|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 \1 \ W& G* z
# v& ?: [9 q* g# v. c( r0 G- Y) zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 L2 U+ P2 K9 w# q
#include <unistd.h>
2 u0 ~1 h) W( [# F#include <sys/mman.h>
3 n' Z) R" ]8 Q8 R5 [! |3 J. ^' X* F#include <sys/types.h>
. W3 K+ Q3 C% t3 G#include <fcntl.h>
z& H' A8 l1 U# a* V. C
: X, o' t9 N: O#define SHAER_RAM_BASE_ADDR (0x80000000) % G! |$ O: ?9 k6 D
$ e3 F0 L7 v) d( Btypedef struct4 r, d `: G( E# j3 s9 A4 l
{ U7 L4 M% x) G q: R
unsigned int a;8 y$ |2 Q2 ~/ d
unsigned int b;
' |* o! {; k/ _: Z! N' `- F8 n unsigned int packet_cout;
( T% S3 R0 U( j, x6 ~- U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ `; v) y/ |, z' J8 P: ~" F/ H0 f9 u: s0 y6 S- p1 {$ A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' y9 ^/ d* a# t9 W- Munsigned int count_copy = 0;' z' \6 P1 l* F2 {/ q1 ^
0 q, X. `" w5 W9 P( w5 s# E0 v
1 d5 \, T5 w8 B/ K! \: ?int main()4 B W4 l; f" m+ ?
{
9 J( m; w7 D& V pRX_MSG_PROTOCOL pshreRAM = NULL;
$ \' B; h: L! d, C pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 b* T6 g1 t* E) n* O5 ?0 W1 q
9 u4 r( g: m0 F" o while(1)2 C& c% G- W6 i+ X$ ^1 m
{
4 H2 i! j8 R' c' X% J; J read_MSG_buffer(pshreRAM);# ^' v2 O+ N& i/ d4 t7 ^& S
} 8 t$ v* J; a4 x0 x! ]
}' t( G. d; F( [7 ?
% D% u5 o( K% j" k. d3 b" E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! ]* t1 G+ J* @4 u
{
9 R) _. l# O: L% i# A9 C( E RX_MSG_PROTOCOL buf;
( @2 Y$ D6 h. l# R) q 9 F% u- Z& @8 P
buf.a = pshreRAM->a;; A- B' U( A/ W5 B7 ]4 h
buf.b = pshreRAM->b;
' X# |8 a6 ]6 {% `( a buf.packet_cout = pshreRAM->packet_cout;
1 s( o. A3 f, M$ q% [8 _( n; g
3 B) p. E9 q. N$ y if(buf.packet_cout != count_copy)/ c. U5 o2 V$ J) t
{0 t, x3 g9 W: k- }% U/ ~+ i
printf("a is %d\n", buf.a);
( u8 t4 U- C- U3 w% L+ b printf("b is %d\n", buf.b);3 l9 r! Y5 P0 q0 V7 w) ~- r
printf("count is %d\n", buf.packet_cout);
+ Y: @( h1 h) W: p: S; f* Z4 i1 J count_copy = buf.packet_cout;. P: Y: o9 A7 Q) ~3 \3 u
}9 C0 g( A2 m+ v2 ?& z! ?- P+ W9 i& R
else5 M( m5 a! z/ `# H& d4 W( c
{
6 o7 p' ~3 h( s6 }8 j. O- e8 }4 v printf("No effective message!");( E8 Y* x+ q5 D; o- S! R
}% w& } L* L% X7 V
}+ }4 y- o% q# q5 {0 L
) @/ o- o) K, h6 V5 Q! s# m o+ s- ?2 A" B4 E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' {. Q" F1 h# L; z' H
使用下面代码,对内存使用了mmap函数后:- o! h4 I1 {1 J0 a B2 i
#include <stdio.h>. z# l4 z* n+ B4 B; I1 s' }. j6 C
#include <unistd.h>1 K$ Y2 x9 U+ t* @% _- x# T3 O
#include <sys/mman.h>
/ o% ^. |( H+ I+ U/ {3 C" u#include <sys/types.h>1 C7 K" I7 a5 d3 ^+ \
#include <fcntl.h>0 m* A1 B: d' g# t( H# I4 v
1 Z9 x9 L/ ^0 T1 J) k3 R#define SHAER_RAM_BASE_ADDR (0x80000000)5 R+ d7 Y S0 q7 a; ]
#define SHAER_RAM_SIZE (0x20000) * o' x; H3 v: c4 z. ` @
+ Q1 v" B, ~7 Wtypedef struct
" D1 v: e; F& }' w+ l$ T{
+ O/ Y( C6 B/ L3 f1 P* ^3 l unsigned int a;
3 s# G" D6 ^6 n unsigned int b;. V) y5 J P% ~3 z5 g& S* j
unsigned int packet_cout;
T# U+ P3 f! F+ @3 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 u& h- I. x( _; ]- \( ^3 M
0 j8 [+ [% ?' e2 r, X3 W
void read_MSG_buffer(int *baseaddr);% f8 M- V4 p) g0 [# M7 q5 ~" [( m
unsigned int count_copy = 0;
& D7 P+ a. ]! j5 e7 D+ T0 w0 t) @
int main()) {( Q$ [* S4 B: f& a! r
{
. T6 L! C# H' _" ] int fd;
; x; \; Y2 z8 i" R; C: r* x# P l( | int *mem = NULL;, Z; w% C* v/ }8 a" l5 Z/ {1 P
% n; P4 d9 O4 v' h' I- A% b8 G
if((fd = open("/dev/mem", O_RDWR)) <0)0 w7 F, n0 b& d2 c4 s9 u9 _
{
1 D& k R8 ^% S0 ? perror("open error");7 }' h# c/ Z) ~2 Y
return -1;/ P' _+ \2 _5 H6 k
}
5 t3 D) {- a& r
( b: e) c9 d9 K% Z$ O' b mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' r/ b7 C$ y1 Y
" P8 p5 c8 I0 I5 o8 @8 s: Z2 Q
while(1)
) p1 ~- s. U' {/ }8 O {
' H" d+ f$ B/ h read_MSG_buffer(mem);
# D7 j4 E3 D4 J* T9 v. M }
& [* k* G1 x! G, X}
* w& T* T8 J) R- T+ Z- _
[0 w) Z8 @& a, |void read_MSG_buffer(int *baseaddr); r9 ?& v& Z' K9 U7 K+ R/ B1 w- i- J
{
2 b% } v4 [" N& F5 p pRX_MSG_PROTOCOL pshreRAM = NULL;
) Q* f, y4 K) n: i! W. k7 ^
3 E' }8 w# X: ~! | pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 e% H. o5 \6 i) R
# J) X5 g8 i2 Z# r0 t8 f% ^* M# O if(pshreRAM->packet_cout != count_copy)9 X" H" U) a4 E$ d
{
1 l) V% d* o/ s! p) L3 q printf("a is %d\n", pshreRAM->a);3 L6 }0 X5 B% P2 L# C
printf("b is %d\n", pshreRAM->b);
8 s/ O, a6 g% k1 J printf("count is %d\n", pshreRAM->packet_cout);
( Z' A4 x& X* I6 e9 `' d' u count_copy = pshreRAM->packet_cout;( I9 I* [& ^* H0 a1 p# a
}8 L/ ~2 W/ h t
else N0 H2 G* k0 D3 z" \$ ~+ U
{! e0 U3 F4 q. l. g& {2 E
printf("No effective message!\n");0 u* c6 f4 n" [3 C3 d! O9 H
}
; q% J# E/ i) I! J} ]/ }4 h( I6 |/ @# I
/ C2 t0 H" Q! c7 ?* L6 g# P% O! o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 R. X+ o8 `& l; ~
3 a- K' {( j' e F
( n0 j: c4 u4 |+ h9 U$ ?+ E/ W k* f3 a/ d: i
" d7 x$ Z" W# g: [% ]: h" U. R
|
|