|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) h4 h' B5 `# Q' c* ]+ |/ R/ y" G7 @: M2 a ~4 f5 r9 N8 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ c" s* m5 n: V1 B' d1 |% P
#include <unistd.h>
4 ], S% n+ E) J: Z9 j#include <sys/mman.h>+ z1 Z3 }4 e0 [+ R- J; V9 P
#include <sys/types.h>% @3 h3 d, }0 _6 U0 @
#include <fcntl.h>; i% K) m* |/ ]4 }* a$ p. S* T
& u9 `" D( G5 R1 L# A#define SHAER_RAM_BASE_ADDR (0x80000000) 5 Z8 O4 J# S3 Z9 K7 ?+ \
9 f$ N1 \# l. m# i( U- ]typedef struct
* i7 I1 j8 H4 f/ P! N& I: q- ~{
. {3 q. }% n. Q0 ] unsigned int a;
7 Z. I0 \: u: H9 r4 U; X/ t7 ? unsigned int b;4 P9 p& t) V2 v& l' h& K
unsigned int packet_cout;
9 X4 Z6 H+ Q7 r5 d2 O7 a/ L2 b* w, P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. z! G# G5 v; w0 p( A
: A2 S$ n% v: z: F3 ~8 H6 Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& W% I7 ~* a* q! X3 l- f2 V, i6 punsigned int count_copy = 0;
0 w+ Z. V1 U# w2 C+ F* P) v; X, o$ J+ ?$ | |
6 ^: u# T. Y7 s; R: s8 h$ Lint main()
. b( \8 ~0 `8 \& u{
9 F0 }2 s) T( Q0 m/ M pRX_MSG_PROTOCOL pshreRAM = NULL; E$ L# w+ P8 `* r4 k, S v$ ], M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, x4 r# ]! m! a% r- Z6 X
/ Z0 Y" v( \) Y1 o7 V+ @ while(1)
( [* c! y9 g F0 |3 f {- h& @$ t: _; i
read_MSG_buffer(pshreRAM);
% a1 b% E; [0 H u } & W/ v* b; Z% n2 ?0 l
}
3 p/ T, A7 x3 D( _0 a; B u7 \& F0 t, v3 W, n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 |* f) q; W- A" a
{3 [9 k" H* h( a5 k( l
RX_MSG_PROTOCOL buf;
! g: \( F b- |
( ~3 Y9 ^" ]' f; k3 I* ]# V. l# O buf.a = pshreRAM->a;
Q6 M( z, T9 G6 p1 Q; v: R buf.b = pshreRAM->b;
% Z! @5 b( q& T) l1 ?/ q' X buf.packet_cout = pshreRAM->packet_cout;
" `! O: c$ m% K7 O8 t % ]$ d: v- e2 H4 @1 I+ R+ {
if(buf.packet_cout != count_copy)
; z1 A% c% L# E( d9 m; V$ g {
3 L3 w* w4 w* `- o, b printf("a is %d\n", buf.a);& Y6 k6 ]2 [( L7 d
printf("b is %d\n", buf.b);5 L* z: F0 \! Z4 }9 g
printf("count is %d\n", buf.packet_cout);, R0 I6 C3 i7 }# H, C$ T7 r
count_copy = buf.packet_cout;
' h l2 ~4 u) V4 q0 g% t/ J }* |1 Q' e+ W- O+ V& O
else
_& v' t- ~" F; N' m- R; I {
5 Z0 X. X7 M3 m0 l. u1 H printf("No effective message!");! u- c F6 n: T/ y
}/ v0 i4 r" P( }8 g& a( ]
}
% |* Y% b" w/ V2 A5 _$ X' ?4 N) L( C p
% `9 U, g7 q- A% L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" D, m/ w j9 S
使用下面代码,对内存使用了mmap函数后:9 b: L7 [6 e5 G
#include <stdio.h>
$ N- }4 ?/ L. [( d v, g#include <unistd.h>0 s5 t! o5 s$ t7 i F8 `
#include <sys/mman.h>7 N2 C1 J8 d v: `
#include <sys/types.h>0 W7 r# h$ k5 [2 m, ` l
#include <fcntl.h>' h/ P$ J* u8 R4 Y# b
0 n0 D7 R8 u; o: j2 @2 M. ?9 h#define SHAER_RAM_BASE_ADDR (0x80000000)
7 j8 G0 N) L+ }) e#define SHAER_RAM_SIZE (0x20000) ' _1 Y) b1 \9 L$ d; w4 m- E5 @
! l1 ]7 w; l* `( d: v. o- X
typedef struct% S$ E, e& E1 Y
{* t1 g. J0 H2 I
unsigned int a; Y! t' q" q: q+ J( ~
unsigned int b;$ S$ {! y% K& `9 m5 I
unsigned int packet_cout;' \) f( o, d# M6 u' o' \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; J0 R: \. s6 [0 `4 K% T
& d& {3 s+ Y# Z3 c4 Ovoid read_MSG_buffer(int *baseaddr);' a# Z! X' X2 @8 e2 W
unsigned int count_copy = 0;6 B+ A/ E# M3 p! G: V3 Y% A
) n- n) N9 A; i
int main()' F2 N9 U; e8 f% B% H
{
7 X/ a: _- z4 U7 y* u; o int fd;
& `2 M1 k, c+ q B+ |1 K0 u( } int *mem = NULL;/ [) |, a t7 K, A% X
5 c0 K9 B5 g8 t$ A* M6 a
if((fd = open("/dev/mem", O_RDWR)) <0)* H) b3 x* f. y ?8 G/ K
{
~* R/ H5 n' t3 [5 K, v perror("open error");
4 p/ C$ k+ G. ^+ Q+ d, L) T return -1;7 N# |0 q" N# e
}
( f0 w0 b( ?2 N+ ?( a# e 1 `0 `9 f% y2 t J6 s
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ p# a4 ^) |( S: M
9 \4 C! K% \ Q, T2 m( [ while(1): w- D' S* l. t- G: Y
{/ V$ {2 M% n) p2 `8 R
read_MSG_buffer(mem);
$ h. j$ F, T. O }
8 F* R1 n1 g. u1 z8 u; Y1 E- l}9 D8 @4 Z( Q. R+ E n, Y& O* t( s
' U6 [# X' w. zvoid read_MSG_buffer(int *baseaddr)
. I7 k7 _# |0 V6 x{
# E" D3 P; C8 v, V) Q3 K pRX_MSG_PROTOCOL pshreRAM = NULL;
8 _" z9 m+ U! E/ n l( v
! j0 t! F3 O' q, v4 U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; S2 q; E' {- O
2 _) ^+ e0 F8 u; k if(pshreRAM->packet_cout != count_copy)
% i* U( j6 {( P- \2 _+ d& \7 z {3 J& M$ F- W) g# H
printf("a is %d\n", pshreRAM->a);
6 u i2 L& L, z* e6 T printf("b is %d\n", pshreRAM->b);, S& C3 Q8 ?. h/ B7 ]7 [
printf("count is %d\n", pshreRAM->packet_cout);
- h' u( A. a% ? count_copy = pshreRAM->packet_cout;, p- \* I9 F0 Y, d4 W
}+ j: L L% n, X
else
, f7 z/ t+ O9 m% ^( x {
2 j2 z1 P; z! o printf("No effective message!\n");
% ~" n" \3 ?6 S9 r, M" U9 b }
) l1 w9 i1 Y! a1 x}
' Q- W# s8 W& Y# ]3 [& e! f) o5 r/ I% j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 B3 f S n. f f5 B
4 L- c2 W6 q8 G2 M
Y6 U }+ X* t' c! U: P$ z) |) [6 u5 j/ i9 t' g
. f7 P! @$ s: d |
|