|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& q, T: w- c3 @, K9 ?, _* x0 Y; {; N' k5 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> Q3 T, r/ f/ G# [* d$ Q2 a
#include <unistd.h>
& E5 V1 b8 B: z& ?#include <sys/mman.h>
5 b& A- Z2 G) y/ P1 J0 I3 L#include <sys/types.h>
- K* ?+ k- g/ |#include <fcntl.h>, W4 I4 e: T5 s
! ^; F/ @* M" D- _9 u9 L
#define SHAER_RAM_BASE_ADDR (0x80000000)
_- Y( ~. F! |1 S; s! y d1 x; Z8 J, n# Q% l$ o+ H
typedef struct
2 V o% J: o: ^9 U5 F- C! y{
5 R% T! V6 ^! s9 P8 O unsigned int a;
3 [# A1 V( ?1 b1 U* V/ ?0 o unsigned int b;3 l$ d. Q+ G r
unsigned int packet_cout;: {" B( n* I( b. T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; L0 l! R1 J% ~6 S
* `/ U3 ~# v3 Y# _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); l' a6 N. [* ~5 {: l9 K+ {
unsigned int count_copy = 0;. G4 ~. `, }; j) L7 w
/ |" ]3 F# j( ^/ h p
! L9 C p1 z' |* j* U- m
int main()
! L: t- I* ^( y. S9 G5 P{
. w9 Z% {/ l) t. t% K pRX_MSG_PROTOCOL pshreRAM = NULL;$ g g2 y: {" |! a# _
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' k0 B$ _! l/ ^% ^
0 W( W' S' a. S I
while(1)
4 a" I8 e6 O+ W6 ` {
0 h) z. K# ?6 R" i read_MSG_buffer(pshreRAM);
5 J7 w, n p& Z- e } : o$ R! I2 _: N
}
; ~: x0 h+ o6 z V/ \& I# z
M7 j1 o. T7 \/ Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: _9 s2 `. _! @5 n; Q{- S$ I* Z' F y- \- ~4 Y
RX_MSG_PROTOCOL buf;
! f9 r, u( ^/ A& @/ a* x
( r2 [" S/ F+ T7 Q buf.a = pshreRAM->a;
0 V0 o! C2 ~+ i7 @ buf.b = pshreRAM->b;. d( F* r1 V F) m) _9 E+ `, N
buf.packet_cout = pshreRAM->packet_cout;
; Y* z* O1 y2 [4 B( ` 4 b# ^$ |2 g: I8 ^: }5 ^& g
if(buf.packet_cout != count_copy)2 y$ L: M/ m9 ]7 R$ z0 E
{
0 l' w& V; I* e) r2 x/ u& b printf("a is %d\n", buf.a);
( W K- Y& _9 o/ \' T6 Q2 D printf("b is %d\n", buf.b);( |& [; U3 h- h" T
printf("count is %d\n", buf.packet_cout);
$ A' n( o& w' ]: l l4 m* l count_copy = buf.packet_cout;4 D. @, m1 |2 g* h
}
% P: {% L6 U h else
& w9 {. Q! C; e- Z) s+ V' h. a {, D9 ?6 E2 q! a2 k0 r
printf("No effective message!");
4 h T$ z2 M |1 F# f }
, a5 r, C; c9 \- q( z}) k3 A: V" z( ] d: ]6 ^
q; b, a6 n2 X+ X% s2 \% u7 t/ L$ x& m4 u( M- s. Y, l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: }) z$ F5 M6 _7 a9 w' R
使用下面代码,对内存使用了mmap函数后:- F1 y# B4 z5 R1 l) W" d( y; ?7 `
#include <stdio.h>
3 T! _; t& V* X2 s9 T0 O( N#include <unistd.h>
t/ h8 F" Q+ c( I, N; r: H- O/ i#include <sys/mman.h>( H1 V( }+ d- Q
#include <sys/types.h>
9 }9 N3 U" E0 l. U#include <fcntl.h>
3 t% o/ X1 `/ m& v1 J5 @
q4 | s& o! C+ O- y+ q#define SHAER_RAM_BASE_ADDR (0x80000000)" v7 g$ P% {0 f( i/ W$ Y
#define SHAER_RAM_SIZE (0x20000) : N" G4 Y2 q. g' ^1 f6 ]
4 Q: ~; N4 S8 D7 W. ~' S- Ytypedef struct
) I" ^" E, z1 x( I{0 N- q+ t; W* J$ h
unsigned int a;. Z7 F4 ]% f0 |$ j) C
unsigned int b;
% ^8 C. n- Z ?' ^5 S7 d) F' |( M1 z! \3 j unsigned int packet_cout;7 {; j& B) Y/ F2 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& y; Z8 w+ |4 G+ u7 x. p- p6 v/ g. ^6 K' p- T6 ^4 i3 v4 C
void read_MSG_buffer(int *baseaddr);
8 n! J3 @) Q; U/ ounsigned int count_copy = 0;
S. J3 C# u: v7 o" K8 z& N
, X8 f# z9 t8 V; @5 T4 N" ~int main()# l) P8 c8 E: G! y! Z- b! ~
{0 P7 s4 a! ^6 |& A5 O0 {
int fd;
. I# ?* C1 `7 W+ c2 N5 O0 _/ Q int *mem = NULL;2 Q- A6 g& Q; M4 s5 F, {) `
% M! f c" k% f8 x9 o8 @6 F# o' z
if((fd = open("/dev/mem", O_RDWR)) <0)
1 `) o* V' p& _" }0 e {/ [7 |: l% c+ O$ D- K& e0 R
perror("open error");0 v& V% i- @& k/ c1 [4 w
return -1;
3 ]$ q, D5 j9 f6 e/ y- L+ }/ I Q l }
* Y% {0 T3 J4 K5 k H" e0 u# Q2 ?2 |
* a# i/ u8 i* W1 E2 G& @" _. n mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. D5 @8 d% f4 Z, |+ |( c" f; F0 N
6 p7 S, v5 ^2 i$ ^+ B while(1)
* `! F, h% a/ J3 W( z) I {- g* r; d! j9 e3 S
read_MSG_buffer(mem);
7 ?+ N4 m+ H1 u" S }
3 @% Y" o3 l; |: c3 |}
o$ B! w9 N, Z: K8 O$ M z" C5 y# ]( u/ c% ~
void read_MSG_buffer(int *baseaddr)6 c& N& a; d0 E+ c/ T' b+ ]) I
{
$ e. U' R5 n* F, G/ W pRX_MSG_PROTOCOL pshreRAM = NULL;; N9 d' i9 Y; C: |7 S/ F1 y$ ~+ Q
3 z* t L' E$ i" C" g) X( e
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- X. `! P9 K# k% r" u$ d; S8 c8 A
: ? G# m H- v9 c# H
if(pshreRAM->packet_cout != count_copy)
' t! t7 C0 o; g* Q& ?( D {
' T. u, N9 l% V/ C8 [ printf("a is %d\n", pshreRAM->a);
9 ?! o6 m" h3 _5 |+ r printf("b is %d\n", pshreRAM->b);; }# e( v) q4 f
printf("count is %d\n", pshreRAM->packet_cout);2 z7 [1 @- ]% G4 K
count_copy = pshreRAM->packet_cout;. H7 R* o# M) I% L; l/ X6 i1 y2 }
}
. |' n1 ^1 s$ S5 D# } else
8 u4 T$ O7 B& f/ l: D, Q {
% K$ S. m) \& R- }4 x printf("No effective message!\n");
+ s1 W; W8 Z7 `0 c }
W/ C7 W! e9 ?}% y# R6 A6 R3 T
9 V C: X, c& w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? P7 I; a+ t5 S+ j( d1 P
$ t; n. K7 s. K. T, z, }6 K' |5 Q- [
/ [1 ?: d' {) t6 B. h; ~! g1 K# Y: \, i% [) H
|
|