嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 I% r) r3 i6 G8 w9 q& j, I: P. e2 f
- w% A! {$ T# F- m( {8 s8 o+ {1 W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& p, i; V# l& k3 x. Y#include <unistd.h>
' Q8 J. N& h- A# b" h, t#include <sys/mman.h>
  N1 Y0 ]' k5 }; o" n. c0 w#include <sys/types.h>
* K* z% R+ J+ T" S9 \#include <fcntl.h>
$ h) |+ Y" u* d) c  H8 J9 |4 @
% Z- ]' K9 B6 h  ~9 u; }5 E% X1 M#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 ?8 g3 G7 W# [: F/ E6 p6 a* O. X  h6 v- a. o3 R* v! l/ O
typedef struct+ p2 ^( }- h) @
{
3 t) w1 u1 H7 H. q5 H        unsigned int a;. w" Q# z. h$ Z9 t$ z
        unsigned int b;
3 _$ L- @5 D+ G/ |        unsigned int packet_cout;
$ s- T. k. e5 g2 E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: b5 ?/ |7 C9 M/ ^' h
* `1 L( G" o( G0 A2 P6 qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% q) L$ J, q* |: R; W* Y+ B# r
unsigned int count_copy = 0;
7 H6 L! D, F3 K
6 e& D7 `. Y) f% N, [
0 f& V- w; k& }/ s: L2 Pint main()
. A9 G- `* n7 ?( T; S: L& S{
" z5 b+ u' Q+ f+ p: L+ E7 a        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ {9 z) t+ w) i7 ~6 \9 n. ^        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 @1 w( t/ o' W3 w& i' E6 d* w9 o) y, a, B( R/ o
        while(1)5 h0 }' h2 J! Q% a* O' |+ ]
        {" n6 A) R9 Q7 Y" I6 x
                read_MSG_buffer(pshreRAM);
+ p2 r( b9 c. U$ q9 `$ H5 m        }                - w, i/ Q% q/ L" U' @5 P7 z0 v! w, ~
}1 |6 Z0 f+ q6 z" A1 w3 g9 C
! o/ v+ U9 n2 M/ r- ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 B. ~0 }* Y" H" r
{0 f( K4 Y, n+ Z) j6 N# e
        RX_MSG_PROTOCOL buf;
* j: B, P2 a/ T$ K* b! n% `        
  ]; g0 M5 H! i, r; C) R6 k        buf.a = pshreRAM->a;- g' x+ ~3 M% s( a; l( G
        buf.b = pshreRAM->b;
0 F. v( h( y# C  ]7 \3 D        buf.packet_cout = pshreRAM->packet_cout;
0 q( i# m5 p9 T5 H. o! k        
( q7 O2 _  V1 d! t8 I        if(buf.packet_cout != count_copy)0 K% [1 J, j; \$ C6 }6 c
        {
( ?* C+ l8 n; U9 i" w& ?                printf("a is %d\n", buf.a);
+ `$ x2 H" P. C7 M                printf("b is %d\n", buf.b);
/ L' ~" A% y6 p( [                printf("count is %d\n", buf.packet_cout);
+ X5 ]& \  y( l                count_copy = buf.packet_cout;
/ w0 |1 A8 \& F        }
5 K0 ?$ n) E$ b3 |) E        else6 A" F+ r+ H: u& W+ p( _  p# d
        {
6 t6 z8 `* \4 ]! J4 f                printf("No effective message!");
- Y4 h/ o  V  C+ L/ _        }
& \" s  y- @8 o8 }4 W( P9 e}
7 K6 g8 \& ]. q4 y8 l; `8 ]2 f+ n5 [& W  Y$ K2 D- \5 v

* J# a* w4 T. w  d( f4 U: i5 x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 {& C5 P5 B- A5 d. Z) N使用下面代码,对内存使用了mmap函数后:( Y' o5 {' n7 `7 D2 A$ v+ G% B
#include <stdio.h>( K& ^& O! x2 d3 B( x# X
#include <unistd.h>$ F7 W) m- ~4 k6 K1 O
#include <sys/mman.h>
3 B) L/ H7 j# ?% D#include <sys/types.h>
$ n: S9 b! u; P1 C5 X# |#include <fcntl.h>4 z2 N8 ?4 m& F) x- M( e! C# d
5 h0 y: b( ~, J& _. O7 w+ v
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- Z+ |. `' a6 J" s% P1 t#define SHAER_RAM_SIZE         (0x20000)   * H2 L, u  L% f1 W. Q7 s  \
5 }) x" N4 }# x
typedef struct/ U" W( [3 w8 y* ]1 F- A
{2 T3 r' m1 ?5 L3 x( D5 O
        unsigned int a;
9 C$ x+ G4 w/ P7 n        unsigned int b;% B' D8 E) F% G# }8 Y
        unsigned int packet_cout;+ s5 H* E- H7 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: N- h1 D$ a' U/ Q5 Z+ ]6 [* }

) t/ t! m7 F% V# X3 k! lvoid read_MSG_buffer(int *baseaddr);
4 w- _4 B# e9 o/ Y0 [& v" g( _3 yunsigned int count_copy = 0;1 Z; d$ C0 r* h3 P

! y3 H% k; S8 C' Z2 P) mint main()
9 v  _/ i) C. t. e{
+ C4 \' ]0 ?: _5 H- h; L: d  ]  ~4 L6 m        int fd;
3 }" r$ R  Q- |5 D7 n8 g4 U        int *mem = NULL;* F6 d8 L4 M8 P$ G8 ], n" ^
% b8 M; z1 n' f' K" i% l' {
        if((fd = open("/dev/mem", O_RDWR)) <0). |" ~$ h3 ^5 n8 k. d
        {
& v$ R! p' l. P5 g. n                perror("open error");
4 S/ X: P& t2 J# S                return -1;
- Y1 t7 p5 r2 M; K        }/ G5 t% D: u+ @/ }3 u
        % [' v" D& E( }' l7 T
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 a1 d$ ?+ E) H) N, T1 P) U0 q" w# ?/ j
        while(1)
; E2 ~: a$ J8 a0 s2 l        {
, f+ }* u8 p1 F( Z                read_MSG_buffer(mem);) O" f6 Y, Z7 x2 a
        }                . ?2 l- J  ?9 C
}% n3 A7 F1 b; t$ H5 B

* s' N% B# N$ s. [. vvoid read_MSG_buffer(int *baseaddr)$ I! P( b0 m' p2 c4 e0 _' e
{
8 ~  X1 y6 }$ e  ~1 |3 u: a        pRX_MSG_PROTOCOL pshreRAM = NULL;- e: h+ q( k5 ?* u) Q

/ K% Q2 k0 B6 Y2 L8 o        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ k5 {( P9 O5 i4 N/ U

' g* r( k: O, h/ d        if(pshreRAM->packet_cout != count_copy)
5 V" ~6 K2 [7 e6 q        {: K" Y5 @2 ~2 X2 E# m' L
                printf("a is %d\n", pshreRAM->a);
! m# k5 S1 ~/ ]3 s$ C% ?* K                printf("b is %d\n", pshreRAM->b);
1 W+ c: D7 [9 W3 a                printf("count is %d\n", pshreRAM->packet_cout);: o8 I) V' \$ W7 n5 d0 Z
                count_copy = pshreRAM->packet_cout;* X6 _% f& T: ]% p7 o9 Y
        }
( \3 Z3 c' c% d' S; j$ T        else
: ~7 y1 G) t$ N+ X! B- `        {2 V& ]3 o1 N0 T% o# D0 p
                printf("No effective message!\n");
5 q7 O* @+ L% J3 `! e- x, @: p! U        }2 Z( ]* Z0 v1 P
}
7 K: ~+ t) M2 l  ]& x. h$ J
% r9 t. m8 e: s% e1 D& R5 s没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 O0 j  z# S) o

" k  E+ [' U$ S0 e2 y. K# [+ H2 D$ z1 _8 y7 n5 D
2 |- z& @9 O# T2 r: T0 q' n
) e+ `2 v' [+ V





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