嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , e: {" L) ]0 {: h3 _! |, U
0 v$ c5 c# j) M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 }' z- `; X, v( W. c, h#include <unistd.h>+ K/ ~( l( q; a; ~) F( W% Y
#include <sys/mman.h>
( n4 l1 ^" E) B; M  `" d  S#include <sys/types.h>; P1 Z1 M# ^/ U( y
#include <fcntl.h>
! C: n5 @2 {% R5 u- X6 H
& B' M$ @, v. w0 P( \#define SHAER_RAM_BASE_ADDR    (0x80000000)   + B) p* F4 D0 \( T+ J6 T& M) i
" |6 H0 P2 M7 J- i8 o! |3 ?& t8 J
typedef struct( f8 K7 O$ {) G4 f
{! R6 @% \0 g" j+ B7 a5 F/ }) U! z
        unsigned int a;
. k8 W' ?% ^, f1 h        unsigned int b;
2 B( f4 e' P& f+ W4 I- ~$ C) e) O6 {        unsigned int packet_cout;
% N0 Y; `+ o* N' u5 n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ r" d* Q# l: B9 j4 s) c1 m( h" ~
; O' i# o+ k! x7 wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& m% \* L$ V9 H4 f% ]unsigned int count_copy = 0;
7 y8 W  X. ^% c8 X
% M' B, j+ a0 H: u1 C! e7 N% ^  E$ r6 G( k6 ^; G
int main()
- }1 G4 k& d. @, z+ S{
$ `" c% e; o7 W! ?4 y( P        pRX_MSG_PROTOCOL pshreRAM = NULL;6 V0 ~0 Z0 r* \! D# C. \. o8 f6 [
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' U; `/ z! Y0 L. f" u
' F- m3 ]# z' b! d
        while(1)0 a6 U5 m4 A7 p7 P9 n0 M  N- O
        {8 r% C/ \0 J# L& J4 B) D
                read_MSG_buffer(pshreRAM);
2 ]/ a6 N) [# c& I1 l" Q# G        }                $ I7 H$ d8 D0 L: c+ L) g8 ?: F
}
% O! @* d1 `. g) I$ p
" u8 L4 c, u0 |% U& O+ y/ evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): {% C; F! n! G: }. _6 {" n. w
{; y8 P8 j, N# c$ J( M9 L
        RX_MSG_PROTOCOL buf;5 K8 r$ f% B# z
        
# S# C; I; e2 i/ P: p5 V0 K        buf.a = pshreRAM->a;
* [9 f+ C9 k+ ?5 r$ i& M        buf.b = pshreRAM->b;. x+ x+ r' w6 g, \2 A
        buf.packet_cout = pshreRAM->packet_cout;
+ _& z% K& V! p  \+ A        
9 \0 W1 Z! }0 Y+ J: j% p        if(buf.packet_cout != count_copy)$ ?4 [( E2 r3 |8 i& C9 |" B3 @8 V
        {
: b0 g  L: D' t4 e) ?6 z                printf("a is %d\n", buf.a);- i: k5 g- t% E0 n* q+ F
                printf("b is %d\n", buf.b);
, o) K; B8 g6 t4 Z( j                printf("count is %d\n", buf.packet_cout);
) w5 C) K* M" \9 e; o' S7 C                count_copy = buf.packet_cout;' X% y4 G* V+ J( ]" T8 `' `
        }
" w! J* Y; w, o" u! M) R        else
+ o( ?- H) W1 w        {& ~( t! C% T; Y: U9 K+ N8 y
                printf("No effective message!");- m* s+ q3 g+ Y8 Y, D1 j8 i
        }3 d, \; G! K3 R8 l, l) S( J
}# R* L5 s1 v% c; o
2 i4 t/ l% d, \0 Z

9 o1 C' i4 U# T' _5 v: A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( r1 v/ f* r1 a6 L
使用下面代码,对内存使用了mmap函数后:
9 n5 Z; ?: A3 R$ Y- p( E! l#include <stdio.h>
3 Y+ s/ I+ y3 o  \% H2 c! w#include <unistd.h>' D$ Q. I) g4 o3 @4 B& i) K
#include <sys/mman.h>7 z4 @3 Z8 o* s7 {
#include <sys/types.h>
3 Q9 t. }/ Q. F( G. E3 h- y. }#include <fcntl.h>& V* ^/ ?' o& O/ _$ ~& z

& g& c1 d9 K0 Y8 n#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 T2 I# x# \' n, a9 Z#define SHAER_RAM_SIZE         (0x20000)   8 L' @9 y( K: D% E( ~" M, ^
# Q4 [, J3 ~5 M, o. R2 _$ W
typedef struct
0 t1 F' ~. i, l: P& Y{
/ T, v' x" N- Y% Z3 {, G* L! X        unsigned int a;3 h+ N/ N7 ^( y, v
        unsigned int b;8 t, B  k, \: q; o
        unsigned int packet_cout;
8 p! b' z# C/ j4 `. ~* [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- \2 \" p: i* D" a* N7 H7 W

2 D! `7 X9 z! ]8 R7 G% Y0 _( w. L$ A% @void read_MSG_buffer(int *baseaddr);
/ J* I2 d; Y* v0 @3 qunsigned int count_copy = 0;
* f7 y$ }9 t1 a; Z* q3 d
# \6 L$ S3 u: F% f/ o9 h- vint main()/ M) d3 j( z4 o- O/ Z" R: G8 \& J" t
{; e9 a: T/ ?9 k( S' V
        int fd;
% v9 n0 ^4 X4 V        int *mem = NULL;
, N1 S* Y9 x6 ^9 _% I0 l) O7 b$ n/ f4 n. z7 S& h" s
        if((fd = open("/dev/mem", O_RDWR)) <0)( B* T1 r, t! @8 T+ i
        {. E" d6 I. o6 C, `% y- T3 m
                perror("open error");
4 L# `  X& i4 W6 _6 C3 J1 |- x                return -1;: T' [9 D  S$ K+ \
        }
# n& I1 h0 @9 V7 n" g8 d, e. O        4 U! F; p: R  a7 a8 n1 B% ?) s- i
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ @' ?: M+ o: C( X) |1 u' ?& e( Z& x9 v$ W: `% O
        while(1)
4 l0 m7 F6 m' Q        {" c7 Y# V( }" `4 W+ b
                read_MSG_buffer(mem);
: ~  Z8 g* k0 p0 {        }               
- r& ^. A2 x4 N; m}
$ |3 y. w; F1 H  j6 ]) j7 ~2 V8 C4 N9 V1 y$ ?. |4 [
void read_MSG_buffer(int *baseaddr)7 H- Y& ~% c0 _9 j0 {
{
8 ~3 x. n7 l! c. [5 {        pRX_MSG_PROTOCOL pshreRAM = NULL;+ g' S" [& q# Z! N' y7 D
+ k( G9 E7 @, k6 q' ~
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# @% i4 f2 O% u3 r( ]7 u$ U  q$ _1 g- ?4 W( s& y
        if(pshreRAM->packet_cout != count_copy)9 D1 [; ?. t+ I$ R% g
        {
3 ^8 t8 r/ @" @% n$ g- a                printf("a is %d\n", pshreRAM->a);
  O( M" _: V$ s0 H& ~* t                printf("b is %d\n", pshreRAM->b);& d: n0 n) X1 v3 t& \) Q( b" E5 M  \
                printf("count is %d\n", pshreRAM->packet_cout);
; C4 C$ \5 {4 y8 q) p. H                count_copy = pshreRAM->packet_cout;6 ]4 a1 j4 i4 \6 {0 }$ G
        }1 B7 O  S5 R. _
        else
1 _; H% \: W/ I) p; x        {- _- V9 O; L* l+ U* \6 X6 s
                printf("No effective message!\n");3 }. E! t/ I0 v( b; G* G
        }1 P6 S  U4 @( o8 c
}3 s( p( `$ L+ C% r. ]5 {$ Q, j, C9 X
2 B* `4 d: @) ?* C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 Y, O3 `6 s* I3 J! Z& {. O' E( b4 h+ {7 N* W$ L; h* @9 u" d

) q9 B0 Z* ?0 e; [  J
7 i& Z5 s' [& Y) G3 a1 K! F: e8 k6 y0 l' @3 V! A





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