|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 t8 v7 W7 }% H- }" M9 R
! e, q6 u" }, \4 a* lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) M7 m: D5 G: s6 i7 b, x
#include <unistd.h>
& ]" {8 s/ m9 e+ S5 E- g#include <sys/mman.h>; U% a7 x# ?! A: h* [$ F
#include <sys/types.h>: ?$ {6 Z5 D0 w8 r% R& j# Y# }
#include <fcntl.h>
5 _2 b) w& c# Z2 [; r' B. x7 U; H0 w7 e$ s
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 V0 S! @: o8 ?# u- z& K# T3 S& y! m- [& h
typedef struct2 B% T, s; u& n! f- L
{
p4 {4 v! ?* {$ {, t unsigned int a;8 z- @; h& f( v8 j
unsigned int b;: U% Q) G) D; s" t% B$ g
unsigned int packet_cout;% b, x. U5 l" t3 ?3 B: a+ i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* C r7 i' ]/ n# N. P" T Q
/ G) y R* r" V$ A. p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 M9 w# c0 A( p4 u g$ {* u& Eunsigned int count_copy = 0;- h: s+ ?5 _) y4 n6 Y! I2 l
2 L, D' q( x- y7 K+ P
! @4 s2 o$ Q0 Eint main() i- T) F& y( T5 D3 F3 V: W/ M! R
{
) p( \" q k; Y4 w pRX_MSG_PROTOCOL pshreRAM = NULL;
) `- d1 R2 \1 E3 t9 E7 C I1 n2 X8 E pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
i1 F/ g; O) I% E
+ m& y0 j, y- ~0 @* D! G) i6 O0 ^ while(1)3 C1 J1 A# J% m q
{
6 ^0 Q1 z; l& M w9 g8 K2 A" N8 P* B$ ^ read_MSG_buffer(pshreRAM);
" m3 P* _' m E: g- z }
X, t5 A% _' k/ O2 q}8 ?" k3 j0 B1 J8 W
" c6 z7 D1 m+ U! J. a* ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- f; d4 C- ?* X+ G: e+ n{
& g3 _! \, D2 a, c. C( r3 P RX_MSG_PROTOCOL buf;
: I- i9 L7 ]$ V
( I1 N$ E% \- M. A buf.a = pshreRAM->a;
7 G1 Y$ d9 |- n# n9 D J buf.b = pshreRAM->b;
5 V$ `, B/ P. G H! f: }; O$ B: u buf.packet_cout = pshreRAM->packet_cout;
- ^% d+ D3 C1 Y/ L! l! u! j
, A/ \, h) z$ W/ I' N5 ~ if(buf.packet_cout != count_copy)
1 P9 w8 K" U, n: k/ `0 T { S* y8 b I- h4 \$ `" w p, W
printf("a is %d\n", buf.a);! c) ?7 r) v" y2 A% r; v
printf("b is %d\n", buf.b);
) T% k+ x3 e6 C5 T printf("count is %d\n", buf.packet_cout);
+ I! i/ m0 x$ s count_copy = buf.packet_cout;
- u& b2 g$ ~1 D/ \$ g! \ }
) `" z! F+ `8 O# w else
; x2 ~ T" a& p& X {
: T Y% f3 W/ F% W W. Q- W printf("No effective message!");$ x2 j) k; `& a2 @
}
2 E; E- K8 N- W( {: b0 G4 K}7 m4 |/ p$ i7 F: N+ c
' q3 i8 R! U' Z M
8 L( ]/ E$ ]: y5 c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 D1 W3 W/ |) T/ J5 [# n3 v) ^: w使用下面代码,对内存使用了mmap函数后:. Q+ Y( Q3 K% y9 j- ?) z$ _4 K
#include <stdio.h>
! Z# @9 X9 M7 Y$ W7 U% L% ^5 }#include <unistd.h>
! d w- |4 T6 E0 D6 `3 s#include <sys/mman.h>/ W* A0 v/ F) ^* S4 {( r* d
#include <sys/types.h>3 q$ f7 U$ o0 y6 s t
#include <fcntl.h>+ U3 J' G9 A2 K
) @5 F: k r( | @
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 t! a3 \; J, G! R/ E#define SHAER_RAM_SIZE (0x20000)
& f: |$ y& z2 r' k& D& u
/ P" H+ u: e% ]( H- U/ Q( {3 _& X) Gtypedef struct0 g4 m' ~( N8 `6 \$ m. B% C
{# }( U' T; p2 a' z
unsigned int a;$ G8 a; }9 [4 w. T
unsigned int b;
" r0 k0 N, l* T unsigned int packet_cout;
[6 x5 [& I7 r! H a" w& o4 M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 h0 K3 m l" F& c
( ~" b, `: w) e, }: H9 [5 R
void read_MSG_buffer(int *baseaddr);
+ U4 } k$ ^# G! S4 e$ T" T; [unsigned int count_copy = 0;
0 Z* i5 _6 w# R+ m6 l& r& B
8 y6 V- d# T0 u# T/ ~int main()
+ w, G+ v2 W$ [, E4 u/ F7 X% n! x{: S5 f3 v, z8 h5 T3 p) t
int fd;
: V+ m; }0 o8 ?/ P( L) X" W int *mem = NULL;4 R" r# m) P! a; G0 O- `; n
4 [: _; `! |3 t1 ]
if((fd = open("/dev/mem", O_RDWR)) <0)* q3 l' U, W* W4 f( ~# u
{# A K9 M2 U# v( O/ X
perror("open error");9 ^5 ~$ F* r" c- d3 M& Z" [6 V
return -1;, B/ {5 s1 P# [! \( P9 b* T8 {
}
+ H Y' T# |- { z) L2 ` : O( s; _) t; ]# {
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: C6 G: B3 h! _: l u* J$ N- W
0 R) f0 A# T0 L. I# ?, ]
while(1)
% h: [9 [' {' ^) L2 z {
7 [4 w! i8 @0 ], @+ f0 z. O read_MSG_buffer(mem);" E1 j& I9 h/ u x: D1 }9 c) D
} # {0 j1 @5 ~. K! q) m4 f( \) M) I; z; L
}
. q. { n# ^7 S- g6 F4 d0 c0 Q% Z, M6 u0 ~7 P4 K, A
void read_MSG_buffer(int *baseaddr)
; G' W4 s1 P1 _{
8 j8 c+ B8 d2 R% ^* U; t$ d pRX_MSG_PROTOCOL pshreRAM = NULL;1 |2 n. N- R0 \! F
6 E0 P& R8 T8 T9 V: _- O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( {0 D: E+ s: B: |5 P" X+ s/ l* ?. c7 F6 x
if(pshreRAM->packet_cout != count_copy)# J; j' U# k! z' _
{
+ i/ o* _6 A1 C( k' b printf("a is %d\n", pshreRAM->a);
9 e0 d! d- _8 E" R; \- j3 } printf("b is %d\n", pshreRAM->b);
) P: w1 T. o, b$ f( C$ I printf("count is %d\n", pshreRAM->packet_cout);
' s4 L0 |# P2 H! {1 O3 g+ N% J count_copy = pshreRAM->packet_cout;
& z5 x0 r0 f* y' }9 Q+ n" `" I }$ p0 H! l9 n7 m5 z/ |
else
6 e4 x3 G% W; b- }/ E4 _$ E' I# X {) r; a5 ~- T. N- W# D
printf("No effective message!\n");
2 u9 C S% i ^+ k }# }& D8 q; j( N7 Z% V' ?
}: B" n/ \& N" J# o
7 R" _: `! W! y, \/ [' f* L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! h. ^" ]. ~5 ?, B& c8 c+ Y5 `$ ~8 R9 x# ]
6 c% V2 U' W7 W0 k; ^1 G" F& u$ J9 a( i
, Q. C; G+ p1 k: R
|
|