|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% O4 q/ N9 ` X/ f% D& s# {* F) j# h1 ~" f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 ^" w- l% H4 d6 P& f
#include <unistd.h>$ n5 T* o, E, L% J& V* p
#include <sys/mman.h>
6 b+ x3 Z1 x0 G' k. f8 Z0 t! S2 f#include <sys/types.h>
8 g0 B0 r3 r% Z& t* v8 U; R#include <fcntl.h>
9 m* w/ F8 ?# l. K% |+ r/ M+ s8 R
& N8 ?5 Y6 f5 o) o+ ~' Q- Z#define SHAER_RAM_BASE_ADDR (0x80000000) * I1 S( K/ Y7 p& K4 c
, I9 I$ b7 Y7 S4 Wtypedef struct/ F& K/ s4 n p' o# s
{
) l1 E( G2 s7 y$ E unsigned int a;
8 H& Y2 C; G! u unsigned int b;& I6 N/ K# g3 `! u: n) \& w' n0 I
unsigned int packet_cout;
5 W K+ ]- }! {$ V1 E8 Z% S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 B; z9 N8 ]6 a' T; Y: X4 s
& D. Z4 `% t/ ^9 I! k2 W. Z4 Vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 ^3 f) ^# s C2 o* J, z/ f
unsigned int count_copy = 0;
+ `. a# r% ?# n2 J z8 v" @" W
3 |, `/ q% b- W
( [5 ` t- g7 S* Sint main()0 J5 u) r. \9 n1 A$ x& I
{- P. V: F2 D5 B9 i- C
pRX_MSG_PROTOCOL pshreRAM = NULL;+ T, V) y2 T) E2 c1 ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" s% g; T, j4 S3 r! ]; u+ W$ f) Z* Z
while(1): S, o" V6 Q2 x6 m+ X
{
! m- r# x; c! K' h1 v" I h read_MSG_buffer(pshreRAM);
) ]% G( k3 U( N3 ]+ b! o8 |$ s }
' T) {4 q E& J" D7 E}' C6 A$ F, v7 |# I$ [
0 c- a/ H, p* ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 _% j& L7 C/ e C" g% K- n
{; r Q6 K0 {2 G
RX_MSG_PROTOCOL buf;4 v) D( y2 q) _# q
! j4 c/ Y! g7 F8 F buf.a = pshreRAM->a;
* e \' I3 [0 h buf.b = pshreRAM->b;
9 W- q& F! N$ C buf.packet_cout = pshreRAM->packet_cout;
1 `' F5 D; ], |* f/ c
5 n; }: z" v# v. g0 q! a) p if(buf.packet_cout != count_copy): q- n2 a5 K( n' ^; g
{
) ~* x0 {& f) N# a( o printf("a is %d\n", buf.a);" Y0 Y+ E6 c) y _
printf("b is %d\n", buf.b);: G% F4 U3 T* E
printf("count is %d\n", buf.packet_cout);& G9 X" U8 P4 d$ Q- c7 g
count_copy = buf.packet_cout;
# {, c( B. e/ z' ^3 I1 a: z }5 l0 w, r$ r. C# }4 ^( \3 o
else
4 f1 O( l% b L; S0 a4 C {/ `+ d9 w) R O* b6 G* y# [1 f. ?
printf("No effective message!");
, u5 q, k* `9 N. C" } }8 S4 i6 n7 M$ Q J
}
. d, ^' S- z+ t) ?$ R6 D' H! b' M& \6 k2 O! V2 C0 U
" n) D3 @* r) t& |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 |- z- |7 ~- L4 [) q7 j' _( e使用下面代码,对内存使用了mmap函数后:8 _5 N7 I' ^9 I& k
#include <stdio.h>! R3 c6 p4 a! X" Y1 x1 t
#include <unistd.h>
( A, n" a6 V" J& _5 r#include <sys/mman.h>
. \2 g7 f) ?5 s# K \* L+ [#include <sys/types.h>
T% v7 n2 O" v: B `: z#include <fcntl.h>5 z B8 K0 _+ w2 y5 a* I
4 }( w5 [/ ~9 V$ ?3 u# M
#define SHAER_RAM_BASE_ADDR (0x80000000)3 x, n2 V8 |2 P) g( U5 R
#define SHAER_RAM_SIZE (0x20000)
! z# l; K, t/ X$ ?$ j0 R- k. [" v s
* W0 T( a' Z8 N5 v- E' b3 W! itypedef struct9 w& _3 r; c# A- G
{$ c) F& J+ {& e; v6 B/ F
unsigned int a;
+ @+ n" R x6 W2 R unsigned int b;
7 {3 h \3 S) w% R7 y unsigned int packet_cout;
y2 t. O* h5 r ^2 f, Z2 I2 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 O# o( I9 c1 F9 N
, r! _) I- X! T2 R+ [void read_MSG_buffer(int *baseaddr);
; `1 I2 ^/ @- ^0 O8 h: sunsigned int count_copy = 0;8 Z7 {5 A; T4 b$ J5 E2 z5 P
4 m4 N$ A+ R/ Y$ K3 Pint main()4 V$ X( J( P) L8 O! q
{8 `/ D) P" G9 a; q
int fd;
6 m5 \4 ]2 a9 j1 O: \ int *mem = NULL;
+ s( f- v& M: k$ E2 y# j5 Y; @4 l; d5 B
if((fd = open("/dev/mem", O_RDWR)) <0)
" a4 v) h, ]( [0 S7 |5 V- _ {2 d. Z: X3 s P3 v8 P
perror("open error");; e" o; Q. v. a2 z
return -1;
7 Y& D: E+ m1 T g* I8 I6 T$ s }( J- B6 ]' e# |
/ I3 V! D. C- t5 R; I& @ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ K% F* `4 N6 w! A( d2 W
' J/ e" R% p3 l& i while(1)
2 \2 l" r2 T" g2 a. U2 i; ]7 C8 A {
! Z8 q, @; d$ k* A I read_MSG_buffer(mem);, T2 i0 [: \9 ]6 } _6 V2 z
} ! T" z4 q" T4 `- J. D. f- U
}3 e( L1 x/ g8 B% P# m& c
4 h" S4 r+ X+ M, f7 Dvoid read_MSG_buffer(int *baseaddr)5 @: q' ^% J d- q. L1 O
{. m, L' S$ G! v3 y6 ?/ D0 Y3 o0 Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 `) J3 X4 }* `0 H
+ n. s+ K" p! V2 T pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: i' }5 ~# e' J0 N5 j7 t0 l
" |, u5 W) ~" O7 j if(pshreRAM->packet_cout != count_copy)
0 B+ G9 b8 c& X" }1 j: F' h {! B( w8 w m1 U" [: V$ O& `
printf("a is %d\n", pshreRAM->a);' T, G1 j0 J+ z8 ^
printf("b is %d\n", pshreRAM->b);
1 ^3 A0 J! a: O& U' x printf("count is %d\n", pshreRAM->packet_cout);& b7 I( a3 n1 l
count_copy = pshreRAM->packet_cout;; u4 s2 T, ~+ R) p% [1 M+ O
}
0 X. T! |$ ^- a& G% d/ L' M else
' b, I# w6 i- D! x {
% `8 a# K! m' Y' |; \1 ^ printf("No effective message!\n");
! `6 A8 I! n9 h7 j: } }
2 @9 o1 |1 A. x}
4 n H# E& j- \# J9 y# J$ S1 ]% D3 c: ~" x) I% b+ C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 _% {2 r( E4 b* w4 H" v0 e, @6 \
T/ s0 r" c6 l: h, N$ ~
# j" F; x5 }% @. ~0 _
: S% g# E4 o, S; v+ C) p |
|