|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 b6 b6 X& A& t
/ ^8 g6 y+ G/ FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 c* q4 o8 U8 m, n: h, q" }#include <unistd.h>
% Y, Y* D. T* G) M+ ?#include <sys/mman.h>
& v0 R# S% X1 x; v/ N8 _8 j+ @5 M4 O#include <sys/types.h>
4 ^ i) \5 K5 M* @6 n! }5 {/ P; Y0 W, o#include <fcntl.h>
' u* ~7 A; J7 @' z# w4 H+ D$ X; k6 W3 F" a" h3 Q0 M$ K8 K& r! U( v/ Z
#define SHAER_RAM_BASE_ADDR (0x80000000)
' I: H$ Q8 A y& b: d% A# L8 ^" L& v' x1 { o5 N: b& G) i
typedef struct
& Z4 ?9 v: @7 [* \* m! q{
# M, v/ S) G3 g3 G unsigned int a;
8 E O& D/ V P" ? unsigned int b;/ q. m& Z; x: [0 p
unsigned int packet_cout;; ^7 _% r" k3 L- ] u( k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- Z; }! T2 o" Q& X- ~* y5 m9 S5 e: r1 n [( n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% I5 Z% P( J) Z+ m6 R$ P5 N% a. zunsigned int count_copy = 0;
1 D# |- ?) n" }9 L- P
1 Y! f" p6 }5 c- a3 M4 @, r. a F& g2 a) _: F6 x# t1 _
int main()
b& j+ V0 v4 r0 @- M2 m. A{1 O( x0 z' ]: J6 K" W
pRX_MSG_PROTOCOL pshreRAM = NULL;$ \! |! f& g5 }, a+ `2 `+ C: w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 D# D. |* H' p, @/ B" ^& h' l
0 Y$ b* r5 w& P0 L# d2 p" r while(1)
9 _0 o& `: e4 n) ], z5 E- `5 z {
& G4 o0 A" g C- { read_MSG_buffer(pshreRAM);" t4 s1 P1 ?! a- ^" v
}
3 l, M1 W7 E, z1 ?7 J( Q" \}: q0 }7 n% ?% X: P
$ u8 V! }6 W: n q) i/ v" yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) D7 M8 s: V* F( Z0 @1 A' d
{
5 Q5 }3 y. A1 ]3 x RX_MSG_PROTOCOL buf;
+ s2 r' U; E4 Z& O( j) { % I. n1 A- x. F8 i2 M8 D
buf.a = pshreRAM->a;% d! B8 q6 y% f; |! W k6 _
buf.b = pshreRAM->b;
4 D) m8 w% Y' @+ |" T) P2 W& u e buf.packet_cout = pshreRAM->packet_cout;" Y/ {; f, N' l- X+ ]& v+ }
3 q3 D. ?" D/ S( T! k
if(buf.packet_cout != count_copy) n4 e+ P. b$ {( N4 V1 F
{7 ~6 r- L5 w9 a0 |$ O" }
printf("a is %d\n", buf.a);
7 \& f/ G G( v$ S$ {" \5 t$ k/ Y printf("b is %d\n", buf.b);
. n0 z* T- `2 E/ h; t printf("count is %d\n", buf.packet_cout);
+ ]2 k" p4 e% ^% r% [2 ] count_copy = buf.packet_cout;' `- v# f) Q5 L$ U2 B7 I* }
}
N. Y5 C" x6 T# _. T5 \ else
4 c0 F8 f. [/ m0 E/ \' v2 g {: ~& j2 a4 ]" _3 R( a
printf("No effective message!");
+ J8 t% B6 {5 Y; s h4 {+ ~ }0 `+ U: _4 B7 |' Z$ Y4 c
}
0 b; v* r7 {+ f( O* t2 L* z: [( b+ }6 A4 R
7 }$ ]" O% G- ^$ K$ }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, v5 |- B* q, R5 h; G" Z( s/ C使用下面代码,对内存使用了mmap函数后:$ T' b1 K! z$ {9 p* d. G0 s- a
#include <stdio.h>- b# s9 E0 W$ v. K2 R% n$ P
#include <unistd.h>
6 S6 T1 _3 S8 i& C4 g3 w L# P#include <sys/mman.h>- h2 h3 F Q% H( x% m
#include <sys/types.h>
+ |; F. t; B4 C0 D' P2 B e#include <fcntl.h>
) G0 J0 n. J! r. h! {0 ]- u4 k
* ?/ ?5 H% G: X# j# \ \#define SHAER_RAM_BASE_ADDR (0x80000000)" Y, |3 _3 u/ y+ L
#define SHAER_RAM_SIZE (0x20000)
7 }: }5 V0 l" L0 Y
( B& z" K5 H" w, ~* E6 m1 b5 j7 Ytypedef struct
$ s H! t* v0 H: V4 M{
' e! _% L/ r1 V, X5 q9 I( I& d! J; n unsigned int a;
9 d8 i6 n; S4 k- B' C8 N unsigned int b;
2 ?1 Q/ a* m8 N0 W6 b0 E unsigned int packet_cout;
2 g$ h/ u, n* G7 A8 L! j3 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 m2 K0 D8 ? ?% V; `
2 {; ~ @3 c) _4 H9 w
void read_MSG_buffer(int *baseaddr);7 [- @$ c- _& `
unsigned int count_copy = 0;0 o! f+ |; T6 t) r K O
1 B7 f% a8 ?. P; C' `: uint main() ~) T7 Y: r9 D d* Q
{
5 x4 H l4 r4 y) d int fd;
# l5 L! J; e1 U7 n7 y' K9 f int *mem = NULL;: k+ |! u: I2 m4 @4 [
5 p/ W8 r3 }% O$ d1 Y' s2 C if((fd = open("/dev/mem", O_RDWR)) <0)
9 k) X3 Z0 ]( O; `: E# A0 H, V) r2 G {
4 w( b) W# v; g perror("open error");
4 V6 `. u, u4 _3 ]% z return -1;
4 \9 I3 z, n, m/ K. x! _ }! {: B0 t y5 Y
$ _7 k. T, t' r3 ^3 v3 F. H# _ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 t1 T* n, M. s5 j2 ]3 D! ~6 A6 Z* i3 G/ p9 ~8 A h
while(1)
3 \; t( }$ X! y; ], g# H {
8 [( n, ?& c$ n5 ]3 f3 S read_MSG_buffer(mem);8 n/ A- T. u4 ~) S. r* U9 ]
}
0 f; T: h4 I: O6 D2 I}
6 {; w2 `( B k3 F8 p5 {$ e- T! {) D `
void read_MSG_buffer(int *baseaddr)) k$ g* k/ _1 H, n; w+ l$ W
{
& @0 W2 s' S2 ` pRX_MSG_PROTOCOL pshreRAM = NULL;
8 i8 {. c$ P2 \2 X
4 L4 e* }( B3 ~3 } pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 H; X8 l8 i" l9 o3 \6 i G
4 L0 a {; I8 |8 Z/ i/ y
if(pshreRAM->packet_cout != count_copy)
- X( z: x* H) H0 F5 w9 a {' |; C8 H. T) U& c) a/ e
printf("a is %d\n", pshreRAM->a);
# e# E3 {1 ~$ {$ A5 o5 }+ J8 M printf("b is %d\n", pshreRAM->b);
/ s" J" @' L% ]5 N4 t6 ~/ r1 L printf("count is %d\n", pshreRAM->packet_cout);
' v3 d! ~; T$ } count_copy = pshreRAM->packet_cout;
8 J6 m" x5 }+ p9 D6 Y }
$ W( j" e6 D# P9 z" L* ~- F else
1 x( d; c* d) K1 F8 C/ x {
7 h8 g) c% ?7 {, W: C# X8 ] printf("No effective message!\n");; d+ z8 Z( [ j) c1 I! ~
}' c% O, q) ]2 B ]
}
7 P) W7 p8 t: ~
; I8 f; J6 F; x, J) ^4 }& a# b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' ]3 V. ]! S1 B; H+ Q$ s- k
, m y9 L8 ?& k2 p7 K; V# I3 x' O& i3 \3 [' x: a, o1 X3 m& e3 B
+ ~8 |8 v- m$ u/ L6 m' [
3 m4 j) X) q5 Q
|
|