|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* G& ]1 Z: W5 C I
% w. y' |% s2 ]) W4 @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> P# X" b; v4 }2 x9 t' ?) \
#include <unistd.h>7 [7 B- |/ }/ d" R. L; n# U
#include <sys/mman.h>) ?8 H1 O' o* p
#include <sys/types.h>+ t/ S* k- w/ R* ]( ^( R( Q" l
#include <fcntl.h>
& U% z* J8 |+ M* i6 Z
: a) M/ g+ E& h6 B#define SHAER_RAM_BASE_ADDR (0x80000000) 1 g! ] V( m) ~" }4 V: e9 N& t
- R8 W5 y$ C5 L& gtypedef struct
' G9 m9 w1 i$ b, ~9 l9 Y{ u+ K% z. n* B3 p! @/ |) p! a
unsigned int a;- s" N$ @ w: c; g" D+ r2 Y ^
unsigned int b;
; ]$ W6 }$ B5 W/ ^/ { unsigned int packet_cout;
- q! Y4 q! |9 N5 R* {! o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* [3 I6 Y, A' M# z" o, V5 m: ]* a3 U. m# r4 b, \ q q. Z+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ U0 t- j1 f" O% d& ]5 ^ kunsigned int count_copy = 0;8 b( z: L0 B: ~+ [7 b/ v4 a
% I8 t8 O" e( h k% O, P. O
% h5 \& H* g1 K5 q6 w# N3 ~
int main()% {# R, P4 N5 W
{
7 W- [' B0 w. V pRX_MSG_PROTOCOL pshreRAM = NULL;8 k9 J8 u; w) k2 e! B" `
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 a* X6 ]( M3 C
2 L* J% H+ p% a4 f: ?" a
while(1); U2 j- m q: A, v' r$ B. p6 y' `
{$ l' M1 Z* h0 X
read_MSG_buffer(pshreRAM);: d/ p4 p9 d5 H* f0 X( ^) v
} 6 p& C% V* d# Y6 {! B
}8 o5 k& J+ c5 @& s% i% q4 m
7 }2 w9 U/ S. N# N2 Q9 P6 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) r8 H- W+ i, i& j
{5 Y5 @% W C6 O( {# Q/ h
RX_MSG_PROTOCOL buf;
: P1 {7 R! ?* K6 a2 m " p7 X% x& k8 O# H
buf.a = pshreRAM->a;% l9 H$ P4 E2 u4 R6 X. C
buf.b = pshreRAM->b;
; ]* b! Z, }* _% Z* w buf.packet_cout = pshreRAM->packet_cout;
' i& F4 F# ^! g2 o' c" f% I 8 D. X; Q( ~" _/ i
if(buf.packet_cout != count_copy)
1 L* N6 X2 ~6 D {
" _, H( V5 c& F. A, A printf("a is %d\n", buf.a);
. Y' w, P% i9 v' H4 P( _9 z printf("b is %d\n", buf.b);
% F* p0 f' W% L! V" m0 u2 X! ] printf("count is %d\n", buf.packet_cout);. P9 R0 d& a: J
count_copy = buf.packet_cout;
' A3 a A! F- @/ m }2 \) }& ~( Y! ]4 G
else
( Y# t, c7 }4 G {$ E; [9 |5 P9 Q7 t8 A8 J& b
printf("No effective message!");
$ f6 g1 Y) K/ m6 Z9 _2 Q+ P, C& j+ M }( w6 ?4 b& o7 F) I* v1 S/ C7 R
}+ b9 X y0 [6 v1 @* T/ X3 r2 T
4 f5 [: q6 N6 E: D" T" P' b
8 w# S+ \9 K6 d' z* J+ M但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 V' Y1 K+ j8 C8 u9 S" R/ ^使用下面代码,对内存使用了mmap函数后:# E$ L: n7 u1 _5 q7 G/ @
#include <stdio.h>1 R# Y* q0 f4 [& i8 a- r
#include <unistd.h>" g: ~. M$ V6 k; C4 e, y; i! Y
#include <sys/mman.h># [$ M i8 _" p$ p
#include <sys/types.h>/ ~, r7 T2 k) x
#include <fcntl.h>4 {; I' U$ \ v8 M: n
0 f3 W$ M* f1 I1 w
#define SHAER_RAM_BASE_ADDR (0x80000000)- i5 d n4 @' f
#define SHAER_RAM_SIZE (0x20000) / i1 c+ E+ Z5 n2 c% l
( Q( u( r. j) Y- w9 |& {typedef struct
+ y7 x4 a$ R. T{
# @$ a% k! p7 u unsigned int a;
. y# ?0 q% ^% C6 {& B( { unsigned int b;4 |: p; E8 v l) S5 t8 }% ]
unsigned int packet_cout;3 w1 k' x$ j; [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 V3 |! k l [4 V
8 z4 s5 F# |8 s/ f+ q1 J7 J5 jvoid read_MSG_buffer(int *baseaddr);( v2 K4 W. L- Y
unsigned int count_copy = 0;
0 i. w5 n# t1 n9 d$ H" ?
+ V/ K' _, F4 x$ Y0 sint main()4 P* c) Q& G8 s& Y
{
7 f$ s- C7 s) |, d6 w int fd;
/ V4 r3 T3 _. X, B$ p6 ~+ h- q1 v9 S int *mem = NULL;. @. R H: s4 f# h9 Q3 g+ w
7 R1 o, I' Q, e- Z
if((fd = open("/dev/mem", O_RDWR)) <0)) Y( f( k- E3 X
{" X% e0 {5 [: F
perror("open error");3 V# B5 Z( K' I6 T
return -1;
& ?# o- ?3 e" h0 x9 |' _3 r6 C$ y }. }& E5 S6 n* E Z0 C8 G4 Q! N
" ^2 ~: T- L. s4 g+ \$ ~# d7 R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 q6 B: A, \ K6 ?" @
5 [1 g9 q- ~$ f, T3 P# B: x. y" A while(1)% u! o9 p( j5 z6 w/ i8 @
{3 g b; x) n# ]) y
read_MSG_buffer(mem);
3 u' y/ X2 D8 m/ G. r } & S: b6 u& x4 F$ g
}+ p! |% x# T( K
+ U! t5 H4 ^2 ?/ }- Pvoid read_MSG_buffer(int *baseaddr)
8 ?. V4 q* Q& R9 I{
* a6 g/ ^. I7 _9 w! L# ~8 |% j pRX_MSG_PROTOCOL pshreRAM = NULL;0 l# G( |& ~- }) \5 Y! w7 U
: y! V/ [9 v6 Y1 \" h pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* Q- V& D9 N. s0 G
- h* w) v$ W4 G5 `0 e2 [, o8 Z if(pshreRAM->packet_cout != count_copy)
& E1 f) F5 H( C0 c6 N% b {
' G5 g) b, c, E3 K' b2 g5 L printf("a is %d\n", pshreRAM->a);4 v2 S$ G. C+ [! j6 Q1 E/ K
printf("b is %d\n", pshreRAM->b);
1 Q8 P+ t0 e8 {! g" h printf("count is %d\n", pshreRAM->packet_cout);: b7 I2 a0 p& T& H
count_copy = pshreRAM->packet_cout;
3 r, Z$ N ^( Y4 C1 |3 K$ |* h } L2 J! x# X) k8 f v. W2 c
else& i5 C- N6 i& x2 p& X' A
{
4 e$ Z3 |0 p8 V! d' s G' n printf("No effective message!\n");
3 T7 S3 [' q/ N! | }
/ E& X" Y7 K% k# g5 b, w# j}
8 N& B; n0 a* c% R
- x+ w2 k& u9 G, c" X; S% M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, a9 `) p8 Z! F9 W4 B9 w, A& d( k: u" J+ X, @( y3 x
2 I8 `$ q" ~& b5 Z5 S' [
4 z- I2 H S. L8 d
6 W( Z' @8 m" Z& A8 S; t |
|