|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , ]& Z: Q3 z0 [/ O. j
$ l% A) A2 s" q7 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># O+ x$ s& O9 k2 p
#include <unistd.h>
& B. F3 s" Q6 Y% O! T5 }' }: b9 D#include <sys/mman.h>
( s* ~/ k% B0 N3 l#include <sys/types.h>
) j2 D/ ?) d) |6 n# `: w#include <fcntl.h>; w3 {, A5 q& q
% _' \1 M% |& g3 j4 f4 v& y" R: n
#define SHAER_RAM_BASE_ADDR (0x80000000) 3 e. g$ z8 P# z# Z
, M7 V* @; F; N4 T/ M, Wtypedef struct
+ ` n, L+ Y+ O4 w- v+ O. ]{
0 Z7 Y* k& v6 K) B$ [, H6 A+ q) U unsigned int a;
2 [8 Z+ G# n1 A9 n* t" o5 f. i$ U unsigned int b;
9 Z+ b' P$ f, G6 a2 D K Q7 S unsigned int packet_cout;$ E; n2 Z, {/ N+ A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( M6 f' L8 _1 a
, A; i) S" l! v& kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% _% q$ C- A7 E9 Iunsigned int count_copy = 0;8 Y) ^7 K* h/ v6 {4 l
- [: [5 n; x9 X
6 h' K0 ]) `* M4 _/ z$ Bint main()& Q% r, p, ]6 v% ^+ H! ~
{8 K+ B: { X$ t' [7 c8 C' Z3 f8 g, u
pRX_MSG_PROTOCOL pshreRAM = NULL;8 W) p# i) ^# m' a5 N( ~+ S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- B1 o5 \( a, N
, s4 G8 ^& n# o1 U( i while(1)
3 T* o; V8 e1 x5 H9 O2 r* ]. q! M {
% b, f5 x+ [# _! f3 C. M7 _" u- T read_MSG_buffer(pshreRAM);
5 l- i% d* L7 b3 v" J4 } } ; W. I) T6 u4 r
} }8 e2 q1 e: T/ q" _8 N6 ~2 e+ o
2 d/ `5 @) e" h' |! w' Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) o( i, f) V4 V5 L- W{3 w3 [! q4 q" i3 L6 N: O3 I1 R6 s+ J
RX_MSG_PROTOCOL buf;
/ ?2 d0 L* w% [) m* l" d8 V / m7 m/ i/ q9 o
buf.a = pshreRAM->a;, {# f1 C. W U2 }1 w0 [
buf.b = pshreRAM->b;5 }$ O6 H% g1 M0 |4 t8 i" D
buf.packet_cout = pshreRAM->packet_cout;/ [6 ?3 M- U# z. g' e' @7 n* ~
+ g; m$ p: G9 b9 F' G. c' e# t( d if(buf.packet_cout != count_copy)
0 I% z. D1 \' w5 d5 h {+ t. _! y( v' R+ U+ r( M" s
printf("a is %d\n", buf.a);7 j: P) b/ x* z0 j/ } A7 |+ @+ Z8 a
printf("b is %d\n", buf.b);) ?% e! V2 ~ V* @" j$ q/ [ a
printf("count is %d\n", buf.packet_cout);2 I$ z0 k# B! L0 ?' \+ F9 P
count_copy = buf.packet_cout;
. w0 O5 j+ Z# G8 R6 U+ I }
`! f& T9 N, T# D' X" Y2 ]& | else& V' I( ~5 J8 c
{# Y% V' s4 R- C2 a
printf("No effective message!");
' i& t! r( w9 L7 a$ r i }
+ ]6 P4 X) R9 y% T}2 @+ ^) K/ n- \9 r4 }
" T8 x6 G; \/ k! U& I, S$ ^. l2 F9 I1 n
/ u2 q& Y. J* v2 p) g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 Z- b3 I# s: `8 K3 \
使用下面代码,对内存使用了mmap函数后:. ?, P m& o* H! F% l
#include <stdio.h>5 c( T8 X! f$ t; ]; s
#include <unistd.h>7 P1 f) ~$ s% h% n" q* U7 a
#include <sys/mman.h>% u% @& `6 W& G; @; }( b
#include <sys/types.h>
; X& `1 R f4 O: }$ k#include <fcntl.h>, V/ V& G- ]5 ^8 _
* _* z0 z0 ~ b5 w& u" A
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 ]6 ^' q( l* |0 F% M% {! M4 y#define SHAER_RAM_SIZE (0x20000)
) L7 x/ y$ R* V) L0 Z
, U. G: ^9 N5 v, T& {8 k1 i$ l4 [5 itypedef struct: Q p$ ~5 B; x5 S8 ]+ \6 `
{
; ^ U; _# l. l: ?* P unsigned int a;" Z( T. w) C+ h; l
unsigned int b;: w6 l+ O. i d2 m3 H. _
unsigned int packet_cout;3 v" u2 V l) `" I8 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- B, U% Y8 k8 o! B# c0 ~; Y$ o" I% E/ b# i
void read_MSG_buffer(int *baseaddr);
- m0 C7 n' t/ Z2 _unsigned int count_copy = 0;
8 q) }0 u1 G" ]2 x% B. [; N) S
/ i+ J2 m: ?+ L6 ^2 Rint main() l8 k3 h2 \2 D- l
{
# z( g( Q$ U) Y) ]+ O int fd;
3 P) Q1 Y" _4 t int *mem = NULL;" u/ l6 p3 x" R! n; o" h0 {
+ q: s/ @) F% l: Y% r if((fd = open("/dev/mem", O_RDWR)) <0)
& e* n6 z9 s: X n- f/ [9 g {
2 m- e, m3 j* O" o- _$ i0 M. [ perror("open error");1 I @! W# B' g ]2 f$ |* L% t/ Y4 d
return -1;
) V- }) v& J. w( f" K* m8 j }8 C/ _$ I' n" I! p
- e$ W1 y3 `( Z/ S5 o* ] U) }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' C8 a+ ?- D4 v# T) J
# n: [8 h6 U' _- w. V4 t) @# y while(1)
) }9 @5 m8 Y; j- _% t {
" e: e% u4 l8 x8 i# O read_MSG_buffer(mem);
4 @8 C& C- D. w C% X } + Z9 P8 ^8 g6 n" U
}
7 g$ V# l. x' U' `6 M; n
( V/ H1 H i1 Q* F: e4 vvoid read_MSG_buffer(int *baseaddr)
$ w8 y: p- I: F) Z7 Y{
1 u% Y) Y9 }) F8 d% \- y pRX_MSG_PROTOCOL pshreRAM = NULL;
; y& [, Q7 P5 l& F2 ]% d
4 O6 C2 z! g- E$ n/ A pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# m4 N$ j& {' V" L9 j" V, p
% E, J8 O' j# f2 o& }! d8 d if(pshreRAM->packet_cout != count_copy)4 Z- m' \$ j5 Q3 F# G$ I# G* r
{
# [. V( v) o" l8 d printf("a is %d\n", pshreRAM->a);
# w9 _9 @+ a) s' m& \4 u printf("b is %d\n", pshreRAM->b);
* Z& r2 a! h" o printf("count is %d\n", pshreRAM->packet_cout);6 g6 F" L, l) w2 o) G' w* }& e/ @
count_copy = pshreRAM->packet_cout;% k0 K( I7 L$ {7 H) Z7 d: W
}
5 x; |! l+ A" y+ T& ~0 E8 v else7 B4 H) N- l' |; O6 V+ l9 w0 i& r
{% b: a( q4 q! w: e" z5 `
printf("No effective message!\n");/ C/ F) c) I( L" E6 j6 r+ a0 b
}
c, [' M; H. S1 ?/ Y+ r}5 j1 E2 r. M1 n% S
4 G; J2 y% |1 W1 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: m! ?9 _5 K& V& t) K G0 @% \$ V; p) a8 K0 Y. W4 t
7 X8 q% _. Y/ c" c0 e( ~/ t' H% p
) ^1 n9 \0 }) k8 p- _: [3 b8 C& R/ X3 j: T$ E" W" p
|
|