|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; f1 m, a5 {6 ~0 A2 i2 l7 G; ]+ a8 ~& u. |- q; j F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 X4 M0 J3 X! W6 U' l0 Z0 ]
#include <unistd.h>; Q) A& b/ x! z$ Y6 Q
#include <sys/mman.h>
2 e% h- |1 D4 G* o#include <sys/types.h>
. N, l4 M1 o2 p% \- X& f#include <fcntl.h>6 l2 D2 F& m' I" O
( m' p6 P( ~/ w#define SHAER_RAM_BASE_ADDR (0x80000000)
2 |: f" {0 S& R% o/ b, r, f1 D) o: S S( Z
typedef struct; B2 r% U4 `0 }* }* A3 J6 W& Q
{
% w) D r$ q# N( v- \$ T unsigned int a;& X% H) W$ r5 K& Y; s
unsigned int b;
; q; w) h/ _, s( K, c+ E6 X: h! W8 v1 E0 } unsigned int packet_cout;
% C/ {; _" O- O. R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ^+ f1 Y+ R# w* @2 @: b& P7 @6 a4 C5 P) x! z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ V7 V; V& C0 H1 E
unsigned int count_copy = 0;
& Y' {/ H! v: s" f3 ~
' \: l' Q; W1 q. o- m( q- I7 r. q5 ]
0 A+ ]( Z# h# jint main()' c+ z/ i5 n; r M$ d! H8 E9 Q
{ {0 x+ N9 Q: C! v/ m) I
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 r7 S- C, l' R. ^' N pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; p' Y r3 k- k, i( H( K& P% o+ T5 X2 u" \- R" v
while(1)
0 B* O& n+ O0 N- N/ q1 r {6 ~$ N: I; r7 l* v
read_MSG_buffer(pshreRAM);
# T% _! e4 `. o) i, ~ } / w3 d6 p! o& m, g3 K; R$ z
}
! r6 ~% x; I- [* S4 _! b
0 r F: c: A3 r$ cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 f, ?* D* F, r0 }! h M
{
1 H/ U# D% b( `0 ]: Z4 ` RX_MSG_PROTOCOL buf;
2 a% N2 I% q3 v' S2 B" U + l: X8 j: f( s& t, ?
buf.a = pshreRAM->a;
" J' i) E: {: Z) F5 d4 ~' V buf.b = pshreRAM->b;$ b6 J! `( q& [+ \6 X' a' x7 ~! R
buf.packet_cout = pshreRAM->packet_cout;
. w( K+ u, F1 k* d- V" } b# Q
7 v* B6 B+ P W. m- x5 i if(buf.packet_cout != count_copy)
7 P* u% ]7 e, Z7 h, A {
0 |5 k. L, P1 h2 }: i! \* ` printf("a is %d\n", buf.a);
5 D0 x. K9 y$ o" @3 B2 K! F printf("b is %d\n", buf.b);
$ L& ~5 j9 H! S: ] printf("count is %d\n", buf.packet_cout);' H/ ^# h; e- L1 C9 R: z$ [* B
count_copy = buf.packet_cout;! \. }- `. o* E' W
}
9 n' T, L: A# l* D+ ], K else
! d5 f0 C0 ]* ^$ h {; ~* B ]8 t ~" j- Z
printf("No effective message!");
3 |+ Q/ t/ S5 t$ r) Z2 o N: f }% x C" j' P4 q5 \ G0 {
}! _ x5 Z, v" Y1 o* ] ~
3 b1 ~. B$ L$ }; n; h9 ~
$ p6 |" ^6 ~: D' z& G0 I! D2 K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; I3 k' q3 Q% h3 Q( A, |
使用下面代码,对内存使用了mmap函数后:. r% U% f6 M8 ]6 q
#include <stdio.h>, x' H( ]$ D1 Z1 \" {! M
#include <unistd.h>
% z' i$ f; V R1 G7 t1 X# n* ~4 e#include <sys/mman.h>4 H" o. s+ C; N8 f! R8 j; H1 T
#include <sys/types.h> W* s1 A$ r& g# R
#include <fcntl.h>* A4 j" q- W* t$ G
9 B, Q, g* @/ d+ s#define SHAER_RAM_BASE_ADDR (0x80000000)& r! Q$ n# j' a0 @
#define SHAER_RAM_SIZE (0x20000) 4 o5 S. d! b% j i/ m" u; m
5 s. P& w, o z( ytypedef struct# N. o9 j$ s4 Z& z" N0 D
{4 M& r I- q7 c( n4 g- V
unsigned int a;
6 a c7 e- V; x4 V# _' w unsigned int b;8 \. ~6 W3 {: E
unsigned int packet_cout;5 D) I* B3 P$ E$ n5 h. c+ u( R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) r* u/ R- g4 v) U
& w; ^5 l. `6 ^1 m0 N
void read_MSG_buffer(int *baseaddr);* L+ p5 w( p/ f4 U$ N5 C
unsigned int count_copy = 0;
! p$ x: Z8 ~0 T; R! g* R( M' J( [* y0 i$ W9 i/ _) p4 ~* w9 ~3 N
int main()$ n' _: p: B, ]3 @9 `+ n$ [! o, Z
{8 d9 z+ _: w. U
int fd;
* t( z3 A( {1 m* r: x' a int *mem = NULL;0 y- j8 ?" w @$ X
) w3 l$ P8 s o6 v8 p$ d. U; `1 ~1 v- m
if((fd = open("/dev/mem", O_RDWR)) <0)
! G+ c5 v) r) v) i$ L9 k {
: A I% E' C1 n% j5 ?3 Z8 M perror("open error"); X' u' Q3 d' Z
return -1;5 r: n, }( \1 J1 N. K2 O6 H
}0 ~1 o) u- b N. I
) H/ V1 g5 m; L4 ? mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 ?7 B$ f5 A1 Y7 K2 b9 [. F, |8 ^* w
while(1)6 Z$ Z1 X$ X6 V" N8 M3 z e; r
{
' j) v; x! ], H: m8 Q# P read_MSG_buffer(mem);4 N4 F5 Q# C2 u: Y1 t3 m- }
} ) j& Y- i+ K- n3 U* X4 ^' ~
}4 Y; m. Y$ f3 a0 c$ z4 E& N
I; L+ G* v0 Q. {: F
void read_MSG_buffer(int *baseaddr)
8 a8 F0 \" y- p H{, j* z1 f" ^3 ^
pRX_MSG_PROTOCOL pshreRAM = NULL;& L/ Z& }4 Z6 N" Z
+ O8 m* P4 r3 U" J$ \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( Y5 o- H! K9 v5 Q& E3 Z' T& j) @0 V
if(pshreRAM->packet_cout != count_copy)7 }! k# v9 _" ?
{
1 R2 u) A/ I w8 d8 R2 b printf("a is %d\n", pshreRAM->a);, M6 C5 R4 w" \6 h% _ H
printf("b is %d\n", pshreRAM->b);# n/ E0 {1 I4 a! `! m8 N9 F$ \, w5 H
printf("count is %d\n", pshreRAM->packet_cout);
6 y o7 K$ A& T! G; Y2 |5 ` count_copy = pshreRAM->packet_cout;
% i' c+ ^) T( _. v% x4 n* B }
- F& y+ J" d9 e# q% ~7 S else
9 W- T( e- x) z( @, N1 Q0 ] {. {# T* t' I; L; s* K+ h$ @
printf("No effective message!\n");. |1 Z, W4 Q# o
}
7 B: E8 j1 s+ r2 A}
$ w1 ]+ S; o) q _' C" ^" t: ^5 K$ x. F# O& b( I0 W/ `' {! y9 o0 ]7 T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# _ m4 D m9 N" @3 j
2 ~+ |$ h! f9 \* k- [/ j8 M
* f# U A9 e! d: {/ ~ h) F9 ?, K. a- n9 a! B9 H3 B$ F7 |" J
! g9 j: g( d( ]. z |
|