|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * A6 S" t+ ?1 s* H
- J2 h3 G3 ~4 e) {1 \OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' J$ E8 @$ e# R% I+ E& r8 k( {" B* w' Z
#include <unistd.h>
7 o" D3 P8 Z3 a5 ~4 ^. l' Y#include <sys/mman.h>
5 f& w4 G! t! ^7 e* S2 Q#include <sys/types.h>8 O* L+ X. A1 v9 e8 j
#include <fcntl.h>
7 O. a! J; L. @) w9 _2 i9 w2 W) m: ]0 l. S% g, }2 K$ `# K0 W
#define SHAER_RAM_BASE_ADDR (0x80000000) - u$ K& r" h( f
- f Y3 P( M1 Z% q: @typedef struct
/ }9 e! ~& n( f/ w( d8 K{
( }' l; l$ M% |- y0 X2 o5 K unsigned int a;( @+ Y0 }' E/ R" j, k3 R
unsigned int b;! K% a7 @+ D# {9 l$ H/ a: L
unsigned int packet_cout;
1 P8 @3 K8 o% M( z* m1 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( L1 M& l c& ~) K0 ^( \- h( Y2 K
7 B4 y, V& w _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" S/ Q3 [. |9 A- I$ J4 Nunsigned int count_copy = 0;
* i* J. h+ r) k! q- @# J) d! B( n- ~+ c$ Z/ Z9 M+ e7 g9 A0 b2 y
; Z/ V& ^" k0 Xint main()
8 Y5 k+ o U6 \{2 o; M" s4 r7 g
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 _/ i. L( c( ?/ ^1 ] pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 l2 S! i4 _+ A
# s6 Q9 \( J" [" W+ v4 H, Y9 s while(1)) H2 Y$ q2 W4 [" J( \
{
8 A( y9 r* d# v read_MSG_buffer(pshreRAM);
. m4 u7 U- i9 D } 2 A. `+ e, ]9 ?- I% Y
}
% X3 Q9 s" `) {" J1 {. q! V) w- @' g Y7 v- z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 R- J- ~/ D( W `{
/ ^- g3 c% B8 \4 K6 ]4 [& X6 D" u RX_MSG_PROTOCOL buf;
# {2 o: N0 a+ H% h
9 x* B( P9 x& d buf.a = pshreRAM->a;9 P& h9 L3 \( A
buf.b = pshreRAM->b;
( P9 h% r* O6 q- |5 ]! ^. E buf.packet_cout = pshreRAM->packet_cout;* g* p d% [" V2 ~) L
9 S+ n) ~6 b1 M3 K' x
if(buf.packet_cout != count_copy)
' E0 |3 R8 N0 @" h {
+ Q9 ]* Y* H- v; c3 r printf("a is %d\n", buf.a);
6 N+ _ B3 X! a% D7 Y; g printf("b is %d\n", buf.b);% I e; Y. ]) |/ ]1 A N
printf("count is %d\n", buf.packet_cout);
- \7 A+ L# O6 U* n* T count_copy = buf.packet_cout;
f6 x7 y2 N( |! P% J$ {/ i0 j }
9 t, k( ?8 ?% U6 _ else
. _ P( B1 x2 J R {
; g5 S) G! d# q1 C' p printf("No effective message!");& ]! @- |/ u8 y
}
) r% ^3 G& g& a}
2 F! ~' K4 k4 }2 m; G- }4 H
o, F1 H6 _, \4 e1 K2 r4 S
/ | D3 U% e j, L/ n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( l0 W& s* V& R/ K' e# ] G
使用下面代码,对内存使用了mmap函数后:% {. y" I+ J7 r2 K. L, T" b
#include <stdio.h>
; ^( I% _2 ~) [+ d#include <unistd.h>
6 c& E+ H; s4 {7 s ?9 |#include <sys/mman.h>% ~: G. n# d* J& k
#include <sys/types.h>1 o7 O6 q3 T' y3 ?: S8 P4 F
#include <fcntl.h>
+ N; G7 N$ d# ^: ]# p
$ Z) A, W O. F1 }7 G6 K" S#define SHAER_RAM_BASE_ADDR (0x80000000)
6 t$ o! k5 [4 }/ k1 M9 z* e* q5 b#define SHAER_RAM_SIZE (0x20000)
7 K- ^! D% j9 V3 ^- a+ E/ y0 M/ c; ~! Q3 S: c5 K1 K# D
typedef struct/ t: H& `6 a8 K" c1 `8 m
{, J: ?7 w5 F7 y9 H
unsigned int a;% J0 K0 E! U( _- T- u3 g" b
unsigned int b;0 ?6 f! }7 }$ f o l
unsigned int packet_cout;2 i7 Z8 N+ I5 a7 Z) z+ Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 w) d- x0 t6 n& O$ ?$ L! U) L
. B, ]. k: y. D2 K
void read_MSG_buffer(int *baseaddr);3 W4 i; g4 }% v4 w2 \& L$ Z* Q
unsigned int count_copy = 0;
! z; |; z6 u/ X3 k5 ~' {- P# y* ]8 i, \: A5 W* `6 @3 y1 H' r
int main()
: d. E+ @- e2 I0 D{0 g3 y9 Y3 R/ N" T2 C, o- k
int fd;
- I, Q! m+ ]7 B int *mem = NULL;& _/ m# t0 u6 {
1 W+ Y/ p! O' n( G4 {3 @
if((fd = open("/dev/mem", O_RDWR)) <0)
2 j0 U8 p# ~# y6 l5 f {. E6 y1 p8 ?; m' i
perror("open error");
' C) o" p4 K7 `( T. ~3 f" P return -1;
8 U# h3 k% [0 k' c }, ]. d+ k- _5 H# g0 o
2 {+ m! l9 c# U2 h: h/ j6 N( S' n mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& N5 v/ k6 I( o2 Y3 g: o- M6 T
$ s( h1 v* P+ [6 t5 B while(1)
/ X5 v! O ]5 S2 u9 n" U/ o {
4 `6 Q" p7 |8 c. c/ j6 V; g read_MSG_buffer(mem);4 s; U7 e/ @7 k5 K6 B C+ R
}
( X4 B- @& t5 \. O) a& B7 B" r}
% ~6 R0 a- z. g& G
1 ^. \; F1 M% N1 c1 o" K4 E) bvoid read_MSG_buffer(int *baseaddr)2 Y) i0 K0 n3 D! Z" n
{0 o' n' H4 ]! o* }& b4 y
pRX_MSG_PROTOCOL pshreRAM = NULL;4 \3 s0 z* e; C* x# b6 i
! N3 N4 R5 v+ X- S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 g2 D9 u- B! W6 Y
" \ y. w* J4 L) T* n) f if(pshreRAM->packet_cout != count_copy)
5 c$ B) m0 @( d5 N3 P {; v. I( \4 N2 k* X* H
printf("a is %d\n", pshreRAM->a);8 Q* M0 t3 n1 ]4 F3 N# z7 m
printf("b is %d\n", pshreRAM->b);: L* _8 l0 E- F8 `
printf("count is %d\n", pshreRAM->packet_cout);5 D) A+ o+ d! t3 ^
count_copy = pshreRAM->packet_cout;
- X+ {6 G9 w) G& G9 E: q/ S }$ ]2 q+ H$ ]3 a# G* y/ d9 f
else
; W: F5 ~( t/ ^; @ {. t6 X9 V* ?: c! T1 B
printf("No effective message!\n");
6 ]# ]- _5 g0 R$ H } R+ g0 ^0 [# J( ^! H( X) t
}
7 h, l9 G; ]+ n, t) l+ ]+ E
" @, z7 F( Q' ?2 w/ ]/ e) ?0 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% i. H% D2 i |! \- ~1 ]1 u( @
- j4 |1 ^( q% |" Y# n3 }' d# g
: [' T8 K! ]: ?* E- v) q
! l: _- Y! t2 Z ^0 }& X5 D |
|