|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . R" @( V8 W0 }+ l+ k e8 l$ X% ?7 g
+ i" n0 C2 A6 `8 q7 r" M' F% A. dOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 Q( ~% y& N1 L3 ~2 P2 b9 T#include <unistd.h>. | D3 ~3 r# S/ q* h0 R5 F
#include <sys/mman.h>
" `3 i `& i) ^& e; E" |% ?: A$ g#include <sys/types.h>- q/ j( A. l4 C# d! W+ S
#include <fcntl.h>, l$ x+ P3 m+ j
0 D% V$ P% J6 }
#define SHAER_RAM_BASE_ADDR (0x80000000) 9 ^/ j# I3 k; S/ ?
0 z/ x) l* f+ |9 ]2 B& q
typedef struct
1 ^5 A: t; _# X! ~* o{
8 ~, v$ B* j3 ?$ I: [9 d unsigned int a;
% v: V5 F& d% t- K unsigned int b;
& `% \+ G# Q: p6 D. y% h4 z- v4 v unsigned int packet_cout;
7 s% G* u* r4 a4 k6 H2 c+ h8 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* r0 {% v, x7 h& G* ], T4 R1 j) _2 U0 Z1 t" q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* J2 K' `* x+ Munsigned int count_copy = 0;% m/ z2 @" f4 `+ A% p
t% v: F' d" W+ w6 w6 i, ]. M7 F
' \6 }' H& N# v* y% |; sint main()3 [+ v3 Y. a( s% R1 A$ {5 {
{8 s3 @, n" t$ D) ^5 p+ `
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 [- g" U, O$ m+ p9 ^8 X) _3 F+ `6 s% V pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 A4 ~' h" h4 N: u) i: Z# u
/ w* L! ?; c+ _( u1 r* c J+ d1 m6 N C while(1)
$ m: n3 Q. h G5 I" t {* l9 i$ r% f0 F3 q
read_MSG_buffer(pshreRAM);
4 z! m- W7 j; m/ g' k& G }
5 g' N) d$ g- L/ |: {}' R3 y0 G6 Z8 D7 F8 S; z- y
! [6 ^* C* p; D4 S3 D9 E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) K1 r W1 y7 ], ]6 {! r. |- w; y! X. C
{0 S8 S# z' J b7 q( s
RX_MSG_PROTOCOL buf;
& C* }: u6 [+ t4 q4 s" M" O3 | 4 G2 d1 k6 n d. z$ q; S2 o. z* i$ X$ g
buf.a = pshreRAM->a;! i1 k6 R6 L7 Z; a8 J
buf.b = pshreRAM->b;
* C9 R+ b: |% d! O buf.packet_cout = pshreRAM->packet_cout;
- @" {- A5 O: O4 e* R; h
) ~2 `, c+ ?3 Q+ x& ` if(buf.packet_cout != count_copy)
% I z+ }2 V" U& G: ]( r- P) j {3 i4 y: a' N2 ]2 ^- B/ ?' O3 @
printf("a is %d\n", buf.a);! z( I8 Q; ~, Z
printf("b is %d\n", buf.b);0 W( J i% t( e0 I* T9 k; k/ w
printf("count is %d\n", buf.packet_cout);
! } a8 A; t/ W0 Y5 Z: ` count_copy = buf.packet_cout;; V- |9 J) t" Q/ d. M9 H
}. G+ k: i2 c: _( ?
else
8 H* W) T/ U: A. e( w {
! D C: C5 i( M printf("No effective message!");; R- G: i; c: b1 S5 j" m$ m, U
}2 v O1 l7 u% F- j3 u, O8 Z% B( H. M
}" a; O/ V$ }) I4 d& A$ o
. G. i# a' r9 L4 r6 V
d6 z F. l' m5 K& e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 {5 c: A! r! E9 K* n) Z
使用下面代码,对内存使用了mmap函数后:
0 `( q: ]( ]$ Q9 {! X#include <stdio.h>
$ e! L; ~: g. k+ M& O2 S% a; Z#include <unistd.h>1 d: Z% l% P: M" @$ R
#include <sys/mman.h>
/ B* | G! j5 g#include <sys/types.h>/ @: r7 j3 P! S/ ~* _
#include <fcntl.h>
6 v, _% U. C8 S8 I3 w$ Y+ T( D+ l$ s0 K) B) \6 b/ P7 R& L
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 f) I3 _3 g: \/ p, y4 ^8 F#define SHAER_RAM_SIZE (0x20000)
1 l1 j7 G! p: H8 I/ x5 |5 ?+ B) E- O5 G: n
typedef struct2 }1 @2 {* R7 M1 y- n S! X
{* i0 b% C4 J; p# O- `$ J
unsigned int a;0 z/ V# s3 U. p
unsigned int b;
& n/ z# `0 D: [. _: V5 f unsigned int packet_cout;9 q. k4 G7 ]/ o2 ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 J! N2 p8 a' v$ U
, B' k3 l3 ], Q+ C% Y- Kvoid read_MSG_buffer(int *baseaddr); x7 R' m6 x* x+ g* L
unsigned int count_copy = 0;# U! N& X5 H! C/ d& n4 V3 @" V
' `4 ?- Y. C/ r# |
int main()- k) e2 A3 j( w
{
% k! t* L/ x; j; d9 ^" P" t int fd;, F" `3 j6 v4 y" P: @1 d
int *mem = NULL;
5 L$ k8 N# V: _) I
- n0 A* p/ T0 Y' [7 h/ Y& k% B& K if((fd = open("/dev/mem", O_RDWR)) <0)0 t% w# N9 i# y; ?% G
{
* j5 C3 R, ^& ~ perror("open error");% D/ C8 E6 t7 t1 f9 j Q
return -1;- e( E9 o$ ~2 e2 B6 `
}: C2 h" z: I' r5 s" {8 Q; E
$ {+ L% g; I) x) N7 z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- _1 a$ l2 D, ?. ]4 F7 z7 E/ O! o4 D+ }4 n& O, X) v
while(1)5 S2 \! _- t) u( K( M% c) h
{# i R% O2 Z. W$ c* j% H0 W( ?
read_MSG_buffer(mem);8 D `3 L4 B' C- c1 X. r; h0 D
} ! J4 n6 P. }* }# M; m; `0 m f
}
- G- @! y% h- B' ~3 K# P- n: H ]4 L Z$ T
void read_MSG_buffer(int *baseaddr)
% `/ S1 o4 _* ^, L9 ?# c{* g# }! i4 f3 G1 H
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ f+ @; h3 E; B0 C+ H# s1 p
: o4 n# w; l% e1 U9 F0 t* _0 E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 E2 U8 j1 h) R( b3 t) w4 U7 Z
, @6 Q4 ^: I- N$ S if(pshreRAM->packet_cout != count_copy)
& _ Y9 |) ]4 e; g( D {# N' Q- |8 u9 S3 i) L A2 m8 c
printf("a is %d\n", pshreRAM->a);4 P1 L/ p; G8 ^8 J
printf("b is %d\n", pshreRAM->b);. z s, W; ^* s
printf("count is %d\n", pshreRAM->packet_cout);: Z, @6 Y3 m7 m, X5 E- j0 f
count_copy = pshreRAM->packet_cout; ^) B/ H4 L/ ]0 n& w" A2 K
}
P# R9 a0 i8 S) j" E5 A else. O# H8 U5 z {) S* c! P
{' t3 D" P" s% R U
printf("No effective message!\n");7 P: \/ E/ S5 H4 v, G
}
4 Q# u' }2 t0 f& W}
x4 i- R( B) l' @& t7 `9 o
! N4 A6 @' S: f; u: G" h; m' R3 d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 b* [6 Y! E, u/ e+ I+ Z9 w( T1 w6 k: ^' l8 \& J
0 K, n7 y4 Y, K5 L* k% ~& e) b1 G: p
' L' c% K2 ^0 B2 z, L5 ^6 u8 k7 w& t) m) k
|
|