|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % @. X& N- h* } a* q# i5 A
0 U; R; ^3 M0 b& C7 `7 L2 |! v' rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, J8 D$ t0 V. ~
#include <unistd.h>3 O+ b c/ p, b4 }
#include <sys/mman.h>4 ^, a ]6 X+ m# K6 Z. E$ l
#include <sys/types.h>: i% a8 |% w' {% g7 m K" _# ^
#include <fcntl.h>
3 h. N. @& {/ ]- ?6 k9 ]0 ^" Z
7 u) P$ K6 F9 u; q2 V1 |#define SHAER_RAM_BASE_ADDR (0x80000000) 8 W; C0 A) E, \2 }8 b
# n& J- J# t: W$ u, Z: @typedef struct
- v7 d5 l9 q" \& }; }( U8 u3 I{
) ^5 I! a6 D! \ unsigned int a;/ N" x8 E9 v: E5 d: N$ s
unsigned int b;. `% }; o% l: I% f* i1 K; w
unsigned int packet_cout;
, M3 f6 ~+ Q. \( V8 \6 a& L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ C- ^8 l+ f+ h& X& C' s: D6 g$ ~+ y! r. i% M+ m% t. }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" n# z; k/ g% w' F9 I7 J6 Kunsigned int count_copy = 0;
( ^* z) H: A0 W' V$ V. M! B4 ~( {! m! e _, v
8 s! Z6 r2 X" u/ E5 I+ `: }int main()- F% D1 H7 J1 L; h2 N: U/ C
{* I' C8 T( A8 `% ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
( W- ?& N _" ~/ F! X& W pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 [4 J2 b( o# M* o
9 j. D- {" C" O) X: K! _ while(1)
7 ?; g$ ~4 q: J) J% s* y3 _ {
) y% [$ C5 U% g5 o7 A7 U read_MSG_buffer(pshreRAM);- D! m' G0 f. A7 s) Y: Y2 x
}
2 U, O7 H Z9 r6 n. g% e}, x7 k) v3 s) C: { m2 J- t6 i
( P* e! O( D8 S- b9 gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) X! Q( a( n# P( e' G. @
{7 W1 @% E7 I; e) T
RX_MSG_PROTOCOL buf;2 c$ r6 M. j( r4 j: b6 l' D1 ~
6 U0 r2 T: b G buf.a = pshreRAM->a;
8 y$ m& ~ @/ ?( j( K buf.b = pshreRAM->b;# m& p" g# W- m% ~% T5 g: g7 y7 x
buf.packet_cout = pshreRAM->packet_cout;" T, b* G4 o. X4 `& x
2 r; ]! s! I3 P: Y6 z( r if(buf.packet_cout != count_copy)& B1 e7 Q% |1 c8 U
{
3 |4 e" J2 B _4 t; u- V l7 K printf("a is %d\n", buf.a);
% j ~% w4 E7 w, T' M$ T printf("b is %d\n", buf.b);
: y4 i/ u# \! \; [1 a( z) ]! C/ K printf("count is %d\n", buf.packet_cout);
( s& i! U5 y" R& Q& T count_copy = buf.packet_cout;
" Q" |! b% H3 @, k* Y0 i }
. J/ z% Q' `. d else
* o' F" k) F) }, r# o( O y2 m {6 s7 M2 p3 R$ {" v. V6 a
printf("No effective message!");
, E* b+ f2 V5 ]& y8 V; J }9 n: w6 R) u4 G4 u* K6 H) i6 g3 S B
}
: ?% Q* j8 q: X$ E% v5 F; o& F" @6 q% m. y0 [7 {' n
- F8 j3 a+ t; _# G2 G& V1 t但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& i; ]1 H9 f$ j+ |9 K5 R5 a. b) I
使用下面代码,对内存使用了mmap函数后:8 J1 G6 J8 E, }6 ]8 x# g
#include <stdio.h>2 _- n# s% i5 k: ?
#include <unistd.h>4 x8 m# M0 m8 S: c- C$ [ Y
#include <sys/mman.h>
5 z1 W7 ^$ U9 A1 e( j- ~, j4 b#include <sys/types.h>
* H4 e7 H1 D a#include <fcntl.h>
5 R# |; i4 U/ H) j& V0 U1 I
* m7 |) |6 f- u6 O- }#define SHAER_RAM_BASE_ADDR (0x80000000); c2 d5 k7 ?( J
#define SHAER_RAM_SIZE (0x20000)
2 T F- }* K. b% k: k
0 ^0 G# t5 a1 R* q3 Z, itypedef struct5 Z1 \5 C1 n) A5 v% l7 `
{2 S4 k& x5 m# @, d2 }/ l5 {- H
unsigned int a;7 F- F4 v4 S, Y6 j6 d0 v d
unsigned int b;5 j- ]1 ?* C0 u) \- u3 d+ x x
unsigned int packet_cout;1 E; o1 ~. A8 e& r8 ?8 U7 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 e4 H( q% H# x9 g; w" {; n
( s/ b# \# B) n7 j. pvoid read_MSG_buffer(int *baseaddr);" d5 x: W7 F# O, w4 d
unsigned int count_copy = 0;4 _" ?, D" r3 t6 p) b* }7 R
2 P3 P+ u+ I1 n& u
int main()' Z2 X6 A$ {9 i* X
{: G, D1 ^* S7 W- _, T! [' F
int fd;
j2 x, b7 w3 c int *mem = NULL;) k; `# i4 \( [/ _" C
5 U; X: t3 S; \5 h; m4 G% t( E if((fd = open("/dev/mem", O_RDWR)) <0)
- L* \2 s4 h0 D {
. V& S: S: p8 m7 B0 v8 A perror("open error");7 z4 C7 x; w! T9 V* |* Y) N
return -1;
& |7 A! `# e2 N( v% H0 H } V+ s$ Y( r; D, n
, {" Q; i! h8 M% ]* Z `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# R1 `3 }$ q7 L+ |6 H7 [3 G* w, l3 T3 g
while(1)
z- F" ^9 Z ~- [9 a9 K$ h0 R H {
) E' N2 u6 o0 H0 b: x read_MSG_buffer(mem);8 {2 L8 f6 i) N7 m' ]( I, Y1 `
}
' G+ V: C9 ?7 ]. E& d}
( _* i! _/ ^ J$ |; B' l9 f4 m( p7 ` A1 a( r7 T
void read_MSG_buffer(int *baseaddr)
8 V3 j- z- Z9 p) U. Y" I, X{% A; j+ m8 E+ I+ V; g
pRX_MSG_PROTOCOL pshreRAM = NULL;8 a1 X B4 i, w4 G
5 l& i" y+ [ C x9 G
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ _+ H, J% W- c8 G- @
0 `+ {5 d) f" E: w/ X. E if(pshreRAM->packet_cout != count_copy)- n5 k- ~8 S5 h! R
{! j- c4 |- i, A
printf("a is %d\n", pshreRAM->a);
# ]+ M' _1 w% c printf("b is %d\n", pshreRAM->b);
" _2 f. D/ Y3 T' G5 K8 J3 w printf("count is %d\n", pshreRAM->packet_cout);& [( G4 P7 s3 a8 b' m) h6 M
count_copy = pshreRAM->packet_cout;
) A* n, r( @& [" D+ L/ s }8 }! G* a; o8 U. [! [7 }
else: m+ m% s+ k( C- m/ Y
{
7 w3 k* L8 J6 D2 ~0 m1 I. E! | printf("No effective message!\n");
7 Q3 }5 h i) E8 h9 m* ~$ i3 ]& X4 I }
# b: y' ~2 v% ~! n8 G" G* h}
" z( z! X" e& E# w" Y* E/ @, _& A f6 J+ H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) [* n$ L5 c3 C, |5 w) p/ w) K( L
. |+ [# E- w% k! K n. a+ Q
6 u0 C, g- J2 C; p
& V I+ R9 S9 O. A: Z; \$ x, q* B8 H& j+ h
|
|