|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 d: f( j* R- X) W3 f
, A$ G, R, k9 c: s+ D# M% AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 w, x- \; S3 E7 n& O! |' P#include <unistd.h>
/ h4 k: s& J. s8 b8 ~1 y2 h4 ^#include <sys/mman.h>
5 {' ]- {! q) C% \, G#include <sys/types.h>
# F! s; a* j; I#include <fcntl.h>
`, a& ~8 P+ n1 H
0 e: X, U3 R# S4 j$ O#define SHAER_RAM_BASE_ADDR (0x80000000) 3 c y; F' I, v2 E" K
3 O5 s, X; s2 D
typedef struct, }. a8 r! [( c1 |) z- A; v/ @6 F
{
: W4 d; n+ Z% q$ |+ w unsigned int a;* j1 {7 Q+ ?0 b( |
unsigned int b;# B: _! V* T5 J5 t( o/ ^
unsigned int packet_cout;( j$ E' d, O) n; ^; i6 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# s, t8 M! e; L. }1 _% `+ {& D
; ~5 M9 t# l. Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 P7 ]# j1 p0 T* q$ Dunsigned int count_copy = 0;8 ?: {" |; C, w3 [3 H
: _) `+ S, L0 @3 e- e- q7 E- n: P; u
- s' N# k$ d2 Mint main()
+ K# F( t4 D! c' W{
& b+ g$ Z) M+ S pRX_MSG_PROTOCOL pshreRAM = NULL;2 m( b8 l: _% x4 ^+ U7 c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ i+ Z7 w* z' \) d7 }6 \
; z2 P, r: X1 ~2 n7 q* V" `- J while(1)
- o; s5 Q/ k, R. ~6 }) u {) C3 c5 B- {4 [! m+ P
read_MSG_buffer(pshreRAM);
- ?( `; _, I: V- j9 R }
7 F# c! [' j* O% c7 m- a}+ e6 X D. z, p1 z7 m3 L
( l4 a) J( a0 D. N# B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. b9 T. t, O: U- @{2 k- q( o* E% r, G; `
RX_MSG_PROTOCOL buf;
2 x" [8 Y5 N5 d+ ]" f6 R/ b$ X - L0 k3 A8 R7 }4 {
buf.a = pshreRAM->a;# h5 k3 ?: T( b' N7 T0 w2 e8 f
buf.b = pshreRAM->b;5 H! A, x& y! H/ t
buf.packet_cout = pshreRAM->packet_cout;( d* K7 x ^: D0 d9 E( L
! A) U, X- B3 h& u/ e* g8 Q' C. r if(buf.packet_cout != count_copy)- m+ [; [# x: D
{
4 T2 {1 S; p( k" c printf("a is %d\n", buf.a);/ Q Y0 A; J8 _
printf("b is %d\n", buf.b);9 J) j9 ]/ N8 l. a
printf("count is %d\n", buf.packet_cout);/ ^8 b! u/ E+ \/ e: I0 r; e+ ]* z9 S
count_copy = buf.packet_cout;
" d' ~- [1 R( i; e. F5 ~6 i }
% r2 K2 f2 Q# o$ Q$ g else B6 Y6 i: K* D' {7 { N) D' ]
{, T6 I4 r+ S J) _
printf("No effective message!");& }- t: A- O Q; i' m
}* A0 U3 i, Z( g9 [4 x" L- y5 v
}
! e/ u" k/ ~# U) V4 j* o& i
H+ r( k% y, f, r2 ^' q4 x
7 [8 d! z9 L" ]! r& F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' |/ O8 d2 M4 z8 g# [3 U+ z3 j使用下面代码,对内存使用了mmap函数后:
3 @! W# c. @# _/ O( Z' A" J9 @: N* j#include <stdio.h>" l, g" J/ u6 k: L; W( D7 Y
#include <unistd.h>
& F2 I& V/ C# P( T: X8 l#include <sys/mman.h>
5 q6 { v N1 X* b! J#include <sys/types.h>
4 V4 T5 u. p( }* @! T" G' b0 `. n#include <fcntl.h>/ o/ |* l" M0 _, _; W5 l
7 ?* Y, G3 {1 y* Y o+ S; U/ R#define SHAER_RAM_BASE_ADDR (0x80000000)
! {; m2 k6 v# C#define SHAER_RAM_SIZE (0x20000)
$ P0 T$ M1 ~7 {# H2 i
5 O$ c+ m6 z! Qtypedef struct! C" s/ y& Z; `3 _( M" {* y3 N1 a
{
' k/ T# r! _; O unsigned int a;
3 W' Q$ ]5 p" X7 {+ \% r unsigned int b;) a d0 H5 o7 z0 ~: E
unsigned int packet_cout;1 }) {: g) k8 i( k2 Q6 r$ l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 G% B8 k5 T, f3 c* P6 B
5 g, I/ s2 W7 Mvoid read_MSG_buffer(int *baseaddr);3 K3 w3 W, b# M/ w9 Z( R
unsigned int count_copy = 0;
# A, r1 R' I1 m% Q3 u2 ?7 d0 d N
' s s9 u D5 B6 X1 c Wint main() i$ t n6 E0 ?- x9 l/ ~
{
' t: Z1 p7 r- y3 ]9 J* g int fd;" ?$ t6 y$ k- S/ J; R0 I& r
int *mem = NULL;
9 R3 `) M3 ^- d9 G( |, h
( Z/ K& v C* s8 F( x( O- \ if((fd = open("/dev/mem", O_RDWR)) <0)
9 @( P6 z/ W. t( r" U- u {
" A, C9 x/ g8 {4 W perror("open error");
: _. i2 o# E( E9 a) k3 ?, E, i8 o; D' A Q return -1;: v1 [* {) n& @
}
1 U3 S* |1 [5 L# j* r8 O
. X9 X- X% I7 [ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 |. f4 a- H6 m# ?# q9 ?- c# \3 e
1 R. b: f: U$ y* W4 U while(1)
; w! ? t4 ~, o6 `' I* F {
% }& K4 V2 P8 H9 L read_MSG_buffer(mem);! B3 x8 u! e8 ]' j# H
} - A, G( r4 T, P9 \" s5 w% ?6 c, g: }
}
9 G' m6 Z# L( ]$ H R2 e c. a9 Q- F& A
void read_MSG_buffer(int *baseaddr); F/ S- |( t9 `- G* a D
{& ^- T- _6 t) J1 \' A8 G2 C
pRX_MSG_PROTOCOL pshreRAM = NULL; \+ ]( V0 [7 ]
5 p6 n! F" X* N% P: K pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* ?+ ~7 h% C3 M0 S; h7 {0 \
p$ S6 P, Y% k0 i2 `+ }% _$ k if(pshreRAM->packet_cout != count_copy)" a4 y) D, D' [8 w$ j' \4 {" ?6 \
{
/ w& [- J8 p6 A1 P- T printf("a is %d\n", pshreRAM->a);0 x1 ?. D" ?8 p! r; c5 N
printf("b is %d\n", pshreRAM->b);! O8 r" y( ^; x5 h. |7 s/ a& o
printf("count is %d\n", pshreRAM->packet_cout);+ u, r) O* Y0 L9 P4 j
count_copy = pshreRAM->packet_cout;- E" X* ~5 ~# c" B. t8 ~( T
}
2 h' g& I4 ]& ` t else
( @4 P) ^4 |3 {9 p {; _! u9 i% i1 [
printf("No effective message!\n");) c' f4 ~& w" C2 _8 W0 | Z* L
}* Y' X2 T: j# l8 [8 K5 G+ m) p
}8 h: ~: P" b. C% c6 V% y% N
! ]5 {" K6 V% I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 {& P6 q6 w& s# q; Y7 k& [
1 B0 I _ m6 F1 A& S) a8 P! E! u+ p; s' h
* z' K6 q) W. F7 C
+ |$ e9 r$ C t9 A6 K |
|