|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 T) c$ |0 h, |+ Y5 G/ @" S5 j$ M [ y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* x) |- w; [2 Y4 s# N$ K3 y#include <unistd.h>! v/ C, r* S! S+ J2 d
#include <sys/mman.h>
: T* {- b9 e+ e& d#include <sys/types.h>8 [5 X# O8 X* @ c/ A% k
#include <fcntl.h>
6 p+ q- w8 u4 z5 s/ s; i. I8 z; F+ D, p' t( D4 t0 E
#define SHAER_RAM_BASE_ADDR (0x80000000) " Y2 I5 ?% a' d9 ^
1 P' A' |) d; w* O/ E4 g
typedef struct
) v% Y* k* ~6 g7 Q{6 ~0 A" K& `" x3 E
unsigned int a;7 T4 c4 k) V9 @, a
unsigned int b;. k" [# j1 V* @1 \3 _% G
unsigned int packet_cout;
( Y; q) m# V: U6 p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: Y6 O, a7 ?& M' m: G" G B+ T6 F; Z/ Q. N; F7 E5 U: N$ q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 E W* b" H* u g2 ?( U- Hunsigned int count_copy = 0;
/ t- }* T/ E) V; h( e% j; V( p; p! ]) [8 l! m W9 s1 ~ j* f
; Z: i4 p* b9 d8 t2 c9 k8 K
int main()
2 V% N: P) B" q5 F+ A, b{9 D9 z w( }) L& Z5 k" r2 M1 ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
@/ O# g% v$ |! ^4 j pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 B0 Y8 C6 h9 l7 _" D; p
+ c8 ?( K0 P/ d while(1)
4 ^ H/ }: c5 Y% A5 \$ Y {
( Q0 k" ] w8 e1 J8 }8 r read_MSG_buffer(pshreRAM);
# ?. u/ A( t4 o9 p: s } 2 j5 P9 w! X# j
}% T, \7 Y- R5 W9 t& z) a$ M( S
% I7 l" c3 V) C1 i$ T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ \# F2 t/ ~. L6 c{. m3 F5 |# D0 n! e9 a! s4 Z& r
RX_MSG_PROTOCOL buf;
9 ?+ M; n0 K9 T: m* A, y' G5 o; B% _
; ^) Y0 f# Y( Q# g$ f# I buf.a = pshreRAM->a;& l, R. D! v7 L
buf.b = pshreRAM->b;% ?) \9 n1 w- f" v
buf.packet_cout = pshreRAM->packet_cout;
6 _% I& W/ Z6 _6 p 3 h6 l K4 x+ S: z# ?' e
if(buf.packet_cout != count_copy) R0 w4 m/ R8 k& d
{. N2 V" o8 A6 e2 V e
printf("a is %d\n", buf.a);
- [. h/ H. g: b: Q7 d printf("b is %d\n", buf.b);% @1 e$ p. D* |. k4 V
printf("count is %d\n", buf.packet_cout);
8 r9 \+ c7 a1 ^6 ^5 ]/ D! }: z. L) | count_copy = buf.packet_cout;
1 D6 r' E3 x$ A. b" u% u/ Z }& j! |0 q, s2 \" m; b8 c1 h
else
8 s" H% Q: a, l# j. i0 p {
2 I7 G) p0 N4 K' ]) ` | printf("No effective message!");
, h3 P1 Y" o2 U6 B7 V }3 _) y* C2 R5 {* _
}2 T# c- W- j% c3 a
5 \& Y: [) _' J" x4 k3 }$ a
8 X" T; p$ i7 }2 E- `3 Z% D' Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ |: R# N Z5 k* ~5 E
使用下面代码,对内存使用了mmap函数后:
6 F D7 }, {( F#include <stdio.h>
- t! t0 b5 E) J9 U: e) I9 [2 Z6 w s#include <unistd.h>! k% |. P) P; ]0 k% t% @
#include <sys/mman.h>9 |8 H9 h2 J' m8 _# B- k; X
#include <sys/types.h>* p: O5 L+ b* b6 _: C8 f
#include <fcntl.h>
0 @! C; A$ [2 @. v3 w6 |8 u4 s+ \* V; G
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 S! c# P4 V) H3 \#define SHAER_RAM_SIZE (0x20000) 2 P+ _1 {0 G- m7 G9 a5 x( C
" G$ [, q; D- ~ ntypedef struct" K; ]: e1 R: ^% g7 }
{) F: U0 d$ y/ B3 j% W
unsigned int a;2 p4 l; Q+ }+ n( c; [
unsigned int b;
) l0 ^- I$ x5 W: h! U9 U" N unsigned int packet_cout;
" p4 x& @6 k& y/ S$ ]% C! X" e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 Z+ y( m* K) z! j4 T. W' h
" G) m- @1 C# A4 {void read_MSG_buffer(int *baseaddr);
8 \! Q% ]1 G7 K0 I/ g, N# C9 runsigned int count_copy = 0;
- O0 t+ b1 h$ T2 ~/ j1 @8 u
4 `! D# t3 K4 i) D! `! Nint main()
/ ]- ^2 {, l& v" `{
* d5 O9 O5 o! B V int fd;
# F7 V' K% x f6 D+ E2 W( `0 _ int *mem = NULL;
( ~: g* e1 o+ ?% K# U
# t* x$ M0 j% v" S2 H4 ~1 E5 k4 O" {: o if((fd = open("/dev/mem", O_RDWR)) <0)3 q6 i5 _/ k1 \$ v% i' e9 P; B
{* s" o9 S* C) j) ^7 q
perror("open error");
! i/ H! |5 z4 F& `; R/ J N3 I3 \ return -1;
0 f3 \( ^% c3 m$ K! V2 k9 \2 g }
9 b. y* o- I6 ?2 J
( v& G, T6 M. \) P, Y9 h mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: y8 i V. V2 e$ U# Q3 N9 y6 }" }4 x8 M
) E. F# t7 m' ~2 ` while(1)" n; f5 G5 l) G
{
' c; q& d v7 ~/ w8 X) s w read_MSG_buffer(mem);
# w0 b1 C8 }# M- M/ k } h) s: ]) I: m& }
}$ N1 c5 T$ D, }5 ~2 s9 t0 s
+ n; A. _7 N) C! [5 Xvoid read_MSG_buffer(int *baseaddr)
8 M! o: {, B p/ q8 X8 P{! r; [, ~7 d1 u, e% j
pRX_MSG_PROTOCOL pshreRAM = NULL;
! \& E! |0 [6 v) T: k$ r$ X$ b4 u! J, V0 [7 b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ }4 u- Y+ C# b0 k# v
8 r) s2 S6 A8 `5 B9 o( p; M if(pshreRAM->packet_cout != count_copy)# K W9 K% K: e
{
" x. H+ z# y1 G: M printf("a is %d\n", pshreRAM->a);
& N1 X# u$ w0 b printf("b is %d\n", pshreRAM->b);
- B! f% W* {7 `: n) ~) K2 [- W printf("count is %d\n", pshreRAM->packet_cout);! E8 x3 m+ F0 g; ~! B' ~- o( l
count_copy = pshreRAM->packet_cout;, ]4 X% g5 d9 f
}
* u' k$ |! C9 S* ^! a4 T else( @. C6 G9 S3 J: P) ?1 {+ y
{
, T* \$ t5 F5 I% ~8 w5 g! q, T printf("No effective message!\n");/ H& w9 K5 x G" N1 w
}/ c2 z, u* Z$ [- H( B* h
}7 ~4 G, U9 M+ t1 B7 ^- D0 s w. i
6 `: d, Y% a B8 d+ _0 T* L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& z% F# H. C$ q* V% S) E
; ?# ]) V7 U J f/ b7 W
# x' K# @; N$ B7 N; U% O0 \7 b8 j/ e* V; d
7 |: H- U5 ^3 x0 i
|
|