|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% A& n* \/ |0 ]& P; Z& w& H9 Y6 Y! J2 c8 \( q* g: g% Z* p$ \* @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 ^$ p4 ?( u7 N#include <unistd.h>) v! U1 z- U. C
#include <sys/mman.h>1 v( G3 H2 s8 M" T4 S# O: H3 ?) N
#include <sys/types.h>5 F/ A. o7 ^: U
#include <fcntl.h>
! U9 O7 v# n7 u# U' d6 m* ?9 B+ M
#define SHAER_RAM_BASE_ADDR (0x80000000) : K. q# S" q U& W. [
2 |' w0 o2 L. }7 F- b
typedef struct4 d, d' r1 T5 H* b- K
{
3 {* x- r' \( u" ^( d t unsigned int a;/ \+ h, _( O; A% S8 _: }. ^
unsigned int b;( e0 j- e2 q3 O( a5 ^6 C! ?
unsigned int packet_cout;
/ o9 w: E H( C7 B) O' A& U5 t& v7 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ Z) u4 t: A" k! Z* _1 |
, g2 R/ G1 v" U8 ^$ g$ z- }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" \+ N4 ], b. m+ H1 sunsigned int count_copy = 0;! V' X! d* Z" s' k& K
. u) g1 n; k3 C5 R; j# |( o/ f, ?3 }) R) b! g8 T
int main()0 ?' ?1 b9 b* y% U
{4 K) c9 ]. _* }- V$ c$ M+ K( m
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 G$ F) m$ q. i9 D! i& ^$ `) O/ X% o pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# N+ ~, @) _$ b3 C1 y
. W/ s# V, A7 {# ^) s; z& L while(1)
5 f0 ^" } X! V5 V% X! g {: r% q6 a: b% V X! ]. [3 t
read_MSG_buffer(pshreRAM);! d9 P( p! A6 v" } F
}
8 v4 S% e! G+ Y) ]+ j}, U* n- r$ L/ i) v
S c% G' f" M, B5 v' |/ g+ M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ w: \7 J3 i% B
{3 l# B8 i7 k+ {1 o: ?% y
RX_MSG_PROTOCOL buf;
, i) K: q1 X' V( q$ S! r, n( s k8 l / }. }' S1 q( A! ?2 x! D8 {
buf.a = pshreRAM->a;
6 B# \5 V2 `# |2 o2 \9 t! w buf.b = pshreRAM->b;) X5 ]8 E$ i% @6 I8 H+ m
buf.packet_cout = pshreRAM->packet_cout;# z; v. [# V7 x7 m& E; q: j- w; O
9 I8 Q) d4 H+ K& w; e
if(buf.packet_cout != count_copy)( K! c% b, z2 d- @9 z/ U& O
{
" W, r2 V" ]9 I/ ? printf("a is %d\n", buf.a);
. k' c( {' q9 n& x0 C9 H printf("b is %d\n", buf.b);
' g7 D* f6 v7 Q4 ^* ]- S printf("count is %d\n", buf.packet_cout);; Z( r, P3 ]- h/ Q" c! X
count_copy = buf.packet_cout;
# l% \: m* A" y3 ], N/ A }* T1 V% g+ y3 w0 W: M- g
else
& g" p3 H) Z9 N {$ F5 u' P) a, Z ^( w4 P
printf("No effective message!");7 M/ J) O9 B+ n4 B. Y/ X: `& ^
}
% X) ]5 {) w7 ~% t4 y}" C5 m$ b+ J) I Q
0 K/ k* C6 P! W1 ^" m B
1 p9 t7 k5 X" {# r% _! @但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& ?, z* I3 L& f( F使用下面代码,对内存使用了mmap函数后:
! k3 Q' A/ Z6 v, f% A#include <stdio.h>
$ M& U, b; [# }2 d0 D#include <unistd.h>
V& s, @( m/ }8 w# s# k. m#include <sys/mman.h>
* Y7 i/ u- ]' j2 d0 J$ S#include <sys/types.h>. Y% @# p6 @- D4 i- q. s
#include <fcntl.h>* _* b5 {% {; K) ^6 B( p9 R4 t9 d) s. z
! {. h7 [, b! A6 m7 z#define SHAER_RAM_BASE_ADDR (0x80000000)
4 S0 E/ q3 T/ p7 z3 V#define SHAER_RAM_SIZE (0x20000) 9 ^) L2 x+ N$ `8 z% m
3 D: f' @4 j- ^. m" @* Q; }typedef struct, K( ?6 z9 |3 N
{8 y, [0 p" ]" h! F( U& V0 r
unsigned int a;
5 V, T( v2 N' T A7 S( Y. I) H unsigned int b;
' l+ b1 q- n } I unsigned int packet_cout;6 I! S6 Y: ?: ^ x8 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: r; S8 f% N% Z& P, Y7 `4 F2 E' {9 r: U/ h1 L. S: o
void read_MSG_buffer(int *baseaddr);3 j, D+ [5 t ?
unsigned int count_copy = 0;. L( v5 ]( j7 x. J2 R- S
r, o/ o; j% S; F: Tint main()" [" r. E1 {* `& X
{; A; {% ~/ C2 | {
int fd;
. q2 _" G. U3 h5 G' \ int *mem = NULL;, q7 X$ v! V7 e
- }% ]% U) \) M' I+ Z4 E
if((fd = open("/dev/mem", O_RDWR)) <0)" A) U5 g4 H. B# ^
{
0 p- f- p& B }- L$ H perror("open error");0 I* A0 U" R7 L1 X; a* a4 f2 M0 k; t
return -1;
5 ^8 H- t4 p6 L: B2 q- C( b }
0 c5 c8 N H/ `7 Q* D3 f
. P Q0 }: p# s* g3 h) S mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ R7 F4 o& I9 C& [
, v9 A2 v9 ?- A; ~
while(1)0 `1 ? U" @- P. V. Y
{+ P. r' R1 Q0 O
read_MSG_buffer(mem);
, N: b( J( n6 _2 e$ Z/ x p }
& @- V! i! @5 d6 z1 K9 ?} R7 ~) ]" s# O: o
1 y. s, E) t9 N2 a: _6 q$ W
void read_MSG_buffer(int *baseaddr)
. N% W6 l( B& d. E1 n$ {6 U. b, w% K. ]{
- a' N3 }; o/ P8 N7 W pRX_MSG_PROTOCOL pshreRAM = NULL;
4 w. |3 f3 O8 X4 F) O [9 ]; t! F
/ t# a M& Q* ]* q) ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 o1 i" ]: h0 `* ]5 a7 v' q: N
: d* E6 n3 G" S9 B
if(pshreRAM->packet_cout != count_copy)% D$ \& B2 }. d/ {4 E \
{- y+ r0 j; q' M, j+ ^0 r* g
printf("a is %d\n", pshreRAM->a);$ M# G5 f1 _# K8 T
printf("b is %d\n", pshreRAM->b);: R7 T& V# H( V. x# r- r
printf("count is %d\n", pshreRAM->packet_cout);
+ K6 m' I% m0 q# O1 \/ g; y count_copy = pshreRAM->packet_cout;9 `. V( K* r+ [2 O$ E9 d! q4 V
}; f' P- I' ^# H: o! A1 ~4 m
else }. }3 W H, F0 `
{# g9 R) b7 m4 P4 r D
printf("No effective message!\n");
# L# j% s) {- p }# w5 b/ V; K, E
}
4 n- B) P) N9 i( A6 {
: c1 e3 b& O+ X* y* u+ O# a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" c* j' [" X' f. f" l$ Z7 Z
$ H( H' ^7 s7 }+ [; P: g
; T2 c; q/ i) \" d5 F+ k
) @8 |: |5 k6 ]& d$ E- C& d
3 u B; d. z6 b4 G* W0 \7 h& y |
|