|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- A* y M; c8 A% o; b7 X' t9 U1 \3 {2 I% f- Q$ a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: V5 R; @. O4 U0 S" A1 s' L: U
#include <unistd.h>3 S. F6 o3 ?( q/ q
#include <sys/mman.h>7 {0 V& @) b R. O# t4 t: A
#include <sys/types.h>
; U. O( F! t, o* d# N7 s#include <fcntl.h>
0 M! O8 {- j T* ~, p
9 s. c# G& y4 V3 |- @#define SHAER_RAM_BASE_ADDR (0x80000000) + d8 B. v# ]+ b% c! I
, i3 |2 u2 w* E! z$ n) Ltypedef struct0 ]4 U) C0 i6 @4 i9 x% i
{
, `7 X8 Y2 z2 l* a unsigned int a;6 i( C9 y: x" s+ B
unsigned int b;: o+ T) i; S+ s9 L
unsigned int packet_cout;" L5 q4 ^$ Z e C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# l+ B# z- I" U; H$ B! {
! f' b8 x; E; cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 R$ y% l) L) u& P- q) ^unsigned int count_copy = 0;. O: V8 W7 q+ g/ a8 X" _5 @; W
8 ?# @/ t4 ~2 ^/ y' k% _0 J! S O1 f/ m' z
int main()
- x) y4 s/ c% ?9 n- Z4 t{! p u+ ?* [0 G( U$ J0 y# |
pRX_MSG_PROTOCOL pshreRAM = NULL;1 G5 |. k V2 d, I9 \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* n7 m8 h% Y; J. @. n8 S
) b, n S$ b/ k( C' [2 j while(1) n" O: w* C2 N' G3 j, v
{5 s, d7 S" p! w4 L
read_MSG_buffer(pshreRAM);
! N. f2 I( w# h# p) F& s }
7 L( Q7 S1 p4 W5 j% h. u# b) s}
1 ]& q- O: c! J% {/ T, r5 U* R2 S
0 \& n/ t2 }7 a& V8 Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! g% F) b- V) M2 \/ y{7 O2 N, ?5 k1 U5 T
RX_MSG_PROTOCOL buf;
9 d( A" H1 u: L. g8 r, I: N * c& T6 D- k3 p) A
buf.a = pshreRAM->a;% a% ^1 p& d, K# B
buf.b = pshreRAM->b;
( O+ p" ~6 j& a" a0 p( X buf.packet_cout = pshreRAM->packet_cout;( a- q$ ~* w& t1 A/ @
5 p6 ]' J: N9 v3 O
if(buf.packet_cout != count_copy)
! ~. U/ E6 V3 k. n* T$ x/ D1 I {
' L* ?6 t( x1 Q4 B+ l$ p3 Y: S0 H" s printf("a is %d\n", buf.a);; E" v/ V7 Z7 l B! E" n; D
printf("b is %d\n", buf.b);! e F" @! l; T/ h: o
printf("count is %d\n", buf.packet_cout);
8 z8 Y% m! @0 E# f- e count_copy = buf.packet_cout;# w# Q& r3 f/ o
}
+ L2 y8 [6 Y( |8 w else
w+ x7 l1 v3 M6 o' p) ? {
6 W/ T" U3 J$ @3 ?) H printf("No effective message!");
: K5 y" s& o F" _% U* ?; B }/ E) R0 x, x4 N$ i% W
}/ I8 b( p. h% T( ~6 n( E4 D
, D* Z5 N8 P0 i; _; Y
, q# X, L" a2 i3 W! o7 D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 D1 B' E5 J- I% ?+ S
使用下面代码,对内存使用了mmap函数后:- k- s# b& L, j" U' {- {0 G+ w+ o
#include <stdio.h>4 C' i p: }- L8 Z! _! e
#include <unistd.h>) \/ @9 N/ O* m0 G! F/ `) @! Y
#include <sys/mman.h>
& m% |1 M1 {, C' ?, u3 X7 h#include <sys/types.h>
9 |! o5 f: v( c& }1 A#include <fcntl.h>/ c+ t% [2 O. Z3 |+ ~
; X* Z9 t4 i) k, `
#define SHAER_RAM_BASE_ADDR (0x80000000). f. w3 k. ^& Q3 l. A7 K+ @
#define SHAER_RAM_SIZE (0x20000) 8 P) c, d& y7 V) a/ `* t2 |) {
) }" A3 {" Y1 @4 O0 M
typedef struct, I1 N' i3 m% F# r6 m6 g
{2 G! v2 B" k. B
unsigned int a;
- h* \ v) S# u unsigned int b;3 J: h2 x! ]# {
unsigned int packet_cout;
. z2 G0 j! {0 l( Z+ x' r6 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 m; z2 C4 }$ G- _ `% D6 X# m7 B4 E
- G# k* V/ |. G8 gvoid read_MSG_buffer(int *baseaddr);/ K* i |. w: A+ H2 F* [; o
unsigned int count_copy = 0;, F" b& H; A' `2 M& r* ^/ h
& v1 x7 ^5 Y/ d. }' Eint main()4 _: M2 q4 a1 c6 j9 x/ l, X2 g
{
. c0 z) N# Y& h int fd;6 x% i1 P6 l5 ]5 J. c
int *mem = NULL;4 W" \1 d6 H, J! H+ G
# H3 O- Y; V* T! }
if((fd = open("/dev/mem", O_RDWR)) <0)
4 \) m3 g, ]* x( | {
: b) G7 F- N0 F- ` perror("open error");
& N9 `* f# z: x return -1;
( J" s9 R2 v/ |8 Y# Q. {6 ]; S8 J }' X% d0 V# Y7 g Y$ E: v
: j/ s% Y7 k) I& ]2 I8 W mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% A2 F# O+ l, p6 }9 L3 S, K
, d# Q- J- r/ A% t' L3 k
while(1)5 D) |8 W1 Q. M. X: Y. |
{5 \" x5 L6 D2 o6 @# S
read_MSG_buffer(mem);& {" a" o- ]- q% L/ ]& ^1 G% l: F
}
' ^1 u# p: Q, X. j& K2 S5 D}
0 p. }$ _ z$ J2 e& C3 Y% j( b1 J+ r) m2 y- |& P1 t# A% i5 G* E
void read_MSG_buffer(int *baseaddr)
) r4 D, z0 @! P% T4 U{# D& W4 ?0 r6 ?. g( X x+ N
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 B( _" {" `! d' r4 c Q3 b
+ {" p4 |- b- Z5 X pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 h6 x; a6 b! J9 I/ ? V6 t8 i v: s) k) D8 L/ a, }( A
if(pshreRAM->packet_cout != count_copy)
. _, r# K/ q* i' N5 q {' i9 l, I* D/ Q& e
printf("a is %d\n", pshreRAM->a); s" P2 F+ ]0 t: L5 P% q, ]1 y8 [
printf("b is %d\n", pshreRAM->b);
+ s' x% ]9 n" _+ r printf("count is %d\n", pshreRAM->packet_cout); `* |% M# Y& P; V
count_copy = pshreRAM->packet_cout;* k( W$ D5 B9 Z. {, _2 ]
}
2 j5 ^1 q6 L8 B else# K; G! I. ?/ B# }9 @( {9 ^
{
, \. n4 C3 {' y printf("No effective message!\n");
# r. a9 C2 G$ z; r8 o }" h( n& u% u2 I; x
}% ?' M5 ]- ^$ i$ ^
# Y1 Y6 F8 p! } ^- ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: p- r" h/ U4 {% ^4 g$ b8 H
/ t9 g2 q5 e- W7 O: {) p6 x- s
4 m( p- w% D$ b0 I4 O2 e; m
. T0 p5 A1 W* `# x, w: F( S2 w3 [9 d$ t; h5 N$ I4 P
|
|