|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* C1 X3 t: R3 `" \* v
8 j7 |, n% J+ ?; X' n( K4 G9 D2 n; FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ ]6 u% _0 l. h" _, H7 v
#include <unistd.h>
: G; T. c( P4 v0 R' T3 d#include <sys/mman.h>' |& n% j6 ~0 x
#include <sys/types.h>1 e0 F0 l \) S# R
#include <fcntl.h>
+ r9 Z$ N2 J0 Q9 L/ y& F9 }. U# k. H! j! e4 |( }4 t3 R# s- b
#define SHAER_RAM_BASE_ADDR (0x80000000) ) B. n W/ k. t
/ C, ?- h4 x" k; \8 \
typedef struct
) B, i. O9 c* O9 Z l+ X3 F{7 e( r8 Z& A) c" z. P6 f, ^3 D1 X
unsigned int a;
5 u4 i; @$ h# i! B0 {0 w" u unsigned int b;6 Z5 M0 F3 Y+ k) Z
unsigned int packet_cout;% I5 A7 [4 x" Q& L6 d$ e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# g) D: r& k0 `2 u
8 W i: t4 n) d8 Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. o: h B% l9 F) Z% u8 ~# W
unsigned int count_copy = 0;- H( H0 _3 O5 @4 s) Z: a$ r
) w; q) p+ U% ^! M, ?) |2 R
9 e) u; s% ]& o; _0 Vint main()6 U" _: Y4 H4 Z0 f* |
{& ?" m* h+ R6 J/ |& O
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 c. r3 i& ]7 i, i pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) C/ ^, M' E: y" g! x2 J7 V2 j1 ]
1 H" i7 |* r" z" y* a
while(1)
6 M+ j, X4 ^, i, \ {! p% W* I8 Q6 o( ] r( Z+ C9 K+ q
read_MSG_buffer(pshreRAM);
{& _+ q7 R- X; B! n } & T3 J! n3 ]4 x% K" H% V. ^
}" m2 v- h! ~' c/ j8 |& ^2 a
; c" q% e0 `5 `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 _3 ?1 n/ B& `- [, p& z0 [, Q; }{
4 W0 ?9 c8 |. t& F1 `6 s" G RX_MSG_PROTOCOL buf;7 m2 B# H) K. h' Q3 f3 D2 K, {4 w
. E' o( |3 s& E! f7 A
buf.a = pshreRAM->a;, ?' d7 C I; D1 g$ Z
buf.b = pshreRAM->b;
& N* ]6 G" T9 q, p buf.packet_cout = pshreRAM->packet_cout;5 \- `+ g9 q* O
* i4 V( W8 x7 _4 A' {5 q% F' n, Q A if(buf.packet_cout != count_copy)
+ P. I/ I G" B* @( d. I {
+ {- A, a4 ^* [, J1 _ printf("a is %d\n", buf.a);5 n& n8 W6 I+ y# p
printf("b is %d\n", buf.b);. D: ^! D) F; B$ L* }7 W+ K) v
printf("count is %d\n", buf.packet_cout);, z( P) F0 {; c
count_copy = buf.packet_cout;" K, t5 e. j4 B# W+ @/ E8 |0 y
}5 z0 N% O0 L7 [8 ]- P
else0 j: k9 r; S& v5 C6 G5 K
{% V/ m; Q( x; q. r
printf("No effective message!");
- l4 z. `, u5 ^ }
! F* a+ Y. ~, ~6 ^" _}
$ ~& |2 X$ ~( ]4 n8 x; w) r
4 @" N/ R! ]% U$ ~- B5 W" ?; H" R! O% S; n( F3 o F
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 @. t u7 Y( o- T/ O5 I# t- |使用下面代码,对内存使用了mmap函数后:
2 R* U! p* G. S; }) A3 a#include <stdio.h>+ o& P% u9 D/ o5 Q5 r- J# j, Z
#include <unistd.h>1 Q: c8 A( b8 I. t4 `
#include <sys/mman.h>
$ a% t' h9 j- l8 B4 L6 R#include <sys/types.h>; X7 A* `$ A4 u0 D" j. r3 a" {& i
#include <fcntl.h>& T% P8 h* L, j
0 e, R) h V( m# U$ j; o: @#define SHAER_RAM_BASE_ADDR (0x80000000)5 P! j% Y: X5 n: s' e( |
#define SHAER_RAM_SIZE (0x20000) . S9 [: j; K1 l3 |
' ?9 e# O. E" [ n( H. i: n2 t
typedef struct' b% e" R- U* _) V) Z5 g( i+ A
{) j8 Y& z3 Q( a2 F) ~
unsigned int a;, X/ @$ G( ?) n) c" {
unsigned int b;
) l3 a0 x2 k* D/ f7 Y8 a unsigned int packet_cout;3 s# I2 C* O, e, s8 P8 ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% r6 w/ e7 v3 r" ?
) S4 y- M A) F) ^$ Mvoid read_MSG_buffer(int *baseaddr);
( ]) s9 R3 ^7 Junsigned int count_copy = 0;
2 C( M) M# A6 b3 Q5 _- i6 e
. N+ ~' Y1 E! X4 h3 _/ m3 Cint main()
: o4 o+ \/ g: ]0 I{
% E5 Z k" k( R+ Y* f int fd;; a' K- l9 y4 D4 Z1 ?( b
int *mem = NULL;
) X( d( C% l5 {0 J4 X% I# |# o/ ^& J, P$ I7 m% c
if((fd = open("/dev/mem", O_RDWR)) <0)2 V+ F# w; v6 b7 f, p# N
{7 c, i0 B& \2 P
perror("open error");
- G1 l3 C, k8 [' L- f" E9 O+ N return -1;( ~% I$ F. T: C- [4 u H$ o" [
}
: |8 ^0 j; {: c
. ~; \- z. U4 L/ {6 w4 U8 d8 X4 a mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 _ l/ V9 ~( ]
0 U5 @1 X H- z+ L while(1)
5 `2 B7 i- c. v2 E# s4 o( E. w {
1 o: U$ x2 J. f+ a read_MSG_buffer(mem);
; O1 _( k; u, P3 R; J% Z, F) \" w4 ^ } " B# X- R+ r" }: N& f8 Q
}
9 V, ^5 j" `% q% J4 o G! w I
4 |3 G3 ]8 D2 @3 Q9 W5 Yvoid read_MSG_buffer(int *baseaddr)
" S3 O& K5 S, j9 J- u' c6 z{
; |* R7 y' P# F0 m: V9 `& F E pRX_MSG_PROTOCOL pshreRAM = NULL;
2 z) t/ }; u2 f
; D- H" S$ D. E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# [6 E, r: m5 l$ ]& ^. ?
+ {& t. E; _5 ^8 x( y& W
if(pshreRAM->packet_cout != count_copy)/ v& o9 g6 w% D& v' {* c7 r
{
( }3 ?' F" k# d) E: q0 Q. w; n printf("a is %d\n", pshreRAM->a);
$ T4 A% d: F8 Y7 ^ printf("b is %d\n", pshreRAM->b);
: \! C; }4 H: O' T printf("count is %d\n", pshreRAM->packet_cout);, p' j; z2 a3 X0 ^
count_copy = pshreRAM->packet_cout;# q" G' i! y' t4 x1 T+ S
}5 x5 I0 B5 |0 H
else
2 a7 L! k. Z2 n- e' Q, ^ {; S% I: m& L5 j# c) }
printf("No effective message!\n");& D5 F- n' g) ~( r; ^6 Y+ W; ?) W
}
2 _* q u7 L$ \2 Q9 n}' B) F# b8 A$ \& _
5 R( l% n, |+ [9 ~' G( Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: ?; ^( @, s8 |( b: U# A: d9 y5 z+ ? D( x$ }6 q/ D8 `
t) e" M' p0 q% @0 `6 X
7 b" `$ d+ F. K6 d1 Z" ~
" ^) J4 i$ G+ l# q) q9 {
|
|