|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) j6 e, ?/ G" Q$ f& f8 L
2 U: C" [) J: X4 iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 l- d( p0 g% n$ O4 J1 D
#include <unistd.h>
! x$ h. R7 q% }4 J, O3 R: Q2 n% q) ~#include <sys/mman.h>
$ J0 T. t( m# N) z#include <sys/types.h>
7 H5 N; V" p& k; n" A) i: Q#include <fcntl.h>9 b; Z7 V$ y, f0 ~. E! o. U- g" {
: D3 L4 q. A: n2 X#define SHAER_RAM_BASE_ADDR (0x80000000)
/ r0 E m! d2 m8 L
1 f% c6 k% @/ _typedef struct
2 a c+ {( U$ L3 h3 V+ w- \{/ ~1 G' t' @: i4 g7 |; y6 `# k1 k
unsigned int a;
1 I9 k. \+ Q0 v7 S" V) A2 @3 a6 f unsigned int b;
! A R& ^) z* y. B R unsigned int packet_cout;1 v; V3 k) V% |+ ^+ q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 @; F/ _0 U5 p s8 k- ?: d
( Y2 q& K9 |' }; x" i; c3 x& y. \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 p3 b5 N/ u! _! e+ O
unsigned int count_copy = 0;0 a3 H) q# y1 H- L4 u+ Z& V5 q
u# p# ]4 Z. R6 Y! m3 U
4 w6 K9 y% i6 T5 [1 Fint main()
4 u l7 A2 e' w) S{
5 s6 Q! a$ v8 v i# Y# f pRX_MSG_PROTOCOL pshreRAM = NULL;) F! Y7 z7 L2 ]. g1 D8 \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 K8 n! x( ]9 P5 K( {; E, P1 k, m
. ~( n/ M, H1 p1 q V4 d
while(1)
1 ?5 Y K F6 L3 e {
/ Q8 C1 p7 `5 ~) B% R1 k read_MSG_buffer(pshreRAM);
- M! O2 ?" T. W6 u a4 e } 5 L0 t9 M, t( H# ^
}
* A2 w) v! u) ~" N1 a
; z4 R# J3 t$ ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ S5 V8 u* J0 h( s3 ?$ @
{
- W% K3 S% ?; r8 z3 \ RX_MSG_PROTOCOL buf;
; D7 i' B1 n" j
( x1 `+ i) V" h; @ buf.a = pshreRAM->a;
' R9 E; O+ L! y, z$ v8 G* e$ E h buf.b = pshreRAM->b;
5 R3 v7 s6 V- w buf.packet_cout = pshreRAM->packet_cout;
5 _) D- _3 ?! z' e2 e2 E% ]* c
! R4 J" G2 f t if(buf.packet_cout != count_copy)
/ o, n1 R) h- ]4 n! n {1 o2 `% N5 x' o8 ~
printf("a is %d\n", buf.a);3 R7 T% p& {4 x/ p8 a- Y3 \
printf("b is %d\n", buf.b);( o( d4 P1 Q" }' d& s* t
printf("count is %d\n", buf.packet_cout);" f* R& A) ^0 h
count_copy = buf.packet_cout;4 a6 A6 w: z# i! h1 l
}
& P) W3 Z# C5 J, K) u" Y+ _ i else3 ]2 `% v# ~) Z
{. o' k+ z* a' {9 @
printf("No effective message!");5 S3 N9 B; o& S3 p
}, c: A" B" V5 [* x2 M
}
9 ~+ {6 k$ a6 f. x6 A; U' L
" k/ O( C; c' d: _& o
$ Y* [# V) h4 a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) s! p3 Q: N* P& ` B: V2 r- b5 Z使用下面代码,对内存使用了mmap函数后:
( D L" `7 F$ v m5 V& W2 g. ?1 E#include <stdio.h>
" T: K5 [: N, P V#include <unistd.h>
) ]; s. d; J3 ]#include <sys/mman.h>! |4 `, j. o$ S
#include <sys/types.h>
# }8 h+ r2 V3 x6 N+ w: l4 M#include <fcntl.h>7 \- v3 z: v* G, }
9 d8 q, ?; O1 @# W: W#define SHAER_RAM_BASE_ADDR (0x80000000)/ @$ w) s; h, A# \7 ^9 T1 V" T8 R
#define SHAER_RAM_SIZE (0x20000) ) G! C" A$ l. H( i# q
' _) z" _* |) j8 K5 xtypedef struct! w, |; T' W: {% C) G+ E
{; \4 Q# U2 f% e6 m% }
unsigned int a;% p$ Y V" F9 i5 j' S n* L
unsigned int b;
3 m- T: l6 x- y' O unsigned int packet_cout;
9 U2 y% t2 j L( c, G! W3 z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* ~* z9 h: ^% Z' M) ^+ D2 P
' W" V( k0 D2 @: J* Dvoid read_MSG_buffer(int *baseaddr);4 R( P. h) B$ q9 @! T* h* T
unsigned int count_copy = 0;
2 F. O7 F7 A% W- @* ]7 R9 D1 [( b' ]- w( Z
int main()
* |) K X3 l3 Q5 p5 A/ d# T{) [' a% D1 ]& j$ ?& W1 Z: s z6 b
int fd;
. F6 i! O( y: \! r3 i" F9 g7 q2 Q int *mem = NULL;% m# o8 `: K: Q9 F D8 T0 ?
( [7 N" F) S6 S if((fd = open("/dev/mem", O_RDWR)) <0)
, ]7 ?8 Z: h' [4 ?6 y8 H3 h7 K; ` {
$ ~7 h3 o8 L7 Q D7 x# h( m5 N: I perror("open error");
: C. @/ d/ j/ f/ A5 w3 n9 R return -1;0 W# I" o" b; B, [+ C3 B; A
}
+ z/ j3 b" H' ^! o9 Q7 c& L+ T
: I Q5 q4 M+ V R mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! {) T4 y& H! R0 l' E% P/ P# l2 W0 [
1 z$ i0 y% y: y1 U3 K2 K while(1)$ c d9 l; B K8 S8 [3 W& P
{
# T3 [' v# A( {+ N- ` read_MSG_buffer(mem);1 M6 h2 D7 b& t# U
}
: R; _; ]# e7 M, ]! G}
0 @3 n! x ^; l: Q3 m
5 a0 l7 |: m5 I+ Y7 E+ Hvoid read_MSG_buffer(int *baseaddr)
, e& j$ q. v+ [1 T$ z) l{
- Y& |& a( }5 G G3 C pRX_MSG_PROTOCOL pshreRAM = NULL;9 O# a0 _$ p: j
9 Q5 e" R0 n8 @4 K pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ d0 w' M, Q6 c/ R& b8 P8 R! \& v% c0 l! D* W% M
if(pshreRAM->packet_cout != count_copy)6 R! g6 P7 i5 ^: f; ], I6 Y* K
{' |8 Q2 I: H( E$ j, W
printf("a is %d\n", pshreRAM->a);
Z }$ O: x" n9 J1 Z- c printf("b is %d\n", pshreRAM->b);
4 Q. G- X) _' O! z printf("count is %d\n", pshreRAM->packet_cout);' G/ Y5 u) F( u6 W
count_copy = pshreRAM->packet_cout;
0 g5 A, m5 I- V/ O$ J }7 h& y- ~! T. q
else, `8 W* k' G# p, B8 A
{2 a9 x# I7 U) N) X9 A1 \, {3 f
printf("No effective message!\n");
7 H. F& {4 U) T5 P' \. v }
! c# d$ d, U0 v$ F}. t5 }$ B4 L! X; z& {6 {- y* t
* V) s3 c4 [2 {# d3 j }( P9 K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% x4 N7 J- Z- u0 ^& c
4 C$ [4 @) t4 v0 p/ ]: z- O7 N4 e e* H2 _& |2 |
, ]. j* o: I* ?* `' E) g
! K0 G8 o: @8 i4 q |
|