|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 J8 J9 S& V2 |; c( w
* w+ ~- ~1 x' N" a0 p/ n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 e$ n) b" W z. |+ F#include <unistd.h>
- E. Y: @6 N$ N* N( j: h5 J#include <sys/mman.h>
! @& ~" r$ [1 k; Y#include <sys/types.h>; b1 o9 h8 `: H' q! ?
#include <fcntl.h>
% {. H0 T, v: V. s5 [. g1 i, y# h
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ r7 I2 N$ E- \* R) L ?9 J+ ~' @ j! ^8 Z
typedef struct
* w2 r, }# `" h; {/ h{4 }. l) z. x, P' U
unsigned int a;& K/ `0 B& @/ d. L5 u' [9 X
unsigned int b;
/ Z5 Q! e$ s/ R0 Q' B6 A unsigned int packet_cout;- B2 c) M* `# ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 S& p/ f6 r7 ~' ]/ v% v9 x6 e
/ `$ h$ j# R7 z7 `) J* T# Z2 ^- D2 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); g9 V9 W- F d2 E: Q' F. D
unsigned int count_copy = 0;
7 k4 K" v0 T8 h, A) G, }0 q
1 e5 T) ?# g1 _* X6 b$ Z1 J) M- ^4 W0 O. v `5 o
int main(). U; e6 X# D/ Z# h
{/ e$ [+ g8 _" u6 k. C
pRX_MSG_PROTOCOL pshreRAM = NULL;
: k: y3 W, N$ x8 W. Z/ V pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 y* z) [$ T3 x- [7 D
u5 U" Y$ k' F \2 f
while(1)3 k& Y, v h8 b$ E. p8 [3 P0 @
{
$ {/ r5 _+ W3 a- v0 @- D* z read_MSG_buffer(pshreRAM);
0 i+ j6 Z& P4 G }
4 V: ~) j* g, F( Z( \}
( O9 H @2 _" r$ Z* G1 A, x! m2 N: f/ X/ J* o, |5 B) N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 a& ?- N4 }9 @# H+ F
{
8 H3 d3 Y$ \4 B9 Q: e RX_MSG_PROTOCOL buf;
- n6 W8 y* T: d4 x% ~$ N ; v2 N3 Y- h8 T. [% \; `, T
buf.a = pshreRAM->a;! A+ k( `4 Y2 X
buf.b = pshreRAM->b;
& G8 T/ f7 a2 ]/ ] buf.packet_cout = pshreRAM->packet_cout;4 Y. P, w* J. ~/ e/ }3 G j# c, Z. z" |
" T ^2 w3 V, G3 Q) v
if(buf.packet_cout != count_copy)9 E) N: {# O8 q( O, H8 ^( ?
{; r+ s' ^7 P7 Z1 T3 H4 S2 C& |
printf("a is %d\n", buf.a);
3 I+ v. P7 u5 T) c" s5 m9 s6 h printf("b is %d\n", buf.b);/ H0 D) ?$ Y5 Y
printf("count is %d\n", buf.packet_cout);
) g: U6 W3 k1 @, e count_copy = buf.packet_cout;
* |% v/ v& Y& _: f) o" d! Y5 z }" K# G, f T4 f) G7 \" J7 D
else
; i- G$ I( [6 }0 c/ x {3 c( }/ M6 ]# N( V1 H* K8 Q
printf("No effective message!");
" S# m7 D& H% I2 _' g, r7 ~. X }9 |0 g$ T! ?4 V1 e3 Q
}
1 U& k' @1 m% g0 t4 o* g6 V% d" I$ b% s) p8 I, d6 a" z$ X4 b. ?4 ~
5 T3 |) f+ e: {& N3 r; v1 F
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# ?3 o' z: z( g1 W" o$ l* p0 a
使用下面代码,对内存使用了mmap函数后:
; @' n, e: J$ K- y" S& h6 V#include <stdio.h>9 ^6 g9 n+ Y, L# t6 M9 v* T
#include <unistd.h>5 T" b% C, l: u* n* |; T
#include <sys/mman.h>
: C6 @/ L- G9 J t* f/ G+ m7 N1 u#include <sys/types.h>
3 A3 ?9 R2 z% L6 N2 W& G#include <fcntl.h>: H5 k! q3 A; S D" K
; x( Q* x6 W& {: V! ]0 Z3 D#define SHAER_RAM_BASE_ADDR (0x80000000)9 ]! p$ J0 s4 {0 E0 T3 g
#define SHAER_RAM_SIZE (0x20000) . G# Q. V+ R, R/ l b/ R& }
6 I0 w% M5 j9 f0 z. U+ m
typedef struct0 P" u( g/ V8 O' o
{# H9 ?. b: a7 a8 `( G! T' l
unsigned int a;
/ g. h" [+ Z& G5 @ Y+ `& M. G unsigned int b;# t6 L3 E$ x: C* k s! Y q9 W
unsigned int packet_cout;
6 w, T$ z; V: o. O5 M0 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' o& Z/ f9 y; z% {3 E9 T- n% R3 w, b: ?% T0 K, s3 ~
void read_MSG_buffer(int *baseaddr);
U9 t3 Q9 u8 Kunsigned int count_copy = 0;
* E; K; e! W! K+ W/ x4 T5 C+ E9 M) I0 G1 p! X4 i
int main()8 z+ O+ r L' g2 W9 ]
{( p# J* Y. n) F' N" g
int fd;# } c' a% ]' [. h! V' S
int *mem = NULL;, B# b: A0 z1 s( [# E
4 G; ~$ D- H( U4 {
if((fd = open("/dev/mem", O_RDWR)) <0)& U4 \/ P* J9 p; P7 D# F
{
8 p# y& j2 R& ]8 e7 R$ _ perror("open error");
5 p; ^$ Y" h( } return -1;8 _0 f# L0 W+ p/ F! [% V
}
c0 P+ p. G. J% ~( d' @: ]# a- c 2 {3 x3 I0 x/ s. K0 l3 L+ z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' f8 q7 r9 G1 n* q+ V
8 f, y' {" ?0 J' e6 \: m0 M while(1)$ {& h, {8 |- A- @$ N
{4 t/ ]: ^ j/ F
read_MSG_buffer(mem);( n8 _1 M- r( p* H" r5 l. L7 m( K3 l4 Y
}
( o C- l4 P4 U}/ R6 T$ d' `; Q, M: f
3 y9 l/ X/ ~/ e
void read_MSG_buffer(int *baseaddr)" M4 [% Q& j, d1 H3 C
{' \2 x- V6 k5 H
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 E' a+ O; \7 {- }/ f/ f( W( Z, m+ r7 m3 z$ n( A! m4 [5 W) `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ P- g" j) h: ]7 `0 x, L. }, E
( n+ _1 N8 v- L; \$ h
if(pshreRAM->packet_cout != count_copy), d3 N2 v% o+ a! S a: z3 Z
{. u3 \& t, C( L% T* b3 @0 l0 N
printf("a is %d\n", pshreRAM->a);
* L4 z7 w: h* {9 C6 o4 Z3 W- k printf("b is %d\n", pshreRAM->b);- ]3 s* {0 f( O1 B5 G8 y
printf("count is %d\n", pshreRAM->packet_cout);/ o5 J* p, F1 W* i) ?' A$ ~& B
count_copy = pshreRAM->packet_cout;
9 W' S2 ^: n# h5 }, h }. q) t9 O. v& s
else4 V& y) e" ?3 ~% A6 T7 _
{) Y" l" `1 _1 n0 M0 X9 @
printf("No effective message!\n");
/ y. k' g# F. t }% m7 \% _8 E( A
}
9 Q( |) G$ Y- x" {
1 K/ [ |3 h* _% S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 d- B! r: I; w" O: ~
. s/ p' c0 I. H/ N( [& `! V" b$ _ T4 i2 K; g
$ n( {9 H# ]( U4 g ^6 q- D
~" O) F5 x! z$ m& O l u |
|