嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * k. J- v' n; |

1 G, Z7 n7 Z4 E4 K1 o: S" QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' U$ z2 p0 k7 {+ R1 e
#include <unistd.h>% M' U# ?8 O$ v8 K% J9 a  [, l
#include <sys/mman.h>
5 o; M4 T! j4 H" U9 t) W) `#include <sys/types.h>
$ a$ P& }% V* S+ \2 k#include <fcntl.h>
1 t0 t! _( ]  {* C
+ k9 T# \- [3 {; J9 J6 I1 C- r#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ ?, ]: e/ b6 x( y
  |- s+ m: v9 r, \; jtypedef struct
6 _; {0 O2 Q% F. `  k{
1 |% b# o. Q! L) B        unsigned int a;# d) S' m( S9 J% U$ c2 N& j) g
        unsigned int b;% w& r) w: w; C+ [8 K
        unsigned int packet_cout;
3 \! m  z/ P& j6 d; K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: H; A) o4 T! {- n1 _' ^6 \7 Z
0 v& G8 I  t# B/ o, Y: K- s  yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ p+ |1 A- j" x& k  @unsigned int count_copy = 0;, d! S3 U* `  o% ~) L7 c$ f

4 |2 A8 i- L' l- ?4 e4 d. H3 `: q' E: g5 n9 z5 V6 u. R9 y7 m
int main()
3 t- `$ W8 K7 ^0 b  }{
; i( T' A3 N) P0 [: K        pRX_MSG_PROTOCOL pshreRAM = NULL;
. _+ @  b/ u% Y% L  C4 e) {1 D0 i: K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% E0 _+ B" I* p0 j
3 E  q6 b. g% a* ~6 h& T- `( E
        while(1)8 u( d/ m6 O& L3 f% q. U3 ~: r
        {
# e! D7 s- c+ x, O+ }+ C8 k                read_MSG_buffer(pshreRAM);% ~) {" z) D0 v2 k2 V
        }               
' q: `' ]6 `$ x}4 t2 B0 X4 \! F  N) b0 d2 m

2 Y/ H( h' ]; T- h8 }' Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ ?/ ^1 n" a8 u" T3 p& X{# ]- f, Z; N% x+ d- Z5 p7 H5 x  d
        RX_MSG_PROTOCOL buf;, t5 ~1 q, o3 m  p" ~
          s! E. u7 |; c0 v' |: z
        buf.a = pshreRAM->a;
9 b1 z; p) n4 y3 x        buf.b = pshreRAM->b;: W% Y! J( \) q
        buf.packet_cout = pshreRAM->packet_cout;
9 T0 U& o* ^4 r1 Z. F- H. z1 ?4 r        7 d) z# M3 i2 c# m: g
        if(buf.packet_cout != count_copy)
9 |- S4 t6 T; Q4 O9 V9 n        {
9 p  u* h8 z0 U) Z* y1 K6 W" ~! A/ o/ N" \                printf("a is %d\n", buf.a);4 Z/ O" K  B% i2 G4 F1 t
                printf("b is %d\n", buf.b);
" j2 a- w2 b; q0 c3 T& b                printf("count is %d\n", buf.packet_cout);
; k* d8 m9 o  T6 B3 U. F                count_copy = buf.packet_cout;
0 d  }0 V' X7 G  x7 J- `& ]        }# J1 W" t" r. m7 z
        else2 B4 k  K) e' l7 \! R6 t  r
        {
# t2 I. [# h) W5 i$ H                printf("No effective message!");
4 E1 s4 G+ b! g6 W( Y        }) r8 L; y+ d  a+ Q+ \1 N
}
. p2 H, i" X0 R# h4 B" y7 H; n
2 o; y2 s# o" d& c! f' c/ q4 `  a" b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 f9 x6 v9 I  q# F, g3 O$ X$ L
使用下面代码,对内存使用了mmap函数后:
& B9 k& R6 ~  Y3 b  [#include <stdio.h>
, E' ~+ M4 m0 d5 Q% F- u% I( _#include <unistd.h>
: W; @2 [# x( V; U( s' A#include <sys/mman.h>
) p: W+ r' V* u! k3 L& q3 L#include <sys/types.h>9 K* |9 u% C- W
#include <fcntl.h>
/ z5 I# P1 M, m, e+ V1 a) q! H
7 f3 Y) F/ |0 C#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ j2 j5 f6 ?5 g9 c+ `; x) x8 ~#define SHAER_RAM_SIZE         (0x20000)   $ C  h1 M& C' A9 D! p& E
+ r; e4 }2 U( r2 h
typedef struct
$ F' k2 }( Z% ?3 }+ z{0 }# ]# {" |; S: |# V9 e2 G
        unsigned int a;% i4 ?/ [& e" x' I
        unsigned int b;
0 E$ v0 s/ A1 ^+ t* a        unsigned int packet_cout;
2 L$ k5 Q9 }8 f4 ^+ {9 ?" L' [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 c2 N" s, Z7 ?0 N1 ?) T) ?5 C: {) P" X; `$ k
void read_MSG_buffer(int *baseaddr);
; a, o3 v2 U$ p$ Yunsigned int count_copy = 0;
) S+ g8 U( m; \- H" k1 P* H7 C
, G* g$ q$ \7 a2 T" `( rint main()7 Q# J/ v" j3 |; k0 ~1 `
{
7 Z% z/ J- k$ Y! I3 l9 K* h8 M+ U        int fd;! m: P* @2 o6 F, O- x8 }
        int *mem = NULL;
0 z" C& \+ b2 Q8 l/ H8 z# _* v5 J3 h7 W4 D" F5 a: E$ ^5 i. M1 }
        if((fd = open("/dev/mem", O_RDWR)) <0)
9 L  F+ U% A" g! e5 m9 V        {
3 A% p. \3 m. X3 P                perror("open error");" g% o6 ?, H& T8 }# p6 }
                return -1;, C; _- v. Y; f! n( G5 Y
        }
% E* z# s5 k. j7 f        ( ?: f$ Q4 H3 U' ?# r7 w- \
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 K" `7 g: G8 X! f" ~1 J3 C

# c4 R9 P- V2 @9 Y. T) L; v        while(1); |8 Q+ U/ ]9 _4 J+ @6 c+ N* |
        {
+ B+ S. |# r4 j0 K2 A3 L1 w                read_MSG_buffer(mem);- p$ \: p4 \+ y& j/ p
        }                ) _) c9 J( o! }8 O( e
}! ~% }7 t: H, k) n

& R& \) {; c; f5 d$ s" P4 Bvoid read_MSG_buffer(int *baseaddr)
  C! S0 [! Q9 n- c  x{
2 F/ z* }9 k' r& c5 Z/ W! F        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ C/ _1 P0 V3 R0 m
3 ?/ L' x2 W" G2 Y" y" c1 k  H( K; \        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; S0 y# V7 `5 v4 u1 @" r  L& g- X% Q* q0 ?; X1 o
        if(pshreRAM->packet_cout != count_copy)
* Z9 F8 E* K: G7 X2 T7 c& k        {
* K7 p4 A0 z3 I                printf("a is %d\n", pshreRAM->a);
$ X$ ]' [% G+ ]                printf("b is %d\n", pshreRAM->b);
$ W9 O+ L( X# Z1 K/ N                printf("count is %d\n", pshreRAM->packet_cout);
8 K* ?' H% f5 ^+ {4 u/ x8 A                count_copy = pshreRAM->packet_cout;: y( {2 J# @4 s1 u; t
        }
+ K- Y7 o5 D5 ?5 O+ P        else
$ u( W  P3 y1 X$ f8 Z. Y; [        {1 T8 |/ i0 n/ @5 p, _& p( O& i
                printf("No effective message!\n");
5 }4 C- P3 ?: ~2 }8 g        }
) ^% V, p! D  C0 L}
2 {2 I0 h1 K; B8 `1 H* ~& P6 W, L; o3 e; M/ \2 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: y+ r+ b+ r5 T8 N- s& u; h: K; a

4 |) M0 w' J% w! {1 |
0 Z# ]) j) i+ ]" @8 @& A$ O4 T  p7 r1 }' P0 c





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