|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 }; V3 ~8 I& j: C z
5 T5 X; J. c$ p$ ^) o4 U: g8 m% DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* L4 L: E4 J9 L3 V5 J
#include <unistd.h>! q3 A3 _3 }, f' R x
#include <sys/mman.h>9 N; X# }4 l M% B$ B- E
#include <sys/types.h>
' }% T" ]1 q! X% h1 v& W#include <fcntl.h>: b# _5 L7 g/ b3 @# F L' [1 `$ ~: y
1 e+ ~) P2 N8 z. `
#define SHAER_RAM_BASE_ADDR (0x80000000) , d C) k4 r0 z0 ~8 K3 [8 K1 B+ r3 n
7 z' n8 I5 P: Y1 ]& ?typedef struct) q |# |1 H' w! m( L
{
3 p" v: E" Q; c, V `# D* T unsigned int a;8 ]( l; I4 Q% [% Q# e/ _9 J" f( Y
unsigned int b;
3 ~; U% C b+ M5 j I1 L unsigned int packet_cout;
; i- v8 v! ?/ ^6 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 d1 Y* W3 E& ]3 s* F2 R+ R
9 [ i( ~7 u* {% q6 _9 M. v$ cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
d3 A; i0 ^8 |0 P$ V+ v' I: s2 |unsigned int count_copy = 0;
. o) o$ D- N8 ]' H8 t' X+ j. {* W1 G) C. \* L6 O" e
x' D) n& ^4 T2 k! N# l
int main()" w# Q' |8 X$ J
{
3 S" \; p6 @0 G; k3 Z2 t pRX_MSG_PROTOCOL pshreRAM = NULL;
: N3 T5 X. i5 l4 m0 N pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& s& Y+ z& Y( c& M# I+ Q
3 ~. o) f7 A6 _2 h while(1)! [8 k5 Y6 B* L1 R: Z9 s) G- S
{2 B& v6 {; m8 x0 x! [" r
read_MSG_buffer(pshreRAM);
; V' p8 b: u& j1 m$ G }
+ j" ^ P" T( l- d}9 b# j i; C: j
6 N0 q9 Z8 N/ I' W* h0 R4 `/ Q, K8 wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 Z+ `+ q7 E5 G: s{
7 j: Q z! ^3 \$ M6 n RX_MSG_PROTOCOL buf;, v& n- C+ M5 a* \7 ~$ e8 s
& Z' R3 p# @7 {8 Y5 h; ~- _ buf.a = pshreRAM->a;
) F; a$ U r! ]4 K$ _9 P5 I7 u buf.b = pshreRAM->b;8 y( }8 A* M3 V5 o, w% p& P
buf.packet_cout = pshreRAM->packet_cout;9 p7 |2 Y) c% R; G5 u; [: O
+ S; ~! d1 m h3 H4 D* T if(buf.packet_cout != count_copy)
' X+ e$ L- o; n7 O6 O k* c4 e {: ?1 _- I/ V" ^3 F0 e; i1 C
printf("a is %d\n", buf.a);9 Y+ v7 v. E" A$ D' r& ^% \" u5 E
printf("b is %d\n", buf.b);7 b( g* \2 l& x* E1 O; \
printf("count is %d\n", buf.packet_cout);; H/ i' @- F M k5 [
count_copy = buf.packet_cout;
/ l! A7 @1 n! F' \$ _( y }% `6 d# G( k' a8 R& H9 W. |
else ]; V- t }* g0 f& G) p! T4 d V
{$ i3 @3 ?' D; b* y$ i$ Q, Z' E& p
printf("No effective message!");) t4 v, F9 s( p! x6 ?" z
}' @' m1 K/ _ ], {8 `# i; S
}
- ~- Y1 T* }' g$ Z3 d/ w& u* U9 L% ]* q- i3 S8 D- o
+ w. l& U" e! i* d6 O9 T1 j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
i7 s8 I# s) u# J6 D' A使用下面代码,对内存使用了mmap函数后:! R/ `8 K- l: O3 Q4 ]4 z/ S7 |
#include <stdio.h>
$ ~: b9 o" H) ^( }) s1 k#include <unistd.h>9 U. l" R9 U7 b, c$ _
#include <sys/mman.h>, Z. J& t6 c+ C! B7 ]6 J) v6 @$ N
#include <sys/types.h>
& v8 ~& A, i- r6 y& f#include <fcntl.h># S% ]' j3 P4 W( O, C$ q4 u0 V
) ] }- F6 P- J9 M) i
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 \6 T* X k$ J# S. [- N- F#define SHAER_RAM_SIZE (0x20000)
4 ^' @8 T$ u* u' }' G. e! L, k* W" T( ?
typedef struct
" K3 S S, {4 r; M# J$ I{. \4 w! {9 B$ s( ~9 ?4 P9 L2 E& ^( |
unsigned int a;
. \8 [4 C- c9 ~( Q; e( q unsigned int b;
% g( r3 u0 @2 y; ?! { x7 H unsigned int packet_cout;
9 a3 T* j- G F9 q% U* s) s% p* v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 i9 N! p# h; j) k" p
) c4 W$ W* G* zvoid read_MSG_buffer(int *baseaddr);
; \2 w# K' `: runsigned int count_copy = 0;
" F5 r1 ^* p2 @0 m1 Z; U' O8 g$ E" }& C
int main()
/ f6 I% m8 O" l2 X+ s3 ]8 D% d* w{
( Q- m' p; K$ s9 H) p int fd;+ m, W' k$ k5 e0 G( p
int *mem = NULL;
& k. Z% D T |" \7 `" n+ h! G. A" |0 p, v) |
if((fd = open("/dev/mem", O_RDWR)) <0)5 M8 I. _5 `7 j3 z) w7 [
{' s0 M) f; H! T- W7 |
perror("open error");
0 p# n" x* v+ \9 t" O5 D- ^ return -1;
( w- M8 X4 D- e) a$ M }
4 A/ B/ x4 s9 S! E
! `) R/ C7 ?8 |6 F mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 Y( h$ k; y5 [9 ^. S; B* K1 I
' m- u' ^8 k; d9 B7 A while(1)' Z* q$ M% E" x: U. a1 H9 N! q
{
/ C, b* F- E2 B. \5 N) { read_MSG_buffer(mem);
( r; R1 o8 k; M9 x } 8 a/ _6 {: S7 Q
}5 D; I2 N1 l. z( b( t& D
1 ?4 T" c, d. X+ ~4 _+ b
void read_MSG_buffer(int *baseaddr)
; v1 y4 ~1 e! f+ U" f d; c' o{
( n4 @ [7 }2 f3 D( M$ X pRX_MSG_PROTOCOL pshreRAM = NULL;
6 h6 g3 G; Z8 U9 t; f
! _& \9 d( _+ N: ^ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 s: @" G5 E" J' F; m1 W" O
; K! A3 \, f- h$ \ if(pshreRAM->packet_cout != count_copy). C# J5 E+ ]! ?' Y& t2 I! R
{1 H' `/ y! h6 a5 s! r' V! o
printf("a is %d\n", pshreRAM->a);. e* A" H$ X! N2 x
printf("b is %d\n", pshreRAM->b);
+ \8 k0 M- r+ J4 q printf("count is %d\n", pshreRAM->packet_cout);
5 o8 k" s1 m/ W/ G5 f: f count_copy = pshreRAM->packet_cout;
5 |; C8 |- v. g% `2 I2 o }
6 z3 l( Y7 O s) X5 g) L( `+ N0 l( t else
. E8 ?* b- h/ ^6 X {. g* h( C/ q: J. s
printf("No effective message!\n");
9 L1 x" u" |9 p: r2 V }
( T% O& |' }' K; I2 B: o}8 o' k# B& `- l. ]! h
6 e/ n C+ i. i* T3 q" [( l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' ?# O' N; n3 _( }9 p o+ N: ~
3 ?' R1 D: L2 o0 `) A' P( \* q$ t0 m- m5 B* x
0 T7 y$ [, Q: J" f3 i
. y' O/ A0 q4 H" \$ x
|
|