|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 j# m* Y3 \" l) T3 m
" t. H2 W* S# ?; d, I/ w' `OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># k3 A4 V! J. J: f9 k3 f5 C2 x
#include <unistd.h>( A) d1 Q$ w u6 I7 \1 `
#include <sys/mman.h>
9 G: v; ~, m& }) P#include <sys/types.h>
) k/ @0 B. N' r, w \#include <fcntl.h>
% n. \( o, J) w, d7 _5 U. `
1 u: ~: C8 q' n5 C#define SHAER_RAM_BASE_ADDR (0x80000000)
7 c7 H9 i0 ?4 e$ S9 L# V3 x2 m0 T0 M; m$ t$ q( ]1 c4 Y* N( C* B
typedef struct
4 T- ^7 t: f( s+ B2 c{
5 G8 f U$ ?( _ unsigned int a;# T0 ?) k* {; a
unsigned int b;
1 u+ O/ j* Y( W: m3 j4 M unsigned int packet_cout;2 g4 j& l! f2 q* e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ W2 C, l9 Q" I2 ?) x
# V% d- K- d/ D/ Y7 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( n# _( L2 }) @( e; v% x
unsigned int count_copy = 0;
5 \9 x# A) m/ M" {9 o; B$ [0 i; {0 e
9 G* x! e7 i5 ^7 ?! M9 u$ B4 C, Z) D
int main()
( P" ^& u' p! o3 D% R{
4 W2 A1 s, z( V* K+ ~) m- z pRX_MSG_PROTOCOL pshreRAM = NULL;- G! x5 z# [& v7 j. _
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 P/ T" X* \; M# [$ `2 Q+ m" N
) Z! ~. D; r6 L$ U
while(1)6 h7 z; X, K( R, @
{0 H" \! q# i# b% a
read_MSG_buffer(pshreRAM);
% ]+ O, V# s4 \" S# ^# I }
+ x* u r$ H1 Q# e}
6 V/ ^0 ~% G: J) f! T$ G9 z; D0 j& X( K/ p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ ?( ~1 @) _) A" o; A8 v* x+ [- B{
4 F0 W/ Z3 ^6 ]& k# ]6 o0 f RX_MSG_PROTOCOL buf;
W% l& D4 P0 F2 Y; s z; B4 Y & j2 z+ m2 |/ k, N
buf.a = pshreRAM->a;, T# D& x$ ~% t( F6 ^
buf.b = pshreRAM->b;
' @( k* @# E) B) d6 T7 g5 }+ A( |! ~ buf.packet_cout = pshreRAM->packet_cout;8 G& K& d8 B5 ?
( h2 M/ e9 @+ p4 [; D# N
if(buf.packet_cout != count_copy)
& l4 H7 a8 M j& c- f$ Z% Z {% l9 r+ f3 s2 n7 G
printf("a is %d\n", buf.a);
0 a: q1 e* \# Z printf("b is %d\n", buf.b);* }, h) |+ N" V/ @: x I
printf("count is %d\n", buf.packet_cout);/ B; M1 }: N+ c2 O( Y5 ^) O
count_copy = buf.packet_cout;1 M. h4 | L7 T
}# k6 o+ ~; s& D$ v! F$ l8 s. N- X8 \
else6 W: _, ^1 x$ m. `. K" e& K' h
{' R( S- i4 }3 _# Q: {
printf("No effective message!");
8 T. X4 R# |. T6 t }
% Y& }! r1 \) h5 Q8 }}/ E- D3 r& R# k
: i" \2 r L; C2 S
' ]4 ?6 l# F% ^ a# @1 n- U; e5 S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' S1 u9 f% q4 g- O" S使用下面代码,对内存使用了mmap函数后:
: V$ p9 t4 m0 n9 s5 t. N#include <stdio.h>
5 S4 s7 ~0 r9 s( ]#include <unistd.h>
! C t$ {9 d. Y" f0 B6 I#include <sys/mman.h>
, D+ `/ V3 i" a/ F$ p#include <sys/types.h>
# C9 C' g- @. W: G: `3 a#include <fcntl.h>- U0 M! n8 z8 K0 S% ]
( z7 F/ c2 H: `1 d/ A+ ^#define SHAER_RAM_BASE_ADDR (0x80000000)
& i: V! ]( h1 ~#define SHAER_RAM_SIZE (0x20000) 6 A. N: F+ d% X" b* n
1 T2 |; J! T3 k2 i! I' Itypedef struct' F+ E+ V J' Z, y5 I6 U- w
{
2 R9 Y7 E! B% c& h& V( @ u unsigned int a;
) j# F- t: k" D- K, v8 s unsigned int b;
7 V0 M( N8 a) z6 X2 s" \/ A unsigned int packet_cout;! H; A- |0 p0 X; }2 I2 K1 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 z V5 i% Q5 y, k, I* P+ R
$ f7 c8 U" V4 @) y8 a. y/ X1 Kvoid read_MSG_buffer(int *baseaddr);
$ q& c/ M- e, X i$ j# i: L4 }2 P( |unsigned int count_copy = 0;& F" @" h- A* J, m, P; W- X
( }, K8 t2 y. o& l1 I& W# D. ~int main()
' m6 q, W2 `$ m$ q{
6 g$ i6 Z/ T( Q2 x int fd;
* ]) j S! V1 ~2 | C. ?5 e7 { int *mem = NULL;7 u/ R6 |2 c: o% J3 E
, e8 f' Z# m3 p/ H if((fd = open("/dev/mem", O_RDWR)) <0)
3 _* n B% G0 ?! G0 A7 e {
5 `/ f* s4 d$ a; o( J+ ~( g* U8 R( { perror("open error");$ w- m+ R. j9 h# ?' N; i9 x0 f
return -1;
N0 G4 m6 f' x1 a }
% c# d+ w* r; H2 i$ b1 D0 Z) }
; B5 W$ }$ K' s mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 l% e: C3 c( r4 l) L3 ? }2 v4 y& T4 A
while(1)
+ S& B5 |$ N- j& Y" w# ?9 O { j7 q) C; n) }$ X( e" F
read_MSG_buffer(mem);/ A1 R$ o/ j4 x
} & y* x# B% z4 }3 ]9 F. I6 S) q
}3 K% {- U6 U! C" N! O
7 j; T1 d0 @$ I9 ^8 G( b( O
void read_MSG_buffer(int *baseaddr)" I) M8 z# }7 W1 {4 B
{
0 a( C/ \5 ]) o9 R' j3 j& I pRX_MSG_PROTOCOL pshreRAM = NULL;& J) H) Q @% F$ M" E/ |
0 w; B9 W' Z% E4 A3 U5 g% f! b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ U* }+ x! A8 ~: @8 r
! P2 u2 u6 W4 } t if(pshreRAM->packet_cout != count_copy)
, x* S/ F, Q! T3 A9 }6 t {
6 x2 w0 P1 q7 V4 K( Q/ ?, a printf("a is %d\n", pshreRAM->a);, s$ a" U2 E8 e& e P- [ k
printf("b is %d\n", pshreRAM->b);
6 \3 W4 O2 H2 L0 |+ U printf("count is %d\n", pshreRAM->packet_cout);
0 `1 d3 V% V6 H8 G count_copy = pshreRAM->packet_cout;
* w* z- k4 D: v }
6 c3 E/ N6 z! g1 w1 u else
, s& \: }0 ^0 U% h9 Q$ b5 A {
# f/ [; k9 Y- ~4 R printf("No effective message!\n");3 N7 Z% H6 X0 y
}2 [7 M9 A/ V. |1 m- s# R
}& k/ |. o) ]5 l% Z# A( {( E8 A
5 T( l2 D& M& d. l$ f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( J: _* J% q$ ]" @6 l. P- v# D3 u' S: c2 r' n- M6 d
! ?7 f: c6 @# n* ~% a
. K2 }& t) S3 H9 c4 i
) Z! i) W& n: r9 O# w |
|