|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " T) H2 J7 E4 `! B' s
! C" a. |7 J% P# f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 K3 _4 X$ t0 p+ F% z
#include <unistd.h>, `6 a2 z2 ]4 w9 P L1 V6 l) x- d9 k5 s
#include <sys/mman.h>0 U3 Q0 E3 y& [# f4 q' p5 @, @& W% k
#include <sys/types.h>: m# ~+ A9 V$ F- e9 x& S( ~, N
#include <fcntl.h>
/ ~" q0 S/ C3 H- ?
2 }; M) L4 V8 D3 c#define SHAER_RAM_BASE_ADDR (0x80000000)
7 ~4 o# z1 S: }0 B2 p x! L6 x" o- f0 L# M8 C/ }5 p+ \
typedef struct
% ~/ l, p3 i4 A( [$ j, d3 p; a{
2 B h/ v1 a: ?4 u# @2 ?5 a unsigned int a;) x) C8 J0 h8 y
unsigned int b;
5 \% ?+ f0 s; s0 `, f* {$ F unsigned int packet_cout; ^9 `% a# @; g5 m. @2 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# H1 f v- F: F5 T; l
3 x; S! K! b. }( M2 w! }' N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& G8 P O1 s7 K/ U3 g; Q+ S) ?) ^% Qunsigned int count_copy = 0;
# O( u% H# v" z, y S/ d% v! W1 K. `
5 T. s7 y+ C$ w Q! J+ p7 w
int main()
0 `: t+ Y/ ^; N. {' X) ?{
, i9 ?; Q8 C+ Q pRX_MSG_PROTOCOL pshreRAM = NULL;
' s5 t2 ?/ A# Y4 t. a/ F- R7 @ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 C# S* k/ J% P2 M( [( |) v
4 J" D# u1 W% k. l$ z1 ^ while(1)
* X. `0 l& H& i7 E; A8 b7 J* v, k {: U/ d# c+ a8 W+ d
read_MSG_buffer(pshreRAM);# i9 i' V3 q5 T3 j2 K7 o
} 7 d5 E( \5 x8 p6 @: Y1 ~
}- d7 q) \( T* v' b, ?. b2 |# m
& c; o* t" d- q9 Y* c% M7 G/ Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
j2 a- I" g T! H{
7 b: ]; Y1 A" K( S RX_MSG_PROTOCOL buf;7 o d" M7 o! l: a' H6 _$ G( }: q% D
6 ~! J" n+ ~& b
buf.a = pshreRAM->a;
1 |/ J% A% O* @# _ buf.b = pshreRAM->b;. N; R' M8 U% n, m: W8 C* L2 l6 y
buf.packet_cout = pshreRAM->packet_cout;
4 t: b+ l& _+ N. r) H5 f8 { 0 [. b5 @4 Y6 z r
if(buf.packet_cout != count_copy)) l8 W' U. p+ G
{# w% f& [* [! P8 Q( k5 b
printf("a is %d\n", buf.a);. W% ~% c8 Q* n9 r# [. L$ ]
printf("b is %d\n", buf.b);
+ `; G+ |( e( q! z; X printf("count is %d\n", buf.packet_cout);1 \! [) \4 n" @
count_copy = buf.packet_cout;. Z/ m" B, x+ z5 v+ Z+ c1 ` R
}
; X" \$ g/ f' Q- ~2 F* C else
- M4 J) g, u( @* u {- V3 i' w: b* Z) C% W% Y
printf("No effective message!");
. W" D1 J2 Q, ^ }
( G/ Y3 ^' A" O- F1 N$ k9 r- y6 I}2 G9 u) g! s0 J0 _* [ E: X) }
8 @8 ~, W0 b* w* c% T
1 s& |# w, g$ _- A" g6 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# n: f# f7 @" [( {$ i* D5 ?# \9 _
使用下面代码,对内存使用了mmap函数后:
5 k- w2 @8 }8 H* V2 }#include <stdio.h>
' P. S* T: `! J" A5 H3 [4 Y% J#include <unistd.h>9 E5 m9 B# v' `/ q
#include <sys/mman.h>0 C! G9 y) A! x& Y) W6 u
#include <sys/types.h>. C$ c5 t6 X+ i. F. j0 E4 h
#include <fcntl.h>
N3 V$ W }. T+ |1 R8 _) l
* ^# d! ~- n' N) E; _0 z% W4 u$ l#define SHAER_RAM_BASE_ADDR (0x80000000)
8 Z7 K1 f4 {; H" s' n#define SHAER_RAM_SIZE (0x20000) ; ]2 M% a& w6 d" d) D P& o
% V$ T; \3 N$ f8 p
typedef struct* z; b8 H! V; G. I+ P! E
{, ~, z$ o) ^. W! }
unsigned int a;
. b7 m$ W. W2 c1 N/ N/ k0 v unsigned int b;' u( C7 i& C; G9 J, M* c# r0 E
unsigned int packet_cout;9 [0 S; j. ]; g4 E/ D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 B& S0 v: B) L' L* H1 T) O
, o( C6 t- {5 z: ^void read_MSG_buffer(int *baseaddr);
( R- i# a {1 Iunsigned int count_copy = 0;7 O2 j" s5 q! D% N$ B! r; }
. H$ j4 }, n5 n/ ~+ ]! D
int main() j3 M% S& S$ T7 f4 `: }; e0 ?2 K6 k
{4 s" E8 S9 |8 ~0 ]2 ]
int fd;; x, P" M& Q" c: ~- Y/ ^( B4 G
int *mem = NULL;
$ L# `. m1 R. R% u* F$ s& ?9 i1 i2 e$ q3 d2 D" i
if((fd = open("/dev/mem", O_RDWR)) <0)% X) h# Q$ ^5 ^3 Z; \# w
{
; o: k& E$ q) D: y7 f5 ? perror("open error");4 a* L% t! E! D& y) s3 q
return -1;, r' H# I6 U$ q' g$ ~# I* g
}# Q8 Q1 W* q# S3 m
% T5 k# {: x! C1 U# Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; O& w0 N7 X! Z5 j5 T* r2 O1 P) t
& w: C! h6 F0 k( P$ P. g while(1)3 X& K ?9 M% i% D0 E
{4 i# }( k* a9 ]: F9 ]; G+ x
read_MSG_buffer(mem);7 T( N, l1 c( _( X! y
} ) Z l/ p( j$ \% C
}
% z \$ }; V, n$ r0 B$ @+ ~/ Q7 P* R/ m( f( o2 L3 {
void read_MSG_buffer(int *baseaddr)3 D9 ^; ^8 q$ j! [9 C* r4 L9 p! C8 k
{
! O) R2 W; S. v9 J4 u2 y8 N1 B pRX_MSG_PROTOCOL pshreRAM = NULL;
+ ]1 [! P5 ^1 B# ~) Q$ H8 u' `4 S# g% e \! a I6 o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 J% A2 } p, f; Z: Q$ ?
3 V' e( f8 ^& H) \9 Z3 I2 E- W! f if(pshreRAM->packet_cout != count_copy)
( M! p5 Z; e N/ u, p$ p1 n {# s6 D4 U& p9 b& {' k1 p
printf("a is %d\n", pshreRAM->a);: _+ @3 x8 {! e& h) o, ^6 p
printf("b is %d\n", pshreRAM->b);" P% v2 s ^: a9 k6 O `' V
printf("count is %d\n", pshreRAM->packet_cout);3 |& {% v$ a3 O5 M, L7 m
count_copy = pshreRAM->packet_cout;
0 Z r. p' c/ t }
3 a* Y/ B1 C; i' } else/ v! Y/ f q. e5 L
{
f2 m! Z: i- s6 L printf("No effective message!\n");8 | D ^1 _, r, d
}
6 q. ^: u! I- d% Z) h, p- u/ @}
. K# |. c, ?% s. C6 p2 O' C
1 R8 x# c" c0 l. u- H5 M* t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ G8 s2 o' W0 V* j# K; p
! X: E k6 L' l5 }, S! {7 ~" u, i `8 ]- }) P9 [5 M) `+ S3 k3 D
' k+ Y% N- V" U) d2 v$ q3 x; h
1 w" _5 [% `% k- a1 ? |
|