嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 u; V! [! w/ ^) y
3 O: A9 b  s9 F. q/ IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ }0 Q9 E! a- v% w" D
#include <unistd.h>
) z  D' l5 f. {2 B+ P, U) X#include <sys/mman.h>; Z/ g7 C. K5 z; L% S: r0 C+ {$ L
#include <sys/types.h>( v# I; O# R- ?" L1 f
#include <fcntl.h>
' W: g. G7 j, B8 B1 B$ I; E& K% {/ T: s3 |9 @. [8 F! h$ g
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 c8 e2 s/ b+ q" O
( p5 Z' q: x8 g# E7 o1 Btypedef struct$ D' n( L! t/ I3 f! a& y: _
{
) S! p4 m0 b' l1 J9 C! }        unsigned int a;
3 h: X8 |7 I0 u: h. z5 v+ T: A3 _        unsigned int b;- [; b% ?- z+ I$ i+ c
        unsigned int packet_cout;
; x5 K9 _6 d! u8 t0 A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 W, ?2 G* v  v0 z' g: ?! \9 k
0 i' D- u; @' y1 mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 l# ^2 q3 ~9 u+ \7 E( runsigned int count_copy = 0;- d; q7 j8 }6 P( K6 t3 a
7 c; F0 p- X( J; I1 h4 }- l9 Y* ^& i

9 `, _8 y* N% Bint main()
) w8 c( f5 Y! A+ w{) s. ?+ n2 E2 C) `# }8 z* Q0 a
        pRX_MSG_PROTOCOL pshreRAM = NULL;; K: |+ D) u) ^& D& |. k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 X, Q. O. M- u+ _
$ Y! M2 p5 [$ ]7 G- u0 M
        while(1)
* v4 X4 ]( v. x! y        {
0 ^* u( _/ m8 O. n                read_MSG_buffer(pshreRAM);
6 _/ W6 Y* k6 l& M) H/ |: j        }                , y" l4 n. _/ G, s) t* x$ W3 o/ X1 E
}
- S6 Q* M* Z! C% }
7 D. n2 g: O$ I3 z9 w8 vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); Y1 e5 [( ]' f, a1 ~( e+ L
{, `8 C5 c  N% R* C% l
        RX_MSG_PROTOCOL buf;! h. c, ~9 Q3 ^
        
" q: X* L( M3 g, t0 x2 l* N        buf.a = pshreRAM->a;" o: J, y. L0 I) @
        buf.b = pshreRAM->b;  X& W2 w" D* Z. D1 S1 F+ v
        buf.packet_cout = pshreRAM->packet_cout;4 N7 w6 ]: S4 L; V8 m7 F
        6 k+ F# p: P: _$ n
        if(buf.packet_cout != count_copy)
/ Z* x/ _0 \8 {) B6 m        {
5 R% M" ^% W% I8 n5 c& E& s                printf("a is %d\n", buf.a);
. ~; [" m) N, ]8 n- `                printf("b is %d\n", buf.b);
1 h4 e" h: V( D8 L3 x8 E0 q* _                printf("count is %d\n", buf.packet_cout);
  [: ]/ V8 F' \, ~- }# L7 L) g                count_copy = buf.packet_cout;0 E$ t+ @3 M: V# Z3 H. W% Y: O
        }7 l( R: s1 N) N" y
        else
3 `9 R- \0 @" B5 J% X/ v* d7 n        {$ m' ?" J+ O' [- J
                printf("No effective message!");. D* W' q% b$ u, l
        }2 O  v( V6 n6 P
}
0 u: M- t8 \! ?# J6 X  F: C
' q0 z2 O7 u* E: V% Q
+ H" e! o7 i- @; g5 N# g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 u- ~2 t0 U8 A7 I5 P
使用下面代码,对内存使用了mmap函数后:: E3 l9 ?$ p4 x# d( Z3 t* x
#include <stdio.h>9 B2 c5 r& u  i6 G
#include <unistd.h>+ l7 H6 m* D" y
#include <sys/mman.h>( V. f2 N  U  |. D5 i9 Z; |# s  G
#include <sys/types.h>9 O9 H0 [1 @4 p( W
#include <fcntl.h>& ]! q4 C) ^* }, {5 x( o9 z
% a& f, Z& h& F( B7 J, u- v8 e) D. k
#define SHAER_RAM_BASE_ADDR    (0x80000000): m4 X6 r8 U5 n4 s3 k
#define SHAER_RAM_SIZE         (0x20000)   - V7 k$ z) _0 x8 n

7 U0 L& T* @- d9 _$ [typedef struct& e6 u9 \+ [2 U# P6 G
{5 [) @$ S- o. |7 k$ m
        unsigned int a;
( C$ G1 \# \% o; C- i; S        unsigned int b;! g& y9 U0 L$ p5 l$ C! A& i4 k
        unsigned int packet_cout;
+ `3 f5 h$ m  ~7 _# k4 F$ ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: a) k2 x, W3 w  l: W* r
) k$ n3 a/ ^& a# L/ q( S
void read_MSG_buffer(int *baseaddr);
* R( i# W# V- j. N7 a8 Aunsigned int count_copy = 0;) ?6 `7 K0 f% L' z

+ [4 O; U! Y7 p) c+ Rint main()( ?3 t/ |0 J8 F  X  m4 l
{
: T0 y6 U" K- u3 S        int fd;1 D# U+ S* |- N1 J
        int *mem = NULL;
: ~4 c5 _3 v) W3 \; K1 E6 m" d; f8 [" E9 f
        if((fd = open("/dev/mem", O_RDWR)) <0)
8 {2 `+ Y- R$ [2 h. _6 k3 j        {
! P8 L- B& g  |# U                perror("open error");9 `, g7 {3 c  N7 d
                return -1;
5 x7 B( z) `( \% s+ ]5 g        }
: {4 |" O# [6 d, a! L8 l        
8 |7 Y/ L  T  G( x+ I        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) K) p; g# Y4 V& x
; E, [+ A( u, |5 M! o; K) [
        while(1)
  G3 V  N5 R6 C/ a        {
% ]/ n7 L$ Z% x' O# y& G7 i                read_MSG_buffer(mem);
" M( M5 |( z4 O. _: \        }                9 y% T2 m5 e8 B% e9 x7 B/ C3 z
}
. m9 u8 s. G/ S" J0 I7 @% M0 _2 P, o
void read_MSG_buffer(int *baseaddr)
% p0 d8 i# d0 u8 p6 {+ n- z{$ |4 i6 d  H' e
        pRX_MSG_PROTOCOL pshreRAM = NULL;% N2 S- K( L  |$ D1 r" ]

8 D* ?0 E: \& q. J1 N9 j        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 T4 `! v1 m$ P' e7 r; u  Y
( V; t# O: j& k0 d        if(pshreRAM->packet_cout != count_copy)1 I9 B( X% b  Q( h# W/ u& ~9 ^
        {7 |1 ~0 f2 q) |/ t2 H6 ]4 U5 P
                printf("a is %d\n", pshreRAM->a);! x1 X* C4 H- u, ^4 u+ s3 s
                printf("b is %d\n", pshreRAM->b);$ \3 i5 r! V! R% b0 `
                printf("count is %d\n", pshreRAM->packet_cout);* b! x2 x3 Z. l! ?) p" O
                count_copy = pshreRAM->packet_cout;
! ^" c6 e: b6 X: K7 K        }6 V6 F+ x% B/ r$ l
        else
6 B; \% V6 o9 F  I/ w. a$ b5 c% V        {
( \' z( c( L* v2 Y/ ^4 w                printf("No effective message!\n");" q5 x: n: N) l, n) `8 I
        }! l- f  r, ^# }6 a7 \4 h/ P! }
}
% L. w; v3 z9 W5 x/ n. r+ A: D4 G" X, k; t( D& u7 F: E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( W! y- h$ ^- j( y5 h" T! ^1 K9 ^: q# s  K
1 _7 y  N! c. ^  J0 k5 S

8 j3 x% N0 h$ \% Z3 m6 n. z# M- H* C& l8 X





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