嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! ~* F. C% Y7 z3 s# \9 Z/ M9 q
( h. e4 m4 G2 U, U) B9 V; V3 c. @, zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 v: {( s1 g9 W0 S9 N) ?
#include <unistd.h>
4 k# ^; X4 B2 J' h& w# H#include <sys/mman.h>
: ?* J2 m6 @! ^2 c6 H' Y#include <sys/types.h>
* p' \5 U$ e* c+ w#include <fcntl.h>
5 b% y& Y: K3 c" d" S5 R: w) Y6 q" N' v: p8 z% D+ i: w
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) I) h) E% t& {. y- ^! U& A' q  h; e; V1 R3 U7 m
typedef struct1 m" W( F! R0 D8 y) c3 C
{- T+ S; D- U2 `. Z$ w5 L. g, f
        unsigned int a;" o5 @0 \- b& a* |, t' l: b3 [4 i2 C
        unsigned int b;2 w' |" c2 \0 e4 [% }9 `, w8 Y
        unsigned int packet_cout;
. I/ C! p, M) p: k4 J* j/ S5 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ D4 q/ U1 K5 ?# e# v1 u7 o; d( r5 [  h1 p8 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( K0 l, G, i* g5 E0 v! T) }0 n& ]9 J
unsigned int count_copy = 0;
* R) K) A( i- a% Z, i; i0 S" Z% k: E* u. t# u, Y( ~

4 N0 y: }0 ?! A1 x! nint main()
/ l( g) D& _: j1 ?. p/ n{5 n: ?1 i: `( I6 y1 ]( k
        pRX_MSG_PROTOCOL pshreRAM = NULL;- d1 W, I2 f" {; t
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; r  w* [# c* |( Y  A
& J7 w  S% I, B- c$ a) o6 Y9 V; x
        while(1)
, Y' W. p6 S4 h( [1 {& n        {1 N4 F5 O0 j* z8 ~1 {/ Q+ b
                read_MSG_buffer(pshreRAM);
1 h7 E7 y& x1 R6 N        }               
$ K, o" h* _- A" j( |}
7 {8 |6 v, x% e) h( \: ~; n! ?% h( y, u, w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 T& U- l2 W; t9 p6 f$ y
{
9 H; W# P" L! \- o; _* s# Y        RX_MSG_PROTOCOL buf;
- L4 |& @  Q) n+ o6 |& l$ ~- e* |        0 g# f6 M- \1 z% z
        buf.a = pshreRAM->a;
& ~8 H5 {6 W; ^9 X% x        buf.b = pshreRAM->b;# f8 t( N; `' n" c+ A4 o! }
        buf.packet_cout = pshreRAM->packet_cout;. P2 e% F) N: c5 |7 Y
        
7 w% J: ?' g, E# P  M        if(buf.packet_cout != count_copy)
1 ?4 Y( \. T* [4 k% L        {
. P6 q# n1 l0 v& _/ k                printf("a is %d\n", buf.a);
: Y* O& A% @9 [) h  g  L' n                printf("b is %d\n", buf.b);( ~  ?/ h0 ?7 h" q( d4 P
                printf("count is %d\n", buf.packet_cout);
) ?1 M# r7 q: r; p                count_copy = buf.packet_cout;1 C' C0 l/ d' i
        }" x! [/ G" N9 @! x& ^* Y' \
        else
8 O' R/ p: b, x        {
1 A! B$ E, H! ?                printf("No effective message!");) n9 B2 n+ }* r8 R
        }
5 x  Z: U8 S) `& _& [8 \}
2 y2 m& M' a9 i& \
( Q6 a' l! o4 D! Y; z# Q
* k0 M! M/ E5 x0 I" V" R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 f4 ~* y: H3 f, A; u5 r使用下面代码,对内存使用了mmap函数后:
, k0 m# C7 z$ G- h/ h" ~: f#include <stdio.h>+ o" U) s5 _% P
#include <unistd.h>
/ A6 a/ f* e7 Y0 Z0 X  q7 ~$ ?#include <sys/mman.h>& b* ?4 Q# m- ]- a, p5 E6 q
#include <sys/types.h>
- c8 U0 a7 U7 w6 K6 m, m6 E#include <fcntl.h>6 t- {, u; X: n' g3 i

; `1 M8 D1 C# r" s  z  I6 ~#define SHAER_RAM_BASE_ADDR    (0x80000000)3 r/ Y6 ?& d3 o$ r# l
#define SHAER_RAM_SIZE         (0x20000)   
" J' I* v! T6 a4 Z- U8 W8 o/ v+ i& X" a) J) t0 X. |6 n3 n( I
typedef struct& h- u/ L+ x0 Y1 ?" B
{% ?+ _) ]+ u0 l- e. F0 z
        unsigned int a;3 y) Y) w2 {5 d3 _
        unsigned int b;6 X. J! V1 }( R: z  @# V
        unsigned int packet_cout;
4 y: {' P8 ~) k. \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 y8 {7 f/ w. W) ^9 e5 C

9 f. M  {; L1 L, H: Y0 O4 X( wvoid read_MSG_buffer(int *baseaddr);* f5 C( m9 }$ f+ Z0 v
unsigned int count_copy = 0;
9 I, B' q$ C3 H% }. A# K' K* o! K+ d! _# N. }  x' W( C
int main()
2 g- ]5 N8 |8 [( _/ n; C0 s2 Q, Z{
7 x6 m6 [: P* e! |! p        int fd;
8 W- U  D% N2 v' d        int *mem = NULL;
$ l8 L& y5 w! w  I3 N+ P, L7 F  Y* J
  e( M6 u' \1 |) z* S7 [# q* p        if((fd = open("/dev/mem", O_RDWR)) <0)
5 g  p0 A- T4 N% K* p; J% `        {/ e! D& L7 |4 s6 S
                perror("open error");4 F. _. r# }: L# \& z( D4 ^
                return -1;
. P8 H3 I5 i- ~. V% @4 p8 y        }3 a- @& x5 k, z. q( ?( q
        
* ^% T1 T: _$ y, s  B        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& P5 }5 ?* f9 {. b0 g- I/ j3 r' }
        while(1)
: t1 l3 a+ b9 f! e3 z        {
- M3 e- F! P2 C! p2 c7 e                read_MSG_buffer(mem);' v( q1 ?( J4 H4 Y+ b& S+ h
        }                ! q5 q$ Y9 q3 t. D, h7 m$ l7 `
}5 `7 w/ z& G4 _
" j) U3 q! U3 c" N' p/ t
void read_MSG_buffer(int *baseaddr)
9 w4 H" ~, c) c5 i& j  U{
1 o' ?1 f9 Y0 y, J0 |8 O        pRX_MSG_PROTOCOL pshreRAM = NULL;) p9 H; a7 W$ U
2 w" t, l5 M5 j" X$ W, `: a
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ w  N* |' O/ J' R) T' {, T2 [. h! Q- A( h  n- ^! F. l
        if(pshreRAM->packet_cout != count_copy)
- W& U; \7 @. }4 @- e7 A        {9 R7 x# {& u! r  W
                printf("a is %d\n", pshreRAM->a);5 N" G" Y6 H' f% `) A. Z: x
                printf("b is %d\n", pshreRAM->b);" ~; u4 V# K% B( t- Q0 E
                printf("count is %d\n", pshreRAM->packet_cout);
: e) {6 q! s+ P1 |9 U- `3 A                count_copy = pshreRAM->packet_cout;
- H3 q, f! z5 B% P        }
4 o& j+ V1 s9 N% p' J        else. b% F: A8 H4 G& K" ^1 O. D* x
        {
; e5 a& e  {$ p, h                printf("No effective message!\n");
/ T5 A# c7 ?4 z3 P! }0 f        }+ L& Z; M$ a( c  e4 f5 g6 r( B8 @
}% W% p, R6 \1 E/ W1 u; w
0 T7 C5 M& [/ f! B0 k0 |4 a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) |0 M0 A- _; e2 ?- J9 J4 ^3 h( i6 I7 U' _( @3 v  q1 U: q
4 V: ^9 \( g  _9 ?3 {

: h- @: k/ I$ {* [. K+ H, a3 T& n: m) e5 s; W5 B" Q6 Z( N2 x





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