|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! Y: f/ e0 D# }/ N) i7 c7 x* m( {4 g6 `6 w4 [$ x( \: y; N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' K& z; K% ~" {
#include <unistd.h>) B) e0 Y$ \; [4 v; F$ y) ?
#include <sys/mman.h>- U7 B/ {, M% {% y5 p
#include <sys/types.h>) _& o* n) D$ O& t! ~
#include <fcntl.h>
+ C; G( p+ S$ _; F7 M6 v& I; o3 U& P, _" U: i5 Q" v
#define SHAER_RAM_BASE_ADDR (0x80000000) ) T! \" h3 M# `6 d( L, f
' |. M+ a# Z( A' Jtypedef struct4 K9 E3 k/ l5 B! N9 S) j0 }' b& }
{
) X* {& W7 g: ]! N unsigned int a;
. O d! W* j x* K. U3 l unsigned int b;0 C, a# D* U7 C1 v/ F, E
unsigned int packet_cout;6 y: f* S, t" q0 I' V0 q! b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 v( z' S# m( d
; ^& f& H9 G6 m+ s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; t- Z9 A3 [2 iunsigned int count_copy = 0;& {# O, v% B( y5 d4 o
6 ^# Y7 t: ]8 k- w' M
1 N! x# f, B1 h5 e. bint main()0 h8 l% s% ]- B! p
{! C- C0 L1 v* T- d
pRX_MSG_PROTOCOL pshreRAM = NULL;: k) E2 q5 r2 `! |, [( J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;5 V2 H: g- @) \1 S* m, G
6 ~5 b( A* r9 B5 |, H" J/ b1 j1 A9 ] while(1)7 r$ i0 C j( l* \& t S
{6 M+ [* J1 J' {! u
read_MSG_buffer(pshreRAM);
0 l3 P; a! r& C( X }
( \. I; T3 P1 K; Y6 d}
7 r4 }3 }5 V$ I. w" w5 W9 q: k5 g" G. o! P; h/ T. H' g* ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 \8 [ ^9 Z1 ~1 p1 y
{
; r; i2 S8 m& a RX_MSG_PROTOCOL buf;
$ u4 o" O0 ]7 k0 J # G2 [( e4 r% [! f0 ^
buf.a = pshreRAM->a;1 }/ [4 R {2 ^7 C. B
buf.b = pshreRAM->b;# l2 D7 z5 J/ C( D
buf.packet_cout = pshreRAM->packet_cout;
( V: z [. h. S' p 6 t$ a9 V! X% }/ F1 G
if(buf.packet_cout != count_copy)
* w" J4 @4 o% C9 \7 p$ P" L {- A4 u: b9 ]: Y5 [1 D
printf("a is %d\n", buf.a);, D# Z* [0 l/ @; P3 E4 v
printf("b is %d\n", buf.b);
( u# _/ ]7 }8 L) T1 \ printf("count is %d\n", buf.packet_cout);# s4 t/ |& J- d3 Z; Q; B: J
count_copy = buf.packet_cout;/ C! E& S* T( R# @; P: h
}
2 o' b9 W- {8 V' J* q% ? else9 n: m ]4 v1 f$ s5 t
{ }! @0 n' F m$ J9 u4 v6 V
printf("No effective message!");' v. e- f, w$ r6 i1 K. @* g
}
2 {; B& u* M1 x! Y) G: I; S+ V}
* G. ~/ u. \, b! y) R0 L' w1 B! k0 o* A) V B& r- N) o1 p, t4 X
4 F/ i5 {$ i7 s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: D+ Z7 g; c- H2 K( s
使用下面代码,对内存使用了mmap函数后:
: m6 C' |% _1 C$ U& ]# w# y( e#include <stdio.h>1 h( ? l+ u: h; l, \3 }5 t
#include <unistd.h>7 ~# A; F2 U, W( e% v1 {7 |
#include <sys/mman.h>
1 f% R6 X8 o0 @- D9 A+ ^#include <sys/types.h>5 Q1 N9 s% N t6 j4 N3 Y
#include <fcntl.h>
0 u+ R) b" r' U2 i& B2 O; y' k8 j$ ~
6 F! q0 q) Z q/ p. m#define SHAER_RAM_BASE_ADDR (0x80000000)
4 o' i; a0 @* y# ~% s#define SHAER_RAM_SIZE (0x20000) & l+ f* z N" B5 _0 G* y
/ K8 ?+ d" ^7 xtypedef struct
% L! s. A( {& c( S8 l' z6 i{
4 D. T! M" D6 @4 }* r unsigned int a;
$ [; y; S2 F! j4 ?2 H unsigned int b;! m8 t' ^" Z0 P$ c9 U6 \0 u
unsigned int packet_cout;; ^7 w0 r! }6 K3 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& r& a0 K( | j T) Y- t0 h2 O+ [, r
' O- @: }4 Z: _/ z: M2 \void read_MSG_buffer(int *baseaddr);: l( {, x, A4 c5 v
unsigned int count_copy = 0;
$ {$ {+ y: S# h Q
: w$ Z6 _, A" [4 }& Zint main()
$ }' L" m( @: [8 Y/ \{4 c( L* T1 E* I1 O* O- s6 R
int fd;
$ _0 l' U. z# ^5 ~) @ int *mem = NULL;
: ]. ]( w2 G0 o0 L& V/ Y7 i
9 u8 d6 u% _( q, X5 ], u# x! q if((fd = open("/dev/mem", O_RDWR)) <0)) }7 ?7 j8 ]8 V( ^! \
{( p, ~0 t }2 ~7 s8 M! s* j
perror("open error");/ x9 [( v' y# t8 X2 [( o8 k
return -1;. Z; Z. u. O$ r5 K+ G# R
}
$ H1 l( h, q, ~ & I' ~0 M7 a" W& b$ q% R! Q* L
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& u( p8 e. X. ~- Z- Y# \7 I
/ t" h8 F6 h5 s6 x0 h% @0 C while(1), [( x' \9 Y+ @. d x
{) Q! h1 w# m. X7 H# K I
read_MSG_buffer(mem);
}+ {3 R! u) t0 Q- C1 { }
8 X1 z& ~8 H) B# s1 A% `}
~+ Q2 r) h0 M$ n, F: l. g8 T
, o. ~6 y6 \7 K7 n% x# Kvoid read_MSG_buffer(int *baseaddr)4 J- y2 s" ]4 t& p6 l' U
{) d3 m% I' ?5 Y( j9 A" `, Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
; g- P6 M ?; M
! o8 j3 i t8 N& i% i$ Y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 ]+ n7 h' r8 G c9 f/ L
9 |" S. G( [" S) M& \ if(pshreRAM->packet_cout != count_copy). t7 T5 M8 B. n- ~* K
{
% d; ^4 B8 n/ |' r- \* ]* s" ` printf("a is %d\n", pshreRAM->a);
7 E$ S3 B6 R* e: i; }6 o$ C+ f9 V printf("b is %d\n", pshreRAM->b); S% d$ Z3 k* r/ _1 e9 m
printf("count is %d\n", pshreRAM->packet_cout);: _" G4 \2 u l4 w
count_copy = pshreRAM->packet_cout;
+ F9 d; J1 h. M5 x7 a }( b+ p( o O1 c9 {$ _
else/ w1 Y: @$ G4 B X( M \1 N; Z
{
' \4 I* V N7 Q3 ]. T, \ printf("No effective message!\n");) L) m8 ~- ]6 L+ O) n
}
& e- C( ]0 K8 `. I) Q}1 ]. q; z3 x" T# G$ @) D
+ T4 y) a9 e8 O8 |没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? v' N) L/ E& p9 ]& b
% M8 t0 \0 t ~* P4 c1 H9 g" U Y% Y
/ ]1 x6 j2 ?0 G+ p- x
# d! \; C/ U8 W" M" X1 R M |
|