|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 H7 l# o2 C6 _: }+ V0 `* a$ m
- g/ o) @8 Z3 T9 ~8 x+ ? ?. dOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 G' h+ q; H b/ Y5 T#include <unistd.h>
% n. H I, ~% ]* ]3 T5 O#include <sys/mman.h>
) Y0 N2 z5 d9 Y% ?# Y#include <sys/types.h>. B9 u/ B$ g/ {+ }
#include <fcntl.h>
1 `" \+ O8 t0 u; V8 {
# ? ], D+ o) ?/ v#define SHAER_RAM_BASE_ADDR (0x80000000)
; ]- ?+ P7 G; I7 v F, J u% A3 c7 r Q$ \( E6 _
typedef struct
3 H8 J6 o0 d6 i8 u$ a6 t) e{
$ |4 W h1 ^7 V: Q% @ U y$ { unsigned int a;' K* r+ c G/ E( ~1 T2 Z" U1 `
unsigned int b;
: }4 E/ E. q: f unsigned int packet_cout;' N; l3 f. b* Y/ u2 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* m7 z$ R- Z, x% C
1 k5 J! t. I+ D/ O# a% K1 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. y5 d0 W! x1 B6 l+ ?2 R2 K
unsigned int count_copy = 0;
; P% f) K+ z z4 H# |8 `# v5 L0 ]) X% n/ r; F
6 S2 k: c. Y. E$ V
int main()
( J0 ?- O' a' X# l{
2 g. `1 e. `) S; y& M2 \; k pRX_MSG_PROTOCOL pshreRAM = NULL;; n+ q& b; ~, Z0 v! N! P, S7 a0 x
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 g# B# f" k4 F3 @, s% l+ `
* i/ d, @ O9 |: [6 v0 |* G! d while(1)
" s6 |" y( m) O) q9 y* V: Y {) e1 ?8 I6 h0 r( ^$ V t6 [
read_MSG_buffer(pshreRAM);- G! t, g; g6 ^" y6 |
} 6 |! v+ `/ I* }
}/ y) h; T- R' ?- b w
% V( I/ ~4 V4 g- L9 c% Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 o) I: N# f" L9 _' I+ g4 J{
5 g1 X e- R7 W3 U' X RX_MSG_PROTOCOL buf;7 J! p! l1 G; v6 ?, H
" o5 d- ^( p& Y2 Q* A y; f( e6 l buf.a = pshreRAM->a;0 F H3 \. |1 j2 A6 h
buf.b = pshreRAM->b;
1 Y0 p5 u: S7 i& g* E buf.packet_cout = pshreRAM->packet_cout;
* e6 Y0 {# w" K 1 S+ j2 c( j6 i: J
if(buf.packet_cout != count_copy)4 W& ~ a: L1 H: L9 O* T h/ w" o" P
{! h2 r3 w6 T% o4 \! Q) J9 [9 g
printf("a is %d\n", buf.a);, W& x* @ l" U
printf("b is %d\n", buf.b);
' [4 v* U/ ]/ f" Y printf("count is %d\n", buf.packet_cout);
3 _5 b8 B- J, Q; H8 T: Y; f count_copy = buf.packet_cout;
9 T& T3 R4 d# a5 k6 U9 N* U; l }) {7 a4 Q- M+ `9 O
else
6 ?& a8 N" L: ^' o s- s {! M9 y% ?+ }+ |; k' N
printf("No effective message!");
+ }; k n& S$ t }7 b: s# X- F+ g
}
6 Q7 H" T! O! `2 X8 d& z) H# P& ~# O, Z2 c! x# D
, B1 m+ a! D( e& E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 s- k7 ?& K R5 S
使用下面代码,对内存使用了mmap函数后:
7 U8 ^; x V( _3 v5 R#include <stdio.h>
1 y3 e1 C: C9 r% W#include <unistd.h>
{& w) v5 \. O b4 {# L! [" r#include <sys/mman.h>
3 R8 X1 T! n' O, W1 C: `8 S#include <sys/types.h>
) z& Y, ^/ Z j0 k) i0 M; y( Z1 Z#include <fcntl.h>8 P* K3 s9 \$ K' D- s5 e+ j! v
" r1 ]9 L* @& t$ { r" |
#define SHAER_RAM_BASE_ADDR (0x80000000)% H: }$ C* a+ l0 x) \( Y
#define SHAER_RAM_SIZE (0x20000) / B3 H8 B* m- L0 _6 ~' N
0 ]) a6 k3 l0 w6 U" ]1 D8 xtypedef struct
( V/ t1 L1 Q h$ a4 ]8 ^{
+ f7 f( p8 b/ O9 ^5 v unsigned int a; i; P# a" H4 [' I- P! @
unsigned int b;' u6 f4 O$ U* W& Y4 \" v6 k) j
unsigned int packet_cout;& K# G+ ^7 _, }5 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( W# h+ _6 [. u
4 N) m, g; H$ i; W
void read_MSG_buffer(int *baseaddr);
+ e9 O( p: v& J. j2 Iunsigned int count_copy = 0;
( ?. U- n7 I. c. q/ J% B; Y1 S9 Z7 W' p
int main()
2 M# Q9 _, ^/ h+ G; Q{
+ w2 y9 T Q' E int fd;
; i; s0 C# B8 y! h int *mem = NULL;# Z9 g$ v8 j& J" q& Y
1 [+ i( t U2 ^0 e% Y1 @0 V if((fd = open("/dev/mem", O_RDWR)) <0)
2 l1 X, M- ~3 L( ]7 `# c' q {+ ~9 A, |+ C& p4 U3 P
perror("open error");
& F2 |& ~, o. A return -1;
8 ^, R6 m) B4 |7 a2 ` }
/ ^* L6 w" l' Z' P* D7 O
8 P& `; f# @! Q# E mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 F* m/ p4 W/ ~& J" S
* ] B: B, H/ m x: p7 G while(1)7 j9 f+ n) x9 I d# Y. ]4 b9 Z
{; T* U2 {7 {/ j
read_MSG_buffer(mem);
3 q$ B- G4 v4 G7 V8 | }
( O0 `. s- {3 u/ T' ^& z; c+ B8 }9 x}
" i6 G% E7 x5 y$ W: ]% P4 }* r. \7 B1 b. i" {' a
void read_MSG_buffer(int *baseaddr)
" G* v! t0 s( k{" W2 |$ V7 z H7 p2 E u
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 Y* w! }6 Q: N: i
7 p k1 ], T9 @1 d0 @4 ]- h3 \ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 U1 Z, }* U; N7 @3 A, p
2 d" }0 `2 j. j6 P0 o# ] if(pshreRAM->packet_cout != count_copy)
4 z! Y$ n) X/ Y% Y, m2 z8 C {
- U/ W7 h0 i7 J m0 B; `" r printf("a is %d\n", pshreRAM->a);! v" e( E6 v; |. Y% i
printf("b is %d\n", pshreRAM->b);
7 O/ Z% K8 l" g6 o. S printf("count is %d\n", pshreRAM->packet_cout);
! d1 \& x% a1 j2 b; P0 Y count_copy = pshreRAM->packet_cout;
7 I) o# b I6 C4 Y& J8 ~3 i8 C }
' F. M8 R) Z: E2 q- } else
* _ z/ X) {6 a7 h. z e {# F$ Q8 L1 l& g7 Y x1 q
printf("No effective message!\n");
, d( e* N3 I. e1 K }, [& B5 w% L) @" M2 R, n4 \: ^
}
! _9 y4 x7 m2 c" Y; {" X- e1 B6 {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 v/ H9 v Y2 k1 C, B4 X# H. M2 @+ p N) k
9 s" ^ o. B, {4 X9 M1 D
0 W: N+ l* F' Z2 j! U+ B; Q+ Z
. r7 T' [+ N, U2 ? |
|