|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & o8 C( N) U2 a' Y) B y" w
2 ?/ H% p1 `% i8 T6 J+ @) t9 f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' B3 l/ W8 c5 X; s o1 N; n
#include <unistd.h>
( ~+ e5 l5 s4 |" O#include <sys/mman.h>
! e' c7 A; ^' W \: ^+ j, W5 n7 h#include <sys/types.h>3 Q: n) F' A2 n$ _) f
#include <fcntl.h> ]$ `% |1 Y8 _" T
Q/ {7 O c5 ^0 n+ j: `#define SHAER_RAM_BASE_ADDR (0x80000000)
8 @8 z' X0 u$ c0 X1 ~
|0 [* J. p8 R$ Mtypedef struct0 V* l( A# o/ e- ^3 `9 p3 a
{8 C3 G+ O* r5 w9 D! f4 g
unsigned int a;" b$ d, \, O0 l% S+ A
unsigned int b;
" L9 L# \( u }* A, F) a. i unsigned int packet_cout;3 t# R: ]5 n4 Y) j+ R) ]% n! K/ j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 K0 ?8 _$ q+ K
4 X6 K1 i. V0 `. D. r( V3 r! U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! P9 P) f% R7 l7 u. z
unsigned int count_copy = 0;8 K5 y6 y* R$ e _- l; j9 y6 }
+ R3 e2 p& v; e4 G
, A+ e2 l) z8 O1 g( s0 x' nint main()7 g, `! I. ?" ^2 I% }
{
5 t5 Q: \+ Y9 E# Q+ U( W1 P pRX_MSG_PROTOCOL pshreRAM = NULL;
, `1 ~" O& x) e3 A pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ M+ ?# S0 M% X
& l7 G+ M; S8 \0 p# K while(1)* ^5 B- l$ `5 D$ T* n' w
{
, g+ T# H, H- S read_MSG_buffer(pshreRAM);
' G9 M# A* F0 n9 h2 G( z& c }
, O2 k+ l. r4 j( `} J; i; m3 {6 Y( Z" z
; n% _3 t9 v8 i# J y- P* evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# l/ Y# d; _, |( g/ N
{
' a+ r" U' i: D7 T2 p4 g7 q- @" @ RX_MSG_PROTOCOL buf;7 ]6 g* w C6 }& T! o8 L
' V4 P! s8 v" ^( Q: H3 Z {) \ buf.a = pshreRAM->a;
g, a' _0 P# i8 w+ v1 j1 o buf.b = pshreRAM->b;
: i/ D- A7 l- z7 p) O u: @* C buf.packet_cout = pshreRAM->packet_cout;) p$ f! W7 t% N9 N- y( ?( V
; m. d! }6 e/ o, c2 Y if(buf.packet_cout != count_copy); ~6 W* S' {3 A; ]+ H0 G
{4 ?% D+ z. i, O8 E- S, q
printf("a is %d\n", buf.a);
: z$ N8 B( M& c; [3 [) D printf("b is %d\n", buf.b);. }3 ]9 A$ i T) s2 _" e, \
printf("count is %d\n", buf.packet_cout);( c$ I! ^3 D# \% N/ M- Z1 d# F
count_copy = buf.packet_cout;! A D" L7 J' e8 L) @
}& s" @) `& `+ g. K- ^+ D+ S# ^
else
+ _7 t: k, u$ N( d {7 y8 u# ]* A. T# S, {
printf("No effective message!");
/ m' x' ~ M/ [2 ~. } }
: F# j3 E) _4 z1 h/ \}
& K# P4 E% b5 x! l+ z- a
% ?1 d3 _' ^& R0 C) e
0 |2 L- m" J5 F9 v$ A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 P/ e. T+ s* H4 F使用下面代码,对内存使用了mmap函数后:; \( A% p" v1 ?0 e8 g
#include <stdio.h>
9 l" u% O# r0 t#include <unistd.h>
5 V' k H3 `( }& e#include <sys/mman.h>
' e; d' }4 n) ?% w1 ?/ C) E, m& l#include <sys/types.h>
8 b/ s) Z) k. _, Y+ `6 I) Z. F#include <fcntl.h>9 v6 g. s, x9 n* Q
( {" `8 l5 D! d3 P' T#define SHAER_RAM_BASE_ADDR (0x80000000)7 `$ d7 E9 U0 t; D
#define SHAER_RAM_SIZE (0x20000)
* |, p) \. \5 k ?# I
) ^1 _7 R( [4 \. i; b4 ftypedef struct# _ S9 s% B2 i1 n
{8 H7 K# ?/ ^1 S% m8 T
unsigned int a;$ @6 e# \: Q- h, a4 g1 O2 q
unsigned int b;* N& Z% @* d" }4 Q* w: H
unsigned int packet_cout;5 m5 S% y9 f5 g1 m% H9 e0 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 O3 Q2 O0 }9 q
7 G! o' C/ R2 t: @$ F
void read_MSG_buffer(int *baseaddr);
8 J. G; Q& n( y+ c9 `unsigned int count_copy = 0;" {( h; K: O1 b
E8 s* ^& C/ A9 x& Q, B! L" f( t7 K
int main()6 d$ M4 R% x# z# l* ]4 J m
{' G6 ^, u. P. _
int fd;3 H) {3 _4 w8 H |# w
int *mem = NULL;7 }8 ?! R5 m: B% Y n9 q9 I
! n" G9 i: f' s/ i( L
if((fd = open("/dev/mem", O_RDWR)) <0)" l H \, H9 C. p9 C
{
$ v9 v0 Y* F5 S* [" w7 U perror("open error");
6 B. ?' T# f2 x! ?6 t6 o* t return -1;
' {! m9 o4 I0 S3 t5 T$ { }
: |; r. i I8 V, u% B5 r; U % Q% ] t' V" v& D" R$ @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) K1 g& T: j6 D$ ]2 r, y" b
+ T5 T. n7 V2 g E! ~5 d
while(1)
0 i( _* S; y2 h! g {
4 T7 ]( G+ H7 b/ K6 l% d' P read_MSG_buffer(mem);
, G8 V0 C$ ]* Y8 f( D }
$ [+ I# D# P2 U8 t" \! C6 x}( u+ g6 j% K* F
6 m4 A& ]4 n& g# u6 [+ C+ P) tvoid read_MSG_buffer(int *baseaddr)6 N2 f6 x' Y1 |5 f, Y
{6 q4 g: w, |' C$ E7 a5 t) l$ `+ t# S. h
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 W; a7 X$ [# T- R. O# _9 n$ c0 o: x! ?7 E# K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ p0 K) V% D, i" B7 V: i6 A/ o
5 a K" `% d3 ?& U" Z `4 U if(pshreRAM->packet_cout != count_copy)
. v8 e+ h0 K, @( x! f- h: W: Z {
) A! \" R; b: q# ] q9 A4 ` printf("a is %d\n", pshreRAM->a);
3 L1 p* L/ B T" w) C# P printf("b is %d\n", pshreRAM->b);
8 ^% p8 ~% M& C0 H" c" C& Z printf("count is %d\n", pshreRAM->packet_cout);! T! I5 s; ~' `$ a$ N
count_copy = pshreRAM->packet_cout;! u! S! U% v4 b, l
}4 ~6 q+ Z$ F+ }% V, O7 e
else
2 }$ ]5 Y5 O5 P4 G0 [* a* x/ K. q {
5 f- Q8 B+ P. G: t& o3 j printf("No effective message!\n");
5 Y0 ]2 u+ X6 ^" j6 W; l }4 r$ \. F0 Y7 A& d* K/ G9 y" {8 H
}8 w4 x/ D2 y' j4 O
7 U% U) L; U) P4 m( i, b* {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 M' K. J- t" t) m7 j/ X
) i# ?& @0 B( t* E& F- p, F, W7 r2 Z4 p1 I8 J
0 R2 E# N- y. a! L4 m2 ^+ U$ q8 b
1 l; w- t. }- Z! ]# |5 \ |
|