|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " L2 y+ Y& f/ K: S; q$ I0 ?9 v5 C% p1 z
r" B* P6 v, z- @5 f; J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ Y9 D1 o2 f9 L. Z+ d v" L- l#include <unistd.h>
+ I6 a. I( e( \" ~) H#include <sys/mman.h>
- z3 t; r# M8 c$ F+ p7 g, j#include <sys/types.h>
* S0 \% J& k+ o7 b' K" `! a6 O& T#include <fcntl.h>
% K; \6 A0 a+ {3 B& P
. G2 z- ^. N! n% }2 m9 s: O#define SHAER_RAM_BASE_ADDR (0x80000000) / D% }( g! i2 P% f7 l
* Q" x7 C9 Z1 j5 `typedef struct
7 y! G0 W) D# E R% E{
4 P& ~: Y; g' C( B A4 \. ] unsigned int a;! `; l4 B2 S6 e6 y5 Y" V; ]
unsigned int b;
1 E7 U% ~& a# `3 F unsigned int packet_cout;/ E. u2 t* ^* k0 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& ~1 E& @+ j) b8 }7 M7 j
5 Q) o! ^( t( `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ u& T% K3 X7 G1 v" w& |unsigned int count_copy = 0;$ ]% t) _) v) c4 [3 f* Q8 O9 ^, Q# Y; o
1 g% b$ P$ s# ~" Y+ F
% Q# O: ~ g+ o& R
int main()
; G" k' J" e0 V5 |& X{' ]6 [: n9 @* T7 Q9 Y7 k
pRX_MSG_PROTOCOL pshreRAM = NULL;
* D3 z6 p: e, e, p* [: ?# q pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ e/ c3 f) ` S4 }$ p9 H0 j4 n
/ P% G @, s; q ^) E
while(1): O- p7 b+ |- r1 ?# s7 N. g% t
{
8 D* [/ S }% R+ { read_MSG_buffer(pshreRAM);6 p- |" T! l5 y# r; f: Z
} : Q! v3 j) A+ S5 K! s
}
6 n) o7 B; ]! M: f
0 A* C. B$ j6 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ z, `( E) e0 ?4 c' L- `' ?
{
, l) Z+ h( A! W+ P' j+ m$ ` RX_MSG_PROTOCOL buf;' @; }* }7 D; G2 p- X, Y) a
/ G5 j* b. I. {5 F) U
buf.a = pshreRAM->a;2 X# y5 G8 Q9 G) I- `' J/ y
buf.b = pshreRAM->b;
5 B8 G0 a3 ?& @/ j buf.packet_cout = pshreRAM->packet_cout;
# S# u( v7 X: w4 h3 f1 w( x 0 K/ X' c2 ]/ }
if(buf.packet_cout != count_copy)
% u5 Z5 w( L8 u0 S& c9 H7 e+ j& R {
/ ?- z) f$ I/ C K+ [ printf("a is %d\n", buf.a);- z: O0 F5 Z4 O8 U) m1 w+ u& Z
printf("b is %d\n", buf.b);
8 B" O- E1 n/ | printf("count is %d\n", buf.packet_cout);4 u/ Z) Q3 }; z& P3 ^
count_copy = buf.packet_cout;) A, j8 T1 \4 ?5 U1 J9 V- }2 l% g
}2 i1 F8 g3 e- \5 y: o2 M
else' w' U$ x% v/ A9 b/ g
{
, z" [8 @% S- N5 r; B printf("No effective message!");
8 {5 z e5 G0 L, c+ n2 A+ B0 U5 t }
: g0 j( B) \* [( T}5 b4 [; r# l. A6 e: k! }" D
) t1 v0 @# d, H- E# |. Y
( K5 b0 h$ N$ }& V; K5 `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ ~# Y: q2 I( Q6 ^5 @
使用下面代码,对内存使用了mmap函数后:
1 y& V" x" k& Q+ d#include <stdio.h>( E- U2 X% F# B# L
#include <unistd.h>
1 m8 g8 X0 F5 T- o! J#include <sys/mman.h>5 @# L6 R& l/ }1 k8 Q) L6 s- \4 d
#include <sys/types.h>
& n, P0 }, z# ^ V0 {#include <fcntl.h>
9 c1 ?: Z9 F# f* m7 f- ?' m, |/ ^1 L( k2 f
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 b, W; I/ g& d#define SHAER_RAM_SIZE (0x20000)
% O- Q9 v z8 L& n: V9 T* }/ F( H M8 ~$ {4 G
typedef struct
6 z6 d$ b9 N4 @6 W{- j* B8 [% _1 @+ q2 O5 V
unsigned int a;3 D5 A1 E- `5 j* Q& o
unsigned int b;
; G" Z8 C8 A$ {/ K2 z2 O unsigned int packet_cout;
. Z5 f0 r- G* L6 l) N7 m- x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* G4 m* r# @ u; x3 c9 O9 B: D) ^9 S
% o' D& `( T* e6 K6 Bvoid read_MSG_buffer(int *baseaddr);8 C# P ?2 j$ G, K& p) f
unsigned int count_copy = 0;$ ^% x! I. V4 x; [
$ v5 n n y: R: u |
int main()
) f* [# m6 ^( ~* h4 [{; p1 K r, J7 o7 _; e
int fd;; W5 Z& s& i5 G2 h* x' d/ [5 S
int *mem = NULL;5 L, h$ v& C9 l6 K1 M5 A( |: b; F
# I% z2 l8 p- N5 Y$ i1 v! u0 N if((fd = open("/dev/mem", O_RDWR)) <0)/ ~# f& s8 `, S* L( F1 U( f* ]
{
1 M( ^( ~8 p* ]5 P2 g; p1 \) i perror("open error");
+ T6 u3 t1 \2 ` | return -1;( V/ K6 R: l7 ~2 c7 O( v
}
' [- U! K) i& V7 ~$ V3 t) ?5 _
9 F5 S" D4 P1 O# R mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
c! p9 w3 R9 N) c' a7 k- O6 Y! e' `/ \2 N
while(1)2 L/ W' ^! L+ O' g9 @6 U& W! c E
{
1 V1 }: S0 m& B5 d$ x1 U( V read_MSG_buffer(mem);
, O" N! ]2 P' j9 T3 n: i }
0 ^9 Q: j% Y4 m3 Z! v; }5 L}
6 E! |9 O! M* l8 |6 |" @2 x
0 S% F1 M7 i% ?+ H0 W5 Bvoid read_MSG_buffer(int *baseaddr)
5 ^* T0 y4 s0 U$ z$ U7 U& h( r1 p# \) o{
- t3 C& v0 ]# }5 Q+ u5 }+ P3 ]+ u* u- t pRX_MSG_PROTOCOL pshreRAM = NULL;: `/ m( W# g, {+ i- D6 |. h
2 `5 d7 k0 x* l2 _6 I% @: d# [. }; o. U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& U4 G( }/ d# e( _$ S3 k( l: x( J! ]- ?* W8 y a+ v" h3 h6 o
if(pshreRAM->packet_cout != count_copy)) d K/ Z& p+ Q o& u6 ?% O9 ~
{
% K4 [1 E2 b. M# V- R& ]9 Y* o) d: l% Y& _ printf("a is %d\n", pshreRAM->a);
, E6 N. P3 B1 R7 ^' S printf("b is %d\n", pshreRAM->b);! ]# N& x2 C7 r! h
printf("count is %d\n", pshreRAM->packet_cout);- _8 w4 L3 z7 m h
count_copy = pshreRAM->packet_cout;; L: ?; {( [! c8 o/ Q; q: R
}: y2 ~# `) ]1 @2 c3 p
else
* v8 S0 v" d# l) n' {- F& |! r {
9 l- B M1 f- [+ M- d* x printf("No effective message!\n");
) H' Q7 f4 e8 {% s& g* m7 G4 O5 S }8 f' }' R& y2 H8 O
}# {! _: p" w4 U1 b! p) a
" L$ Y# S8 `3 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, h# ~) p; Y0 @
8 V/ R5 S5 M5 V) a3 H6 L
9 i& t: g( J* S& ^( m; m5 M% l3 D Q1 h0 z, W
" {$ i2 u' n, S: W- U' F |
|