|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 X5 a% U. e, A# C( ~% _% K1 t0 i- T! r) e3 p3 B0 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. X5 {+ k* }7 l# k#include <unistd.h>
! r0 q' O4 J* H2 _* ^8 ]# J& p7 ?#include <sys/mman.h>1 h& m5 W5 i* h6 x4 h! f2 F) x
#include <sys/types.h>
9 C7 i8 C- T! ~) ]#include <fcntl.h>
* i! |" |" K# t' w' Z8 |$ `" |0 Q, m& j4 R- U
#define SHAER_RAM_BASE_ADDR (0x80000000)
) @0 G1 e+ X1 \* g* {1 l7 Y
/ l6 V' W5 }5 u4 O7 Vtypedef struct
; V! v( ], q, d: L; c3 w0 ?{
9 q2 \8 k0 d$ f7 O unsigned int a;
" u" L' a& [2 ^' g' h2 B4 x9 ] unsigned int b;
8 O4 e+ P3 z$ f1 y0 h; Q7 @' b( G$ E+ K unsigned int packet_cout;
. `+ N. a' L1 F+ d) e5 X' j& q: T7 u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 J) J# ~, W2 y3 N4 W" o+ g
2 X( j6 j Y* W9 I+ Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; C J/ n" E7 Y& d6 `& n0 W( Dunsigned int count_copy = 0;
* B* J2 Z* ?. K( o( m
0 m6 [/ U$ \% r7 j! h
6 R3 L$ [/ z. \/ h' Aint main()
/ M+ @' L0 l o" r, |7 l& p8 a1 m6 y{9 K# `" a) X6 b) y2 a
pRX_MSG_PROTOCOL pshreRAM = NULL;. e8 ~; n- p% i) i$ J1 B2 H
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 m- |; W1 N9 T- Q' m0 X- n& `# X
; s/ M8 T: l- }# u! V5 A8 K) H while(1)
7 ^: {$ B9 O5 F1 h9 c5 ]! S, { {& m% u7 l: k, E2 y: R$ l
read_MSG_buffer(pshreRAM);) I7 \) o7 I. ?/ }
} 3 O' {3 Y& ?0 s0 v
}
) z* U5 a+ s$ w" A. E
$ E. m; ]( `, K9 P! Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ ~0 X" C5 Y. t0 D
{
" P. n$ S( ~) x/ p0 i6 T1 j RX_MSG_PROTOCOL buf;
+ H, ^4 i7 t; N. H: I
0 Y2 v3 ]" \7 { buf.a = pshreRAM->a;! w/ W/ ]3 M r* ?+ H! k
buf.b = pshreRAM->b;
6 I) L& Y% J% V* R) r buf.packet_cout = pshreRAM->packet_cout;
# |. o# N1 Z. r( q; Q
4 t8 ?2 c$ r6 k& w5 L8 d if(buf.packet_cout != count_copy)
* e8 m( A+ {, o: B {
5 C: S! r) E9 m6 s, n printf("a is %d\n", buf.a);
) w( a2 G+ _4 ~/ D0 a, q5 P printf("b is %d\n", buf.b);/ ~# a( ^8 X* b3 a8 ^' ~/ O
printf("count is %d\n", buf.packet_cout);
$ s. G0 o+ t' l. ^, G count_copy = buf.packet_cout;
* `$ g* R J, g7 T# }& L }
- y8 M4 h+ [! ? else' W6 v7 {3 x7 _, G
{% L0 `! p! O& L% ]; W
printf("No effective message!"); ]( V# X, f4 B/ _7 K
}
: I& d! ]/ _& {} e) S% h$ e1 H) T. W
$ L4 v( E- e- Y$ A
& S- ]4 u. n9 [5 ~但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 j& _2 I. C& c- L* U; z使用下面代码,对内存使用了mmap函数后:' S( [) I( D) k* K; z; u
#include <stdio.h>1 H3 g% Z& A9 j; h; X
#include <unistd.h>" R( M) a. S- t& P
#include <sys/mman.h>5 o: n, {% M" Y5 f5 G, |( ]* N
#include <sys/types.h>
* o# s& }$ z' P2 I2 A4 R#include <fcntl.h>* f- W/ T9 h6 M: \' ]/ ^6 Y6 a; `
! h ^3 W+ u( S& u9 F
#define SHAER_RAM_BASE_ADDR (0x80000000)
( V' N W: U. d#define SHAER_RAM_SIZE (0x20000)
% i& I) g/ G' A
% N: `& I- d( _ [1 Rtypedef struct
& H; h0 B7 A8 N0 I: n# {+ i" J. f3 a{
# c; E v" Q5 M& [* b! A unsigned int a;# W- V6 y, [& i D; ^: J
unsigned int b;. n+ R$ @( W+ w& a( W
unsigned int packet_cout;1 w0 P2 _2 w. ?) {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# H# c! q5 L+ U n) k1 M1 i) P/ j1 @' f9 }
void read_MSG_buffer(int *baseaddr);
, ^1 y, W5 P: N4 munsigned int count_copy = 0;% P" N/ B# O, g9 h
0 f( y9 T+ e: n$ A% J/ Eint main()# E/ G# u% c* o$ w. h2 W
{/ r# f% W2 J, y& e$ V/ ^
int fd;
% v" w" t2 K% D( s4 F4 s int *mem = NULL;
9 b0 _, D: t( O2 i' d! A! F( M4 H1 u# ]8 s2 E8 v3 ]9 p
if((fd = open("/dev/mem", O_RDWR)) <0)' M1 S/ H5 P2 W' D6 R
{# ?4 |- r- K9 u% f5 O" x( F1 F
perror("open error");7 `! b; S% m/ }8 E+ F5 C- `
return -1;/ f C" Y3 E' B: y* D
}
1 u( N; L, Q. W7 \4 X2 V) F
( M& E# \# P, q# H H, w9 F5 F mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& j$ `* j4 o, \; s3 C
+ S8 |) h3 N* ~$ T, x+ `0 G/ K while(1)* i. l& W9 P a6 ]: o& w' Q
{0 g/ j% I8 T) O+ t( ~1 k
read_MSG_buffer(mem);
3 f, V: I; C9 z; `8 U3 ]' _ }
( Z$ k% U. J) {9 q P' ~2 ?}
# ?& N- C- ^) C+ n1 [8 K6 u9 X8 E# k1 _1 Q
void read_MSG_buffer(int *baseaddr)' _( R) F2 ]% \, a) p! }. T
{) w2 {! w7 S) }7 Y5 z( z
pRX_MSG_PROTOCOL pshreRAM = NULL;
: g+ \0 n' u' o" M2 m8 a/ I2 t% z. Z1 f: m" L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- t C3 {, r. ^, I
; I8 b) `' d! V
if(pshreRAM->packet_cout != count_copy)
( C H6 s4 b/ n { S$ |' c- Q' P, Z+ }1 ?$ @1 i
printf("a is %d\n", pshreRAM->a);7 z Q' @" `" Y
printf("b is %d\n", pshreRAM->b);
8 G! d4 `/ c; D3 M printf("count is %d\n", pshreRAM->packet_cout);
: Q% {% h9 k! A count_copy = pshreRAM->packet_cout;3 l+ [2 o, K6 t% |4 O8 a
}
( M# s) S: {: e else+ l2 b" `/ X" T* A l
{- w! K z5 p- v- Z1 a% ]
printf("No effective message!\n");
) V; s# l z1 N5 ] }, V$ D2 c) v8 g, P' N
}
( [# ?+ r/ u% j/ y+ x" B
$ `2 @; ^4 ], x5 o- ?. X+ V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 A1 |1 Y) @1 E- f/ j
% M% q0 q+ @. u& n9 V# r" ^0 m% E9 m P
- T) n: [2 R, |* Q0 O
; m4 u& v- C+ I( C# t1 A$ k
|
|