|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 ]. y( O7 \, _+ |6 {
! N4 @# k3 g E" e3 x- q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
N/ Z) s) P' T) m; S4 m5 ^#include <unistd.h>$ T0 i$ G$ E" ^
#include <sys/mman.h>: V( E5 Y6 K: V1 E' ?6 x, W8 r) S
#include <sys/types.h>
- P7 T* u) y6 [5 X4 G2 ] h#include <fcntl.h>9 k7 d2 ?" c+ P5 ?2 g& ]; B
. P7 v% ~8 G' K" ?1 r( g9 H* G
#define SHAER_RAM_BASE_ADDR (0x80000000)
" d$ M3 q8 ]$ Z/ m" [; Y& Q: D" G. }6 [7 J1 S1 u# ]/ l
typedef struct
( w8 r2 |1 N: _, Y{
+ d7 ^- H: g r# O* X* o2 W' Q unsigned int a;& y& b; a! K6 @9 [3 v' ~9 ~
unsigned int b;& V# U; ^* x, j5 g& f! u5 Z; h
unsigned int packet_cout;7 g; @9 Y: M! k) a9 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
r3 R$ J0 ^" \- y7 |! y: g! o( H" U5 z% {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 h: v3 O- N, @1 w
unsigned int count_copy = 0;
: v6 \5 }% w5 R# f6 }6 P
4 b: M+ ?: {1 `! o. ]+ _9 J* X% c+ V# G+ U" X
int main()
8 Q, ~. l6 P: M `% F$ _) j{
' _; T/ M! b' a& s$ ? pRX_MSG_PROTOCOL pshreRAM = NULL;
( G! c' C" D+ s; E8 W; J! W/ @ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# l% H8 a3 E& T3 z7 C% A* \1 }/ V
( j; g$ z& l" n& j* I while(1), Z' |+ I+ j% d2 A* p7 `5 X% \
{* ^0 d( ?" r6 ?7 ?" e' H3 T; J$ f
read_MSG_buffer(pshreRAM);
' E/ y) D# z1 G9 R$ |7 J } ; T) n3 d" z0 N+ Z" w/ }$ V% v/ Z+ }
}
, Y6 M5 o5 t) z9 J1 E1 }" }
8 F( M" U8 f4 Y& i; H- jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 L8 c' m7 v- Y8 l' K+ X* p) I
{9 {! k2 C, c' q' Q
RX_MSG_PROTOCOL buf;
' Y" b+ f/ X4 _" K
7 n( R7 F5 w: Q( S* j4 ? buf.a = pshreRAM->a;0 Q, G4 X3 w/ ?& a- O4 T( S/ k
buf.b = pshreRAM->b;3 Z& _! U5 q' a
buf.packet_cout = pshreRAM->packet_cout;1 q( p: ^9 ^# K x+ O. g& Y
+ g& K. w' Z: x6 a; g7 A& j4 Y
if(buf.packet_cout != count_copy), `, A7 k0 F# [7 {! X/ q) B$ C
{
+ m1 V7 Z# T4 V" ?2 |! w. y5 } printf("a is %d\n", buf.a);
& ?4 ^2 i$ M+ G) |. D printf("b is %d\n", buf.b);& T% {! B! @6 k- {) _* w! U8 ]+ F
printf("count is %d\n", buf.packet_cout);
1 g. u C, C; S( w$ K7 i u count_copy = buf.packet_cout;, l/ j/ j! s& E0 i K
}- X1 S' o2 F" I/ _ j" o+ ^$ s6 J7 _, Z
else* J0 P% ? ?% W
{
& V8 O' l( W9 Q# e+ \4 J \ printf("No effective message!");
' `5 K3 F- S, F. C5 X6 z }! G( _7 J" _! a: F8 u% X5 k% ~
}
& s( S" z+ S! P* L% S
`7 L* t8 C& z4 R1 g+ C- ?: U$ y( L" r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) ~/ Q8 l3 J" ]2 S$ b6 @6 R# A" H8 a9 k使用下面代码,对内存使用了mmap函数后:# S; g' X1 Y: I: n; v
#include <stdio.h>! k& }- D! Y" y' w: f/ }
#include <unistd.h>
+ I( p& H3 g$ @0 D+ ]#include <sys/mman.h>
: V2 A, i- {$ d! F7 O#include <sys/types.h>- S- V5 J0 E' G
#include <fcntl.h>3 {" a' c' N2 Z& d, C5 C9 w" x+ I
) Z( H6 c0 m7 u7 k* y9 L# Q; `
#define SHAER_RAM_BASE_ADDR (0x80000000)0 L2 n8 c# a- Y) V" E0 j" D! ?
#define SHAER_RAM_SIZE (0x20000) % J0 Q1 y4 R2 b; q! v. l7 ^( \
& Z0 r* r3 K# s' b3 }6 r9 btypedef struct
) H1 a+ T! u; i v0 \{
. \+ r- A, i$ E$ y unsigned int a;
7 W. s4 n* B) N8 T! a unsigned int b;. \6 G7 o# b; X5 I7 h
unsigned int packet_cout;
E' I5 @$ x! V* j8 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 p7 t6 ?. a1 I! L: X! @+ J# e/ S% h* l6 w- ]; x
void read_MSG_buffer(int *baseaddr);
7 @/ W) [; o7 F- Xunsigned int count_copy = 0;% G: E% p+ _7 Q3 g- d5 b4 K
' ]8 f/ y/ k% B( W- r/ B
int main() k1 T/ i( `$ W
{
, U3 N, G8 {8 M/ V `9 g int fd;
! E r. h# ^1 ~; v! D int *mem = NULL;
4 W& l. s4 x6 B6 P6 `8 s9 I+ {1 ?2 H0 U0 M6 n( t# P
if((fd = open("/dev/mem", O_RDWR)) <0)) ~, B9 N- m7 D# m) K4 U
{
2 h% q F6 O: [, H" I perror("open error");
( f! h K6 v" I5 u return -1;
5 G* `+ r# h( Z3 e' O. i' v$ j }
# _' J1 o6 {9 @: q6 Y$ E w
2 E5 j4 V6 r9 I/ | mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: ^# g5 I* K1 s1 y
( y1 O8 T( j/ A, A+ B while(1)- ~2 B/ X' q: w" y3 u# D
{
, y# t# ]. H' t: g/ M& P read_MSG_buffer(mem);5 G+ X; ?! N% r! o- ~! e
} # p; @! F4 _- o% w' H
}. \" y5 v( K- j. C
2 x- R0 C/ u1 H: M' x- k: a/ `8 Mvoid read_MSG_buffer(int *baseaddr)
" H5 n8 A9 }6 ?- e; t{
4 ]1 \6 O1 O8 m$ @! a) E' Y& { pRX_MSG_PROTOCOL pshreRAM = NULL;$ D5 e; }7 _. A" V7 Q
5 r5 w* O7 d- x( ?; T) F4 ^ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) l) c S- @6 o/ O4 A( U
0 L0 v3 i4 m1 M6 H
if(pshreRAM->packet_cout != count_copy)
! I! ]7 H$ i! c I, m2 T {2 H: z9 P6 v( a/ `0 {
printf("a is %d\n", pshreRAM->a);7 `: G, `0 I/ m/ h% x9 q( \
printf("b is %d\n", pshreRAM->b);
/ F) _) s- _$ x3 j! ^, B printf("count is %d\n", pshreRAM->packet_cout);
% }2 p+ k U0 Y5 Y1 P3 s, F count_copy = pshreRAM->packet_cout;
6 i( _7 ^. e/ i+ D1 o }6 d6 h( A8 F: Q3 d, @2 O
else8 R- C& H2 a; [2 u" ]# Y0 \
{
0 D6 h6 w% V4 H# c& d" Z- H% O printf("No effective message!\n");
( _4 d' J5 `, C3 o- z }4 W# o9 X. l* J
}
$ ^( N5 N+ K( y0 ^# J5 n8 ?- r2 ~, A: S) q3 Q2 M( Q0 }5 u* K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ F) Y: v( V: Y. I Z- f
9 ]7 n9 L, C) k5 S" _# u) |* c' h E7 d5 x. G
. d X4 |8 N8 }3 B: ^' M j- D, V9 B& I9 E% Z" |/ E
|
|