|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 M& p. \, r. \/ n
& b# F3 a; y* s& C0 YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# I% g- ]: ^8 t& R% X8 R$ i#include <unistd.h>
; T/ A0 E3 ?0 K1 d' v+ T4 E#include <sys/mman.h>7 y: P' v$ z# ^
#include <sys/types.h>
0 n( T5 K1 d3 ]# k" X H7 q#include <fcntl.h>
7 U4 s+ Y1 l+ \ I) [+ a+ i$ d; ~2 Q7 ?& q, ?- C- v( Z+ A
#define SHAER_RAM_BASE_ADDR (0x80000000)
; w4 b6 ]. L+ m) ?7 @9 }+ `, \- g0 \6 ]( O, o) Q) k" w2 R
typedef struct2 ?; E5 B a5 z( O8 @
{; t$ ?; G0 ^1 n
unsigned int a;* v3 W5 m* h& r
unsigned int b;" o1 B% y8 ~8 q! w6 P. k$ c
unsigned int packet_cout;
7 t( } s V4 W8 d/ _" |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# w8 j; ^ g/ c* O, }2 Y0 A* Q" b
- w3 O# D" N: T" K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 p3 U' f) \" ^; `0 @( u* @; z
unsigned int count_copy = 0;* }" c$ O6 _+ G" N. ]& ]4 v3 x
: s/ N9 U! p1 o3 x6 `
4 F3 F, `+ { u+ @int main()$ t' I# s( l& l; ?7 _
{* `1 L/ @4 D; l" w2 L
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 n1 j, m# {; E* y7 a0 S2 I7 G pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# {; Y6 }* P/ n# C; i3 A
8 E, A4 w }9 i while(1)/ {& p+ i3 j& e: `- E2 J/ w
{
2 z: Z2 b/ ]% t read_MSG_buffer(pshreRAM);0 j. `/ Z( l# O# e/ q
} ! {) f2 X+ Z1 {/ O4 L
}
+ Q6 P- g7 x K2 @- n A8 @: p* u: M$ w% J- n; j- _) |4 J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, [* @ j! e1 x& v: q{
' R( v. e8 d- N @0 Q/ z RX_MSG_PROTOCOL buf;
4 D/ V! F6 L* t4 A+ X0 m7 G " ~* I0 P1 @6 w5 B5 l
buf.a = pshreRAM->a;
5 N( j6 c t9 p buf.b = pshreRAM->b;+ \+ N2 ]8 S2 U$ m! z5 K
buf.packet_cout = pshreRAM->packet_cout;, U3 g2 Q# D4 z& p: u) E; T" }- \# @
9 x; r. a% w5 ?& i! [
if(buf.packet_cout != count_copy)
3 f, k- G) q" X6 ~$ E( V; c {$ d P8 z3 v5 I, s* B1 Z
printf("a is %d\n", buf.a);
4 q( @; y3 z* X0 I% ?9 x printf("b is %d\n", buf.b);, f$ `* T$ y9 M; s0 Z6 T- [
printf("count is %d\n", buf.packet_cout);
1 p4 y2 {1 Y6 j& u$ c/ w& u0 } count_copy = buf.packet_cout;
a. G% O5 w7 E$ v9 q }
( N/ i5 N( W7 R else; N- g- W* E( _. w
{/ q% [& B) y. K
printf("No effective message!");- M" \% R" l. R4 X# i
}, Z4 g5 I9 f5 H! `& v
}8 o D9 a/ O# q* e; {
' e) l, ?' V( M, u* Z, `* ^2 d* o, {% V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 X0 ^: G E$ B1 T使用下面代码,对内存使用了mmap函数后:
) i* s) r! K1 C#include <stdio.h>
1 Y# ?/ {% [' J9 p+ j) h#include <unistd.h>
0 m& I: y& y& z7 E3 N#include <sys/mman.h>
% D. y* w8 Y v+ U' w% M2 H# `#include <sys/types.h>2 w4 X% V ~$ Q8 W: X7 i
#include <fcntl.h>4 o3 x0 F$ x5 o) B
" N& K3 U, l2 v, i8 m4 B. n" o% \#define SHAER_RAM_BASE_ADDR (0x80000000)
5 Z( O! }0 Z! A#define SHAER_RAM_SIZE (0x20000)
\# W+ m8 O5 s( T2 Q8 s, E; P/ _. e! S @* _
typedef struct
6 u; @: r8 y( V n" d) |1 y5 e/ T9 k{1 g- ?+ {, R' \+ d: X; \
unsigned int a;) W ^) s# p( g( b
unsigned int b;; J2 ]1 P& A3 o9 f$ H
unsigned int packet_cout; ]4 M$ p; t0 K( o. g7 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# a% r" K; j: z2 ]9 n5 W) c. H0 a- z
0 @6 T3 J2 v o8 Y9 Cvoid read_MSG_buffer(int *baseaddr);
4 T- _1 t7 B0 t) O% Bunsigned int count_copy = 0;
% {$ u9 B* @7 p* _1 k: b
, j& c8 L H/ J9 Q1 Sint main()
0 ]) o- Y0 }+ z/ i; }{
- x: v; y: n& V( F- G7 [. H int fd;) ~1 X# H5 S5 s# y0 U) d
int *mem = NULL;
: ?7 v2 n+ M6 t9 [4 S' b& f& f; d
1 e% y, u3 e3 n0 D Q, R8 a if((fd = open("/dev/mem", O_RDWR)) <0) v: H% q) y" Q. Q
{ _6 O$ `4 w6 R. s2 b& \/ W2 B
perror("open error");
8 G" j+ _; y2 y. H+ R0 B return -1;
/ D' z; A1 c o9 V/ m( J- ^ }
1 Z/ B/ I9 h9 l8 ]' s: x 6 O& i& \# t+ Y8 x# S1 {1 e
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 n. f/ m4 Z8 G9 x' p. R8 t$ U# p9 z# X( _$ W- a
while(1)! F+ U% h' [, M( }. \7 P
{
' N3 X7 y7 e. t3 Z- @. ~$ T read_MSG_buffer(mem);7 Q" h m, C" Y6 a5 t4 i5 y
} 4 m; P$ \, @/ h' m _' [2 M4 ~% W
}
) W+ v: a& A1 n+ B% u3 e' G }& R/ ^ z
void read_MSG_buffer(int *baseaddr) g3 I# n, p! y9 n4 N
{# ]* J X8 V! ~8 H% b( d
pRX_MSG_PROTOCOL pshreRAM = NULL;
) I, R4 |& y; J# i' m4 j( a* s8 A% [4 L! l) ^! {8 c- m
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 } F$ }2 c- E r1 k
+ d% ~% v! _; H: c: ] ]! J) S if(pshreRAM->packet_cout != count_copy)6 f+ l/ Z2 ^5 K& a
{! E* q8 `, |, ^: D, w9 N1 v# c* i
printf("a is %d\n", pshreRAM->a);
/ c/ S( K; q2 l# j) z printf("b is %d\n", pshreRAM->b);3 K) m+ [: f2 ]" R4 z$ l; K
printf("count is %d\n", pshreRAM->packet_cout);* u% ^7 P0 b, A3 }/ r' A
count_copy = pshreRAM->packet_cout;
1 v0 d! u7 s" }, T# |( W) ` S: z }2 }0 e0 t! @1 t- H
else
# ~ ~0 c2 l) x( r' e' F; T6 d1 G) s {
0 P2 B1 S y. R, M }* r s4 ^ printf("No effective message!\n");+ L6 p N$ J8 x' m0 G2 I
}
+ T" ?( N! d) p; a9 H}' C1 Q* d4 K8 ^* f( H. `
% G+ \% U) K0 d# k没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& H, y6 U" y+ }4 K
9 v0 n- o4 j ~2 ?% p8 K4 G. y" f
, R* C- s! \) d, l" l5 L
7 t" s# N6 X+ `3 r# [' h
/ i' B* y7 n- q* r+ S% c# l9 j |
|