|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" A9 N7 K5 W- x, Z; Q4 u2 X1 Y" m3 q" L/ e/ g( a2 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* ]2 D8 b; i5 b3 ` ]) Y; Z. I#include <unistd.h>
/ u. N+ W2 M9 a$ B/ _ Z#include <sys/mman.h>
* C( J) o3 s8 t: W* z#include <sys/types.h>
* y3 F# X- F: m: D#include <fcntl.h> b: @6 B6 C' t) q9 h
' t9 Z& ^8 e; L$ Y" ?9 c
#define SHAER_RAM_BASE_ADDR (0x80000000) ! Q {8 C0 x" ~& _- N# f
0 d0 p9 l9 l7 f& H! T0 {+ o7 [
typedef struct
' O; G1 i1 \( Y' }5 ~5 J- ?{8 ~ @0 \0 h( l$ M' M- M* e
unsigned int a;
0 c$ L2 w c3 q, E# Y unsigned int b;- h+ n; E( p% k, G! A" A! {3 i
unsigned int packet_cout;
; R5 d2 F7 |/ j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. Q. e: ^ W: @ e* _) Y
4 ?$ t/ _$ a9 N0 ^& \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: O! \% r- F; J) vunsigned int count_copy = 0;
; O; I$ o/ A4 ^! N3 C$ E
( V) b! \1 E" d# M) Y1 t. F# v) f3 y% S5 J* l1 O
int main()
- P4 D6 u3 X A ^3 g) _{
2 P( H+ `4 W' S( I6 v! S pRX_MSG_PROTOCOL pshreRAM = NULL;
4 W% v0 O' a; I P( ^ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* |$ P5 F F3 O! K3 F( s& b
" y* Z+ F& L' E8 d
while(1)9 o4 W# e I/ s% |" }* y' d
{
( v. w) y! W8 M9 G$ o2 _" d read_MSG_buffer(pshreRAM);
6 d" t) p6 _; x }
* p0 _- }8 S4 L9 }5 G}% g& d) D! w/ d! ^3 ]5 a9 X# X
7 U: g& l S7 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, u! @0 |8 j* T: Z9 l: C$ O{
! ^# h- o \! Z/ m1 | RX_MSG_PROTOCOL buf;' P. o: w; K1 e# Z
/ I9 N& Y/ U3 d$ g; n4 v buf.a = pshreRAM->a;7 N" Y; f. k7 v8 {% `1 n4 F$ |
buf.b = pshreRAM->b;" [4 f/ v: U: N5 G8 _- e: ^
buf.packet_cout = pshreRAM->packet_cout;2 a5 m7 e0 ?# i2 A
( H: q, ]: C) V7 x8 s
if(buf.packet_cout != count_copy)
]7 J o# e/ f0 d) z9 [ {
) ^* e* r5 S' u4 D' L0 U$ n printf("a is %d\n", buf.a);9 Q! G' \* m" L; M9 }' Y! Q
printf("b is %d\n", buf.b);) O1 A' A' [/ N% F* \3 t/ r
printf("count is %d\n", buf.packet_cout);
3 k K! g7 }" m$ y. m count_copy = buf.packet_cout;; D1 w0 M5 p, B( U$ l" U
}; p; y0 z! @3 ?1 o% ^, b o4 r
else( Z+ U- K& y8 b2 H) g7 C6 c
{
7 k: s j+ c6 P3 @' i. x" H printf("No effective message!");: u. J( l/ N& h
}: E; r9 Z, Q& f3 ~2 N
}
* A% ^7 a7 \) d$ Q. f1 I' A+ c' D+ M# @' O
0 P, E- b; U* N( p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 S3 h' j0 o* [使用下面代码,对内存使用了mmap函数后:
3 B) q5 }! Z( C4 M. _& h#include <stdio.h>1 o0 D6 b6 a) r5 I( D; @/ `3 D: F
#include <unistd.h>) E6 D4 l- R# X, q
#include <sys/mman.h>) e0 p }5 r% R8 T5 }) b5 M' ^/ h/ C
#include <sys/types.h>
2 D) m0 b( ~) f#include <fcntl.h>* C; s. S3 K+ l1 F: V& B9 G
+ _% x: _ D7 T9 l% l3 Z# E0 [#define SHAER_RAM_BASE_ADDR (0x80000000)
' F% a; Y. }( P0 M" Y7 h#define SHAER_RAM_SIZE (0x20000) # ]! g+ K' i. e) x$ G; f
. r e9 v& r2 |" R. _! e& k* }# D
typedef struct
: z4 `; G. G X- B) D9 I{+ }, [/ Q) ?9 q8 d6 v; {( T4 D
unsigned int a;# [1 m' s" |6 E- h/ z
unsigned int b;7 g3 @0 S5 n1 w, |: ?
unsigned int packet_cout;
( T6 p, W9 g6 t; o: y6 H1 U1 _6 P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 b+ Q4 S D, H: e1 E$ C3 o0 @3 D! h: A3 [
void read_MSG_buffer(int *baseaddr);9 F( Q) V) I6 c" Y& G
unsigned int count_copy = 0;
* Y& n- ]- j- i7 S: d
% r4 o" C! D0 F1 e0 Bint main()
1 u) R9 e0 D" V7 w- H l{! A% S0 M- M [+ y. ?
int fd;6 A( i& l0 c; c# b2 F( t
int *mem = NULL;7 |/ a+ w* W; \, m! I1 G* n4 Q
0 B' z' {0 M; [1 b8 e1 G
if((fd = open("/dev/mem", O_RDWR)) <0)
% \; u0 C& y7 e+ n+ x {- N5 ?' _9 ]7 y! S- l
perror("open error");
5 D" U1 m9 `7 x/ ~ Z0 V3 U, S return -1;
3 O6 w3 y. |9 ]$ c }* _/ D1 K5 }& _( U; Y
6 ` t, m8 M, o1 ? mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 N+ k O: d/ l" l3 H2 x: A8 m
! j, ?% H0 l7 e9 s while(1): }2 @* C& b7 T; u9 v
{$ F& W/ m+ g7 Z4 ^) u$ b: R
read_MSG_buffer(mem);* J% t( ]2 ~0 }5 k& z, S* ]* J
} 5 ]6 I& F# P! Z7 A3 \
}: m' c0 e' v# w u& B
, {& z1 f1 p o+ G( g$ r' t. P
void read_MSG_buffer(int *baseaddr)# ~0 L) c4 m1 c* c9 L. b8 L7 G
{1 l1 }9 d0 ~ W0 }4 y3 H6 u5 _1 _4 u
pRX_MSG_PROTOCOL pshreRAM = NULL;
M2 M7 h+ i2 w; ^; F% t, i# v% I. r4 B& ?% X; H
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; O$ L L3 @* N' @. ^! B% a5 ?
6 [: p2 r7 p. O/ h' i+ d if(pshreRAM->packet_cout != count_copy)7 C! j( A+ i3 _: t$ }: d7 h
{
$ n& n. t+ s5 t5 F printf("a is %d\n", pshreRAM->a);) O/ m- o& i. J! f
printf("b is %d\n", pshreRAM->b);
, G9 c$ i% E ]2 W; G7 b printf("count is %d\n", pshreRAM->packet_cout);
2 S9 |" `/ G- @ [( J count_copy = pshreRAM->packet_cout;
% |# I2 a9 u# L1 ` }
, r! [: K3 I7 W3 _ else
; f5 ] I, a( M5 }& A {
5 T& f% G( R5 M, Z* \4 k# I printf("No effective message!\n");6 I7 y3 r# Q* N4 O
}/ t7 t3 B- o$ `& d2 y; c- h
}5 M q3 C' y- ?* u/ t* T
$ v4 p+ N9 g# J5 ?2 l1 u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' {0 E. k+ ^* W; ?& e) l7 U1 O
5 `3 W: c8 h8 H( o- K* L* s/ }3 I* f9 A2 _% w. r3 e" z" U9 x8 v
4 { r& i# t. j0 F* E/ j7 R
* Y3 n" S6 i2 B7 Y$ L1 y6 r7 _8 { g3 Y |
|