|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 o$ z% P3 w6 `5 }' k- ?
$ ]* E7 p3 }8 ^/ d) |( ZOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ k }9 h0 W/ h9 I' {#include <unistd.h>
, o5 g6 C5 p2 K- g+ N+ c: ]/ `' {#include <sys/mman.h>& J. h# W0 K" m- N
#include <sys/types.h>+ |- c8 [; G: R, M$ B
#include <fcntl.h>
' `5 ]! p$ I3 n2 Q* r1 n$ L+ w9 s
- I. R& H3 D- N9 Y. @#define SHAER_RAM_BASE_ADDR (0x80000000)
. {+ G! P5 |& R6 T3 p" a$ P7 O+ i; F1 v9 a; `6 A9 ^, ]; q, s$ G
typedef struct& D! C0 b C7 n5 x1 z8 ~
{; | Q4 M: O2 e0 o y7 Z9 r
unsigned int a;
9 ]7 S6 z7 i8 R! ~6 A unsigned int b;" y5 c5 \% |; l, Q+ k
unsigned int packet_cout;
2 W' _3 m- P4 M7 W4 S) v* j2 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# ~9 g8 q+ l+ k: N% W( j# c8 j. y; m
9 S, K- s/ r/ bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 _7 R- m: o- nunsigned int count_copy = 0;( K( t% v* Z; L3 _* T4 T
/ f& g' p$ e3 Y. z
+ O6 U9 r6 o# b! Kint main()
1 V! J/ _8 d6 b. j [1 {{9 Z. \9 F- z9 P4 X+ C5 E+ F
pRX_MSG_PROTOCOL pshreRAM = NULL;3 n# D: F* L3 R- ?/ I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. l9 ^% b! b) H$ R$ \, Y1 k: \+ X' V( m# Y9 [8 V. }. v9 k/ w
while(1): `: D) [* z1 j6 N! c, T
{
/ n3 J! o5 t( J# k* S2 C read_MSG_buffer(pshreRAM);
3 U, A; S3 B' k6 U } ! B- X. v- s# y. _2 P4 _
} B) w8 X$ N2 k+ H$ h$ O# Y3 L @" }
/ c, K0 r* u( e, C& e! b# D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' |! h. z5 I" [ c% H3 s7 k9 O
{ k- Q9 q# P0 a* n0 A0 s# f
RX_MSG_PROTOCOL buf;- U+ T* e/ Q& v) v& ~$ Z" i
; i/ I z/ T7 H7 l: \- E buf.a = pshreRAM->a;. u8 a5 n. m4 C7 u4 p# a
buf.b = pshreRAM->b;+ ?, V6 j( V9 s; e; e
buf.packet_cout = pshreRAM->packet_cout;" W" \4 M. u- G& r- ]$ @
5 {: [2 Q4 A J8 h. C) R6 n if(buf.packet_cout != count_copy)
+ J9 l7 ?' \, O) J { z1 M( \8 e6 K/ ]4 m3 ]
printf("a is %d\n", buf.a);6 C( U+ }! o8 `1 G/ R
printf("b is %d\n", buf.b);
. B; ]7 c( ~7 {' C Q; p' E# \ printf("count is %d\n", buf.packet_cout);
/ m, j8 I0 Q/ J count_copy = buf.packet_cout;, G* `& @5 l5 x/ ^
}& [! x' V. F# E( P! T) Y3 P
else
# X) U/ R, ^; C7 K( f& Y {
3 T- t8 M1 F: f$ L& i! R. C- t- ] printf("No effective message!");! @1 ]3 ^, u! x4 b+ [+ x7 l$ m
}6 f5 @4 Y# {- y6 B
}
9 L; \# B7 u! D3 M/ M8 Y" V$ x; H- o# Z% V8 m
& ?; F2 u# X8 y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' [, y5 w u. f. a$ n+ z/ d' X
使用下面代码,对内存使用了mmap函数后:
4 u) b% H2 @- m- ?: U#include <stdio.h>
! @" i6 R9 M& i& k( ~& Z* a#include <unistd.h>
8 c7 ], s5 `* j: B% S* V* m#include <sys/mman.h>
1 N/ R0 w5 z# U; U. [1 Q#include <sys/types.h>7 x% R8 R; ?$ e; j
#include <fcntl.h>
2 n6 l* L7 E0 R/ }
* F0 }$ I; ^. D( i% e3 C+ G5 M#define SHAER_RAM_BASE_ADDR (0x80000000) x( G* [2 U. I k& F
#define SHAER_RAM_SIZE (0x20000)
; z; _4 ?" I: q1 P5 H
! v2 E/ |$ l3 n& [+ Q- t% Otypedef struct
5 D$ H: I6 z. O) K! u {2 b{
! M' X k5 @! \/ n2 Y9 Q unsigned int a;
' ]# v+ n5 w4 y0 X, f unsigned int b;6 R5 S3 E4 \. j/ J1 L5 j
unsigned int packet_cout;
$ ~" G. U) F. `8 U" x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% w6 z2 u8 W% q) {
. U* A* \& n0 s( B9 ]3 ~void read_MSG_buffer(int *baseaddr);
# c' h' a5 ~* W) f( Funsigned int count_copy = 0;: [9 Z3 K+ K! G) ?7 w* p
( t1 _# ^- ~( V
int main()* M8 z& { m i, j4 d! ]
{' g) S# M3 I& ^
int fd;, a3 X9 w. v" S/ A {+ \
int *mem = NULL;6 Z8 H) [5 I% D; C, x$ A0 G
$ J h1 @* M& Y9 j5 L( I
if((fd = open("/dev/mem", O_RDWR)) <0)+ [5 Z0 T" G8 E2 j3 @3 |( _+ `
{5 e o- _7 {% Y; h# G, v& R
perror("open error");0 O! |6 C' i$ E7 U" p' m* G
return -1;
) V# M3 t3 S [6 M3 X0 g/ y }2 z A# n( \$ ]& P' |# D4 Y
/ ~( o) q8 r; W9 @ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# I/ [8 J1 @4 d
, [+ B" S7 W/ A8 V# J, x while(1)
5 L# H' I& |+ ~8 m% b: T {0 i7 @4 M; k9 s# a
read_MSG_buffer(mem);, ^+ a, y) M9 G* w2 k/ ^
}
) {/ t* h6 z' P6 R% r. {}3 Q& m3 S, s$ B) v, ?" Q
, v* i6 [* C* z# g/ U: o; Vvoid read_MSG_buffer(int *baseaddr)4 f! I3 s% k8 l& j9 l8 C
{2 r# \' G/ G' q4 X4 z+ {/ p. F
pRX_MSG_PROTOCOL pshreRAM = NULL;9 X; c7 O. f- H0 ?! V* N
9 H) J( k! h. M1 N& z( W pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 f4 ^5 A& f6 W# @, Z( W& W" Z* G% R8 S V1 W) g- }9 r
if(pshreRAM->packet_cout != count_copy)
* z# \0 m* K4 C f {3 A F' f' r# p4 I2 A d$ ^; o0 R
printf("a is %d\n", pshreRAM->a);* G- ]* d. }& T0 w
printf("b is %d\n", pshreRAM->b);
; ~9 \2 `9 D5 H. O6 q/ n printf("count is %d\n", pshreRAM->packet_cout);
4 n# [( T( n9 K) k, g9 h" _ count_copy = pshreRAM->packet_cout;
1 {7 J* M9 ?5 T+ c! _/ f }
3 A7 }$ L9 p% H) t4 o$ _& C- T else4 G( y; ~( k4 T6 ~/ h& e) g
{- B( h1 B+ c8 x* g9 q; q
printf("No effective message!\n");
8 x# y$ J! n. v1 Y0 }' I }, ^8 ^ Y* k# C
}
/ k% c" P$ O" [3 r
/ t" v7 D! P; k- o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ x. S) e5 P, S8 ]% m2 x/ z
! _- l* A8 j! N8 n
+ u0 {7 _1 C3 b) X" {5 a) S& k, L2 u5 g7 ]
. J# e( }- `. H: B1 r |
|