|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 G8 V# |. \9 I& v! l- [2 V
, i; ~9 O% R8 k, A/ Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, N; ~: g6 ~3 f, E% O6 n* ?. ~6 A
#include <unistd.h>
: A. c, A/ J' V# Z& o3 J& T#include <sys/mman.h>' h. h. c/ d0 c5 I4 s0 R
#include <sys/types.h>
. L! ^, Z2 x: e2 T! t& p$ A! c% i+ l#include <fcntl.h>3 d6 E5 M+ F8 d
* J+ V0 o# |9 _( v1 T* y9 E
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 m$ e: O( K v/ Q" `& O7 r
. B1 g: ^7 d) T$ b j& ytypedef struct- L1 C+ ^+ N U- B
{
4 p5 S* x' r4 c( _ unsigned int a;2 J. b: a* v: [% \3 @/ F3 I
unsigned int b;
' v! }# D! P* Y* d' ? unsigned int packet_cout;2 C; V3 L8 z+ f1 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 }: o4 ?: y/ H! b' a. P5 a' h+ L' }3 l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& V3 m( J) k1 C% g: @unsigned int count_copy = 0;
4 d0 ^/ y8 \, O, Y: n/ m. b: d8 X% h" @# T
' G# M+ ?8 F+ v) Mint main()
* Z3 J. |9 W' d{9 K5 D: m& j. L
pRX_MSG_PROTOCOL pshreRAM = NULL;# B4 K; |7 s$ i2 v: r4 A, ?& v# r
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 i$ \7 n# H6 \& w1 ~9 [
7 e! {7 h% |# o( r while(1)
2 I5 w: Y) r! S# j {0 {& w9 m- g5 v5 U: y
read_MSG_buffer(pshreRAM);7 \8 H0 \7 k# W: Z+ T5 a m
} ! S/ o' R0 o' d3 O: X" O
}) ]9 g5 Q( x; u' k' z) _6 I) q
& z# F2 P5 I+ [4 ]2 Z {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); D- r- h5 [* x4 b# c# U
{
( i4 |8 {* h% E2 P# E; c RX_MSG_PROTOCOL buf;
- k7 A3 |8 s+ z$ p0 c$ U4 W& I ) j/ G, D( Z: v; k+ s0 V
buf.a = pshreRAM->a;
% r4 F0 F7 {" y. j7 H) Q+ b I2 r+ G buf.b = pshreRAM->b;
8 X' o5 B- r' J$ z, J9 _4 v buf.packet_cout = pshreRAM->packet_cout;# J$ s+ C4 J+ z; r& M
: \- L) B- ^' E, `4 t: c0 W
if(buf.packet_cout != count_copy)
% `- K6 M$ x% G1 G5 ?/ O& \ {
- |# [9 A8 X* Q j5 Q printf("a is %d\n", buf.a);! S7 }; w2 S3 U: L
printf("b is %d\n", buf.b);# ]' x M9 b5 F: L
printf("count is %d\n", buf.packet_cout);! L; R ?$ u5 e1 @! g
count_copy = buf.packet_cout;
9 S; Y* |& _1 o1 W+ d1 ? }2 H" D0 G. }0 ^5 ?! ~ D
else$ d! J5 l$ G, f3 @0 n$ e' y g
{
6 J" W' R& P T! ?- ? printf("No effective message!");( f V: Z$ y6 I" W
}1 N: c! ]; |: s+ U& _8 M+ ^3 ]0 e
}
! Z: J# @* v! p9 j. I
6 e& l/ Y3 Y$ C* a% e9 Y8 |' ]$ H/ n2 ?- F4 M% _% V) G) A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 Q: }1 m+ \. p. o* W' t
使用下面代码,对内存使用了mmap函数后:
. ^4 f& ^2 ]& v0 Q, @9 V#include <stdio.h>/ N" H4 `- q6 Y" T. [( i
#include <unistd.h>
, }* g& B+ I3 A#include <sys/mman.h>3 Q# g( K: [* x
#include <sys/types.h>: S8 E6 V( \' H: o9 V
#include <fcntl.h>8 y1 L& q8 R1 g9 S4 J! Q5 Y& P* i
6 |' L4 [8 q* K" o- T* t5 H: G3 s#define SHAER_RAM_BASE_ADDR (0x80000000)5 d3 q4 c5 s# v2 N
#define SHAER_RAM_SIZE (0x20000)
. [/ T% L2 H3 g; g; ~1 U
) h3 Z9 t; O$ t( b! P# u4 T) |8 ztypedef struct0 r$ i$ @; d4 a7 D7 g, X( ?* r# F
{
/ l" m% J L* g" A* v unsigned int a;3 _, a$ i. I; M& r
unsigned int b;
2 v! H% c+ j$ U; P unsigned int packet_cout;
2 F: F0 _# n/ f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 m/ G+ @7 W4 l# A2 m
! ~6 C: K3 {: T% Q5 B) f& I7 cvoid read_MSG_buffer(int *baseaddr);
) ~9 ^. L' I0 P+ o4 eunsigned int count_copy = 0;4 ^9 j/ _1 l3 N! ~; ^# l- t+ f2 E: o
, |$ T" ^) w V0 q: Z5 b' }0 C+ pint main()/ f- _. w8 ~4 j& }8 V/ a' Y
{
3 {/ g# A. r5 s. w( H3 z int fd;
9 G% G: W2 H2 P/ Y" a4 n int *mem = NULL;6 i0 g1 E1 Z5 b% w, h3 M- I
& A7 O6 ]% I. Y; o/ |3 u, b if((fd = open("/dev/mem", O_RDWR)) <0)$ G3 [: d& t# ^) @; ?0 \3 I1 F x/ X
{3 C$ w" F+ S: N3 h- \6 ]2 R. O
perror("open error");& p+ j# {" r2 B/ G ]# A; z9 X
return -1;
0 a7 T! t$ G. k$ m( X7 p' c }
9 ]- D* F+ k2 [! g0 V. F , Q2 B+ e- M# ~* ~) t0 \
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) \9 Z ~2 h) j4 t8 X. I
7 A$ q* m& P, }( F. g2 S$ C. a, p while(1)
3 x5 D' m0 ~ ` { r5 T3 b2 _. ]- I, o
read_MSG_buffer(mem);3 D9 \& R" I) R: L" J" o. W9 v
} / L$ m+ ^; q, Z5 `
}
, x8 x9 y. s W4 e# Y3 C4 \5 d3 g: E7 w$ X! N* q$ ?
void read_MSG_buffer(int *baseaddr)
2 M# E( u: Y$ @# L{
4 o- _6 J( d8 R& ^ pRX_MSG_PROTOCOL pshreRAM = NULL;, U4 ^8 p9 M) ~* Y L' o4 t6 x
" d0 R4 \' @' t7 h- J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 I+ n9 C) @; _0 b
) A. _! F; O: y6 }7 O+ B! X if(pshreRAM->packet_cout != count_copy) ~6 o* m; [- h
{7 H" a) g$ \6 s) o* t2 u
printf("a is %d\n", pshreRAM->a);
* _8 P; T8 [" H' z' | printf("b is %d\n", pshreRAM->b);% a% `5 I' ?# l# I2 U
printf("count is %d\n", pshreRAM->packet_cout); d- i* f- k; v. Z" `' W
count_copy = pshreRAM->packet_cout;
% _ U5 J* g5 ]* L; B& L+ {) j2 q2 x }
L o6 M; p, d else; ^' v k6 n- M- n4 x" M2 T
{& P" F( s0 t4 C& n% ~
printf("No effective message!\n");$ o$ H* \0 G: X* J! J
}0 M" U7 @' Y5 {& Y+ H* [( g: v
}) L, @4 j% p8 M4 m
T( J: P; H+ S+ m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 @ [ N* G* i6 N( @2 ^$ w' x# [
4 G* U! c* I+ W- t
; k4 F! K) L* z2 ^% e, F/ Q1 ^3 ^9 A5 @" K6 R+ `- p( t
. U, x# t# w9 w0 V9 T' v |
|