|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 |6 P2 I# x) |& J5 K' ?& D5 B1 ?- E" a4 z. u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ G: J) ^4 }2 e. n2 ~#include <unistd.h>
! [: Y" u1 V% L: Z8 n+ z+ O1 x#include <sys/mman.h>
# Z+ {! K$ _% T: F#include <sys/types.h>6 C( o& j* h) g* q% x- n
#include <fcntl.h>, y( S# N+ g$ {0 G! U
' L. a( ~1 N% B0 y
#define SHAER_RAM_BASE_ADDR (0x80000000)
- e8 J- G) q6 Z0 d" {! A4 D! u( R" F F5 X
typedef struct' z! C. g1 ?6 w) {
{
+ H5 y" T8 I" D k! N) N! x5 _9 [ unsigned int a;6 \1 l0 i% O+ \* ^1 t
unsigned int b;
9 N* P' P$ }+ h' S unsigned int packet_cout;: O4 q. U, G Q0 U# l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& \9 ~! b& S- { B
4 M3 Z1 }% J( v, N% K* {3 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ E" y) s. N/ v1 _+ S" D
unsigned int count_copy = 0;
' M [9 e& V$ I/ N2 Q' C$ G0 {& B
/ {/ \6 a$ }5 a3 @1 t8 o2 k+ P/ r. o5 f) E3 _$ [. N* X
int main()$ U# C$ {3 e$ c9 k" M
{# ^- s8 a( P# r( K. z, |5 E
pRX_MSG_PROTOCOL pshreRAM = NULL; Y ?: g5 ^9 o1 O
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 }9 U- a3 d* D+ |' \" p/ k) ?% _8 v; O, j3 M0 H
while(1)- A$ C% G4 \( ]5 }% f) ^
{
; T4 Z- o) a% X* Z# H4 y# C read_MSG_buffer(pshreRAM);
6 j; A4 b- K$ o& P* ` } & R$ x/ x6 @' D( ^1 L5 i8 T
}
/ H) r1 J# P7 C5 A- p' }% v6 U5 z, k4 V4 }4 i8 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 E, h/ p0 s# s: U- U& ?# _# x
{
! \) Q9 l V3 q, l4 |4 l RX_MSG_PROTOCOL buf;
0 G( L8 Z$ G( a4 @
* ~* X+ R6 y% [/ k2 q$ a buf.a = pshreRAM->a;) R1 } O( ~! c/ Q" I
buf.b = pshreRAM->b;' F! P2 U6 x# `& m8 Y2 [( ]
buf.packet_cout = pshreRAM->packet_cout;
# B8 R( `; L4 F" W5 M4 z
, n0 J: ` d2 H) q0 q if(buf.packet_cout != count_copy)
5 g. V1 p9 Z0 x9 u2 D9 f9 v {
1 y2 R2 i% X1 C& E* Z$ S printf("a is %d\n", buf.a);
& }. T$ N+ O, k! f1 V6 c printf("b is %d\n", buf.b);0 u( u5 t" J* y9 Z2 c4 ?# }5 d* y. T
printf("count is %d\n", buf.packet_cout);$ c Q# u6 E7 H$ S) `
count_copy = buf.packet_cout;/ a% M) a: z' j) w; T6 R
}( w8 S5 w4 J( z, S& D. C1 D* H
else
4 w2 T I9 p( o( c+ t7 n {+ a/ L- }" Z, \) _3 r) \& ]- W/ v
printf("No effective message!");
2 |4 S+ Q! I. J Q }
( D7 ? X. _- {}
$ N* j! D/ g2 K$ Q5 F+ b n
. a- m* M* v0 J8 n* w/ \+ Q0 {6 Q
5 K# y( {! W# }2 X% p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! b2 |1 x0 ~" C3 c. U0 r使用下面代码,对内存使用了mmap函数后:: h8 w" }0 ^; G7 S. \
#include <stdio.h># q6 f" [' H& T3 s' e+ o5 J+ L
#include <unistd.h>+ b& w7 m4 [2 n6 b; {9 {
#include <sys/mman.h>8 n0 Y8 [" K4 L
#include <sys/types.h>
% `' V. ?- [/ B# I7 c$ z#include <fcntl.h>/ @3 C; _- K) N7 S
: d( b3 V. L' o1 R1 ]#define SHAER_RAM_BASE_ADDR (0x80000000)3 c+ a8 }( @& @+ s( G- _
#define SHAER_RAM_SIZE (0x20000)
9 z9 x7 T& ^! I
* o$ x9 F& z' q! xtypedef struct, c J, ]5 D/ t& g T% R' i
{ i/ P: v9 x: f! P3 F9 k
unsigned int a;
' } x( o2 Y% M* |2 ~9 j unsigned int b;
6 K5 c) |+ v) T; o+ X2 @# } unsigned int packet_cout;
& J( V6 W; P& D# O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 R# t$ d+ r" T8 i
4 p0 k& B4 D. m6 @' Pvoid read_MSG_buffer(int *baseaddr);
3 e$ ]4 {' |2 C" s" munsigned int count_copy = 0;" J$ a) a( \& E8 n8 i' U8 }. Z
# |/ j% g3 p6 w4 [3 W$ B5 q! v) u1 V/ q3 Tint main()
* _: o5 X- L0 g+ K! {{
$ V# D% o2 T/ @1 l4 n7 B6 e" } int fd;: }! Z6 S3 {! v& z1 S
int *mem = NULL;
2 s' H. |- o- L
1 l7 O7 o; R1 i: h6 d6 {, s4 @ if((fd = open("/dev/mem", O_RDWR)) <0)
/ {/ Y1 w3 `; E( T2 ~$ O% m5 L! V {: f1 h4 y/ h( L; Z4 O
perror("open error");
2 b( h/ V3 P2 P# o$ i; T return -1;
( p/ ]; J7 B2 y; W! ~7 { }
! e4 ?* a( B2 X 4 R+ f) s- T- p* f. u$ }) d
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 @+ M! T1 P' ?, `4 R$ G/ `5 w0 M+ \5 l: \1 b2 w
while(1)
6 N1 q' j4 y$ p! }; m# W; |; F* h2 O v {/ p1 l1 C! P$ E
read_MSG_buffer(mem);; Q3 p/ K5 I+ s
} 0 j% n* l# H* J$ T& e
}
( Q' L) n) D6 O1 H6 B, f( u1 S: K" N- o- D
void read_MSG_buffer(int *baseaddr)
5 O/ X' A8 @$ F/ P9 t{$ o" y* p7 V* l$ k7 L1 f4 a- T
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 x( U. C& u: r5 y) Y! _8 I0 e4 }# s% y4 U2 p" o4 K- k) v- @1 y0 q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) g# b5 b+ s! T5 {/ Q% T V, d+ M+ v' m c0 l, w- G
if(pshreRAM->packet_cout != count_copy)
# O# x& n# Y1 G( f4 S7 F7 A {
4 A, \2 B) K; @6 L# W' `4 [ printf("a is %d\n", pshreRAM->a);0 n l9 B5 J( \+ G; u6 Y- }3 F& a
printf("b is %d\n", pshreRAM->b);( V P2 h, ]" ^7 Z
printf("count is %d\n", pshreRAM->packet_cout);
U# p U" |6 c$ ^ h count_copy = pshreRAM->packet_cout;
4 K6 p* |" t8 q) M: N$ z }7 o6 B5 H X" e Y: I& R; r7 z2 o
else
0 l6 j4 w& b+ D. S3 r1 N6 b+ ] {
9 m5 }) N' z" i( i printf("No effective message!\n");9 v2 r' H1 h; F5 h" ?- x! k- \
}$ O$ m p5 M6 T# m
}
; z/ p4 Y, k. f2 x1 j. }5 y1 c% J6 f8 G: T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 G/ z6 B/ B0 G: A
/ E+ m) p0 \4 J- O1 n2 J9 [: F' f9 t$ y) ^& W7 n- |
4 r" n8 J0 U( V- M: O c+ L; t
1 [+ R* i8 Y! ?. h/ B |
|