嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 J# J% Q7 }$ D+ K0 H7 }1 A2 U, y4 q9 ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* ]# {% I' j$ `#include <unistd.h>
4 e, r8 @2 |) x$ V8 q- T#include <sys/mman.h>" G; O. _7 D3 _! X$ q
#include <sys/types.h>2 G5 d* C0 ?5 w  X* e3 x
#include <fcntl.h>; v2 a7 ?" x- b  x( E# a: s: p: e

/ B; z' |1 H# p$ b#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 V# Y# \, Q1 P7 e/ M6 s) w# p8 S4 b# H3 M! v
typedef struct
" D7 e4 T9 A. W, z# i. q/ Q{) \5 A; B3 x  c. |9 R8 Z" ^# {% r: O$ j
        unsigned int a;
. M3 B0 o  A5 P) r) K, G        unsigned int b;
2 y6 u! R2 l6 E2 j$ P& ]% {7 V        unsigned int packet_cout;: R5 ^& k/ f3 n5 c" v& ^* P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# T. `! Z5 n$ w# G

2 d0 `! \: e6 v: Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 [5 \- `% E& |0 r1 K0 l+ g3 p
unsigned int count_copy = 0;2 h+ N6 q) b1 M& \& _, e

3 }: B) T3 x3 v2 F3 j
  M( v% e& q9 F+ ?- Dint main()
# }( ]6 t, g* @{$ @  J3 o9 ~' ?. z# P
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) r, e3 N) d/ a- c' \, s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ ^/ [6 h# N  V; l/ L0 |
% q1 w* y5 G' r8 {" R' ?* r
        while(1)+ a# w. J+ w: X; M# R4 ]
        {
+ S1 d. B) d6 H6 i/ z                read_MSG_buffer(pshreRAM);9 [3 n% P& X. q8 @9 O# B" o4 t
        }               
" ]2 C3 f# Y  g! ?. A3 l}, |* e1 b7 L% O+ T3 }/ [. y; A' C
$ `. m. {) v' Z+ M" A* R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 e. ~+ s, M, T* @3 d
{" q; s3 f" A8 u9 Y- _; ?
        RX_MSG_PROTOCOL buf;
7 X3 `4 ^- n! C- }5 E7 b/ o6 w        $ n: ~0 U) j1 `; n$ e; ?
        buf.a = pshreRAM->a;9 @% M& Z+ X0 ?  P+ Z
        buf.b = pshreRAM->b;
& f+ g" _3 ~- J9 w2 X% ?        buf.packet_cout = pshreRAM->packet_cout;( j3 @- m, w( U7 G: P, K  i  S
        4 V, ]! X1 i' k$ l
        if(buf.packet_cout != count_copy)
3 T9 Y( ?) \5 ~# f5 T5 w) R        {7 x: l6 G( `* f" N
                printf("a is %d\n", buf.a);0 E3 p. _1 H. p# z2 |2 V  n
                printf("b is %d\n", buf.b);* L! o/ R& E. c: }/ q; E+ I, U
                printf("count is %d\n", buf.packet_cout);& }) J2 A$ ?8 I, @7 _. g. E
                count_copy = buf.packet_cout;
# G: S' `: x/ \/ C* i2 L" j: W& R0 l- |        }" g; }' u. X3 _4 K3 g* {2 ~
        else+ s, o' D! |3 A2 \) S! J
        {6 n! [0 u0 ~) R; L4 R; w' u# Y
                printf("No effective message!");
  A1 l6 p( u. \, ~        }
+ o2 @! b# e) F  r8 B% \3 e( S}
9 @% r8 b& P4 |2 W/ P, E8 {5 L* G( v# f& ^

6 b3 }% d3 R# O* s! n' w但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" Q6 w0 X- l( s; m* }. f4 a- |2 v+ w2 v/ t使用下面代码,对内存使用了mmap函数后:
, O; ~* x/ ?5 S#include <stdio.h>
& _$ Y  p1 X2 p#include <unistd.h># z$ V; Q4 V, G( d1 A; {4 ~
#include <sys/mman.h>
* V$ ]3 H# _# j$ [#include <sys/types.h>! B/ i8 r8 U3 y/ j( x
#include <fcntl.h>& F& ]7 O% U0 K( v3 Q
. N/ R  W2 o! j8 d
#define SHAER_RAM_BASE_ADDR    (0x80000000)6 E/ g' U! m% o( l: A
#define SHAER_RAM_SIZE         (0x20000)   
) y: w/ Y2 u: c# g9 N, b4 o+ |+ Y7 ~6 a) u6 t
typedef struct% y0 s1 X& _' [( p6 C
{/ j* O3 _( r: i' ?& I3 y0 C
        unsigned int a;
! o- p- ]6 L$ Q/ p* G        unsigned int b;
: a% b- \: a# z( n/ n: M+ L        unsigned int packet_cout;
: [. u( p! Q# J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ N4 k/ Y0 O: Z0 A7 \' h( @) z; G6 P2 S) Y1 [  u& W; A
void read_MSG_buffer(int *baseaddr);+ w/ Q: r/ A% _( q) [! Q" u
unsigned int count_copy = 0;
. N3 E- T$ j) D* D  J" G( X3 |
3 H. S; x! H* f$ i5 e1 sint main()
$ k" f0 `( c3 A' D) ]; v{
( Z6 q/ S2 Y. m" b6 W        int fd;
8 p  C6 |' o6 h6 ?( N1 a7 y        int *mem = NULL;
# t" Y1 ~8 b. }" W5 {5 j7 b& ~; h/ ]8 K; f1 N+ |  u. \
        if((fd = open("/dev/mem", O_RDWR)) <0)
0 K9 w# w5 z8 B& y# B) b        {0 h4 r- P, i7 V/ S# D  i) c& {' {1 m
                perror("open error");; |1 Q& x/ n% Q/ C$ t4 D5 S! T- ~
                return -1;
- X) J4 A3 S+ V        }  b  y/ @3 w( b5 \
        
( R! M4 Z/ b/ N3 |) I        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 e* g! e" W+ x) U; q; T: t
* [0 }3 p4 B9 {7 v% m9 _        while(1), y% p9 F  W9 W, \- F5 j9 e
        {: b/ ~  h1 T; a& i% [& G- g1 B' n2 N
                read_MSG_buffer(mem);. E$ e2 a  g) i' g$ J5 U- Z
        }               
/ D" B2 S! Q- d2 Q6 G}
0 [5 u3 I; {8 ]- t! D
+ }6 A, u' R# C5 s/ ovoid read_MSG_buffer(int *baseaddr)$ g. _& t& C8 b% X1 _' S# F
{& q6 L% E4 o; G& Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# x' }" q  i% |# o5 s. X* p8 H
7 x# |9 J' p# ~  W  U) v9 k: e2 V        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( I; I0 _+ f" i# E/ r6 y3 R7 f' P. |  u+ U
        if(pshreRAM->packet_cout != count_copy)
' u  |; Q8 ~; p9 E" }; p1 v. K        {
% K2 a' n& q* z$ Z* h                printf("a is %d\n", pshreRAM->a);- h2 w  f/ c$ O1 g% [# l1 T6 t+ C
                printf("b is %d\n", pshreRAM->b);$ ^4 F7 Q1 ^& Z9 s3 x
                printf("count is %d\n", pshreRAM->packet_cout);
* a3 G- d- N8 F" c6 }                count_copy = pshreRAM->packet_cout;
. S; {$ v1 E( a7 _+ o        }, Z" r2 G) w& U) ^# ^( x
        else
8 k- `4 w5 v8 z1 c3 {2 F        {. M. l0 @% n# ?
                printf("No effective message!\n");; R/ x$ U* t% U  E8 |/ C# i) B! H6 i
        }
5 p/ j  z5 Z9 C- M% j7 c}
' d0 N* z4 _# s
6 I2 X* `# b4 p7 ^没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! l+ j+ w2 e2 g3 m- @9 U
! n& M  h1 c  |/ P3 f$ \: z; i  ?. k

( G# [: l% N" p" ?# a4 k0 f
" l5 S5 v1 d9 J5 J, H' H1 G0 M
4 |4 K1 N9 V, q5 v% u




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