|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( A# P$ R6 v+ R6 \6 |6 {. H3 `7 b, i8 x: x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' D- Q6 ^% o5 n#include <unistd.h>4 d& p% R$ O. q" }( ~3 _
#include <sys/mman.h>
8 g/ }1 b' ^7 V& z* ?#include <sys/types.h>
5 S; D9 _: e8 }, o#include <fcntl.h>
) B% `( u; c, C% d3 t$ A$ h& Y7 T; j) E: R/ J3 o: E) R
#define SHAER_RAM_BASE_ADDR (0x80000000) # ^. Y; G% j" h; R, b2 ^
! J& U) e0 M- u. z! Z8 Qtypedef struct
6 X7 @" a5 [2 O- p2 ~& Q- I{
' D( U& X( X6 C0 r# M6 m, z! A- F) C unsigned int a;! s1 a( J' z' V7 t# x/ S" \5 c
unsigned int b;% {8 j9 r L2 V" B7 b
unsigned int packet_cout;( n, \5 K" o9 I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. a, p' Q* D. l" C$ k9 v' i/ h3 s! `
0 K7 z. B: ]: H' |2 i) Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 B$ y' A# n; f& {+ ^unsigned int count_copy = 0;
- l; q8 M! |( W# B; Q. D* g0 O$ U2 A2 u* B8 i' Z5 i
% X' z* G5 w( b5 I5 K
int main()
; V f. c7 V* H. U4 t1 _{! t+ R9 O9 \) w& R6 D# k/ @
pRX_MSG_PROTOCOL pshreRAM = NULL;
# M( {& F' Q5 n6 G2 o pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, g5 w+ _! @) q; ?! x% O
4 f( N3 V) A5 B- [, f5 J
while(1)3 Q- a5 V4 B; `4 |3 I
{
( R8 Z$ M% G2 G& [! ], o- b% S read_MSG_buffer(pshreRAM);; \7 j2 y* [ ^# I, O! z% u
}
8 @3 v9 g& \/ |8 _: h! K}
- K3 F/ M) {( N D
4 H! t2 u- ], {+ Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. U" D* U2 W% t9 v) p h. s{
7 E3 x$ \% E& ~% g6 _7 Q9 [ RX_MSG_PROTOCOL buf;' | X7 L) \5 g# I
7 W# O! r& E+ {9 c1 ?
buf.a = pshreRAM->a;
# c6 d' q4 h* A$ j$ q- J buf.b = pshreRAM->b;+ n. D1 _( j1 z" W
buf.packet_cout = pshreRAM->packet_cout;
& ~" K" ` a9 ~$ G& J# u; V 8 c2 s& U9 S* L* z2 s4 g
if(buf.packet_cout != count_copy)6 U6 [4 ~ E4 t1 x( k
{
5 \( V; L% R; z% N0 L6 Q5 Z' B printf("a is %d\n", buf.a);0 R' f5 ?$ S& j( q" r- R( j
printf("b is %d\n", buf.b);! u6 N9 S8 O& }: y$ R# i( ]
printf("count is %d\n", buf.packet_cout);
2 H. P! j9 }+ Z& @8 U k8 K count_copy = buf.packet_cout;" x7 S) `' o9 ` t
}, Q% I" B j0 S$ a# U+ G* ~
else
. f5 r6 F U8 ~/ V. T; v" Y$ T& M {
( D$ L- j. M0 i- f/ _ printf("No effective message!");$ J# S3 W2 m# \: z% O1 Q& z
}# y/ a, x+ Y z S4 e
}* x) r0 [7 s$ l
1 D1 r+ o) D! v# S8 J& B" t
4 u3 \/ n j* U ^, N) i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ d+ l% ~$ P- _/ Q' a6 B4 [- ~) i使用下面代码,对内存使用了mmap函数后:6 ]% \* }5 P2 F! R; x5 T& n3 j5 t
#include <stdio.h>$ g$ `$ B- \3 e0 A T
#include <unistd.h>
0 C" D. E+ B3 Q% Z% N B#include <sys/mman.h>. T. B$ k% |3 G
#include <sys/types.h> U; z. s P0 e* K
#include <fcntl.h>
* P" y: x* ~6 k5 P! B" X
) G% ]5 b5 n3 j& N! n2 o#define SHAER_RAM_BASE_ADDR (0x80000000)
s: c+ r; j5 t, ]3 a) W#define SHAER_RAM_SIZE (0x20000)
: H, V6 n+ {2 i) k
! m8 p& ~ o- o9 Ptypedef struct( w* g0 p) g4 `- M# H; k, B
{
p7 f5 Q# w3 f6 i9 Q8 E8 ^ unsigned int a;
( ~; U2 R* d. v4 @2 Y unsigned int b;
/ i& \$ Z7 X6 M' ?! [; V unsigned int packet_cout;8 L( R4 `* w( e: F5 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; D! Y6 T2 ?: F
, O q5 ]0 ^0 a6 ]
void read_MSG_buffer(int *baseaddr);
( z* J7 O. O _$ qunsigned int count_copy = 0;
) j2 W% L2 a2 A8 K* c3 H. b( {; s1 z j
int main()5 m# G& Z v; D! W
{$ H+ h: @/ m" b5 C# n
int fd;
; x6 J) U W) H. K int *mem = NULL;! u8 K/ {8 f5 X5 n8 x ^
- ]; _' D" U, c+ C/ ]% }4 V- n
if((fd = open("/dev/mem", O_RDWR)) <0)5 H Z8 \7 j# l5 X2 G" S7 B2 F6 v
{6 m2 a' m! ?$ K4 Z$ ]; c
perror("open error");
0 P1 U6 j, y) x/ }3 A return -1;! P% J$ C6 A% j7 F* |; R [& S) ~7 ?, G
}
- T: A. C/ r6 k/ [. e) v8 ?
8 K1 F. ~# [: J# x mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, m- k2 k6 F6 O9 a2 L& ^' [" ]* V; w5 g6 ~3 @6 o
while(1)- G7 v& `3 L7 u: D" B
{; f1 D' T" v) Q) }: ?5 |* P
read_MSG_buffer(mem);* t# v. E! w0 s1 y s: `+ I
}
# j$ P+ s) P2 Z' _7 S, k1 y8 i}
8 `) @9 _; g! M& u2 y" K- m& ~4 R- V, b
void read_MSG_buffer(int *baseaddr)' D9 V/ S: ~/ n! j$ h$ E
{7 a6 v: Q5 V( \
pRX_MSG_PROTOCOL pshreRAM = NULL; X) `3 w# v7 r G1 E
7 ?7 i# S! m* d$ S) l6 z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" x* E# D$ G- ?' F% `) m
6 }; C* Z; M& i# I/ P, n if(pshreRAM->packet_cout != count_copy)
: d$ C i% W E- q {6 J! J* R1 M- j# {. V( a
printf("a is %d\n", pshreRAM->a);
1 x1 ]+ v( O: X+ T+ O; ` printf("b is %d\n", pshreRAM->b);
$ Q4 N3 [( X" A# g, A printf("count is %d\n", pshreRAM->packet_cout);
$ t: O1 S0 f6 w' O" H) [ count_copy = pshreRAM->packet_cout;: G6 `! e% `0 m
}2 v3 f2 b2 N: y
else9 r' q2 S. s" R Z
{' T0 x* i+ g% u
printf("No effective message!\n");* ?/ v% n% M# [& V/ l) N
}, O! q2 N: x1 t8 v. {
}
& k. }0 ]1 M9 [
$ f& Y+ _# m J B/ }没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 h- ^& ?6 a, U) q. l0 \5 W
* O6 R5 x s& v/ H3 {1 t' O
9 [1 S7 P+ x: F5 S9 `8 m6 t$ n# }$ V1 F3 Z
+ W3 q- X( D! V, I
|
|