|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 F% g2 o1 j9 F" \ W& a W
8 X( g2 W6 f- c- o7 Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' B! u- `1 u$ p+ o2 l6 E
#include <unistd.h>* a1 L! P* Y8 ?6 Y* ^ A+ ?
#include <sys/mman.h>. b! w. M) l, T. [. `* J
#include <sys/types.h>& D u4 \! R$ T8 G6 W8 P) B
#include <fcntl.h>
4 P. N3 I$ X& w: T! G" Y7 S) {
( G' e, l q, C" L/ n. [7 q+ A, M$ @#define SHAER_RAM_BASE_ADDR (0x80000000) ; s" n$ W; \% E2 ]
3 R3 n/ B8 c0 S. a/ @' i: ~
typedef struct
3 b# Q/ K, \, A" R{
( l/ T! C p" m( A( ?: P* U2 G1 x" U unsigned int a;* e e8 x( {# l4 ]
unsigned int b;
1 k0 @2 q9 V- R unsigned int packet_cout;
' Q2 k" p0 {& t Z1 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. f9 @, k. f0 P7 F7 B
1 N9 [2 Q3 G/ [# i7 M* Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 o' E8 }! ~/ e8 g1 _$ }
unsigned int count_copy = 0;# a/ m4 Z4 @, a( {! a! ?$ q: l
, C! ~0 V) ~* N7 O
8 T% `' x+ `" E1 q5 |int main()
( C, X& ^+ M8 J$ W( V0 V- B4 {' n{! ^9 K* i m j; ?1 u2 c
pRX_MSG_PROTOCOL pshreRAM = NULL;/ H n1 i3 A. {3 l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! g1 G3 m* }% X0 `( M
; j! v9 b5 Z- [/ ^+ _) N! R while(1)
I. U# j. o: G. A {
8 q& Z/ o# x) b9 u' V read_MSG_buffer(pshreRAM);
2 f1 } g. j4 b. i7 _5 [: [+ [ }
( e$ s1 O0 @9 s7 `0 f% W}
& }; {. }6 ? x* U K/ d n& A: y6 V) X/ e% M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 Q9 c7 g& Z9 ?{
5 c9 `+ k7 V& f6 v# B+ P RX_MSG_PROTOCOL buf;
' P& ?/ ~, x. ]% j: y
6 f5 Z, U- G* ~/ }# E6 N buf.a = pshreRAM->a;
- H0 x) a1 }5 g buf.b = pshreRAM->b;2 ]" Y! _% J! k- h j. V
buf.packet_cout = pshreRAM->packet_cout;- l# J) C+ |& g0 S! T
* G1 }# S _' D5 w6 T
if(buf.packet_cout != count_copy)
, A. k4 L" K! M) W {
! ?2 v5 B; u( r5 Q. U D/ }" p( t printf("a is %d\n", buf.a);
, I0 v7 ?6 d6 |/ T printf("b is %d\n", buf.b);
& z5 t% V; I6 m9 o printf("count is %d\n", buf.packet_cout);4 X; F% X" W% `" b
count_copy = buf.packet_cout;
! b W' i) A7 b$ U$ H }& n$ Z/ P3 E- d% D3 Q; O
else
; [2 P3 K( a' b* R2 V0 U {# d! w5 o6 {. m8 I( }8 P
printf("No effective message!");7 Z6 J1 T9 n3 c
}+ a7 Q7 ~9 h4 _4 @6 R+ g2 C" `4 ~
}
5 p/ R; v" a1 U0 s. V9 v7 A: l# l/ }% b' n1 g S
" n: U# s Q. h; S5 @, h+ x+ [8 P1 ^! M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 c4 t8 O' V* _7 B使用下面代码,对内存使用了mmap函数后:1 s% f) s# @/ ^7 y
#include <stdio.h>
" B. r( ?: O/ F- @, } k* N#include <unistd.h>
; c3 C% `# Z3 B. _2 O% ~: V#include <sys/mman.h>3 c7 _, x% _; y; `% U) P
#include <sys/types.h>4 N$ e; M/ m, I7 ~2 N; M
#include <fcntl.h>
1 U/ F. q" I# Q- ^- B, F1 E p) z# {& _( `' Q7 O9 \! u1 n* H
#define SHAER_RAM_BASE_ADDR (0x80000000)
# v3 r2 b. X- [6 m/ A7 R#define SHAER_RAM_SIZE (0x20000) ( ]) E1 k/ l- T
# ?$ L% t8 I g5 |
typedef struct
2 O+ _) y! [6 |{
# W6 e- O! j6 n8 _$ p% W9 t( @# b4 i unsigned int a;5 b1 W' \, I0 Q( ^" h2 o
unsigned int b;5 o- ^5 a2 H8 E" B9 p: Q
unsigned int packet_cout;
5 p# o& h. W; o2 ?! J0 Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; O' F. C' c9 b
7 O3 T% ^9 g# j* fvoid read_MSG_buffer(int *baseaddr);
) L {: M, P h7 z9 runsigned int count_copy = 0;
% Q1 E* t: ~! s1 N$ e3 v. Z
6 `3 F8 N* C$ jint main()
; ?2 ?7 u X5 X) Q. p# `5 P{4 E( B: r7 h9 I7 l
int fd;7 h5 H/ @5 J+ _6 s, N4 ^; w
int *mem = NULL;& n9 ]% G+ O0 t; a. x% V0 h
; ~" k2 } {8 i$ F% V0 t
if((fd = open("/dev/mem", O_RDWR)) <0)
! K! z7 ~2 W/ C$ d {
* V$ N$ S x: Q$ Z: P3 H) x! U perror("open error");
2 L" Y+ I+ ?: ]6 }+ w/ v M return -1;
1 L1 F' a6 W1 q/ ?) R }
- \# O' \- N1 V4 ~! c/ z+ s' j & n9 N7 h9 H% r; p
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 d2 @" I" j' j9 G3 Y6 @6 _- W _0 [' |. d2 q, {
while(1)
0 a8 ~& E& h( A* `* @) t% x {! m/ s3 ?+ K5 ]
read_MSG_buffer(mem);
; D3 V9 L& m+ k. x } ; T3 P4 O9 z. S" }, R3 a9 u
}
. \1 X5 a" X l9 P5 S8 z) ^4 p& j
void read_MSG_buffer(int *baseaddr)+ u9 G8 R: A9 A8 l' {" k/ G
{9 X3 M/ Y7 t. ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
) p I, ]% y3 A4 P: @2 a
. M& L' f7 a- e7 x pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& f( y1 ?, C4 z' q# j
7 U- r- e0 B7 C. j) o if(pshreRAM->packet_cout != count_copy)( m$ i3 O- y" {0 U8 l
{1 Q6 V' o7 x1 k" p
printf("a is %d\n", pshreRAM->a);
4 O, o: ?8 G( a printf("b is %d\n", pshreRAM->b);
8 x. D H7 |- p4 V* K8 M7 a* K* X7 h printf("count is %d\n", pshreRAM->packet_cout);- M/ o% T S6 Q% d# G
count_copy = pshreRAM->packet_cout;
; [/ {2 p8 Z; `& p) Z4 |9 e }
% S) E$ r9 ], J& v; W9 S else
8 z, T# l9 Y; j R: g( E {
7 h7 D: V/ E1 N3 U9 j printf("No effective message!\n");# S7 s" q; l* W+ _
}( i5 i5 ]9 n }' U; N0 [
}+ ~0 K; K/ P" ~0 @/ Y% I) b
, A/ r ~9 C! X/ q9 W- J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- b3 L: d( w# t E: r1 Q
6 x4 ^/ @) P1 y8 g2 @3 o( J
5 J# D( V0 I) n; o% F
1 ?- u3 Y) Y/ g4 X
$ e+ b4 {! D# P0 ?, i/ J4 P
|
|