OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5879|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* L3 z! M1 |1 D% Q& j8 v9 y" X$ w7 j* K
) _3 Z( y* H, y3 p, KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 ^1 _4 g* `2 _6 N#include <unistd.h>
: X+ K* c1 m% L- ^; @! L1 r' b#include <sys/mman.h>0 \# c" V) f  k3 X1 k
#include <sys/types.h>
4 t5 T% L4 l2 l#include <fcntl.h>
, Y, n, w; W4 ?( E! N# I4 C- x2 M7 \7 S5 l
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 O. T, n0 y, k2 T4 f  m9 R3 w' l5 P8 Z& ]/ C. a' Z
typedef struct/ e6 y# \2 m& v
{7 s: V) K/ Y6 X) w1 _
        unsigned int a;
: R1 s  F& M3 q5 o4 q2 J        unsigned int b;, W+ p2 s! N. |0 ?5 ~3 ^1 g2 ~
        unsigned int packet_cout;% O+ H2 z, f% @; g, `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. I( v) g5 I' U2 K; Q$ q
& y4 ?% u3 f/ x6 m# Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 ~8 R  ^; a  D4 q
unsigned int count_copy = 0;7 F* g) _: o1 K1 ^  c
+ x4 i' p6 A$ ~+ a* {7 N' B) h( e

- ~5 k/ ]6 l5 v+ ]. rint main()
" J7 _1 q3 L8 r4 P{3 X' P/ m6 F$ q7 N0 g$ b
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' P7 `0 z+ q" ]+ U+ @6 O        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! s# ^! U5 ^+ d9 h9 \
/ T5 M1 _6 g  P1 _        while(1)' F- p9 Z/ [" t8 I- O: {
        {# U$ f& p- |3 T6 w$ w6 r
                read_MSG_buffer(pshreRAM);
4 v0 N% n& r/ ?0 B; {        }               
" ^6 @# @$ u# i* [8 [: m3 m}
9 u' b9 y9 @5 h) y  {$ J4 i/ W
& M/ e; `0 q" Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! H0 q8 p/ v. |0 K: h! C% [
{/ R- U. `" d; K" C& e; u" V
        RX_MSG_PROTOCOL buf;- S9 V" C( T- _1 h- U
        
" r- I3 p* q+ w1 P. W        buf.a = pshreRAM->a;
' ?( K2 Y1 B2 O" Z, y        buf.b = pshreRAM->b;5 V* }$ B$ F% e) C! l
        buf.packet_cout = pshreRAM->packet_cout;
1 _. j2 ^, ~: C2 a  O, Y3 \        - ]' W8 X+ q2 x) A3 ~1 A. B
        if(buf.packet_cout != count_copy)
9 Q  x8 [) V+ q9 ^* W. Z$ n        {
: w) u5 ?, q7 ^2 @                printf("a is %d\n", buf.a);' c$ L# `$ R6 r) Y  V+ ^
                printf("b is %d\n", buf.b);; t5 G3 o7 l6 s% B& C9 e& i
                printf("count is %d\n", buf.packet_cout);& m( Z6 L1 ?" S0 T4 v
                count_copy = buf.packet_cout;
1 m- b  Z0 [$ w, u, p% ?- P8 x  \0 ]        }
" k. v6 \+ M& W1 ?/ E- ?. R        else' S2 {4 T+ T$ D# s
        {& Z. b# F$ e" R: i! ]. u
                printf("No effective message!");) x; V, \  t! ~# s- L
        }9 H' {  q  q, K0 N# U
}! U; u; t- @0 ~8 c

7 `. X2 r7 T$ k& l0 X# t* a( i7 F" k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% s0 |0 F: U  i+ B/ {使用下面代码,对内存使用了mmap函数后:
( N. @1 Q: ~/ }  I- T#include <stdio.h>
( ?" k7 ]2 R: B" y7 M9 A: C#include <unistd.h>
/ ?* Z+ ]3 {) H% M1 C; z$ C#include <sys/mman.h>
5 v4 Y. K5 A. w& x/ {4 Y4 a8 P# i#include <sys/types.h>
: u) `) K& b: G0 L#include <fcntl.h>, X2 f+ B; I& [$ J; a
/ E  m6 Q) d) [/ G
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- _# w& G( J, o#define SHAER_RAM_SIZE         (0x20000)   + x( ]7 a8 }7 U/ O

9 p9 k& M& B, }: A. }5 e: y: Utypedef struct
. I2 o) J; m7 m8 `{5 E/ r$ g/ e1 A. F
        unsigned int a;
" R8 C# }8 y/ n* X* z. X        unsigned int b;7 Y( m* D  A' ^& p8 c! W
        unsigned int packet_cout;
3 `5 C+ {& U+ V0 y8 ]; f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, q0 l+ m$ Y+ @8 l; e1 i1 A1 J. }$ e9 N, K& [3 Q2 F
void read_MSG_buffer(int *baseaddr);
0 P  Y3 U, N# X8 u% G0 I- O0 funsigned int count_copy = 0;
9 F' @1 B' j+ V7 a0 ^2 r
  q# T# r( g: Z, [, h/ ~int main()8 [: Q8 I4 R  g6 Q2 t
{
7 D, B: t4 g1 g0 Q9 U9 G! F+ Y        int fd;
- G7 i! R+ d( W' A% y; h        int *mem = NULL;
/ V1 r/ F+ C' ?/ @- a& o
2 D) L+ `; N1 O. s: a        if((fd = open("/dev/mem", O_RDWR)) <0)
0 P/ ]# p% Q/ k        {+ q0 n# Q  @1 p/ x
                perror("open error");$ w1 h% m$ g% [) U" u* J
                return -1;% R; Y; p& O% Y6 V
        }
8 s; n/ F( d- B, h        " X) M0 b7 y5 _& X& o8 j4 Z5 Z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. f* ]4 w: V( @8 ~* o; Y$ K
* W$ s- n9 G0 E5 I        while(1)  X( p0 S! d# ~; w) Y8 ^- q2 ~
        {
. P7 G7 t% M5 p" J+ I& O! r                read_MSG_buffer(mem);
, G! L8 Y0 ]( v4 U) Y0 y        }               
9 b+ Q- a3 x- h5 J}
0 Q4 X" V7 s. ^1 `8 s5 X& H: B
5 e  a4 i( e( Z$ @( E8 z6 P9 ~void read_MSG_buffer(int *baseaddr)
: H; e5 h7 ]0 B{" v6 ?; o$ w  o, N% K6 c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 R" K7 [7 M; M( ~; f6 o: x* D2 u& g1 Z8 @. `8 O$ i& G8 O: o; B  s
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- e0 M: G# p3 g0 ?& v7 x& ?( I9 U
2 B2 N% @( F% v; C  l( }        if(pshreRAM->packet_cout != count_copy)
; R, P! @% R2 q' R        {4 B  n* P% f8 B0 v" f6 c. v* w/ |
                printf("a is %d\n", pshreRAM->a);
+ H; E+ _' S1 G: M) f7 H3 N: c: N9 [                printf("b is %d\n", pshreRAM->b);% n2 ?7 C" O7 U  O9 @3 _
                printf("count is %d\n", pshreRAM->packet_cout);& ]* ^/ W1 r  a7 x2 X, A% V: S
                count_copy = pshreRAM->packet_cout;* b4 F* a* y& G! S9 M7 j$ L& l
        }
( U. x4 {/ ?  Z3 C3 s) f7 b0 Z+ V" f1 z        else4 z; r  x) `' L7 \' h
        {
- f* Y% I/ K: Y                printf("No effective message!\n");
! ]2 M# {  o9 z3 _+ q        }
& c8 v: r" {+ ?; \+ ]! k}
& v1 i$ ?& G7 ^7 `5 W" U# x# n4 T- [: j& F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 _: _# ]; E" }# b8 ~& j
3 j" I& ]% k; Q* u$ K" P/ m& U) R6 ~2 Z4 V* F& G& N# r5 o8 Q
# {7 @+ N7 Q6 K2 n' \' `+ @

" V$ k" r# [% k* v: u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-10 03:14 , Processed in 0.046685 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表