|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# |0 X4 {: d% N9 r6 h/ c* Z2 x \! u# e5 X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 ?1 B+ |( g0 K& C#include <unistd.h># B, |8 i& x4 ~/ B& L
#include <sys/mman.h>
) B$ M$ @# F( H#include <sys/types.h>0 x- ?& {' I7 g. A) K2 A! E
#include <fcntl.h>) B6 L# e) d: |, g' i3 o ~
+ e6 {& f3 V- ]# k: a! ]" h9 n; Y) {#define SHAER_RAM_BASE_ADDR (0x80000000)
; ?" S2 O1 Y$ X4 M/ _+ F
. \$ b. |: Q: t& M) U3 Otypedef struct
5 k" o5 T. J5 z{
. {2 j5 ^& W; D: S! o unsigned int a;
* v4 k" y& R- D5 r7 Z unsigned int b;# P5 P) `! g1 [9 {3 o
unsigned int packet_cout;3 g- I7 j( H) @; H N' v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; v5 L0 m9 Y' z! {0 |4 q
/ J4 `# T( |, ?' l: B$ `5 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ o, s2 ]; y t w' wunsigned int count_copy = 0;2 Q) T/ |& [* {0 ~5 A# N
m! ?2 ?4 W& b% }
# w& d+ p# E/ X y2 i ]
int main()
6 `. I$ D3 z8 ]& W$ ?: g W{( V. D9 \) P' k; |# G
pRX_MSG_PROTOCOL pshreRAM = NULL;8 L+ `0 O9 C2 U2 s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, M& L; e6 `8 E" o0 X& f
. a( o. B, d, m while(1)
' Y) r/ Z) `! j+ k% n {
' R" f8 f( E! [' l read_MSG_buffer(pshreRAM);
- \% h4 N* l6 n ^( D } 5 \2 N4 g( N( T- u8 w$ S1 n h" _
}
' F U# J- I8 |9 V2 [- Y5 D& c* o5 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- u7 C. \/ e2 E) Q; Q+ J{2 R0 ]( x8 S2 ]5 W
RX_MSG_PROTOCOL buf;
2 S! B* S5 e" C Y 3 p G' ^% [# b2 ?0 R: m0 a! Q
buf.a = pshreRAM->a;
: F. w i* E* ?% \" F9 C3 f1 W buf.b = pshreRAM->b;
8 v! r: k& @- q; N6 ~/ V buf.packet_cout = pshreRAM->packet_cout;9 J4 j6 V5 u+ z, X$ R5 T
4 r& Q. k% n5 r. w1 I
if(buf.packet_cout != count_copy)
; n" S8 G8 s1 I0 B4 r {' L: s' u: p. A
printf("a is %d\n", buf.a);/ w4 G: ^3 W: R$ v- b
printf("b is %d\n", buf.b);
4 i7 ^8 _. N# {0 Y: z; _ printf("count is %d\n", buf.packet_cout);
/ _4 X Z3 s8 v" R. ~9 { count_copy = buf.packet_cout;
7 D H( C; u9 X. d N }
5 l$ F( H9 ]1 u: P& K* T4 o else
9 H6 B7 o" F7 ~% U {: T. u2 R6 c& `5 q7 w/ ]% q
printf("No effective message!");
! D8 A! S) b& r4 o8 e! q/ }2 o }$ ~! u. ?- H, z
}! N) G% x, N+ w$ E* L
# s1 _! V' o' S
; j* R1 Y6 y. |' Q7 c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( D; P; b6 C2 H, a/ |/ b: t+ H使用下面代码,对内存使用了mmap函数后:1 }7 p, O' ?# V- m; c& U& D8 Q
#include <stdio.h>
# s$ M6 S: {& j6 p0 W- i3 p#include <unistd.h>
/ p' V& }) B0 {# q; `) ^. k#include <sys/mman.h>
o4 O: k! v7 m* R6 O5 O$ n#include <sys/types.h>
; ]* O$ V$ G$ I3 v$ D2 h#include <fcntl.h>
6 [5 b6 g6 ? `2 |/ S
; j1 z: p. x0 M# K0 k; B#define SHAER_RAM_BASE_ADDR (0x80000000)
# j! i3 o8 P- y#define SHAER_RAM_SIZE (0x20000) . \8 b" \+ F0 B- ?' b r
$ {4 \' C) @8 [/ _* J. k4 xtypedef struct
0 W3 Z, j, m# B" ]{4 N& I- d4 i/ M k
unsigned int a;- ^9 e5 S" I) U: i
unsigned int b;( A' V; S. p. a4 {
unsigned int packet_cout;1 x4 V. h+ E5 i% e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 b5 S" s4 m2 B1 p" x
9 q5 m2 t+ |0 S/ \9 J4 fvoid read_MSG_buffer(int *baseaddr);
4 M0 c+ r1 I# gunsigned int count_copy = 0;% S% U2 M9 C& c% e% i4 l
! `% u. M. d8 J6 z
int main()
5 w0 d* u4 K3 ?+ N2 _) V{3 s1 t. u/ n, i: T
int fd;3 d2 B, i u8 U$ K) s3 Q# b
int *mem = NULL;5 h" D$ h' m* j0 f# `! R ~
# G- p) S Y! l4 O% P" ?& [ if((fd = open("/dev/mem", O_RDWR)) <0)
2 @6 l) A' G% C3 ^8 R# `4 k {& o3 q& `* s" z
perror("open error");
+ s# o4 G4 W( {& o! r return -1;
2 U+ |/ g5 U4 }; } }
8 r$ b- k5 N' L/ Y# S' y% Z! S
" z" N& y: S! c: y. B+ ]0 o mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 \% v4 \% X% I/ X4 V$ G- y: l$ ^( @- @+ e4 B$ [* J
while(1)
& P; C# c, A" p- E0 ?5 z( B }6 w {. t, t- C: v% k- l1 o3 A
read_MSG_buffer(mem);
- |: U2 i# I5 z% @2 T! } } 1 g7 M5 Q; X8 z
}
! B/ [, d, t) _7 f! b
u5 E2 M% x+ _, \5 Svoid read_MSG_buffer(int *baseaddr)
. Q9 {1 x/ u `# C{
# y0 b6 Y, z4 ]0 O pRX_MSG_PROTOCOL pshreRAM = NULL;
* d4 T' V. O4 z" A2 R0 ]
5 g7 O( ^0 z; Q y# u Y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
l: y* j* ?% `% l
1 U$ D: X1 j1 ?& U/ g" s if(pshreRAM->packet_cout != count_copy)+ k1 s K& H) o* |
{
( |: K2 t2 x9 K. ~( i- D1 J printf("a is %d\n", pshreRAM->a);
/ V+ a- f" A* M" N printf("b is %d\n", pshreRAM->b);9 g0 o9 o) N1 |' s! F& B! r' `' H
printf("count is %d\n", pshreRAM->packet_cout);
, B7 x( v& I+ ^1 g8 \/ Y& M7 G count_copy = pshreRAM->packet_cout;
2 j1 ?8 ~" @" [, o7 S' N, f. r }% I( }3 \4 O! A
else
3 F$ \9 @6 U) z' x) a4 ^ {
3 B6 p& p% Q4 W- R printf("No effective message!\n");9 i# C5 U' c" l& g5 g
}1 T6 F+ K D+ b6 v/ N6 V# |3 F
}
2 G! \1 O/ E Q6 c2 O& O0 H) x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! T, S* G9 V( O2 R/ q7 Z2 b5 }; l
: V5 |' D- |6 Z) g y6 h/ S7 o/ y! C, i; ?# ^) o
" v8 m& [0 r5 A' {) s" y
l* R8 Y# s0 X3 K( H |
|