|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- T5 K1 @. ]" ]% \' ~
6 S' ~( Q$ `9 g( w* M& \OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( `% I" k* K) t `" q' y
#include <unistd.h>' h/ r$ ^( F7 K$ M+ U0 A
#include <sys/mman.h>2 n6 d% U4 ?+ ?$ x3 f/ Q
#include <sys/types.h>1 Y% m2 U( I/ {5 H6 v
#include <fcntl.h>0 p' t( ]# Q9 Q" _. g4 ?
& ~, S# s* x) t! E% z6 V" a#define SHAER_RAM_BASE_ADDR (0x80000000)
& c: u! x8 ^8 F! V, o& F7 @
0 i6 M8 G4 @# G' n% `* ctypedef struct
. L1 l9 ]$ k) c0 a{" h9 k4 ]( y# g1 @ \* M
unsigned int a;! [2 |9 L0 f+ s; ^( }! b) p
unsigned int b;- {' {2 |8 k9 z/ @, A' r& f1 O d/ s* I
unsigned int packet_cout;
' B/ |4 _7 s- X2 Z. S; }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 S4 l/ D% o; f* n" E0 e
. R2 Q( K- p9 z2 T* Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 w( T: h/ T) {: \. U! ?$ Hunsigned int count_copy = 0;
2 f& t2 Z9 H2 m# V6 j$ h
) r6 `! _* h$ ?5 ^ H6 k* N! |# U. }" m4 ?& |
int main()% E' e% |% n( t
{% I( Z' @% P& ]& ]+ C* p; I
pRX_MSG_PROTOCOL pshreRAM = NULL; p. H2 a4 J6 O2 }8 l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 w- |( ~5 X' [; s$ M
7 ]" y3 z* s9 [! k; A1 G- H while(1)
, ~$ l+ K- Q* i0 C5 D% e {
: g8 n9 j6 ~! G4 H read_MSG_buffer(pshreRAM);
2 ?4 v( C; w5 W G: X& W" K5 W } t8 q# I# e' Y, `0 ^4 w
}
) h& F) w( V9 l/ _6 B: X. X: ~' o I2 g. z) c" X6 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 E7 b- [/ n- q5 l2 w; C
{) E o4 Z6 Q6 e1 Z
RX_MSG_PROTOCOL buf;
/ [" {# R: I6 v2 |7 w& L7 d6 t / D0 W5 o) m7 t& B8 v- N
buf.a = pshreRAM->a;! }! K/ B9 m) g3 A1 ~
buf.b = pshreRAM->b;
" a$ e& E' @) W% c1 m1 q6 ]; B buf.packet_cout = pshreRAM->packet_cout;
/ U, I( y# S& @/ f2 v* v8 S/ X/ g! g0 O
+ M& g4 y) P* C9 R' O4 b if(buf.packet_cout != count_copy)
" H5 V% Q3 @: O& S3 o8 b- t! ?1 l {
a4 c4 n8 l6 w1 M# | printf("a is %d\n", buf.a);
2 k# A- G7 p: u1 o printf("b is %d\n", buf.b);
; H& Z+ |! n! W printf("count is %d\n", buf.packet_cout);
$ `! z) A' g' g" X) b2 g& J' } count_copy = buf.packet_cout;
1 d% Q: i, N; u. @0 s. u' | }3 o& r; [- u R( G4 p
else! o8 p+ b. X x9 B
{
8 T4 B& |9 o, H" P! s' R+ U printf("No effective message!");
+ d7 Z; f& P! e# s. L8 s" u( x1 w }
! H0 [ e0 D, N4 {& S5 ~; A' x6 h}
8 `. m, A( C- X1 J. f
! x4 _3 D& ~3 g: s" C
9 a( x! n( W1 u2 I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ f4 q' v- [2 @$ I" l; m7 o: }& ]) I8 ?
使用下面代码,对内存使用了mmap函数后:+ t3 t4 c' M- H# ]5 F
#include <stdio.h>5 z: g! K& a/ K d q* r; \4 L* x
#include <unistd.h>% R# _/ Q# [0 F' l7 k* q4 X- m
#include <sys/mman.h>
0 M7 N) l$ W" E1 m1 H% ?#include <sys/types.h>
: p! M3 K+ W9 j- |1 [0 i4 O9 b#include <fcntl.h>
' [% |( ?, n; A, q; C6 r0 l
' R8 y J; |0 @% F7 a6 p" Y#define SHAER_RAM_BASE_ADDR (0x80000000). D' W9 L1 u' y
#define SHAER_RAM_SIZE (0x20000)
. F% f! O% _3 R& v7 W* u$ \5 K
$ F( ?& S( A* r; ?typedef struct
) v, L" Q: q2 x5 j) C5 |{
) Y: R9 A) U6 Z6 N4 ?9 C unsigned int a;
" g+ _& `- u S( ?/ u2 J5 e unsigned int b;
& E; t: g0 D5 t- j( m unsigned int packet_cout;0 W& u* m5 w& M: ^# ~1 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 o5 Z+ o* y4 }& _% B9 B3 V5 d" t% f( l# o8 [
void read_MSG_buffer(int *baseaddr);' Z6 P0 _: U5 ]3 o. v
unsigned int count_copy = 0;7 B: f5 L. V; G9 e, X) u4 ?
4 j/ f% {/ {& q! R: X
int main()* P# @' a6 N" M K
{8 p: p$ N" M5 o8 ]* r' a2 f& X3 F
int fd;9 B4 `* O: }9 Q. t1 L, {" ]
int *mem = NULL;. V) x" ^( D; b+ ?" A: f0 S# c
# {; x, k4 y* Y if((fd = open("/dev/mem", O_RDWR)) <0)
3 C8 W4 @% D p* f; @# I) c# S {" o7 I4 [. U4 p8 M' G/ R0 ]
perror("open error");
u8 N# X% N- P: X; g return -1;
6 ^) p7 N% x* a/ F O' ? }, v% ^0 ~: D$ y/ {+ @
: d) s! h( `. B4 H) `+ y' v8 f3 ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ @" x& ~5 ~$ @, m
* [- _6 x, u' [" e% o while(1); k6 @# T8 B* V7 Z
{
. M. Q! R2 `' h( ]5 V$ A read_MSG_buffer(mem);& ?9 Z1 D$ ?* ^% n
}
2 V+ f, w% d" D9 e}
( U" ?2 Z+ S3 j$ l! j
4 X$ f' ^! S* ?6 z _* ~void read_MSG_buffer(int *baseaddr)% j2 W+ Y# z1 h9 y/ t7 j$ s* u& n
{! t1 M _4 P2 `
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 E8 B) Y, J* o/ ~' o* _
" b6 z, O9 g- H1 M1 ?* E8 s, H pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 q. k& Y) _; z5 }7 `$ Q9 h
" J8 a" Z9 W# \) p
if(pshreRAM->packet_cout != count_copy)4 J6 X% F& ~, @2 H( H! c
{/ ^+ Y# y) h4 W, y* J, o1 u
printf("a is %d\n", pshreRAM->a);
! Y b5 ~& v. n, ? printf("b is %d\n", pshreRAM->b);: H$ u. y% P, ]7 g5 |
printf("count is %d\n", pshreRAM->packet_cout);
" }1 _$ j8 p' J; V2 W) n/ n& T count_copy = pshreRAM->packet_cout;
$ [2 y, K# M& e5 } }
2 f, r8 d8 n+ m else/ D& y4 q) Q: C! ^+ h, B
{
# N; J2 J; H3 L printf("No effective message!\n");* b# L* I2 \. V% G. i! K
}
* \2 ?3 g9 e+ ^9 L8 N' z3 c}
4 b- z7 V& R! t$ ~) Z5 ]3 m5 S5 W- I9 i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 W/ l: j! c& G( d
/ @: B/ U6 d5 h4 p) [* V/ ~. x) b# e V! n
+ @! N& O- x H$ o" W# y& K( J3 { f" e- z) _+ e8 \) p+ B& x
|
|