|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% m4 B9 |" c" v' T
; }8 a0 W* e8 I: ~ M7 r: \: fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ M' r" S: o+ i0 }. R- [( C8 i
#include <unistd.h>) L" E2 ^1 q% ^
#include <sys/mman.h>
$ {7 T2 I# n. q5 Y#include <sys/types.h>
8 m3 Q0 C1 ^: k0 s% @* {6 ?+ }#include <fcntl.h>
1 T- _/ b! z1 j' T
7 l. ]5 B0 Q( A1 X( V% L#define SHAER_RAM_BASE_ADDR (0x80000000)
2 z3 K8 q+ _% O7 r% U% N) ^8 |
% y# j2 y/ _( C% ?typedef struct
o: E- M$ W+ z, f8 T: H; ^+ V1 c3 m{1 k ~, U9 D, I! X% a
unsigned int a;
) A5 d1 |: e* U- n unsigned int b;4 K' i# I5 a2 S( Y
unsigned int packet_cout;
/ D7 U" U# u$ B* C; ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 w$ f- p( t$ T/ S, ^$ z
7 M4 V) [! f$ c- mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* X6 i8 t. }) r2 O7 e
unsigned int count_copy = 0;' ?1 [" K+ E5 E \0 U, B0 R6 m* E
6 G( `. P5 C [2 u9 `% j
% `3 y7 o6 j! k: {( _- c( F: ^int main(): \/ n7 |' J; a9 _# e8 w
{" G0 x X; o/ A# G3 d# j; @
pRX_MSG_PROTOCOL pshreRAM = NULL;, O0 p3 u! o8 j
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. Q: a+ @5 b- l( \9 W- B* a/ q C' ~" ]7 N* @* ?0 d
while(1)
J+ V/ C" F) @$ D& m( J {
! b4 G/ n7 Z! P( F5 g$ V5 O2 @ read_MSG_buffer(pshreRAM);
) ?6 J3 }/ z& P b3 M$ I% l }
- n+ ?# J( I/ z2 {}! c+ J5 o) C5 h2 s
1 J, U, o# R# Y. [; d) {% @: M1 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; Z+ p6 o7 T* Q* U$ j5 H{0 d4 K1 `% ?& g( {
RX_MSG_PROTOCOL buf;! `$ N6 d) z5 v2 V$ W: b* e! e/ |
# N( B3 W1 [( c; O; v% S( r( H buf.a = pshreRAM->a;
3 u9 E0 C( d8 Z3 t. ~ buf.b = pshreRAM->b;
( Z; i: n6 t( y3 c5 |; z buf.packet_cout = pshreRAM->packet_cout;0 G% e5 _& S: X1 h! F& B3 [- z
7 O4 g9 A/ B* w1 F; X4 M
if(buf.packet_cout != count_copy)9 u; ~2 Q9 v: `7 m! y' h
{
$ {$ R+ [, O5 w9 S3 s printf("a is %d\n", buf.a);
% @ s, E+ H/ s+ P L printf("b is %d\n", buf.b);
$ W. @! W2 L# h3 ] printf("count is %d\n", buf.packet_cout);
' ]! o9 c, a% d5 ~6 H' M7 H0 X count_copy = buf.packet_cout;. |8 `) I g: r9 K9 ^$ t: B# U; i
}
4 n: T8 ?5 d. R7 Q else$ r' m6 m( C$ n, _6 R5 j7 @
{
1 p f$ F& H, | printf("No effective message!");
@4 l n) D. ^5 [) t' y }* P7 E; R: J$ a) r& K6 y; Z- r
} Z, [' |8 u. w% K0 s/ `) N
0 s) `! k. a2 R3 \3 @, j9 B
2 u; F& O; o# l4 v, I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ e8 a8 D' V5 E! c" h
使用下面代码,对内存使用了mmap函数后:4 c5 ^2 Y8 ]$ a# J: s& ~
#include <stdio.h>
( V; f* w4 P0 i0 y" v#include <unistd.h>/ @/ G: M q) ^/ c
#include <sys/mman.h>7 g: i; E6 V; _/ n
#include <sys/types.h>
; A( O8 R J$ S/ k#include <fcntl.h>
2 Z# Z K& ?8 ?5 ?! B- f+ f$ V: S7 E2 s
#define SHAER_RAM_BASE_ADDR (0x80000000)% a& B2 |6 O- a2 J
#define SHAER_RAM_SIZE (0x20000) 8 ]& t. _! z# Q% L
1 D ^& d5 \7 G2 c! D9 k
typedef struct/ u9 T( D' a/ A$ f) E- b) z4 Z
{
; ^, j' M' \9 ?# h h2 n5 W7 N unsigned int a;$ p2 K4 B6 [9 ^& t. P
unsigned int b;
~- b% M. \. u unsigned int packet_cout;
) \/ T1 O# u, Y8 D- `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 R9 i3 a" R3 S2 {
3 o' M* Z4 p5 ~; ^
void read_MSG_buffer(int *baseaddr);
2 {/ b* \ O- Q! b6 z- Funsigned int count_copy = 0;
! h$ ?: X- R, ]: G( {* L
$ K" @* i) l8 k8 D% c4 v- \% \& Iint main()' N. M6 Z. d+ h1 z& ^% E
{
* P& d1 S) W+ B3 W# V$ L; K$ n int fd;: T( T. J. a( y B& U( R/ O
int *mem = NULL;
! K- l0 S" R# q4 ]2 n
. h7 D# S8 i$ f& G. C if((fd = open("/dev/mem", O_RDWR)) <0)
+ w/ \+ `5 P6 H+ R {. O% Y2 _; l" p# G! x4 `
perror("open error");, D, Q. q9 E* l6 Q
return -1;
7 ?0 |1 @, H z: y }
, r2 a) ?$ r" z) C6 j& @9 i, {
6 X% l1 l* e/ v mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' p7 C& ?( [5 N9 O# J
8 E# I o9 S1 R while(1)2 B- G& K' _' ]3 L
{0 ?$ Q' Q$ C5 m( ^# T1 r: W! t
read_MSG_buffer(mem);& U# t, [0 `& k7 V( Y
}
7 _7 O! a& z( O}
- k8 G$ E4 U8 L" `, T9 ~; Y, F) U; J* y- x9 T( Z! [
void read_MSG_buffer(int *baseaddr)! p5 t1 R; J- b
{1 F4 h+ X8 |( I! G2 f% c: N
pRX_MSG_PROTOCOL pshreRAM = NULL;
: m) ^4 A. @5 X6 ~- j0 o& O+ ^7 I, ]& O7 E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 @- y& t! _9 ~9 g
: a' m& {2 A+ ^) K6 U if(pshreRAM->packet_cout != count_copy)3 U( Q7 E5 C* l# |
{
3 r- W1 M3 c- @ printf("a is %d\n", pshreRAM->a);7 r: A" [) Y& K# s+ T( Q
printf("b is %d\n", pshreRAM->b);! I4 e5 u# G; A7 u) o/ y
printf("count is %d\n", pshreRAM->packet_cout);
) L) x+ K+ Y$ J" [$ s( @ count_copy = pshreRAM->packet_cout;
2 w4 S0 D( p6 k6 y' E }
& }+ N! C$ h) W( O, f) V& d else
! i' K) s$ H. `* K) q {" A/ t% L* e0 c. s7 x
printf("No effective message!\n");
2 Z$ c7 x; s+ X1 @ }) }. q) Z1 D3 C5 _, Z: W# a
}
3 x3 e. |9 ?& t$ G; s3 ^, R) J# V% A! e( l0 `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% [8 Z6 q" [% q8 @! ?- ]* s+ h
$ ?+ N9 P( J2 ?1 X8 J2 F( f" Y1 [/ D1 r" r
6 b2 o0 y4 l! L+ o _) Y. @2 P: u3 ]+ z5 r3 M
|
|