|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 G* J9 O# s$ p# p( x4 I
& Q( v6 r8 J8 v* g) m" x1 i6 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 n) M' P! o% {; q0 [#include <unistd.h>
1 k7 p4 |+ H3 a' [' i# }#include <sys/mman.h># g) J8 s6 J! @: e
#include <sys/types.h>! q6 y/ s5 b! U( f
#include <fcntl.h>
7 P) M5 w9 |. G* A) x. Y7 w% J; D' }4 a! ~, k& g) _' t1 M/ P4 s
#define SHAER_RAM_BASE_ADDR (0x80000000) - `1 L: o% `: k& h- u& F
4 N6 m; `1 K( ^- H" J# x+ a3 l3 V
typedef struct' i1 O$ O# E; d8 D3 q: F3 ~
{3 } A9 L: N* I$ {0 ?
unsigned int a;( S X( L8 K! I. g1 p
unsigned int b;
7 K. M; n/ J4 ], e5 c8 Z unsigned int packet_cout;9 J/ n8 n# n$ K: ]/ r" {3 ?/ n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% S( `3 Y7 V3 K. d0 j* `+ h8 f
6 A! c: ?1 W" [/ [ U. {; O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 y# ~: X2 R" n- M+ ~- D
unsigned int count_copy = 0;
# ]' A9 K5 R6 Q1 K% ]3 z4 g. @
. S# U% I/ h% o$ ~7 Z# ~# Z
, x) I, u* [- j7 t- b' T4 u0 Aint main()
) t+ N: C% s, h8 e! \1 e{
- D B t% k: V0 @ pRX_MSG_PROTOCOL pshreRAM = NULL;
3 s) M2 h+ J- B/ n6 [0 t pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# s i; Y3 S8 ]( O0 @/ c( @
3 X [* a1 l& S" s+ f+ C5 M5 o while(1)
& T7 w E9 \# v1 V( [ {+ s& F$ K- W! I# J( A1 o
read_MSG_buffer(pshreRAM);
" S% N' h- j+ n( _! K2 k) I } ; y' L$ R1 V( X
}
: F: z. z5 U! |; }/ m- s; u
0 D% Y( C( @6 w$ }+ Q: I% r6 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* U3 T `! e+ y- L! ]{
O& y4 q7 v/ g. }7 q4 @+ Y6 ] c RX_MSG_PROTOCOL buf;& {1 z2 L O6 m* j- D- x y# x- Q
3 Z% v; C) Q( x' y/ W' d5 x& Q buf.a = pshreRAM->a;
( o# U7 ?5 t( W8 n, N# s$ W buf.b = pshreRAM->b;8 @! T" y3 r o# T, I! X% z
buf.packet_cout = pshreRAM->packet_cout;
% W+ p9 \" P. {3 B5 r& l3 h0 q
9 r) d3 K2 X: X if(buf.packet_cout != count_copy)
" w7 X4 D- }: ?+ u* F7 j {% [6 W& i7 f4 P' S: c
printf("a is %d\n", buf.a);
+ r# K- \; U$ b printf("b is %d\n", buf.b);; e6 g& I' j9 V1 c% q+ p
printf("count is %d\n", buf.packet_cout);
. ]& a% _. Q+ p: O4 S count_copy = buf.packet_cout;1 D! E" P6 c1 t; W% k% `# |, @
}" X+ ]0 e2 {& T0 m
else
. D+ j- _. d& d5 }0 a& W+ p {
; x' J+ L- B6 e" R" I printf("No effective message!");3 { K( [# r+ H& I6 [$ p6 F- N
}
: d4 E- _- P6 ]}
6 s, i% x( w( Z+ P1 G) Y0 i8 K5 J! A
$ s: ~1 m- }6 a, S: \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% ?8 |/ i! l; b4 ~使用下面代码,对内存使用了mmap函数后:1 p6 R# U1 l6 k6 \& b& D5 E
#include <stdio.h>
* l: E% t, K V* }# Q$ ]#include <unistd.h>. a+ w0 W5 e4 F" Q. W7 f" Y. P
#include <sys/mman.h>% u$ z) a; j5 ^' }# {
#include <sys/types.h>6 E# R A8 C; X! @" J. R3 i
#include <fcntl.h>6 p1 F ]) b1 s; ~7 F1 g0 ?& ]
( H. W+ A: I. W {: m* l# k+ u#define SHAER_RAM_BASE_ADDR (0x80000000)
+ i4 k) t1 R2 A5 E#define SHAER_RAM_SIZE (0x20000)
; L7 ~- ?) \+ I: {1 Q# c6 h( K- X
typedef struct
9 \0 O/ F6 y" v0 {5 k{
4 g# [1 Y; x$ i5 T% Q( X) |1 \, Z& z unsigned int a;
- u& \" B- r2 b( Q* [! B, R unsigned int b;8 V$ z5 k0 K* T9 X. }6 B# a
unsigned int packet_cout;# t" ~5 P/ n! X& }+ W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 M O6 X5 d% X
( i! N8 k, n9 S1 q% B/ Y/ H; a
void read_MSG_buffer(int *baseaddr);
) j% x c) r% @$ Yunsigned int count_copy = 0;5 ?: p7 Z& Q& O2 l
) S5 C$ [3 W5 J- ` R! K$ I
int main()
6 s2 ?+ |# X; J! F; o{
3 M L9 @/ _) S# b! M1 U" p int fd;
3 ]4 S' W- l% P+ H' E5 m int *mem = NULL;& J* W( D7 j% g) d5 d- d2 ?5 |
: B7 R ?, R# @6 I, @) H$ B; Z if((fd = open("/dev/mem", O_RDWR)) <0)
% h6 B5 Y* F/ i4 f0 ?. J8 c {
1 B0 C8 x1 q! ?/ y& k7 N1 k" ^ perror("open error");, _" `$ P( o. P; M
return -1;
$ i1 B& z0 ~3 h2 L }6 K. y2 J0 c# G! Y1 v" w% d" ^1 l
+ [! F1 w7 ], C. I mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ l: [5 a4 R- H3 M) K5 b% Q: e- G1 m
while(1)
7 d$ l2 f( d4 m w/ \ {4 `; D/ K# s8 d
read_MSG_buffer(mem);: q" @ x# t" @; @9 O% p
}
# h( |1 B( y: M5 a( o4 T5 Y6 O}1 [8 o9 S' v/ P+ E4 b+ f! H
# N0 F! {3 h0 a0 _+ I9 z+ c1 l9 Avoid read_MSG_buffer(int *baseaddr)
& M, ~# V8 d: ?0 F6 ]1 Z{8 F' f0 X# e+ U/ E6 q% C
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 s; a8 ~& J, p8 E+ X8 F: _& d9 y$ h; T
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* V" L/ v! L6 Q. ?2 S" C# k; C+ E. r
% P7 v/ m ~0 n7 m if(pshreRAM->packet_cout != count_copy)
% d3 Z% h3 e+ @- o3 o+ B {
7 @$ ~6 y' T' { printf("a is %d\n", pshreRAM->a);
4 @; X) D; t; h4 [1 i9 x7 B( L printf("b is %d\n", pshreRAM->b);6 Y* j1 u/ s2 U [- W
printf("count is %d\n", pshreRAM->packet_cout);$ V; w) p5 y c9 n
count_copy = pshreRAM->packet_cout;
# I1 \; q a, _0 u9 I4 U* {- x }0 |% R4 p% z: j
else
# y' G7 s% f3 s* a* r0 ^ {
: k/ W$ Z5 S/ |2 f" Q6 Y2 L! n printf("No effective message!\n");
4 n. @/ ~- N( K5 L# c, B }3 H# \# t; y4 a7 q! X: d1 U6 g
}0 A6 m) |, g) V
- }& a$ z& d; F7 c7 R' ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& N$ w/ C q2 R- j7 R0 m; `. I4 ~3 C8 k5 W1 `7 X& e2 g$ c. g
! F+ B; _) w0 F. N/ g* G- L2 z
* V. V R$ C, f- E% t! u( p* F# Y2 g1 y) S
|
|