|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ s1 Z9 D, {8 `+ E( m% \4 j1 k
% v. ?; M5 e% L8 }# ROMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ S+ C% f+ ?( P% \: @; c
#include <unistd.h>: N( M7 I7 A7 ^+ _1 n
#include <sys/mman.h>: w- D- q: J! L, D, q* J0 T; A5 g% T
#include <sys/types.h>& M! {+ k1 _$ _7 D
#include <fcntl.h>8 t* M' O2 W! r% t; m, G4 p8 c
4 Q: A! |& |; \% Q1 g* t/ |7 f#define SHAER_RAM_BASE_ADDR (0x80000000) - K2 t' O' K% y+ k. ?. k3 S
; B9 Y' c# R! q9 d( }7 G9 ~. v, z
typedef struct5 F$ `7 u# g, C8 R4 v
{
4 J, b" u: w* s2 R/ I: q- p8 M" W; k- i unsigned int a;! H( W/ `- C. G0 O2 Q) D. N
unsigned int b;
3 {6 F/ o" U7 Y% A. w: c unsigned int packet_cout;
4 [& o- J# \+ _ o* i9 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* \2 t8 T7 |+ ~
/ C, U7 g9 J3 ]& tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 L9 B% p7 Q" G. l( iunsigned int count_copy = 0;8 L! r- ?! G9 n8 z) t
( E2 o. t/ o7 E2 V( v9 l) ^
5 y/ ]) R9 G5 [( x6 A" c# c
int main()+ J4 Z" _0 `+ g. `: A( k1 g7 K2 T
{, l7 D/ [; V$ R! E7 V
pRX_MSG_PROTOCOL pshreRAM = NULL;" S' \0 W5 o% `8 D" W4 e+ d1 E: C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ k* @! A8 x2 C/ e/ G0 ^
# U0 z& Z6 s. A* }: |; Q1 | while(1)
6 ^+ ^. s, g- B, K# y {5 A) M j$ @6 v* A( \
read_MSG_buffer(pshreRAM); t2 J2 }2 B5 S) n" @
} 0 y1 `; B3 b+ i4 C, a _
}
/ \* X4 Q _+ G! g1 u* b5 a* O. ` @- N3 [3 o( \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 e) |; V3 q) ]{7 o$ d; k7 k1 K, l, p N
RX_MSG_PROTOCOL buf;9 d2 X4 K6 W& P
" D6 q3 S/ m5 ]1 q. c
buf.a = pshreRAM->a;3 V" e' k. y3 H2 u* i8 w
buf.b = pshreRAM->b;
1 d' c6 `( m# K4 h8 y buf.packet_cout = pshreRAM->packet_cout;. |, V- i6 C, ?6 m
$ L) o! E3 f O( P& h
if(buf.packet_cout != count_copy)% x. w$ v7 {; ]% W# I) {5 n+ C, C
{5 r4 T. _! J, i$ n( J# ?% l
printf("a is %d\n", buf.a);: b, x4 P- h' s* l9 \1 B+ S5 M
printf("b is %d\n", buf.b);
) H- m4 {) m$ w8 o& N8 ] printf("count is %d\n", buf.packet_cout);. J- ~9 x \" D: ]( S1 ?: H
count_copy = buf.packet_cout;2 `$ F. l: ~4 T
}
3 W0 x( D' ~- z, P else
; h! h& G+ H. k- E/ x {
( E" o; a. g6 t4 H( U( m# U printf("No effective message!");
( V2 k( E, N9 R( |4 E: P. U9 r }& g/ F$ [2 }+ W* x
}2 _/ D) D: a: d7 b" c' _1 q+ h
5 P! J6 b/ V R) q& l$ e+ X1 P4 O" h$ R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 ?- o) G& h0 i$ p" d
使用下面代码,对内存使用了mmap函数后:. Y/ v, a1 X2 _3 L( Z' i
#include <stdio.h>& u5 u V4 d; H0 a, T/ K, C/ ]/ |
#include <unistd.h>
% o7 C$ h( t0 r# C, L) x6 }#include <sys/mman.h>9 Y+ m$ w8 z' e" C
#include <sys/types.h>
]1 Y) A" U8 x$ b" d0 e# Y#include <fcntl.h>
" C6 n& t* c6 w0 E6 l5 l& N5 V8 Z# A# }- q9 i) d+ z
#define SHAER_RAM_BASE_ADDR (0x80000000)+ M" }& [' K% L3 r h9 F9 w9 b0 J
#define SHAER_RAM_SIZE (0x20000) / F* |5 V/ g3 s+ @* W& C9 y# ~
8 r9 P8 U7 x' U* r8 m/ ktypedef struct
+ C+ z5 F* M" g: Q. N& g) p8 [# l+ k6 ^{! B1 l g/ o4 o6 I' L2 z& f
unsigned int a;
6 H: K8 Y/ z) B5 T unsigned int b;3 I2 o& Z6 h# Q, j
unsigned int packet_cout;
* M) Q8 ]$ M7 ]5 s( W1 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, o0 T4 k+ g: C3 S& r4 Y1 D4 S
! O t5 A9 f8 ?9 a) ~; z$ `void read_MSG_buffer(int *baseaddr);$ q1 e3 i. A: {! M* _( G% ]( J. T6 K
unsigned int count_copy = 0;7 E t+ W, I, k) w8 G0 o
* y1 {8 ]" w5 e9 p. mint main() O- M' o+ Z; Y8 y I3 p
{
3 R/ \" z8 I& y8 A int fd;0 X) I0 v1 x0 Z
int *mem = NULL;
0 f# C% B( q5 G2 k! t4 }9 T' k; S; v0 i# g
if((fd = open("/dev/mem", O_RDWR)) <0). ^4 L9 I2 @7 t
{/ S' _1 H* x( o7 F6 V
perror("open error");0 K l! t- H) L
return -1;
) w; v9 c( O5 n/ `- n w }
1 _8 V" q" t9 M& l l2 ]0 r ^6 o
& O/ e$ P$ d4 ~1 r8 l: ~- W mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 c5 k1 r7 F2 n8 o
1 z j. f- P3 C# k9 y- [/ M while(1)
& E& A! b |/ t c& _ {
, R# \ E& D5 b1 }: ^ read_MSG_buffer(mem);
+ [) k3 s# I; `% i0 c4 K6 p } 1 e2 v+ `7 v; Q/ [8 B: B: v
}
& z! D8 ^ ]) w+ L' O9 C* n; m
3 o1 d e7 v. @" z# b0 k. O) E, d! qvoid read_MSG_buffer(int *baseaddr)
( F4 U: m( {6 E" e' G4 e4 E/ v5 a: d0 t{
/ u' [5 x" u; x- N pRX_MSG_PROTOCOL pshreRAM = NULL;( s- \( Y& ?1 z/ }" \2 U
) R4 b6 X+ b! ?, O C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 W) t$ u) x# O, B
" ~4 g/ _+ w$ {5 Z6 S
if(pshreRAM->packet_cout != count_copy)
$ I6 I' B6 m; E0 j9 ^( c2 |( c {
6 C5 k& M7 J, z# [$ Y printf("a is %d\n", pshreRAM->a);
1 B( M, U$ s+ P3 h; A7 i1 x printf("b is %d\n", pshreRAM->b);" S' s$ q( M& Z
printf("count is %d\n", pshreRAM->packet_cout);
# M% W! C: \' e; q; N. {9 {5 B count_copy = pshreRAM->packet_cout;: E/ _5 [" B5 V E. e
}; b, T. @! ^+ A. a
else5 ^5 Q" g% b9 P9 b* N
{
7 U3 S; _( E7 w! { printf("No effective message!\n");
- \2 p* [3 h# [ }: J! l8 u2 Y9 D
}
' ]! z8 ^# S2 p1 f7 e4 e1 `) W$ o4 c8 N; Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 p5 e4 {5 q; l1 r6 T' \
- n* |& b4 ^) s( M% b ?
7 Y% K9 q+ j3 P( b' P/ E' o8 l7 _' L8 o4 D9 g( a3 h
& U4 j [. \7 }1 h, {* k9 u' r
|
|