|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 M( s. Q5 O( s
6 w6 h4 C; N+ I- A# F- X/ J- KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 o8 ?0 n& N$ Q# I
#include <unistd.h>
\: C* M3 X& `- b#include <sys/mman.h>) R9 ~; p, m) Z; ^' J
#include <sys/types.h>
' T+ Z" t4 s( E; x' G2 j#include <fcntl.h>1 l9 H3 C L/ M, t/ R9 b) [1 D: }
) T! |1 x8 @$ k+ n#define SHAER_RAM_BASE_ADDR (0x80000000)
! J6 D. q( Y$ r* d
$ K0 E* l- C0 e8 ?2 {0 j5 E) btypedef struct
" O3 r) S" S: } O' }+ U{; o6 ] |0 H& q! C* Y2 M
unsigned int a;! F' t8 l4 o5 @# j* G0 H
unsigned int b;0 B& A/ P' l) c" L2 m* D
unsigned int packet_cout;. C% c2 S# b9 s/ X! X4 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 _* O0 X$ h- T4 p1 Q& r& r( j, z7 P
- y9 p) l& D6 C7 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 h# P$ N: C- y$ V
unsigned int count_copy = 0;0 j3 I0 h2 d& p! [) [$ w: l
U8 h- G* k n* @5 X" X( s
t" Q: R7 {, T/ `: F4 i; gint main()( i2 b' b7 O" a! ?
{
' Q+ ?$ S Q% N1 u pRX_MSG_PROTOCOL pshreRAM = NULL;
! ]/ a' T3 q/ I7 A! q @ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, f6 ?) `2 b8 F. c$ Z2 h
5 y! |/ n5 |! y$ U9 o3 g" [) g4 Q
while(1) y; D+ {# }' z
{
3 M% q h* B9 s P' u read_MSG_buffer(pshreRAM);
7 v6 ^8 g: F( H5 e3 s }
; l- e* {1 `9 f, w K2 p}
) [& Z- g& P! N% ]) n" v" B! e7 }1 b6 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), C- m) i4 m5 g0 E6 [
{
6 E) ^- n2 j" U; L- f; o5 F2 C( N RX_MSG_PROTOCOL buf;" B0 ]1 w0 y! x0 A# [" s) }. W# I
; ^% }, Y k3 _
buf.a = pshreRAM->a;
9 M3 I% h" n* n0 P6 j buf.b = pshreRAM->b;' G& ~. ?4 `2 i; B: X$ o& V
buf.packet_cout = pshreRAM->packet_cout;
* h/ f3 V4 k. d9 r- |
) z! e; Q l8 b& w if(buf.packet_cout != count_copy)9 \2 S) q7 [# R- ~) q% R% I+ H
{, c; J% a$ }4 w# j+ M5 D" ?
printf("a is %d\n", buf.a);
8 o9 Y- M3 l R printf("b is %d\n", buf.b);" [4 ~! a/ H: [% b c
printf("count is %d\n", buf.packet_cout);
% ~ b' Y3 y4 b( F count_copy = buf.packet_cout;3 ^( |" v1 P9 E" C* p" S6 n! |$ ^
}8 `* T' d: m- l4 a2 S1 h
else
* }1 q$ U g( x7 ]; D {
6 f4 x, G) n+ S& X" M4 q0 r printf("No effective message!");
4 G2 z* z+ }9 T }
" T4 Q! k: T P" }( A$ e}' {) s) g" y( a8 ~0 i! \' t/ g( B
: U: V1 Y+ _' Y7 e
5 g, k* P8 H% I8 ]' F# y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) j: [3 d, G3 M, I" H4 Z( H; u使用下面代码,对内存使用了mmap函数后:
9 e6 ?8 { b8 c#include <stdio.h>
% s& W- ^! U' b H9 z! w. [7 ^#include <unistd.h>
L& H8 P: Q3 C/ [#include <sys/mman.h>
, Q: w, r' k! ~; H0 i" R0 [#include <sys/types.h>
0 ^# h2 O6 r, H8 z) B1 h. `#include <fcntl.h>* z; q {" g# Q; j; z
# i- P& f: }- C- ?* n+ x
#define SHAER_RAM_BASE_ADDR (0x80000000)9 g* m: T5 a1 G- `7 w
#define SHAER_RAM_SIZE (0x20000)
* q N0 s9 @ o: i) L6 U
/ U) Z7 h7 ?* Mtypedef struct* ~- X2 W! b, z' r/ _
{
- N/ }3 n5 q" Q* K Z unsigned int a;8 @$ o% y% `# Z
unsigned int b;
! x) i0 Q/ u1 L0 w+ k unsigned int packet_cout;
0 G' |% t& M3 i2 S6 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- g* c4 o5 v2 I1 m9 e9 @4 X
: {! x6 A: k2 n3 z" O4 s
void read_MSG_buffer(int *baseaddr);
% q0 B0 F( z' [- cunsigned int count_copy = 0;$ }# d$ f( G$ g7 B, E
1 @3 X C8 o+ t( F% Dint main(). S4 O2 p6 A- V- X
{
/ H$ W: x( q7 b+ N( T+ A5 n int fd;
/ k% D& D. X$ ?. R+ ?. Q+ ?% S int *mem = NULL;
+ z" k8 q6 G1 i8 n" ^
2 f* s7 w$ d, c- }( g if((fd = open("/dev/mem", O_RDWR)) <0)/ o6 }- V0 z. z6 C6 D
{
& J1 R! N6 X' r9 Q: U perror("open error");
! t5 S+ s: S+ j, f return -1;8 B+ ?9 D5 k2 S% o( q$ w- A. N
}9 c K/ Y$ h6 k; i. D# W* m
7 P j+ }8 i& M3 Z7 P' I9 S+ l% k mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- F3 `* b! R/ i
& W& e! s6 O; e( \ while(1)( B, d/ w/ S* E( a/ t. P. `* @( u
{1 j3 O) |# @2 p8 y* J
read_MSG_buffer(mem);& N+ I' i M$ Q+ l- L5 `
} 1 N* u5 C# t4 {; K( y
}4 |1 ^( p7 | k, J" ]- v
& V- s# B+ E! b- L! F8 M9 b% m0 J% u
void read_MSG_buffer(int *baseaddr)
2 y7 C& V6 r8 W, o" F$ |9 \{, m+ d' q/ ?$ [) ]6 ~
pRX_MSG_PROTOCOL pshreRAM = NULL;" |( X' S' ? t3 F w4 D. X L
$ N1 B& R1 T/ D- s$ b3 s pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% h6 T) v/ K. Z4 @: ?! x( w4 g3 X. F: _: B# y) [
if(pshreRAM->packet_cout != count_copy)3 X1 d' T$ o& p1 \6 L& `
{$ z4 T" N& ~% `" ~
printf("a is %d\n", pshreRAM->a);8 l2 {& W2 J' W" f$ m
printf("b is %d\n", pshreRAM->b);
. n9 [: H/ H( L# ~( t2 W' C. B0 d printf("count is %d\n", pshreRAM->packet_cout);
2 C( V+ |. b7 h) W/ @0 M count_copy = pshreRAM->packet_cout;
* d1 P, [$ f1 V5 c }
* v: x, J1 }3 s! F; U! P else
5 |4 Y8 @& A8 A; U: m {
/ S F t, N/ V/ F- R' o) C2 C printf("No effective message!\n");0 w+ p: i6 F7 _: t S$ m
}
3 T/ q1 f+ m n, m# ]' H}+ N8 u4 Z0 t2 g2 D1 F- ^: Y9 s: ]
6 T% r+ U( L; w# z# l. z; g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
F4 q D9 }5 e5 N6 S3 w0 j
z1 e6 D$ y7 r$ Q+ \- [/ e2 \! U
, R7 u. x0 ? L* T1 l7 C9 @) l: t# [9 Y, I: z" Q
& J8 _" H3 O' X+ Z0 u
|
|