|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 W ?- i+ O& K4 I# b/ q
- g9 M1 ^9 Z! u& a6 t4 t) ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. W3 j- e. n6 R" Y# u#include <unistd.h>
9 o4 b. s) `: p: o. N#include <sys/mman.h>3 D1 D. j' y6 s$ U
#include <sys/types.h>
A( ~0 o2 U8 U#include <fcntl.h>4 p" H9 T+ [* `1 n `: b9 Q& c5 s! C* `
* p4 D* i4 J/ K D8 }
#define SHAER_RAM_BASE_ADDR (0x80000000)
# s O7 N4 E2 b/ a
J. F( m3 m, F$ V* a3 Q" _typedef struct
: d+ ^+ S+ `0 c; s0 c+ @{
# |" _: b0 U" y$ L9 [* d5 K! t, m% A unsigned int a;* s0 l2 m0 q4 I. L- ?$ d) ]8 p0 q4 c; ]
unsigned int b;/ o; @3 B2 d/ l" U# a; j. l* x
unsigned int packet_cout;
) G0 O& I6 \( A" X) p* O) G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* y9 a$ u8 q# r0 k) @+ p
3 {2 b7 q9 h# J' N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 ^% @9 \) K7 q
unsigned int count_copy = 0;
: o, W+ [2 e3 g9 N# k+ A- V: E, X! m2 l* P3 R$ E7 C
: t% {+ \! q2 Lint main()
) ~, w* W+ R" o: e% h{! A4 s3 c, P R: p5 f
pRX_MSG_PROTOCOL pshreRAM = NULL;" w k( V: y* w. D0 i k$ h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: I8 O7 X/ _- Q: L' Q0 Q/ X" ?+ s; e/ D( a! f. A% c3 u
while(1)& x3 ^' x) ~1 T( l3 }
{/ L, b- n) z7 t9 ]1 B
read_MSG_buffer(pshreRAM);, |/ L5 i% i/ F* ?* G2 u* f
}
6 G$ S% Q1 H! {) j}
5 Q8 v" R+ N% z- d4 Y7 {0 y7 t' s& Z# {+ R, ^& Z( C4 c" p5 X- o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- d8 z5 N7 Q4 \
{
9 q5 ^/ P5 b; f% U$ V, k RX_MSG_PROTOCOL buf;
" @. g3 F `" n$ U1 _& F6 V$ O6 r % M% p& c0 C; N c, h2 N, ~/ Y
buf.a = pshreRAM->a;
" Q T; g8 O: P! M buf.b = pshreRAM->b;5 q, {0 r; Z! k/ f
buf.packet_cout = pshreRAM->packet_cout;3 t. f- n* ~9 n4 v) Y' @3 u; z* Z4 l
# Y4 Q9 D& G1 k1 J# _4 C2 L if(buf.packet_cout != count_copy)
' z. ^8 h3 P/ l {- Y _4 M R1 |5 X
printf("a is %d\n", buf.a);
! v2 h" o0 G+ p1 u- d ~ printf("b is %d\n", buf.b);+ c+ f. ?" y5 I
printf("count is %d\n", buf.packet_cout);* G+ g; G) n0 h4 Q" N9 H
count_copy = buf.packet_cout;
$ K B7 o' u0 ^# p }
, b- C; S) Z, o1 x( ~ else
9 N9 s' \! o# b" h {6 T0 k# C9 }" z8 \+ d3 E8 r" }9 S
printf("No effective message!");
* _2 c; V& A( e3 ]" b }
: o4 U" {+ W9 ~4 Q) T/ F# I}: {, x! K7 g; Q. t4 W
3 l* j# G( |! f8 |6 r" z( U2 e4 \2 y n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# I% E6 O# }5 e使用下面代码,对内存使用了mmap函数后:( \ K/ U% C* C+ v* t& a
#include <stdio.h>: s- g2 S, U+ E- H( [1 Y
#include <unistd.h>
( U/ P# ^! }5 {! G2 \3 q. a: |8 f#include <sys/mman.h>
( @) J7 j' q0 Y5 k; M& L6 \#include <sys/types.h>! q3 g* Z* I8 Z+ D+ q- Q* B
#include <fcntl.h>
4 |: y( v5 K+ q3 Q% @: M$ j7 f! r! D6 d( v
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 ~" K# I7 F+ u& [#define SHAER_RAM_SIZE (0x20000) 7 X2 A# R# i( q
6 Q0 u: C1 W. H! M
typedef struct$ u5 `" a. @# ], v
{
: D$ P# d# ^7 ?3 z) M) t unsigned int a;
, I; }7 {( O9 d( m unsigned int b;& u2 ^9 N; P. }- z) h" C& q& x
unsigned int packet_cout;
& U0 F- O6 H: `8 C# ~3 V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( o" D' Z% F6 F1 m4 p5 J; C) M
" V K. X& n$ a: t4 @void read_MSG_buffer(int *baseaddr);( E" ?0 P1 V$ h5 O8 v( y
unsigned int count_copy = 0;
' r! L; i; @' Q+ |! W
2 i, w/ @1 @* t ?2 H% Qint main()
3 R* H/ U; s2 C) S8 G{
# R4 J2 A- [# @$ Q; J( t+ j' D int fd;
. l, m" Z) w( k; {9 N int *mem = NULL;) e6 T) r! [; L! @, a- T# u
2 i5 \4 {$ Q$ Z* m& w3 K7 l# A" ? if((fd = open("/dev/mem", O_RDWR)) <0) S Q# F! D. V$ |1 ?0 v/ r$ A; j8 Y
{$ K7 L z# j( ~% l5 o4 U
perror("open error");
+ k! \5 j9 j) }0 U' K return -1;1 i" p1 C& n- |" }4 `
}
: H* j0 j/ |& a- P/ }7 W% s& d7 N
7 P9 t$ p4 U$ O mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& R9 z, p$ ]8 l3 r
1 b+ X* B) M& l! _/ H' l while(1)3 Z; c" C* D, U$ D" R( v5 b
{
- H& D7 _8 ~ G/ c read_MSG_buffer(mem);) _( z# Q6 y4 S* d3 h4 @. `; N
}
" @* V4 h7 R I; D% q}
* l0 a5 q8 k) `) ^+ d! v! c' g% ?2 H: i
void read_MSG_buffer(int *baseaddr)7 V' d1 O% s5 X
{
p2 b Z e& C; T pRX_MSG_PROTOCOL pshreRAM = NULL;
1 h0 y; M4 T- v: w2 o4 \8 P
1 m2 @! r- v6 ]. F pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& i3 x& @. E1 M; @0 y! {
* s9 {- r. y! A if(pshreRAM->packet_cout != count_copy)
5 A' `6 @7 C9 {7 R" k8 p% ` {0 f2 @" D8 j u" ^$ O! W- ] h8 {" [
printf("a is %d\n", pshreRAM->a);
' o9 ?3 r) s' S' H) h printf("b is %d\n", pshreRAM->b);
7 |# A! v0 [& w) X printf("count is %d\n", pshreRAM->packet_cout);( `6 @9 H G9 I
count_copy = pshreRAM->packet_cout;
9 i7 U/ a3 e2 w0 g! h" F: x) @8 z6 x } v6 A! u5 v* ?- y! d1 N2 \" E
else" U. S7 M+ v/ u1 C i8 ^
{& `* L4 o9 n5 v$ `
printf("No effective message!\n");
2 a! G) s5 C- k }
8 k7 K4 x `6 _# R% f3 \}6 P" c# h) ^( p/ x: `, D
% Q2 P( Z4 ^8 ~; b: [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 s! c7 X% J8 N! Z k5 O9 R+ Y& t) E0 e" a3 Q* ?
~* ~0 `9 H3 S' ~4 O- M/ p
+ u0 ^ q; R6 H }, V2 {9 c3 m( _. F( a. _# Z% D
|
|