嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: I* V' u7 O5 d  q3 d+ W9 T5 d6 B0 d: S; J( k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& ], h. P- d: l# H
#include <unistd.h>' `5 V6 N/ t( M, v
#include <sys/mman.h>+ a. ^7 _% F% x+ Y  H8 P
#include <sys/types.h>( @+ u6 A  M9 C
#include <fcntl.h>, I" F1 _+ {' F5 L9 F, D( l  w

% R6 l" i" t' W8 }5 K: D#define SHAER_RAM_BASE_ADDR    (0x80000000)   % q( h8 j' s7 Q! R# s. t
. f) _0 L& E; v) b" ^; b
typedef struct+ Y- k( N* o$ v4 r7 }; a
{
' J0 M. ]& j1 }! n        unsigned int a;
# H, n- b; K3 E+ j; v. N        unsigned int b;0 G! j  |( F- F4 }
        unsigned int packet_cout;
" O4 m- S- k/ l4 V1 ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) x: X. v9 T2 e+ u9 Y, o
% G$ s6 D, q) D! b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 t& q& C' Q  u, q* [' b$ I: _unsigned int count_copy = 0;
+ b+ a2 i' o5 N3 ~9 |) [. r4 P# ^+ Y- t5 _  s% a

' |4 N8 Z8 v  T; n; Yint main()
1 V0 ?: `, X. X; j) w. N{& Y. {9 w: i2 h  Y! H# Y, N4 j2 i
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' a( m+ j( T. ^5 }- p% ?. l        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 p( M- W+ t& _9 k
* B0 R8 `* o9 m7 Y
        while(1)
# K, s4 ~& r6 Z$ v7 M        {% p4 {, s1 }" ^/ H; T, B
                read_MSG_buffer(pshreRAM);
7 \9 p/ a9 |7 f. J) Z        }                ! P% i$ M- {7 T8 _# B
}
+ T- n3 T- s% ^( I8 W3 D( X' b" D' S3 E: L7 M" l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 S9 E* E4 h% v. w9 s+ x, t, m{. b. I* Q+ g& d: j9 d9 K( f
        RX_MSG_PROTOCOL buf;( _0 G& C5 ~8 @' F; I  Z1 l7 A) X% d
        - v3 s6 m( {) R7 _. ^
        buf.a = pshreRAM->a;. Z- G- T# B( ^# p% Q$ f
        buf.b = pshreRAM->b;. ]% y$ k* |+ {5 U: O
        buf.packet_cout = pshreRAM->packet_cout;. [$ b) L: e; R2 U1 g, d" ?0 K
        
% Y5 B; T! w- W5 r! w6 h6 a        if(buf.packet_cout != count_copy)4 q, [- ~8 F, J- V3 ?- G8 j
        {+ a# S6 p2 z8 J/ Y- M
                printf("a is %d\n", buf.a);
" X" a& {- [+ y% r: K) p" Y* P                printf("b is %d\n", buf.b);/ L* n; g) v& r9 t
                printf("count is %d\n", buf.packet_cout);
3 ~1 E, C: ]4 x                count_copy = buf.packet_cout;
. b; w" A( P2 p& b        }
* r( [2 {  x9 n: Z        else
( q  h1 R" N) ^        {
/ g0 z4 J4 G3 R+ z( \                printf("No effective message!");
, E7 |8 G4 M6 y* }8 }# g: y9 F  M        }3 a5 c* q' y$ W! `. _9 z; ?( J
}
7 B3 ?4 j& K& }* Y5 n/ y8 e) v
; v. k  n/ i3 Y7 B0 i. e" C  B: x6 G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 g, [4 x5 H3 C8 i使用下面代码,对内存使用了mmap函数后:
* w  a9 y4 I3 F6 G2 D7 P#include <stdio.h>
+ z. ?. N$ @/ |6 Z- H! d4 @; o#include <unistd.h>0 v: H: r0 Y7 N: m4 M& S
#include <sys/mman.h>  u6 C; S  I) }# d6 L% y+ I
#include <sys/types.h>+ r5 R1 E5 t9 R$ K- c
#include <fcntl.h>
- ~' k  t9 U1 ]8 {7 |
/ I# s& E% o( c; q1 o/ i" l#define SHAER_RAM_BASE_ADDR    (0x80000000)+ o5 }) p* K, B
#define SHAER_RAM_SIZE         (0x20000)   ' V- p2 K$ o# G) s+ f1 x

0 ]% h  K! N- H5 Q% @* e8 Qtypedef struct
. P% t5 g8 j) t# g4 `( d{
9 {1 i5 v+ E) s  ^* K# d4 {* Q        unsigned int a;+ I0 ?1 T9 y% t1 b% [. F8 F4 _2 c
        unsigned int b;
) i( D$ `7 d' f4 U) @( f3 a        unsigned int packet_cout;% J+ C" ~8 P. y  u3 o9 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  M1 i! M3 I' K3 B
6 ~# P6 L9 W# P# ^void read_MSG_buffer(int *baseaddr);
0 P( t+ c" T! Ounsigned int count_copy = 0;0 [- o5 @( A7 p: E& F2 o3 m
# j4 [- a1 u4 V
int main()
0 G1 @1 c! Q( d{2 m: T/ K% |. k0 S. q8 D
        int fd;0 e% A* u, s! z, ?- J8 O1 w
        int *mem = NULL;1 Q9 n" j8 [$ a8 d
9 j  }2 V& U( R# B+ D8 j5 \
        if((fd = open("/dev/mem", O_RDWR)) <0)! ?9 L- e, x7 e$ q% s7 @0 z  }
        {
* o4 G/ Z# O& _% ^/ Z. w                perror("open error");# c8 l' x& s6 g3 V4 R0 i
                return -1;3 Z6 o3 K7 X& ]. t4 B0 ^
        }9 h- Y/ T7 v( L" S$ r1 D# S8 `
        * x# q0 R0 B  M
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% V8 Q/ o8 X$ H" x" S- w
& w& j: s! J& m0 A9 `0 ~4 z        while(1)
' z8 H! K! m7 B        {, s& j+ [8 D7 W2 \2 i
                read_MSG_buffer(mem);
$ C/ C( }! x6 j: Y- t        }                , ]) z% E' I+ T3 Q; K. C2 u
}1 T0 }0 _0 ?6 X6 y( ~- Q( a

  t" ?* z2 y# Z7 ^, v7 ~, l1 dvoid read_MSG_buffer(int *baseaddr)
" H& r( |& i" i1 R1 o: K( G+ X8 U{
8 j; ~0 E! P  P  b* S: f4 D4 ]: s6 ^        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 ?; T# E  u0 X5 R$ r  E  r& ^$ M# B! [; B% l  J. {& k
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 i. C2 K, r; q6 e

; d" A  U, D& Y# J& ^        if(pshreRAM->packet_cout != count_copy)
6 |& ~& `; X1 `* J. X# \; m        {' Q8 C* f+ x& Y! N4 S
                printf("a is %d\n", pshreRAM->a);
1 ~8 D  l* f8 F% E                printf("b is %d\n", pshreRAM->b);
+ [& p. y7 _; ~# |" y                printf("count is %d\n", pshreRAM->packet_cout);
5 ^% h, o5 Z' v                count_copy = pshreRAM->packet_cout;
3 U9 S+ f  z& b' T0 B& a        }# o/ G* f  l7 I5 j) j
        else
- V' U7 a2 o7 M  u$ t! w+ b        {
# z) e1 f. h) x6 z2 i4 t                printf("No effective message!\n");
+ N& ]; P) N, g* I1 Z& f        }$ m+ Y3 c$ a) \5 c9 O3 C4 x
}
' V/ R# F: |- s" b. w. C- a
$ x5 m. ~/ @$ j* p. T4 K6 r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 T* a3 t+ e' g7 F7 E! H- Q
; h0 G) c# s3 x0 o0 s
; R) s9 m( X0 A  b( I; b8 D2 t* q4 {) o( H. }% ?' b- m* D2 q
' M7 |: x$ O4 ^





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