|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ N, E- }! s* t+ F2 n
9 g! E4 S' a3 ]' h* X% R6 L" L$ @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( q- S+ \2 P3 {' k* ~4 B
#include <unistd.h>4 f( b9 k& c* t5 R$ {: _
#include <sys/mman.h>
9 N2 O9 _6 B# }7 l#include <sys/types.h># `) L. L; k6 k- a" t
#include <fcntl.h>
$ p" I/ ~- Y1 S4 z4 I* L# M3 C& |2 J! w- j- p7 f# J/ A( E
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 W2 y4 S$ V# P6 b& N2 S5 l
, R f, n! u: ? y$ ^/ R ktypedef struct
4 y3 `* o) l9 A$ z) H{
- \* h+ {* @5 r) u, }1 `9 G unsigned int a;
$ H8 Q9 V7 h, S- V9 p% I unsigned int b;
8 w2 ]0 o! S8 a+ x$ J3 ~) G unsigned int packet_cout;
/ J3 |- s) m* r; ]- a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. H3 E9 }" ?0 M3 ]8 a# b4 l
\0 H+ L7 z; }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 a5 V* o! {, i/ W' t0 W6 ^unsigned int count_copy = 0;
& r* y; \$ B }' d
# p8 D" `8 d$ n7 R1 x
3 L) c6 Y( S3 g4 u3 mint main()$ G5 l6 v! _4 F# Q5 Y& t
{. n0 B3 x% t/ [) I! q$ R
pRX_MSG_PROTOCOL pshreRAM = NULL;
& ^4 X$ R% O; _/ |" S6 s pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 J* B1 ]7 Q. h4 _7 u: m
: C& Q: ~; L/ H8 ]0 ~' H
while(1)
& C6 a1 Q. N0 t! L {
; T7 n, m+ Q1 h4 G! p read_MSG_buffer(pshreRAM);- t- X i/ y; @6 o0 a. i. c9 G
} + @" O# m: c/ C0 Z1 `% c: z8 k; q
}
3 I) C' K4 K+ [& o! N( ^1 N* h v. m% }1 \3 s' Y! b1 z" ~; }8 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 U6 K! y5 c \
{
. S, w9 _# j) V9 j RX_MSG_PROTOCOL buf;
3 |9 h: \/ I7 E) V3 X9 ~. e: \. r
. p# M! l6 x+ z- g3 ^ buf.a = pshreRAM->a;
- c# [ f T% M! s' T9 _6 o+ o. z buf.b = pshreRAM->b;
# j" g% S7 {$ r0 [, U buf.packet_cout = pshreRAM->packet_cout;
; R% W$ h+ Z" s
5 S+ V9 L$ J8 Z9 B2 ? if(buf.packet_cout != count_copy)
D0 U7 W9 _' u* F# `. r. L8 w {1 \6 i! ^0 b+ q$ ] T
printf("a is %d\n", buf.a);
. x) i3 @1 H* h printf("b is %d\n", buf.b);
& z- u/ ^# @9 \& s _ printf("count is %d\n", buf.packet_cout);
5 {6 `2 f6 N# N' J$ x count_copy = buf.packet_cout;
8 f- j, e/ D% F% d1 J }1 y7 N" [7 p4 v0 \, p9 D
else. E$ O& Q: ]( _6 X2 r }
{# d- F: y/ p& k! @% ^+ }2 i7 f
printf("No effective message!");$ T1 v% i, o$ Y( H# e) `8 z
}* f' w6 h, Z0 m9 z, L
}' q/ Q$ F7 O/ i1 `$ B
% Q9 \5 c, P; q& g( I% M/ c
6 n5 n* W' Y ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 G' C1 h, \3 x e9 r* r使用下面代码,对内存使用了mmap函数后:7 p8 k* E, n$ j$ P% D5 r! A
#include <stdio.h>
! r! C7 `% B6 f6 D1 r! K#include <unistd.h>
' o& E- n" R" m#include <sys/mman.h>3 V& |: k4 J1 o
#include <sys/types.h>, L8 Y" O `8 t* \2 d3 b
#include <fcntl.h>& T7 F7 k& c9 J' R8 K1 A6 w+ J; d! s6 Q
) }' k* S( Z9 p) c, |+ o3 H#define SHAER_RAM_BASE_ADDR (0x80000000)# i# S5 N) D# {) z$ k
#define SHAER_RAM_SIZE (0x20000)
6 Q/ p3 W! i% z# o+ W5 [& c: ^7 F
/ c' p s& W+ c9 x& n. Ctypedef struct0 e( I* }& D+ V9 g: R; o
{
3 x! f+ h: ]- B5 ?& ^ unsigned int a;3 ~# U: q$ ~: c, G$ l5 e2 s
unsigned int b;" I. e5 n8 T& w* ?3 [
unsigned int packet_cout;
k# ]5 y+ Q4 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) C% {, ?- `1 C6 {+ V
$ }9 l- @4 h" d0 f) Y% u3 d: rvoid read_MSG_buffer(int *baseaddr);" ~6 w& C+ O6 I* r5 W, P: f
unsigned int count_copy = 0;
5 S5 D5 W. l3 |" \. ?% q4 v) N* X2 g
int main(): a0 z v* X) i
{3 m# Y8 `" f' d4 h0 o1 i
int fd;$ E) }+ \. f6 ?+ x
int *mem = NULL; b! H% a. b- E8 o4 ^9 f% O
/ h$ ~) z; `) ^
if((fd = open("/dev/mem", O_RDWR)) <0)
& Y# [% l0 n! c0 n+ ]& d$ u+ R' G% I' Y {
7 O% _( w1 t! r0 C# {1 x; I, B+ G+ u( F perror("open error");. P6 r8 m$ s' f5 _
return -1;1 P" w4 x* s) V
}2 |# [( i2 d `
7 |* \7 f1 g# T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! l. O7 _$ H' s, r7 {. ^' h
8 T/ Z" o- G. t! G A while(1)* a, G9 H! c9 C/ a6 h& N
{- s; p. k3 _% V" ^3 }; i7 U8 D# g
read_MSG_buffer(mem);+ C$ m+ Y' h; W
}
" D+ ^ z3 W7 N3 }* q% G}
5 B% E7 i% C, i$ S8 V0 C( l: T, W% f0 i7 n. @
void read_MSG_buffer(int *baseaddr). u" n3 f& |& `1 C) O
{& {: ^4 ?/ p/ b6 O
pRX_MSG_PROTOCOL pshreRAM = NULL;3 X! N4 A. X! c# q+ Z# }4 v
; Y7 p; Q, E* Y% c! w3 j pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; ^7 C% K/ R9 ]. O% S
/ @; a3 m, Z: Z" l1 S2 o" z7 z
if(pshreRAM->packet_cout != count_copy); X1 T3 L/ ], a
{4 J8 U8 I' F9 l8 V. \
printf("a is %d\n", pshreRAM->a);
' ~: G3 }/ a, L2 G6 c: l5 u printf("b is %d\n", pshreRAM->b);0 m; d, u7 ^# l( M* I$ X
printf("count is %d\n", pshreRAM->packet_cout);0 a. \. W% I% D, P0 r F. Z
count_copy = pshreRAM->packet_cout;
( Z# L: z- P w" f* D: J }) a2 L5 m$ E @! Q* P
else
$ B }2 Y* n# }1 F {
$ z7 r! ]) J* c0 z% c) Q printf("No effective message!\n");
: X6 o3 c4 D: h }+ F' b' ?6 v3 K. N7 m% h
}; U9 @0 b" @6 o# p/ P! J
7 E- w; q# ?' ]) X* [0 p没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: @) b! y* r- j& B: g9 d$ z" R) X- \: U
5 G, B$ O+ _" y8 ~' S
$ H8 ~; e, M+ H" g6 s/ |* u
# e/ F. _2 _6 U- l! p |
|