|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 H- r& ^" h) }6 r, j: O n
5 Q9 h$ |9 l; j7 {5 p9 ]OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 i$ r3 x$ f0 V8 m; C
#include <unistd.h>
" Z0 u! U: A" |2 [* u1 x0 |#include <sys/mman.h>: S" \3 M# O$ q' q% d8 f
#include <sys/types.h>
1 g' f+ ]9 D3 Y# l#include <fcntl.h>
+ D; j, K% v! R! w- G9 w, \$ n1 P2 u5 |! T3 Z- h: x, o3 P
#define SHAER_RAM_BASE_ADDR (0x80000000) ! T- u0 e9 R$ k
6 W. B0 O1 }" Z
typedef struct
0 T- Q V! q; C8 k. s: o9 h9 o& R{
C! T1 u# p7 s# Q' {3 v1 f unsigned int a;
( h" d- s6 q# J7 y unsigned int b;. `, ^, g, B2 v
unsigned int packet_cout;2 l4 J6 L! D6 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 {$ i2 R/ G8 E% b- d$ o9 X& h. ?1 `; ?8 U$ S( x& S1 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; F/ Z: p2 b4 O t) uunsigned int count_copy = 0;6 [; j# u. f( |4 i
! d; B/ C! k8 P& c8 m/ s0 A% u& X% z& B' e
int main()& W' s) i1 _0 S* E+ ?
{6 G. U: x, w; n x) X* D( ^/ F
pRX_MSG_PROTOCOL pshreRAM = NULL;$ Z4 ` i! ^3 a- [% M$ n
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. H' w- D" D) g, t
" H; v% r& ^( U& r
while(1)
. Z5 R* z% p, B- J {
' k1 P# U# z! {+ I6 A/ t- w read_MSG_buffer(pshreRAM);6 l9 D6 a8 I j, H4 q
} ! M0 Y1 s: v; `2 H
}; w& {( ]( v5 @) Z
# ~! Z4 E( t# Z% k) U l! H) `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) V& J4 @& u+ q, N9 z+ _" f& O{: Y- o. |. {! p C$ U
RX_MSG_PROTOCOL buf;" r/ ]2 f I0 J' E* a* k
3 V0 M3 |. w0 i buf.a = pshreRAM->a;
9 i- N |6 E- K3 P- M buf.b = pshreRAM->b;
0 K7 {) O+ R/ w S$ @2 ?8 c buf.packet_cout = pshreRAM->packet_cout;
# a. z+ K/ X& D' F3 e% T + s- m, x9 d% H* E- f# n
if(buf.packet_cout != count_copy)5 ~) x4 S& x# f# A' Z. H" E: E
{
! O1 o. W+ B2 q, D9 P) V8 e printf("a is %d\n", buf.a);
4 N1 y+ c/ F! l' E6 O4 {: K4 Z2 S printf("b is %d\n", buf.b);
5 P7 b& E8 P$ C3 ?: R printf("count is %d\n", buf.packet_cout);* V, u8 X( t: f% S5 O* S, }
count_copy = buf.packet_cout;% k% J: A0 M- |8 Q5 Y
}
- M( d+ _" y9 _/ | L1 s% h else
" A4 m# p$ G4 X2 y; ]$ d, o. ~ {- O$ [: k! Q J
printf("No effective message!");3 O+ i- E& I' Y
}8 c" i; l; [$ a3 M/ [
}/ T5 l7 ]/ I5 {: C, y
+ ^( T5 F6 L8 t0 |
% o, e5 d/ u8 h0 R/ S& V( A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* D. {9 M# U: G# [6 P9 G# ^使用下面代码,对内存使用了mmap函数后:( e) m- b8 _8 A1 J
#include <stdio.h>
_* v; O& }1 K0 e* ~7 a#include <unistd.h>
0 I% Y1 ? v4 L: H/ E#include <sys/mman.h>
# o- T' q, J/ t3 c#include <sys/types.h>( z) u- p+ ^2 ?- G6 [
#include <fcntl.h>5 U: R; D) w% k; w# S
5 T) X F* i1 X' Y9 ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 n$ S* O9 D* K7 v" n' B* y3 A#define SHAER_RAM_SIZE (0x20000)
8 M; I% z9 `* G3 Y4 f4 U5 f. i, i6 R4 k) S3 ]; {
typedef struct9 O# f# b2 {$ |9 {
{
4 S3 j+ C2 p- J& K. V2 z" J4 ^ unsigned int a;
) |7 q) Y" _' Q9 z- l0 \ unsigned int b;+ |! K4 j- F& L3 @) L3 a# L: l3 j5 q7 |
unsigned int packet_cout;
( h3 k! B2 |* T! O# }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* [% \& B0 Q M. C/ N4 y
4 s. w2 d+ j3 r8 tvoid read_MSG_buffer(int *baseaddr);3 e, Y1 U& J5 s1 w
unsigned int count_copy = 0;
3 M) ^+ L0 ~+ I+ p; G! }2 I; H# y; ]* F% ^7 c2 ?8 F
int main()% i, x$ _+ U5 h* ?" s
{ _ d( v# q0 u4 `! [7 e
int fd;
6 u2 w7 ?& L, s& c" q int *mem = NULL;
# ]: S7 e; n' ^# |3 ?- {! w4 U) ~7 J/ I
if((fd = open("/dev/mem", O_RDWR)) <0)- a/ ?4 ~+ C- X0 O
{
$ k' C! j8 }) _9 d perror("open error"); L0 |2 J; I8 |' d6 b& p
return -1;8 I5 y- A$ s& a
}
4 K! D( u2 n! \5 O C7 \ $ W# y( \. l- W' N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: B$ w4 n/ v" c. E) w" X) E2 g, ^2 \' ^ F* h1 `7 M: ?( a
while(1)
% ~! X. ?- B' X7 I0 R: ]9 K {
; B9 X, C- j0 l$ `6 z; l: J read_MSG_buffer(mem);- |; R# B$ ]) l8 ?/ G
} ; M% K" e5 T0 U* S
}& f+ D3 D) i# L9 ?. I
; j. H& t3 t/ _
void read_MSG_buffer(int *baseaddr)
+ L1 h( v+ ]) U, S/ s{
9 F6 @0 s* f4 }4 L pRX_MSG_PROTOCOL pshreRAM = NULL;
2 j% b# _- r; ^; `- b. ~8 [) N
7 t7 y7 L6 t8 E# l. U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' H! r# F. Q, J4 G& h3 u8 `3 v' |1 f
. [. x! Z* G4 ~, A' ~$ [ if(pshreRAM->packet_cout != count_copy)
) K! _$ l, F/ D/ F% c {% X2 G4 b5 D- D
printf("a is %d\n", pshreRAM->a);4 J& N" U$ t6 S
printf("b is %d\n", pshreRAM->b);
) q5 x$ ?, E; d; T% H printf("count is %d\n", pshreRAM->packet_cout);: Y" R' R+ N! a+ h3 U5 b
count_copy = pshreRAM->packet_cout;5 k3 t1 ?2 {; i
}
L& d: s: I+ }! _, B else
; @* s s( U7 u4 w6 ^ {* w2 W8 O+ [7 K6 g3 d
printf("No effective message!\n");
# z' L; X) I. Y9 x* U4 C' u/ ` }/ }" [5 M) H2 _8 ^4 P+ @ y5 z- W( {4 M
}& C2 c" d! G0 c# A+ f
3 w# B$ l3 o# a% E% M* J" Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ G1 i9 \% O/ V2 ], \: _ Z! \; o+ k, ]
* [' Q4 o. Z* P. R2 s+ y% B
7 E; i) a9 h, a+ U6 \6 t# D5 D, P+ \9 n: f% a& @
|
|