|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( w! J4 S: j: _. ~- U8 |* ^
) i( R2 ^ @5 R* k. K& _( I; P3 r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ `/ t+ t2 x5 l6 N/ C2 Y1 h6 K
#include <unistd.h>* a; u+ H0 Z" }7 Z: d- {- c) |
#include <sys/mman.h>* G4 `% R/ g! G/ K7 O+ R- [
#include <sys/types.h>! H2 C9 w4 D0 c% v8 w+ X+ A
#include <fcntl.h>0 u" s! ~ s6 H# S" @/ w2 w
8 Y3 j( n3 o1 F, M7 X& X, ?#define SHAER_RAM_BASE_ADDR (0x80000000) # ?9 I5 K# _" U- o. J
( O% T6 V; y- S. C, Ttypedef struct2 G% P+ d5 n: m8 L3 Y. L
{
, j4 M2 v+ q1 n4 R# i unsigned int a;
7 @1 P4 G( ~# ^' y! Q3 `. H unsigned int b;: c4 A/ F7 D4 ]- o7 u! g
unsigned int packet_cout;, n; P) k p2 F1 H9 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 R0 k; T( b5 Z- ~1 @1 w
# i* r# i" @3 S" O; O. r) n' s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! M+ V% g! o* p* Eunsigned int count_copy = 0;) l2 D6 f: A; n; A: A
/ F" _. E% g: y2 g! D+ q
7 [0 ]+ o! [6 S6 J2 o- f* X
int main()
8 \ {/ B' _) n{
* J' I" L( z4 M8 P8 N8 Z pRX_MSG_PROTOCOL pshreRAM = NULL;
; Z% ?& z" C1 [ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: \( g! {: }5 R0 t
4 z h; E3 K" W3 n; Q0 f! w/ G while(1). Z6 b# E5 l. W8 x% w$ f; u! I
{
/ d( a' X# Q9 X A \ read_MSG_buffer(pshreRAM);
M3 S- ]6 ]0 x& X5 }3 ~ } 8 h0 N- @2 p+ o) G6 ^
}, w+ a8 n/ W }8 s
- K" h, Q/ j. ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ D2 l3 G: Y# X/ w, N
{
6 i7 @0 \$ d: O7 H RX_MSG_PROTOCOL buf;2 O1 |" y8 u' C. m: x& v, C
$ Z3 S# s+ Y0 G buf.a = pshreRAM->a;: J2 @4 _0 {) g$ z
buf.b = pshreRAM->b;, j2 o5 m3 M+ R1 D$ E' y. @* F
buf.packet_cout = pshreRAM->packet_cout;, s$ M, z$ `, N- l8 `8 c* O
/ l' G; c) s' ^( V
if(buf.packet_cout != count_copy)
' u! [5 l4 c! F4 s {' t ]& r- ~6 j- H3 [4 Z, c; {
printf("a is %d\n", buf.a);
, N/ E; g& u2 Q) k$ z printf("b is %d\n", buf.b); }8 A, [' a- f4 ^* A0 z
printf("count is %d\n", buf.packet_cout);8 F, b! d/ ^8 s; d: C7 e
count_copy = buf.packet_cout;7 X: I2 Z% ?6 ]7 I
}% @' ^4 E* y! @0 T" h3 w7 k6 h
else3 a l \. P% o5 b6 f
{
. T& L* U- ~9 G" x+ x' ]" o printf("No effective message!");+ q Q/ ?) X! x) m4 H5 r
} Y5 U/ R. @( B+ n2 _/ E
}
3 y9 ~# S9 q' C3 p) y+ g; j b$ P, g" `& A. a% j
. ]9 j( {. f6 H7 ~ `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: u3 A7 d/ t8 X6 X u7 X* ?* Z
使用下面代码,对内存使用了mmap函数后:% ~2 m+ ?/ O4 _& F7 [
#include <stdio.h>
t: u+ V2 l8 ?/ P' o% a" n#include <unistd.h>
$ v- n6 A, ]; I. n& ?4 D1 V#include <sys/mman.h>8 S8 Y6 [! _7 Z. F- x, Z$ g+ }
#include <sys/types.h>
2 U/ \& X7 N8 U3 t- r#include <fcntl.h>* H* e' B$ _' b O: u6 S2 X
) K1 Z3 K& G5 M/ J% @) R#define SHAER_RAM_BASE_ADDR (0x80000000)* Q$ \+ ]1 S9 U' a8 g
#define SHAER_RAM_SIZE (0x20000)
* H# \$ Y2 @' Z+ d0 N. [2 T
, c6 w/ ?0 [3 ^' S7 Z; B! s+ `typedef struct
7 f* L$ {7 b( E9 {+ J" m{+ G0 j1 a. y4 i& k3 C& k4 y5 }
unsigned int a;9 z4 t# @( \+ ~# N b2 x
unsigned int b;
( @" r2 f; w$ z3 H8 d: |2 u unsigned int packet_cout;8 ?2 w) |# U3 a0 `: E( e# R! e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. _% N* H2 r/ p+ a& e0 }8 Q
. l# o- T. n6 L4 S& S3 cvoid read_MSG_buffer(int *baseaddr);; |4 Y( z& L- m3 E4 `# O
unsigned int count_copy = 0;
3 W. X1 E1 l. ^+ j& K1 P' w; M+ {) i6 y5 P' x0 v
int main()
) a$ P. I% o+ t8 `1 a {8 L{, K+ k+ M z) w* w' ^
int fd;1 @8 F" [6 N Y' v U
int *mem = NULL;- x% p8 \/ L* E4 U3 R
% f" E3 l' p4 R2 d* g G if((fd = open("/dev/mem", O_RDWR)) <0), Y( \6 G# v1 ]1 x4 J
{
3 z" t# M$ N9 s- x+ q perror("open error");' _) L9 ]6 z/ }3 a1 M. p( A+ ~
return -1;
# g* O3 y) W! O6 {0 c, B7 Q7 G+ {" Q5 t6 k }$ J4 [; @ j( w
# f x. ?+ @4 _4 y( N9 n6 e- X8 a
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& a: S/ X+ T I5 k0 o
$ O2 u. O6 A7 Z9 r/ L Z5 c while(1)
1 ?" Q4 A7 ]6 E* {: P {+ b. V n5 ?$ Z& U5 O5 B7 C- |
read_MSG_buffer(mem);
2 l7 e$ b5 K* V } 9 f( M# F- B3 T4 ^ a0 T
}
+ ~$ b' L6 W1 g/ q# t% j
6 G; P1 C1 s# g% ]5 f" p" avoid read_MSG_buffer(int *baseaddr)
' u3 T2 C3 M& u# Q& b{
9 }; ]" G8 U# Y pRX_MSG_PROTOCOL pshreRAM = NULL;6 o1 G' Q& Y5 `' n& _/ K# U, A
) n. P; U2 N) P4 w: j L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ G% M: i% g1 v3 h! V( E+ e
8 D9 D# Z; x8 W0 K4 R
if(pshreRAM->packet_cout != count_copy)9 e, [/ P8 J$ S/ ^3 _! ^
{8 p, N/ Z. K- b5 n5 k5 u4 [
printf("a is %d\n", pshreRAM->a);( W- b0 h( a& K1 Q; z
printf("b is %d\n", pshreRAM->b);
3 Z: {8 Q; V/ L1 \ printf("count is %d\n", pshreRAM->packet_cout);0 w1 f- i3 F/ {# B; {: v
count_copy = pshreRAM->packet_cout;& x* D! ?) T7 u E' W
}( W# B9 }: R5 Z/ P4 l7 C6 y% ~* k$ U" |
else
& {' R9 A: R' Q2 i5 x/ m) _ {/ {! j1 u# S8 T% p: y9 _
printf("No effective message!\n");
! ?; t1 @0 Y0 ^( v) M }
D% t1 \2 Q0 ^! Q. \9 {}
% K# W* g3 d5 C1 @; F9 l a
- i4 Y8 I" R: D" u- G. i1 P+ z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 f' ^* O' S; W( K3 j: |6 r; s
; B: y+ D1 L- P# X. V6 b3 c4 Z f' p9 C
4 F* r5 {8 v8 A9 {' Q* l
$ h: m) a' v4 A& u& V3 \$ p" d% o1 W |
|