|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
t! V4 x$ @/ C2 ~1 I! O0 e* l/ o8 ]6 A" s! t s& l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 L( E7 B- Q1 M2 b6 E; {2 I
#include <unistd.h>
% f3 Z& D3 w& \& X2 {4 E' b- s#include <sys/mman.h>7 ^1 d* H j* Q
#include <sys/types.h>
$ ]9 _# Z9 {9 `; W+ R3 `( _#include <fcntl.h>% C s( P/ v0 g
! G4 B: c8 u( j5 E#define SHAER_RAM_BASE_ADDR (0x80000000)
- o& V% m m+ b6 [5 A1 A
. H# Y* K3 ]# L: V6 { U2 S* @typedef struct8 E9 ^& ~1 S! d& _
{
$ w! t- ]+ d+ E( K unsigned int a;& r7 {% B' l7 C4 ~
unsigned int b;: Q& _, k3 h7 Y
unsigned int packet_cout;7 K9 A9 f: n) z8 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A* @+ f$ a: K
# A5 p& b" g; Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ V7 A7 h# g( x( W7 o3 Y' p. o$ q
unsigned int count_copy = 0;
, l' V& Q c$ L+ E: ^- V0 i) K. B+ S; R+ K7 O
4 `. O1 ~% v: v7 A D! J( g
int main()0 S8 P, ` v4 _8 E! [: ^0 s
{
7 b9 T2 y; Q7 ]8 N7 V7 g2 ~( T% P pRX_MSG_PROTOCOL pshreRAM = NULL;+ b2 a0 c% x! z1 f2 h1 u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% B! J1 x' h5 n* q1 r8 f( {
3 M Z# q8 y# z8 o3 N6 q while(1)6 G: [% x) a: X$ o' j
{
3 i g; s' U- e& H: V& S read_MSG_buffer(pshreRAM);
& y Q, K: j) Y) W/ s7 t2 h) H } + W. { c7 S& i! g, J& @# g2 G
}6 }+ J) `6 ^+ p3 Q; {6 L
5 {3 S: x5 V; n( @* E1 l* B( v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 S6 t+ N# U0 z! ~" T{
% P, h, C. S- e/ f4 E; ?* y: m RX_MSG_PROTOCOL buf;
! U, d5 M0 s- w1 v4 D5 R 5 h. H; b7 U ~0 K* q/ q% F4 D
buf.a = pshreRAM->a;
' U5 `7 W8 G% x" E5 L( p# j, j3 G buf.b = pshreRAM->b;/ s" h" y* ]- U2 r0 {
buf.packet_cout = pshreRAM->packet_cout;! S: U3 q/ D+ N# O+ t
: H! ?2 C% N/ W' y
if(buf.packet_cout != count_copy)" D$ E! e3 s0 F. A
{
% f4 l5 T" n n+ i, V' j+ } printf("a is %d\n", buf.a);
. \( ^- m9 T# l; m, v. b- T' m, |/ T) e printf("b is %d\n", buf.b);
5 z2 ^5 I6 y) ^* p7 H( n- s& | l8 |1 C* n printf("count is %d\n", buf.packet_cout);0 p7 v r& P/ E4 q6 m
count_copy = buf.packet_cout;- P/ U: O$ {! D. s6 v) _
}
* _) E7 i( Q8 C9 N! A else4 b7 b3 O" B0 e
{
+ H. y- T" |" s; t- ] printf("No effective message!");
6 `6 } F" N/ _$ O }8 h5 l% d% J' u9 D8 f7 v
}
4 P$ b1 q0 O% C: N5 I/ J; U! t: p+ W; d* s- P) {9 a2 n. }8 e# G) C% \
. D' x ~4 x0 R, C, O; h但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 Q2 `# m1 n- O4 H$ ?, n
使用下面代码,对内存使用了mmap函数后:
) r/ U8 U! S6 o$ M; q$ K& ?#include <stdio.h>
$ u2 t; P; y5 A6 i#include <unistd.h>& \! i" Z; x; ~* t6 V9 t
#include <sys/mman.h>- z0 s, U- B) L; v F: N. K( N
#include <sys/types.h>3 ~: E1 I% [8 L' N* s3 V6 l' T
#include <fcntl.h>
, l8 q( n6 ^, r: _' o7 l6 W) u q& s9 U8 w, K
#define SHAER_RAM_BASE_ADDR (0x80000000)
' n1 m4 `8 w. ]# W( x3 u* }* {8 Y5 Q' Z#define SHAER_RAM_SIZE (0x20000)
. y u- S0 z8 d' ~% J
! A- j* J; _& J$ J) ttypedef struct
8 E5 b3 K. P1 W, {9 r+ r{$ S( _) s; E9 k) K, M9 N1 L
unsigned int a; V# Y: L: ]* v. D
unsigned int b;
5 S( P$ T+ W/ R, A k unsigned int packet_cout;
; R% d" b, x4 _0 x3 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 t4 P" t% |5 X/ f
_* M% z" H! i5 Svoid read_MSG_buffer(int *baseaddr);
) W- Z Q. b9 Z6 p' s7 N0 H% qunsigned int count_copy = 0;& I# y' u5 P( v% I
! U4 c: Y4 E6 T5 Z3 hint main(). P% x$ W* P+ r- v
{
$ E# g' f% G; q* u int fd;
: @, `, c4 J( L5 n/ s int *mem = NULL;+ z; d3 d7 w- p2 G
, a' g5 K4 g3 Q3 M- q) m# Q
if((fd = open("/dev/mem", O_RDWR)) <0)
- p& O# z4 e5 X+ N* a0 u' C2 w0 y2 k {
/ Y( t; i3 P/ ?5 E, ^; y/ I6 q; B perror("open error");
% ?+ N# l+ Y! b/ d return -1;
' A6 t- e5 i& l: ?. {* F+ l }
% r2 E5 }8 E) a x" j+ ~9 Y* @# E b8 j h" r1 R& F5 j" t! [
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 z" e- R1 } Z+ I$ M8 K6 ?* d# z# V8 {6 l/ k+ M' P+ Y" g) R
while(1)
. B' M# ~2 f- Y. N) L {" h9 U- N! M( g- ?5 s5 e+ O7 P
read_MSG_buffer(mem);0 O& L5 s+ T# A; D0 s0 N
}
# \1 {$ q; L+ N' L# p' r, B& ^}
- n/ R5 L) k3 g: p6 s, I, X$ F! ], E. J7 M( ?6 ^' z+ j1 V
void read_MSG_buffer(int *baseaddr)
. M" w4 m7 Q% M{
/ @# n/ Z! A& Y' @* o) g; L pRX_MSG_PROTOCOL pshreRAM = NULL;
; u [: ]6 A, K9 C+ B: I4 B/ v# R) d" u( ?+ |
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 |8 L' ]8 v7 |" ]
: M* q f- k6 `6 x0 {8 o5 e# _
if(pshreRAM->packet_cout != count_copy)% G k9 u7 |/ T- o
{
3 j2 b: q, x+ N4 v printf("a is %d\n", pshreRAM->a);) P5 i/ {# `, t- N7 _, @
printf("b is %d\n", pshreRAM->b);
1 t2 k; E4 i4 H- D/ |+ [( T: a printf("count is %d\n", pshreRAM->packet_cout);+ w" u1 b3 f' `+ ^
count_copy = pshreRAM->packet_cout;
: k: d4 q7 A4 u }4 w( v5 s1 p' j3 n& W
else* T. M, K) D Y( T" [ b
{
( I, ]' Z* Y0 U' }' {7 Z printf("No effective message!\n");
N3 ]" K; l9 k9 @7 a( [ }4 k' q* J+ b! e9 ^+ F
}' ?( F% T! n" c# i% r/ O
/ s6 X7 b( m8 p) s5 K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( n; u4 \% j9 G, R4 g' s0 D
/ g) ?6 P' H8 U# G4 A r
# J! \7 k' \' r% z$ V
1 t' C4 E& s E+ h" Z5 C+ p( s
* G( Q/ J' w4 ~/ R* x
|
|