|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / m0 }' [5 |& L
% y9 X- t! T! N+ NOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, K- i/ y# g0 {8 N4 F2 k1 v0 c
#include <unistd.h># v8 r. d/ ]# p7 q
#include <sys/mman.h>' x8 C% T2 d' I
#include <sys/types.h>
0 S! `* R- r2 ]. R" _' i0 U9 _#include <fcntl.h>, V! r2 z' m" ?) T- T3 F& E& ^
8 F. N( J2 |0 g. o7 V* h
#define SHAER_RAM_BASE_ADDR (0x80000000) . Y8 Z" D% a) [/ `0 x
8 k/ C& w! _ ^9 q) K" @( c
typedef struct% D4 i2 c& |9 D# r) A
{9 c" F8 k3 t# S# M9 A$ ]+ V
unsigned int a;* G6 I) z1 D8 t k* D
unsigned int b;
8 O* \+ N: L" Z# m unsigned int packet_cout;/ I/ m5 d/ b, @# D _; z3 h5 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 n1 E# W9 Z' |4 j$ E1 U! m& K Q1 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 T+ M/ i' T3 a% kunsigned int count_copy = 0;
( C$ q/ u0 R- B' g, U8 h$ _
/ p( H9 c+ Q0 @: f% g5 l/ ]- t* h9 E: q) D
int main()
; j; g- \( g( b* ]) [2 A. o4 j{% r) C8 a% b! |2 ~5 {
pRX_MSG_PROTOCOL pshreRAM = NULL;. L3 Q7 s: z1 x, D @7 C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* _. b( o9 n% u; n# i) I9 W, k3 `9 E& O1 R
while(1)
3 J, h3 Y `# G {8 n, F( j( R% d: I9 @' i# ~
read_MSG_buffer(pshreRAM);3 t. U3 b# d. }& r* f8 n
} : k8 @! k1 i d+ F" e% l9 m
}
* d( I! N3 N8 o$ h( n$ y* G2 B5 P9 ~; @! `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# R. T4 a9 b5 S{
- M' y( q7 p8 ^ [$ @* @ RX_MSG_PROTOCOL buf;1 W6 {- B) S2 L: L$ C a
3 z& u7 q/ @$ U buf.a = pshreRAM->a;- m* v( Q; H$ F1 _5 b+ Z1 {4 Z" z
buf.b = pshreRAM->b;
8 |' m, E* A, ~6 F buf.packet_cout = pshreRAM->packet_cout;
- p8 w8 b0 i5 M* F7 y8 {/ y
) I R+ Z( u( R if(buf.packet_cout != count_copy)
" I, b$ j) c, b3 r0 v9 C {
3 {8 P* d O+ O6 I printf("a is %d\n", buf.a);' }6 R% U& S: l9 T
printf("b is %d\n", buf.b);# N$ O' f' F) ~8 h, I1 H
printf("count is %d\n", buf.packet_cout);5 N5 T; W$ N! w$ n( ^2 X/ v+ `* k
count_copy = buf.packet_cout;1 I; v2 @3 B6 S6 y! [
}
. p# F4 y% }5 V else
0 w2 W2 s9 s8 E( g* _6 j {
$ d" B G5 i7 f0 S printf("No effective message!");" L4 j, |. G# R" z: f! f
}8 f# {; s' A' H& q- c
}& }% x/ a- Y6 j5 ^% }
, X5 f; N& i+ g( V X! }( U$ A' \; a1 l Q8 V X/ Z; v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 R; `" E, i2 J5 Q' x8 \) c8 V5 ~使用下面代码,对内存使用了mmap函数后:
# Y# J/ X; S% ]8 P( }#include <stdio.h>
- _1 D: k0 b* o& U6 @& V#include <unistd.h>: @; h0 ` c2 r
#include <sys/mman.h>
5 ^$ I! k$ M0 A3 A' Z#include <sys/types.h>
+ P4 H# g( B6 }& A" }+ b#include <fcntl.h>
2 g! h7 d" d5 F7 j: D% d' \' N
: \9 d# G% c) n8 m6 h1 b! |#define SHAER_RAM_BASE_ADDR (0x80000000) r! m; g8 U4 Z2 q
#define SHAER_RAM_SIZE (0x20000) 0 h0 z0 ~/ @4 g, F7 l' J/ N
- n4 z( L: J9 N; J5 \8 [( d: Y* ~typedef struct
9 T7 t6 m+ d* g N. {; Q8 r) B{+ V$ y' j( _7 G1 l6 j/ K) U2 `
unsigned int a;- z* p; q. d1 o
unsigned int b;
! B) \! P4 k3 f- P3 y1 y4 K unsigned int packet_cout;% N' x+ Z3 M3 b: x$ `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; B, Q& t# y5 t4 O8 r" J- c8 Q
0 O7 b! X. |: F9 F& E, J, z; O
void read_MSG_buffer(int *baseaddr);, N! I) l* b, U% I9 K
unsigned int count_copy = 0;# p! B4 R) w, b4 `4 { q
' J, f( ?' e# s, Q4 S5 I( I% C/ v
int main(), \' T# P& c4 E) X
{
! ^% U. s. t/ a int fd;
- m* H9 R; `; P int *mem = NULL;
/ J4 P4 M3 I/ V' C9 ]7 E; s
" V# |- K: B& f& i if((fd = open("/dev/mem", O_RDWR)) <0)
* b6 G& e$ v3 r1 h' g% D* m$ w {
9 l* [2 b) m9 g5 y( X perror("open error");
( ~: K& P* B6 B3 i( C* l" p$ d8 ] return -1;
9 t9 h* I; W9 V: c0 r$ } }6 L: N" U; i4 }+ ~9 P
_1 [" J+ Q$ l j/ L
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 d( Q- X% N* B a. e$ N$ M% f m3 e' w
while(1)* p* |) Z9 j, I' F3 N
{
) R3 q i4 P+ B8 ], h' w8 q read_MSG_buffer(mem);# r% w4 S( I6 f3 p2 ^: t
} " s. a) l5 g0 h0 u! w/ d
}; E( X3 ]+ \7 Y1 n6 }9 a
: D: B5 @# }* c2 d J! @# d
void read_MSG_buffer(int *baseaddr)
0 _% i: p8 z J* p) ?4 o' V{
' \7 s l/ N5 N' q2 G pRX_MSG_PROTOCOL pshreRAM = NULL;9 \$ f) R# J3 T7 \7 J
. {3 d( ^7 C) I# _8 i- z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, e" n! n1 G0 p) _- O( q
2 R3 ] ^' B0 A0 { if(pshreRAM->packet_cout != count_copy)
4 Y8 K+ x; i+ R3 `3 w {
, p( R2 t7 z$ }3 c2 F) M; i printf("a is %d\n", pshreRAM->a);
5 b% [' E) g: X3 O) H$ O& I- F o' D printf("b is %d\n", pshreRAM->b);
4 b" k, E; b5 m& A printf("count is %d\n", pshreRAM->packet_cout);% J# c! f) [/ h4 V7 _4 O( H2 z
count_copy = pshreRAM->packet_cout;
1 ] {. ~. s0 E }3 ~, B" H5 I" L# A' w8 }
else
( D, Q3 o$ N5 j$ |' P {( ^7 p/ Z+ d% A% j4 U6 b" \
printf("No effective message!\n");% p5 K* Y% q4 G
}
$ a3 y9 D/ w3 q h}
$ \+ M: L" ?1 m
$ `/ L, J+ _2 D. P( b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! f* {% D7 i, D: @1 U1 A4 w
* j& ]+ N! K9 W z0 C3 {5 t
; I0 m5 u$ ?/ R8 U' T- B J; K- ?4 J4 v: O. j* c7 q
' k; E' H) |2 b% v |
|