|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( p N' Z5 i2 r& Y" b
' C- J9 v9 c4 q; z: h- z& p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 l1 |0 ^9 R" Z, ]( l#include <unistd.h>
* h9 v: W* E* [9 a& v#include <sys/mman.h>
4 a* A( x) q6 `8 e0 }#include <sys/types.h>8 C) F. N( P" A) A
#include <fcntl.h>
+ H+ C+ g# T6 m
# p I$ a3 c) Y- n/ s/ Y; m#define SHAER_RAM_BASE_ADDR (0x80000000)
, L% e6 K# L. v$ ~
# I: u1 b+ D# ]# y+ V- d5 ztypedef struct/ `6 G4 e2 b1 a! r. J8 U
{
- ]; Z( r% Q& n0 U& p* ~ unsigned int a;
* S( S! W V9 t, m unsigned int b;
6 K, b2 [- ?1 {( K y: \ unsigned int packet_cout;1 R/ f: t1 ~: u! g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, G' v9 [8 k7 z6 v/ [
, }; R2 m) L/ A- m* p; D$ B" O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 I& K2 ?* y/ W4 Kunsigned int count_copy = 0;: o$ i* E5 a" v; _/ Y
# K, R% E, n: n. Q, u* k" n% B# N& M* `* F
int main()
; X ]( s* e D8 O5 g{
) @: h( ]" r5 t" E5 l( F7 q8 L3 W pRX_MSG_PROTOCOL pshreRAM = NULL;
! f! l2 R3 h e' K pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% E5 }6 X+ d# [. V/ S/ D0 v. ^8 [2 i' w9 P! W% y# | J6 G
while(1)# C9 ]2 k/ N- A1 J) |# @5 _
{
+ E- }* j- q; u8 ?# i i read_MSG_buffer(pshreRAM);- V, B0 G8 D3 }3 t
} " N c0 Q% v5 b4 f( d
}
% t* n$ a# T( E! s3 f4 P
. D1 J8 a4 u7 m& q/ f# evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 S( g" I* Y* L& n! u- u: @, ~{4 \6 v+ }5 a" T2 v9 p. _
RX_MSG_PROTOCOL buf;
# h6 s! \2 Y$ n/ ?) G6 W% ]4 Y
1 O" O F9 \& B7 Z7 N7 k buf.a = pshreRAM->a;7 Y9 F1 u" L: A+ E
buf.b = pshreRAM->b;- P% U, c4 L. y3 E" r; L$ O z$ v
buf.packet_cout = pshreRAM->packet_cout;
* I) U% v: l' Y0 X' G! u) R
$ q2 t# c8 X, {# O+ c* I if(buf.packet_cout != count_copy)
4 N2 E. d' X# u5 d, J j! ]1 s$ { {
8 E+ ~/ {7 f9 f F printf("a is %d\n", buf.a);
+ w$ y$ O3 n- j5 p printf("b is %d\n", buf.b); ^6 _; j7 D% |) S) ?
printf("count is %d\n", buf.packet_cout);3 o6 v' T/ [1 B5 z$ X' d1 ~, g
count_copy = buf.packet_cout;
. E y4 E/ B9 x* \% F }0 L' f# \; S- b
else
, n8 C! I) z& @3 u6 F0 i {
4 w- L. ]- q) { printf("No effective message!");! _: f: b8 G5 r' m: t7 \# d+ T
}
6 U9 y, `4 b3 m _& Z Z}
6 {5 o$ U' F: k c* \" M! P" H/ w1 ~7 w! |# c U) U
9 w- t4 C1 _0 Y1 D& T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 {5 J# m2 @% z! i& [
使用下面代码,对内存使用了mmap函数后:
2 o& X8 Q* u9 g: k6 a. I* G3 z% a#include <stdio.h>: m6 W5 q7 [; v$ F
#include <unistd.h>7 z" W6 H! a8 Y. i! ^
#include <sys/mman.h>
* E- g; h3 A, d: o/ {2 E" c#include <sys/types.h>
( N6 I, q+ i8 ]2 R#include <fcntl.h>1 W7 L4 P1 S1 [/ E4 ]" v
( b' i4 f$ G' n. p
#define SHAER_RAM_BASE_ADDR (0x80000000)
: o; Z, h4 H7 |% |8 U5 A#define SHAER_RAM_SIZE (0x20000) ) D/ } e, v4 ^. e1 Q/ k4 u6 e
& e0 n6 y. b: `7 S5 k( F
typedef struct& K% \/ K; ~8 Y8 V6 m
{ T' ~7 R; c& r0 o6 L( I1 b
unsigned int a;
. b" \" ]. ?5 R' E4 Q: R unsigned int b;; T' x9 n0 n8 j# [
unsigned int packet_cout;
3 @7 r9 R# W( |+ L- m3 ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- B7 ^) v" a/ Z3 D. O7 A [" m
- B0 d7 ~3 W# @+ `" h& ?void read_MSG_buffer(int *baseaddr);
# x) p' h/ N8 P8 D. punsigned int count_copy = 0;( o! u& g; `9 Y
" T" r% }! b- I; _1 o7 r
int main()
0 [: P: W, P7 J5 W1 u+ c, [{* G, @6 m" M Q- X7 G' q0 t
int fd;
! @6 x& A, V0 |# r( n M; J int *mem = NULL;
: V1 Z$ y) F4 T/ F8 ^; ~6 \; J/ S0 A
if((fd = open("/dev/mem", O_RDWR)) <0)
( h: X! e' _( p' D a2 I5 n9 e4 ~ {
# x7 T) z+ {- Z. }" n perror("open error");; t: O* [0 c; k& ]& f; J
return -1;
2 P j, n( K* B# ]& h7 a }
$ m% F4 _1 l4 [/ U7 a3 D% G0 c
1 M$ e* y- f" }$ ?7 |& P mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 w! Y( j3 N/ T2 s) \
- Y1 j- t4 d9 r1 i9 l while(1)
4 b2 c4 o0 B) V/ B5 [ {
K8 Y' X; C4 V) G4 g1 h/ z$ S read_MSG_buffer(mem);
8 D# v2 b3 P; i5 ?) F }
, n- p* w6 F/ |}
% Z) ?& q0 ~9 M/ H' v$ c$ E- ?4 ?7 Q$ w) z1 Z3 w9 D m
void read_MSG_buffer(int *baseaddr)
# X @. A4 p6 ^) Q- c& N1 Q* |{
% S. X& C4 T6 m0 R9 z; [% }" H) ^: { pRX_MSG_PROTOCOL pshreRAM = NULL;
6 ^- ~) G* g) g/ A: H" ?2 U, b# ~9 l- a2 o) A: @; k! r: X
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 z2 U2 _ y7 Y4 H) c! e+ [+ H4 y7 V$ F+ l
if(pshreRAM->packet_cout != count_copy)' b& v6 s6 _2 F o. G7 P) R
{
% `! E2 i- o* D printf("a is %d\n", pshreRAM->a);( ]& ?: Z* S `6 G0 r6 s' U3 n
printf("b is %d\n", pshreRAM->b);
0 Z7 ~. J0 X/ Z2 N' s' P; @ printf("count is %d\n", pshreRAM->packet_cout);3 \# A- }8 O2 @4 j3 q
count_copy = pshreRAM->packet_cout;
; B3 S3 O, F1 U }5 _4 \9 e- \6 c3 G
else# x+ i `& N) \+ m
{& J, {& v- \* k2 K5 e4 W# N
printf("No effective message!\n");6 ?8 J( u) z X- B& E8 T ~) |* F
}6 A; I) }; U1 l9 X& s( l
}
9 y; P" W8 C6 P4 H* u+ I3 B
( J' b5 D1 n3 f. e j9 e6 N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. F& r3 u6 A) `8 G$ H
- g4 _5 Y7 m, E5 M8 Z3 X- k. C5 M& x; j
, ~/ r6 X5 Y3 |! q( J
2 k4 h' q4 x' b0 @3 @# C9 i5 j& ]7 }5 |/ A+ P! k r. X) t
|
|