|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# g3 X# v2 Y" Y3 g/ J% k7 ]' K
) V# ~3 B. V3 s2 A# SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( I$ ~8 n P% O2 e7 `. q0 |1 V4 k2 e#include <unistd.h>+ u( ^9 I! Q& T5 v% H
#include <sys/mman.h>
; h+ h- x) Y( u5 P! ^#include <sys/types.h>$ y d3 L! P2 i) z& O& v
#include <fcntl.h>2 ` n( p& E5 G0 C& [% f0 p1 b4 A9 G
+ K: |6 N2 C2 G6 W0 _#define SHAER_RAM_BASE_ADDR (0x80000000)
9 z- n8 \/ _! ~4 D# d" [9 d, T/ U$ Y2 n4 {: _5 R* I6 s
typedef struct
- F' t% q; v/ p( x7 |, Z{1 g- V7 y& {2 n! c
unsigned int a;: } T9 c" ^* ~! h! t7 P5 ~
unsigned int b;5 n8 i$ v7 I) p; ~
unsigned int packet_cout;) c7 `. S. I7 q2 o. i8 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- E% s; p. j4 }
' g" a, u' u2 L! o+ [+ k! Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 @; @) e1 @: B- d i" s& Xunsigned int count_copy = 0;' H u" h+ y( @
) U& B8 a* Y0 O) G: F' ]4 [" a. R% p( n6 y+ }+ D w, H
int main()
. S' ~( { O. l{
( Y* a$ x6 X a2 t a7 W pRX_MSG_PROTOCOL pshreRAM = NULL;
7 q2 p: a! y4 f& n pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 n% n9 |3 J" L% p
8 S3 j2 @ ?' X# y+ q while(1)
j, G5 D. n6 t; y) v {
1 v5 t& l3 v0 ^3 e# ]. b. J! N read_MSG_buffer(pshreRAM);
, r* K; N" Q$ z) A& H9 Y M5 v! D } " ?* g5 w& m4 Z7 l
}3 D6 M: @2 x9 ~, v6 c% n
9 Y9 S- ]8 G" k0 G) v5 c0 x" B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# c" R8 m; ^3 r* r x{
2 S, P1 Z$ m* { s o2 _) u( K! R RX_MSG_PROTOCOL buf;
/ d" ]! O5 r. h! D% k+ d' I8 f
& G {% ^1 E* }# O3 i buf.a = pshreRAM->a;, r z2 C0 R2 i) _8 Z* |
buf.b = pshreRAM->b;$ r Z# ^9 a, V" O* N4 @0 d
buf.packet_cout = pshreRAM->packet_cout;& p* N; r) T5 K; f0 i
& {7 J' b6 i1 x4 q5 i2 m) c
if(buf.packet_cout != count_copy)
, c- ^( `* j' o# Z8 b% e$ c {/ c1 N. k+ Y3 _2 ~9 H8 I
printf("a is %d\n", buf.a);% g) b# h6 g* p
printf("b is %d\n", buf.b);
: F0 P" Q! J$ d7 Z+ ?- N printf("count is %d\n", buf.packet_cout);+ b5 d i- c$ w# { O \) o
count_copy = buf.packet_cout;
* @3 t2 C/ H2 e/ G }" K0 h8 k! y$ J$ y) b
else
& U, K% ?! K! T/ t& k+ \; W {# n! b% P: h! \- q, s
printf("No effective message!");) `' Y) }) m- ?5 z! W9 O
}
F! y' v& b: Z6 z, j/ ~}
% G: p: \6 V+ F! |/ @2 E" j. _2 R- m- o3 v& k
0 |& v3 v) u" Z; d1 l$ \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& r7 G. x3 ]& L1 D5 P
使用下面代码,对内存使用了mmap函数后:; o2 f6 s; p; i# _- p1 \6 c, c
#include <stdio.h>
3 h4 O! I c6 p1 l6 |4 ?. _( v#include <unistd.h>3 \' Q2 _; u# ]( b
#include <sys/mman.h>6 G. ^- ~- V* s6 l4 N3 i% D
#include <sys/types.h>9 F4 D3 b- p6 a: A' Z+ \* T6 P
#include <fcntl.h>8 u- Y$ ? d8 m% [/ }. N
. Z" J p! c f' _
#define SHAER_RAM_BASE_ADDR (0x80000000)
- L8 ~6 X7 A) A9 Y#define SHAER_RAM_SIZE (0x20000)
) Z/ v: r2 ^, @) e& ?4 B. C; F' W( v: G/ f$ R2 N
typedef struct
; Y/ n9 g% \4 l4 |* V{( }- {* g+ u, B6 H5 |' k O7 D. S9 Q
unsigned int a;
( X, ]+ V6 O9 \ x6 ]' z8 ^ unsigned int b;
: g2 Q3 g' ^# E, v# W5 x) N( N unsigned int packet_cout;
3 f' f$ u" I* d8 M# K6 t1 }1 C: ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" K! ^1 M5 b3 z
( |+ D7 D4 {8 X( svoid read_MSG_buffer(int *baseaddr);
4 s" K4 i, a) e) s" f& dunsigned int count_copy = 0;
1 Q2 U7 P1 Y. E2 l# q7 P2 t# z5 G# E/ k, I1 Q" X5 J5 T `) |: M/ V
int main(), v2 ^' E; n7 ^8 v
{
8 O" m! J1 Y$ [+ g0 U int fd;, W" n8 u; r' b) g, M+ r: U6 \. U1 k3 B
int *mem = NULL;: w% j9 I( [4 S2 q
% z5 G k5 ?1 z$ c3 B
if((fd = open("/dev/mem", O_RDWR)) <0)+ w/ T5 Z0 S" I- q$ W( t8 X3 v
{
9 {1 l" W* J+ j' s perror("open error");1 B* X; J- J- E q* V
return -1;
; F X! G! x2 k; h }
4 e, d4 s0 y1 J5 l% t$ o% ^; b
6 `) O8 ~4 a/ z* |0 x7 f mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! R. S) U5 {' p! m
. y- X$ }6 e! f2 U
while(1)
/ ]4 m! R7 g7 K7 d! O9 f* l' g9 T {
; b2 y# A- v6 X read_MSG_buffer(mem);
& W7 r# |2 z3 } } ' q- K7 W/ ?+ b
}3 a" p. O+ [& h, {4 H. h( C
( r3 Q0 ?: H( k' ? K) x# _5 B9 H
void read_MSG_buffer(int *baseaddr): v+ i! {4 O" W( d# a
{ J5 V: X0 G; A8 T2 I
pRX_MSG_PROTOCOL pshreRAM = NULL;% |) z" o' K4 w- S5 r! i- s
! z" F9 `: B4 n' V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 h, ~4 ?# k. S" ~6 P% H
W5 c/ q( a1 D+ l% L8 X if(pshreRAM->packet_cout != count_copy)
' p1 _/ p/ t8 ^+ d/ l {
+ J# t/ J: w+ | printf("a is %d\n", pshreRAM->a);! ]+ M3 J( a) k' K
printf("b is %d\n", pshreRAM->b);0 N2 O8 b& p2 _% ~2 C/ U
printf("count is %d\n", pshreRAM->packet_cout);
% k! Q; P2 k" M$ O% v) Q count_copy = pshreRAM->packet_cout;+ |- U# l' D0 B7 ]* g/ H& g
}
4 _/ @: F3 n4 W W# C" p else z% B3 i4 P" j" `. _0 e" a
{
9 U3 P) Q+ n* \% Q- D6 j( W2 ] printf("No effective message!\n");
% B1 h- Q1 Q, B' O! K/ G, J5 p }
, D+ q- g! }) Z}6 M& u9 |0 {5 a J$ `0 Y
) ]' i( c- G2 V1 v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' o5 I. [( a) z6 d- @
9 D* {1 d! N1 v% d# q0 q7 V
/ [0 o- m. m$ w% M' o- ?; m7 s: Z% N
O8 ~8 `& }/ S- q3 } |
|