嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! k. R, T% Z* n) m, K
4 R: X1 }6 F4 i! g" H. A& ?+ @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' Q: v3 N1 f! T5 h6 m. ?: [#include <unistd.h>! K# z% {  D' y0 U
#include <sys/mman.h>8 l+ |2 u$ v& I$ B0 L3 [! q
#include <sys/types.h>
+ U0 [4 m/ U) R#include <fcntl.h>; }  A" Q9 ]3 m$ P0 ^
+ h. V/ D% l6 m" `6 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 [6 S. p" r4 j, |7 ]
" q+ L; N$ H" D! n% h$ P; ?& ?typedef struct0 n/ Z1 m+ z1 L! t
{
3 Y! w' o# b6 M9 J% x' z        unsigned int a;
" @! ~* m7 G9 Z* X* X* n$ u        unsigned int b;
0 ?6 h3 d2 G3 A; l9 h        unsigned int packet_cout;
# R  f% v9 h0 S0 A: V; D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ g# b& Y& }5 a* D% O  A$ a
8 N+ D5 F7 B7 H$ w2 z7 f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ T2 u/ j3 C3 `& U# p: H! ^unsigned int count_copy = 0;
0 r& Y/ p6 ~. R
. s" u4 i7 o1 c* `7 M9 p4 p2 q6 T9 p' C# H  g
int main()3 x  }. c1 `3 `9 T
{
! o9 n1 }7 h' c( U5 s, \  Q        pRX_MSG_PROTOCOL pshreRAM = NULL;2 W9 ]6 x% x7 |; i7 w9 Q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ M" R$ [! t- X  h- y' m: h) d- @1 M8 ^) p, ~
        while(1): W6 ]) s9 _6 ~6 p7 r
        {3 S! |0 i* L: f8 V! P
                read_MSG_buffer(pshreRAM);
1 w* T- ]- ]7 Y  B! h7 L        }               
9 v- d2 E# Y( |}& |- C+ t- T* b+ u6 I+ @8 S  |

+ ?, n2 h) w- m: h/ m  t& Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' }; S2 K* m6 l{; o: x( C# k- B
        RX_MSG_PROTOCOL buf;
+ ]; S/ R0 F! C        8 o1 ^9 g3 s$ f; o% \
        buf.a = pshreRAM->a;5 @8 ?. @8 B! w. V% R/ c
        buf.b = pshreRAM->b;* y3 Y7 P! n$ A* u. ^! |
        buf.packet_cout = pshreRAM->packet_cout;" [3 A: r7 q4 h
        " m' k3 B9 a6 W, o- O  s* U
        if(buf.packet_cout != count_copy)
% _  \' L7 H, x5 V: v        {6 o/ |6 I. h" [2 S3 i: V6 o
                printf("a is %d\n", buf.a);
8 W8 P4 H; G( Z5 k                printf("b is %d\n", buf.b);+ w- W+ d0 Z. r! R6 V
                printf("count is %d\n", buf.packet_cout);6 c6 N" D; {3 [- V/ B- [1 R
                count_copy = buf.packet_cout;
) l' Z& d3 c! |! s+ B  ~) K        }' z! h& g- j. t6 P- q' u8 L$ l
        else0 h! |% w$ D0 {7 C# H- _+ H
        {( ~& p3 [" g8 C' d# n; }- B9 j
                printf("No effective message!");
) ^: c- U% d& Z8 k: {1 e        }
+ Z' v  |, N/ S+ n% b}  s  Z. v8 D$ }3 d! s! I8 f

' o0 n/ b9 x0 T+ A+ O
) P' }' S4 \+ L6 `& R! n. T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' w+ {$ k. U& W. ?: s) \使用下面代码,对内存使用了mmap函数后:9 x) S; @8 o1 E8 U
#include <stdio.h>, Y. |/ p2 F& ]& i
#include <unistd.h>
9 J, r- T4 t" P#include <sys/mman.h>. k0 {  h2 x! w7 d) _
#include <sys/types.h>' }/ Y: M. D5 a- O. B3 b
#include <fcntl.h>5 C& m  _9 _8 l5 \7 o6 r9 Z+ v+ C2 I

3 ?5 s( C- g: _* K, n5 G' Z" a" I3 I#define SHAER_RAM_BASE_ADDR    (0x80000000)& u' a0 z2 u1 S6 _+ N
#define SHAER_RAM_SIZE         (0x20000)   & M8 s7 ]- w# h# J  q0 a" d: A* L/ \

- ?% t5 {  W, u3 l0 T& E! e; `typedef struct: j5 a* k. ]+ A; p8 p: @- L
{$ A: V, z3 f$ U: I4 f
        unsigned int a;1 X# n' m) U" @" X) L- D8 C
        unsigned int b;7 _) u" r" w; y9 J6 ]; J
        unsigned int packet_cout;2 \' ^& T6 e+ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ w6 W' V: V# [; u$ r5 s0 N$ U& N
% Q8 f" E* n0 H( V! H; P' c, r1 Y+ jvoid read_MSG_buffer(int *baseaddr);9 M3 z3 u4 o" R# H
unsigned int count_copy = 0;
6 ?$ i, P7 W' u* E( F* I# D0 a4 C6 I! l7 C+ v- h9 N
int main()5 y9 I% X6 j7 z$ f& m4 ^0 n/ R
{
, f3 i, o6 n$ z5 Q0 U        int fd;
; `5 O" A& C3 [& k% {        int *mem = NULL;
' N; f0 v7 _8 }9 P* q
1 [1 i5 I) C8 ~4 u9 ^8 u' ?        if((fd = open("/dev/mem", O_RDWR)) <0)2 U5 h5 j7 c6 O# T
        {
6 E3 q, o" `0 S9 |  `                perror("open error");: V4 q1 C& }" F; r! P
                return -1;, z: ~: E; d7 }8 A& {' x  c
        }
0 b* v; V$ G7 @- @+ I* C5 ^        4 }+ N7 v' i+ g' L3 V% a
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 P/ w* [8 R; I& T  ]- y& N
$ x/ ^. ^+ R6 S% Q2 Q        while(1)
8 ^9 k( |& m+ I        {4 s. m, l6 f1 _3 Y8 h4 E/ ~
                read_MSG_buffer(mem);6 ?( t2 ^! N" Z2 }1 o+ l
        }                % S' v9 t% x: n4 b5 o( m% ^* Q4 r
}: z6 P/ |# d$ ?
' B) [7 Q* P; }- j
void read_MSG_buffer(int *baseaddr)# t2 M2 Q# N  x. f
{
3 L6 `: _& ?# n* Y. o        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 G7 a1 n7 b: s/ Z8 K" M9 `. _3 @9 r2 s1 h! _, f
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  _) N9 N! X  R0 X+ E  m2 B

) o+ I# P6 |7 x' Y* s        if(pshreRAM->packet_cout != count_copy)
1 O8 W) M) z* _" v! ^" I/ G        {
3 i, h- x! _( t4 j% i$ \- m                printf("a is %d\n", pshreRAM->a);1 ^. W( W6 l* w, B) ]2 L  l) g
                printf("b is %d\n", pshreRAM->b);
9 s) {0 l* [) V- e5 R, n# ]                printf("count is %d\n", pshreRAM->packet_cout);
8 K4 E4 v5 y8 g& I1 f0 M1 x" X& c                count_copy = pshreRAM->packet_cout;" p4 D' W7 b: a# h$ L
        }
1 J5 Q! l" f  h! Q! ^$ m        else/ H  Y3 ]  |; \9 w3 |1 b  {
        {
4 _6 D" O: _9 W/ m& O                printf("No effective message!\n");
' m! h( x% _! Y2 G+ d) b' @        }
- F! i* ~9 U* \3 Z7 g}
8 M/ o9 w+ p: o' ]6 z- ~" k3 I8 l- x3 a: S( L# w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 p, M9 _- W- q, G' j0 o

; Z" e, e1 E# W1 T' Q/ G1 r; ~! w9 W6 p7 z4 a

! u' ^2 o7 T: i! s5 I' X5 O2 w$ C6 }6 \. |4 U9 ?2 b! Q' ?, [





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4