|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 ~& I* I2 R) o9 f! h% |; u
; C2 ?' b1 b+ ^- _' i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> U+ V- c: c3 v/ L( a+ W, Y+ v7 i( z
#include <unistd.h>. w& P# _: `( x: {, m9 ]) T& U: E
#include <sys/mman.h>
/ q" [8 o# w) Y7 c7 P#include <sys/types.h>
2 m, y9 B- @$ ?9 ~, {#include <fcntl.h>
' A' T# Y2 ?' n8 F* C( F( _" r2 @5 b
#define SHAER_RAM_BASE_ADDR (0x80000000) : J0 h' c$ |% N5 N% n
9 V$ O- p% O- ?& u
typedef struct1 j( z! W m/ I) W% q
{: `$ a7 l1 |4 p% y9 x7 t y( m
unsigned int a;
|0 d) L/ U7 u; ?+ `, D5 F unsigned int b;+ W# Y8 V5 x. M/ ~* Q( M: ?4 a
unsigned int packet_cout;
5 J4 \5 g5 N' V! e5 s, e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; s. g! M$ S7 G5 E: r" J- ]6 S0 u% j
( t# \, H$ A8 y, k7 {5 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: h$ G& O& [( ?7 ?
unsigned int count_copy = 0;. E$ f1 f* G. m9 [- B) Y* V
- |! K" n) J( C+ M& F
" ^( ]+ G; G1 I+ Q* m5 \0 {1 C% n" z; ]int main()
- u" S7 O8 U, ]5 Q7 p5 o1 o{
; _, b, |# j6 F pRX_MSG_PROTOCOL pshreRAM = NULL;
' I2 a" [; `3 B- o pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: X1 y4 q, A9 h9 D$ e1 o9 { V. }+ B
while(1)
' Z6 u9 {- ?- `8 Z3 i; x {( P/ Y2 k7 j' [
read_MSG_buffer(pshreRAM);
% ?6 q% T" E/ Z! F: k }
' [; P) W8 J3 ^$ [& r, ^4 b8 Z}
: M% p9 p- u. Q* F1 G. w6 C" H/ f. v2 ~# @1 {7 h4 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- I" k" c/ Y( w0 j
{
- b) r4 t2 [, D$ \) z: d8 ] RX_MSG_PROTOCOL buf;
* x$ C8 L( N2 i4 K6 U; w " P. X4 m V3 i) q9 U+ I* u9 \
buf.a = pshreRAM->a;
% ?' x9 C+ N+ a3 g; h2 d1 V) \! J8 F buf.b = pshreRAM->b;
5 V* S0 R' l1 {- R- B$ m# R buf.packet_cout = pshreRAM->packet_cout;7 {) b5 I8 @: A) b' P1 c- o: l
4 Q, x5 V$ Z/ h) s8 V0 Z
if(buf.packet_cout != count_copy)
0 i( S1 F( p( T' B0 X8 k2 M, r {
6 K1 E1 N) C) e% y4 k9 N2 v printf("a is %d\n", buf.a);; j/ [( m1 H) c s, j r! m
printf("b is %d\n", buf.b);- }; T" G. v2 I2 a G8 W3 s
printf("count is %d\n", buf.packet_cout);, j+ O- J0 n$ [+ J+ w
count_copy = buf.packet_cout;9 [, F5 t7 \- i
}
3 B# R% q% P3 ]6 R7 d3 ? else
$ p' M: `& a9 B0 `& S# o {( v/ Z# b1 y+ g5 B3 \) F+ J! _
printf("No effective message!");8 S# ~$ B n9 I X
}
7 G+ w" @0 ^3 f+ c% j}
' b. U& P9 }5 `# O: R. ^6 J( B8 f, S
5 S+ p6 o" x8 Q$ Y% _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: A% i! x8 M4 C+ m* r, g" T2 ?
使用下面代码,对内存使用了mmap函数后:
( k# i; E6 k* q- _0 x#include <stdio.h>
8 T9 s0 V5 q# V) ]9 T# J4 O#include <unistd.h> P+ a- h* U5 X. t% H8 v: ~! N
#include <sys/mman.h>, T: G, l( t7 P" B# k5 c9 l
#include <sys/types.h>
- a8 [% s0 M8 N1 P4 \#include <fcntl.h>, z% m- n; J6 |9 B; j
5 N" ?( Z, o' u, G- j3 c
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 c& V5 t2 x7 l8 W. ?1 ?#define SHAER_RAM_SIZE (0x20000)
5 `, g: k0 g- |
# |$ G' V# s$ V/ e& e$ ]% d. [typedef struct% b. O' n3 r- n" d" e7 s$ Y( e9 \
{, `6 M& @% y1 x7 `
unsigned int a;9 }* n X7 a( M! @, {9 `" E$ k, g
unsigned int b;
7 u, u+ U8 R" F$ h0 x5 \' B0 y( W unsigned int packet_cout;5 s8 \: Z# A/ Z7 B$ b1 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& D' R1 O. ]- [. A/ G
) s& G, ^2 O: d+ P( @2 j8 evoid read_MSG_buffer(int *baseaddr);5 Q5 f0 J/ f5 N5 c
unsigned int count_copy = 0;
! j( G4 ?) V7 R+ u* p7 b% M# u
3 z% n3 q& M1 B5 nint main()
O( [: u2 d* K* k3 F0 d! d& f{0 C# {$ i6 y; s+ u
int fd;4 n& I4 g. }7 t6 `, h
int *mem = NULL;* J8 F) ?3 y3 A2 \
- l9 S* r: Z1 }: V4 Y% m if((fd = open("/dev/mem", O_RDWR)) <0)
; m5 {! p- v6 O# ]& @ {2 y6 Z% [4 N* t- C) U) w
perror("open error");4 O& y! z4 D! N$ n
return -1;
. b$ ^4 L+ f1 c: L" u5 q4 Q }+ _0 ^ D+ x. ]) r2 K! s
_* l3 w5 i5 ^3 Z. Z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; S( }3 c8 S; @# P, @1 q9 }0 f8 j# m# L# n
while(1)
- T9 J! u! w( K9 a3 k: I7 t {
/ t6 H; [/ P0 c: I# I5 u7 m read_MSG_buffer(mem);
6 ?! u* R% H; I# N } 1 e1 A* J0 I# w5 E& Z9 Q
}% h9 ^- }' z) X. j& R1 o
$ p) K& g- S7 l- v) \& v
void read_MSG_buffer(int *baseaddr)
2 D# F& @ a0 }5 ^) u6 n{
# ?$ v( x' @0 Z$ v$ S5 p pRX_MSG_PROTOCOL pshreRAM = NULL; g9 @ G1 e: a' Y/ C( Q1 G
7 J$ f, F, {% G. F pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ U; k9 ^# `: w. a1 f' `3 W, g' l
- r$ q3 ?! h3 ^( V; { T if(pshreRAM->packet_cout != count_copy)9 t V5 P V8 y* p* |3 C% q4 a
{
$ R% k. T% \, S6 ~$ W' d! S printf("a is %d\n", pshreRAM->a);. x* ?5 P( W& G9 q1 k8 ?$ ?
printf("b is %d\n", pshreRAM->b);$ P- ]/ q1 L" W6 I9 v
printf("count is %d\n", pshreRAM->packet_cout);: F* q" e$ g1 H* _1 i
count_copy = pshreRAM->packet_cout;
- i; O, h- C9 v! u% G }$ @( G8 O8 s7 W" Z" Q; S
else" |! X% s, E6 r* U. I# s m6 U) s
{2 b3 U- K6 a' x- I# W% g4 Q
printf("No effective message!\n");2 O" f$ P, F+ X$ l% K, K6 ?2 k
}3 ~3 ?$ o$ g. j. ~5 L5 |& \
}+ r, y3 k" j" @+ A$ m, a
- A3 |' H5 N& t% f7 V/ \" I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 y& K. \4 N. |5 l8 X+ c. R( v- Q& o2 S U U' M6 [+ Z/ N
% C0 h5 R7 q1 N( l8 n8 M a* R2 _
. ~) l" J D ^4 F9 U8 H4 b
|
|