|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ s3 W+ B4 }& t/ R( t5 d) a
4 O7 y1 A8 I* R4 vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( L. J, b( }2 T$ q+ g# C" s% s
#include <unistd.h>7 ~: o4 z) i1 A# Y% n
#include <sys/mman.h>
9 U* P) M+ q8 h' d# M: |#include <sys/types.h>5 t) j4 B3 X, _2 Z+ c4 h
#include <fcntl.h>
2 o$ U3 k' Q1 c$ H$ S! G
& W5 z/ t8 F7 Z; y#define SHAER_RAM_BASE_ADDR (0x80000000) Z0 b2 B- o& o! R7 r/ s
4 V) y, D8 h! L' N4 y1 h; Vtypedef struct S' T5 Z4 @) i- V3 f/ e9 R: j0 Y0 D
{
/ P0 R. P0 m U1 y. ^5 s4 c! a$ [ unsigned int a;! l1 {4 f5 c# q# f9 r- L
unsigned int b;3 x4 p) r; a S" l% V
unsigned int packet_cout;5 X j! ]1 V+ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; P; g- o6 i3 M. y. ^
. R: o5 |' c+ i1 C7 R0 O" q* dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' m4 P* q* c* h0 p1 y" Wunsigned int count_copy = 0;
$ Q) q: `8 z E2 j+ s2 a1 X; A! |0 M- z& M
" C# X0 D: n! a& O+ J" Xint main()
3 [+ ^9 P7 X+ D, D9 Z6 u{
' H9 [2 t& i6 q- e pRX_MSG_PROTOCOL pshreRAM = NULL;
/ K* {! |/ h8 O+ V# ?: k3 r0 K pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* q+ D: M3 p) P7 e( [3 O+ q
- @3 U, h7 X+ F8 Z while(1)
) H+ E% `3 [ ?( ~6 Y' J {( C! @" r+ V& Y+ `+ W* I0 E% A
read_MSG_buffer(pshreRAM);
$ I, |$ [6 V6 u }
- G! [; w* k) q$ E* u. _8 F}: P* L. d4 x2 q5 `
7 o( B/ u& [. Z: W+ f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 k, q* f: Q* _" g& m z
{# Q3 m7 a* ]; u) W$ L" |& P
RX_MSG_PROTOCOL buf;
: w2 T! Y1 i2 ]& E# q4 s# D' \4 n
9 U6 L/ N- ]6 u2 e8 o buf.a = pshreRAM->a;
- O8 m0 B+ v- k4 ^/ G7 B4 B% H buf.b = pshreRAM->b;$ V. a8 B+ |1 X& |
buf.packet_cout = pshreRAM->packet_cout;
- |/ A, P( }, }2 N0 F 8 X7 ~1 f+ ?9 S3 a
if(buf.packet_cout != count_copy)
' P, v* d6 [( Y2 G% p$ ]6 I( _2 t {* W1 S1 ^- a, h0 n8 W
printf("a is %d\n", buf.a);
% d) C" w# p8 b/ c0 h% N printf("b is %d\n", buf.b);
, U- o- l# g% S- v! d/ Z9 z, E printf("count is %d\n", buf.packet_cout);' f5 o7 z5 {* z" G/ E/ G, p
count_copy = buf.packet_cout;
# t/ G, u2 M( U. B' N }+ _$ z* n* {: _$ B* \1 l' V
else
5 Z; G. O, t% c {0 j5 p7 L9 N2 f" h" J( ?) l% e
printf("No effective message!");$ @( B: w) h1 m* S8 `5 a
}
$ @' m7 N$ S9 u6 j4 N}
: [+ }, i3 S5 b; u
. J- h9 E: k& }0 m; B- C- p4 r; u/ C' Z& q" z. d& A d6 e3 D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% Z' C2 k% ^: M I1 F) [; a& A使用下面代码,对内存使用了mmap函数后:
+ b# X2 P4 I! ]#include <stdio.h>- ?, Q* x0 J7 _2 D# [5 t/ @
#include <unistd.h>
5 n* H) n7 M- \' T! b9 _4 t#include <sys/mman.h>& F, T. [2 p& Y9 q6 B# f
#include <sys/types.h>
. B- m5 L( M, s& a#include <fcntl.h>- D. ]: u" q u! P' a$ t
$ [! l2 t n: A; z
#define SHAER_RAM_BASE_ADDR (0x80000000)+ h6 i% ?, M/ ]3 c/ w
#define SHAER_RAM_SIZE (0x20000) $ C+ e0 R7 T0 T8 J
/ ~$ o p2 T4 y: L: Ftypedef struct; B& C" D4 ^ P
{
$ `5 y+ a8 ]2 M5 P$ Y9 H7 w5 q; m unsigned int a;
+ H+ h$ r* P o unsigned int b;
- ?( h" W0 {- Z9 z- O unsigned int packet_cout;
$ x# W4 O$ a6 R7 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 O& {9 ?- v3 \ A5 m# L8 t7 G& P
5 m( X: N5 B$ u5 W- R; y: Fvoid read_MSG_buffer(int *baseaddr);
D. i u7 X" j+ o! q% kunsigned int count_copy = 0;
! \; C5 P1 I* V/ c" ]( M2 a5 @3 P
int main()' h4 `) ]% J6 e, Y, Q. g
{
, W/ J* u- p3 a& x. _6 o$ l int fd;
/ z4 F% i4 ~3 S$ i& p- t5 _ int *mem = NULL;3 p: P( _: X& ?6 ]8 g
D( s3 ` h( m if((fd = open("/dev/mem", O_RDWR)) <0)
/ z5 c0 R0 Q" G) j {
p* ^! R/ j1 |2 u perror("open error");
5 Y! z. H% _% S9 T9 \, X return -1;, R' g& k* C: l! ^6 ]/ y& m
}
( p, b7 T9 O( v: L- w2 }/ p* j 2 ] \8 ]7 G# p2 E% l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' I" t8 p2 p3 F3 K& f
% X) K' z2 l Y7 M
while(1); k5 k4 ^* {# L$ _9 P% d
{
/ |/ u. b) c: e9 W5 M: M read_MSG_buffer(mem);
+ m9 ]( j% J/ e x! g }
* c) \' v- {- \6 i}
y! O4 \8 |; M' g6 s; i4 g5 x+ b$ R" g$ c( R
void read_MSG_buffer(int *baseaddr)# `0 X) L$ q% ]: F
{, l1 A( O; D$ J5 j
pRX_MSG_PROTOCOL pshreRAM = NULL;+ f9 v3 n3 w# g" q& i% V$ I5 r, c
" I8 U, H$ F' b pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 z+ E; n8 \* c+ d" u' p1 m/ t/ @' T" h' o* ]
if(pshreRAM->packet_cout != count_copy)
, e% w0 @1 Z; g$ r4 o {
5 Y" p W' D: K; U# M; w, r# D printf("a is %d\n", pshreRAM->a);* t! ^0 I5 c( }& ~3 J
printf("b is %d\n", pshreRAM->b);; R6 ?1 j# x& O/ ]) ~; Y; x1 A1 {- T) R8 O
printf("count is %d\n", pshreRAM->packet_cout);6 ?1 ^4 t& B9 ]7 L Z
count_copy = pshreRAM->packet_cout;
* d5 n9 f& G; N; p- l, I }) t* i; X5 c% c7 U+ p$ F8 r+ b
else( d( x. z4 ]) K- n* i- T4 H
{5 {- u! L' I3 y/ ~
printf("No effective message!\n");
# V5 P9 Y5 Q/ k9 S0 \' s6 n }
/ D9 L) q* S& G6 p}
1 \& }4 V {. ]. X% i3 z/ \) c$ y. L( i( A+ o1 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, P# D& H$ N# H7 x' b; r
( S5 L: l. T1 r4 U& I+ P
, V% S# ~% J; i" @8 k" A; Z' ?
8 F P# M3 Y+ s* @3 l$ z: l" A* ^) n0 v, w
|
|