|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) t3 N+ n3 Q) t" d3 f2 E
' p" Q3 s. U, Z" ]3 ?" A7 \OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 M9 f+ R p: U: B1 U- _4 Y4 P8 v
#include <unistd.h>
5 j. L) }4 ?* l, z# n5 x g) D6 t$ N! J#include <sys/mman.h>* j, h5 F+ ?$ M- q& X1 r/ q7 n/ }
#include <sys/types.h>
2 o2 o3 k0 }" X3 c9 o! G4 I8 G#include <fcntl.h># p- K$ f7 _2 t m9 `
: w6 y. Q( ~1 Y) J#define SHAER_RAM_BASE_ADDR (0x80000000) $ u; i& d: r S# w
( R- B8 B [, N7 T2 g& n
typedef struct
8 s7 {$ f' [3 _7 `2 A! T. a, |{, L1 [' W6 r8 ?8 w
unsigned int a;; R& v; ^- s6 M b: _; N* @
unsigned int b;' ~/ H2 a% `2 X6 f( {/ e6 M
unsigned int packet_cout;/ F+ e2 }- q& E* ^' R" ?1 P% @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# u4 i+ |/ L. v4 B" h; G9 e+ B3 N& o$ ?, S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ W7 ?- _' N" t, P" G A x- I
unsigned int count_copy = 0;
2 ~5 d6 N( \/ N' n; J7 g! @! }! q$ {% I/ F( u$ {
) }0 i5 u7 z+ ]int main()
/ y8 p8 N6 |+ e+ K2 d( @{
5 m5 J. d& E- v" B+ P6 c# k, Z* z pRX_MSG_PROTOCOL pshreRAM = NULL;
! @# K7 B- e! U pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ ?( C- i" v/ [& a# z* o
% ^- S9 X5 k$ ~/ F4 v
while(1)
/ I9 s. c. A8 g6 O! u3 F- p {
% `2 F1 ^# s* X* h2 I read_MSG_buffer(pshreRAM);$ D: W$ ?5 N8 s" m. j% b2 `# J8 z
} ; @, ]) [; w8 j Z7 a
}% j5 A7 ~* o+ r/ ~5 f
5 Q7 u7 u" y# R. l# }# s3 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( M$ M+ c; |% f) M3 G
{
; A0 A6 d. ~0 a$ c, |' j! j4 w: ^ RX_MSG_PROTOCOL buf;+ T! X1 N, M! L
2 b% u1 b* Q$ ~; d, A& \& D! L; ?+ K buf.a = pshreRAM->a;
/ X, Q7 N8 {' z9 `# \3 r; O- q buf.b = pshreRAM->b;
) S, i& K- z. }- t4 E1 { ] buf.packet_cout = pshreRAM->packet_cout;
$ h& |( M: |+ T7 Q5 v# Y* y" Q! A
- P4 X8 V( i+ o1 \4 b6 a3 f if(buf.packet_cout != count_copy). q, V* Y0 R( Q% w7 V* _
{* h$ U4 l; x; }0 h- v2 L8 b4 z
printf("a is %d\n", buf.a);
1 ^5 M8 x% c5 j9 i! Q. h printf("b is %d\n", buf.b);
+ I& a$ ]6 Y, S& s; T& t% T printf("count is %d\n", buf.packet_cout);
# K+ ~1 `7 n; a count_copy = buf.packet_cout;
% _8 d# m$ h8 e: C }; |4 Z$ u7 I$ N* R) d* a
else1 {& J Z- [) V
{& C1 y( q d- x$ o3 O6 t
printf("No effective message!");! d( @5 h) n/ d. p
}
% i2 J) Q( t! r' J}
$ a% X0 S2 G. p, F* |' S/ V" D8 V+ w, U* m1 @ I
, z/ ]$ `2 h" A; ]7 E8 S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! K/ B4 ~, s+ H, [ g) }
使用下面代码,对内存使用了mmap函数后:7 J- A9 S- v7 _) J! Q
#include <stdio.h>0 h- i, v# A! b2 S5 d+ p
#include <unistd.h>
* y+ i& R- d6 ?6 q#include <sys/mman.h>
2 G) O( ^: l" |% c#include <sys/types.h>. v4 R( E+ w, q
#include <fcntl.h>( D5 L% A: d' Z% ], E$ g1 ]! V
5 b0 M! r$ l# T7 W$ w% m! N& d3 Q: z3 R
#define SHAER_RAM_BASE_ADDR (0x80000000)# _! A# Y( |. @# n1 P0 f7 c
#define SHAER_RAM_SIZE (0x20000)
5 a2 q% k i5 y" {. }( C- X% [7 l! q3 ]& d- f3 L# R. M* O
typedef struct
. m3 p. u' _7 d: T{7 W3 X j! Q8 s: G
unsigned int a;# d9 J1 H5 ~/ q2 {
unsigned int b;: m: V( e' A ?# K0 X
unsigned int packet_cout;. L1 i. k+ l( `" d; V5 [" i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 p0 y2 S* Q+ ^$ c( H* Q. O4 j1 z0 W
" d( y, q' U" K3 b7 F8 J/ Cvoid read_MSG_buffer(int *baseaddr);
8 C' ?& g8 N7 q6 X1 m. L& Xunsigned int count_copy = 0;; [) |( B% Z5 O+ J/ D
* L/ r) W0 C3 r2 ]% u7 L
int main()
2 P9 V# m& ] k, k1 o8 i. E{
0 ^+ R/ p% X0 C/ o* g- \. J# M int fd;; {( I/ B g+ F( b/ @* g
int *mem = NULL;6 n' n8 [4 H. W) s$ H6 b6 \. G
z& z5 d$ [- g8 f# f if((fd = open("/dev/mem", O_RDWR)) <0)6 w7 E) V: a! V _+ y0 z$ e
{7 y" U7 I7 p' {5 F5 E4 h! q
perror("open error");2 |2 C. U; ^2 P' W# g
return -1;6 n) D+ @$ j' x5 Q( q# L$ B
}
+ Q6 x; L# }* l. v2 E L- G* D
( J: ^. B- B: o' Q) x8 j0 C+ V mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ l# r: f3 U" o6 m( L
! J9 X% | L1 B1 a( \7 n while(1)! E6 s: F. t6 L8 ^+ m
{
; q- X5 {9 ?8 c1 J# x0 {& r# [8 k read_MSG_buffer(mem);$ Y2 O$ w4 l! i% l5 X# n
} 2 J7 c# E3 B+ r& J2 I+ S
}
) i: K! e1 T2 C& B- X w* t2 }& M& u9 s" S5 |$ M
void read_MSG_buffer(int *baseaddr)
% ?# |$ r$ Z. B, o) q1 t$ l, b{
& t4 m S& g9 p9 w. \6 c, { pRX_MSG_PROTOCOL pshreRAM = NULL;# U; a" b, X, u2 P% X% s
9 A; d# ]- \& y+ U7 D) {- F1 i pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; o( V+ M' }* q2 n4 j
1 G4 Y' t$ K$ M: V z- y
if(pshreRAM->packet_cout != count_copy)
0 ~& ~' k9 w s% I. ], j* H2 x {0 R7 O8 S! c5 ]1 j
printf("a is %d\n", pshreRAM->a);1 Q2 Q1 E+ U" A2 Y1 x: i/ O: _
printf("b is %d\n", pshreRAM->b);
- a4 a) |$ R3 A( {: A; B printf("count is %d\n", pshreRAM->packet_cout);4 Y/ U! X. E0 z; a
count_copy = pshreRAM->packet_cout;" p2 q- d+ Z A# B7 e0 \# L. L
}
* P( l6 h, a- E1 y0 A8 P: D else
& m {; m6 O6 @$ C2 ^# V" l- ^' b$ q {2 h1 U; k' ]9 h
printf("No effective message!\n");
; }4 ~+ `' J- ^ }* F% C- I8 Z F5 C! @
}
* x C' [- m% O0 p5 W2 p% X. D" G$ C# H2 k; W# r* P9 p: M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' |1 }& @8 `. `! z+ ^1 N2 u$ I) p; v/ ]3 m4 j
8 Q, t9 V9 a* \, h4 {( l: O
; f+ P6 ]) |) v6 z% G; t+ U4 e, X1 B8 a) g6 U! Z4 k+ J7 A
|
|