|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 h& D5 D; g( L* Y- c8 f$ e* r
( A) r W: y/ a* W# yOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 v4 v6 T5 F! J0 B0 a#include <unistd.h>0 L9 u+ e( p' L3 G2 {. S5 I
#include <sys/mman.h>
" n# t9 y) N2 B5 [6 y* Q#include <sys/types.h>
; g0 j3 o, ^- o; H5 b- H4 B j5 H: _#include <fcntl.h>5 S+ \9 w$ N N, i' }- \
1 {- @3 n8 a4 z0 p2 C6 F
#define SHAER_RAM_BASE_ADDR (0x80000000) 8 ~8 B" O" O8 @0 U
. s& J: F0 k x
typedef struct0 [5 H3 ]0 t3 V" T( U: O4 A
{& M- K$ ?0 a: O
unsigned int a;
! E, v! P V! e1 j/ Y% w unsigned int b;
$ _( a& ~6 \& `: } unsigned int packet_cout;
& _8 c" ~) A& i$ J/ z7 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 }& c9 K% ~( @& \1 U7 t0 s4 X! Q% ?: Z8 o) h) [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% w( ]/ J Y' W% c9 V: m
unsigned int count_copy = 0;, {- B& E5 u' N
, J) ^3 z. n/ V/ V, ~' V, q
; l/ e7 ?" Y$ I0 i9 |: X$ v6 qint main()3 ~/ c, S# j& \
{
0 U3 W9 V; |) d: F/ j pRX_MSG_PROTOCOL pshreRAM = NULL;
0 M7 F( G) J2 Z5 H pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( z( i6 r9 t4 M3 [( b: M8 \9 B% `. k `* {
while(1)" q* A. k! y+ O3 z, O) ?% G6 c
{
( h: X, W5 ^; U2 M0 z5 t read_MSG_buffer(pshreRAM);
! Z! y2 B- L- f* ^8 {; k }
+ o& ~1 J: e) J7 Y2 j/ ?/ c; a}
/ o. \5 J- N! L8 v0 [5 j ]9 a& P) p7 B9 {) \7 Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 V( v3 o# [4 F; F5 t# H
{# s5 y8 y3 b) p) P ~
RX_MSG_PROTOCOL buf;: m& k! j, F9 \$ o
# V8 ?/ n" `6 J' w/ k1 x7 V buf.a = pshreRAM->a;, K4 O% S# a5 ~, e
buf.b = pshreRAM->b;
4 U* x: W9 }' n# r buf.packet_cout = pshreRAM->packet_cout;" H4 K* `3 \/ O: |9 f. [
. Z5 s; V) Q4 P: e& p, ]
if(buf.packet_cout != count_copy)# _( M( C. ?' U# Q9 V, K
{
' y4 E5 X$ {, @$ | printf("a is %d\n", buf.a);& ~- X l) C1 D/ K
printf("b is %d\n", buf.b);
; W. F7 [2 a8 k4 M+ U+ F7 b I printf("count is %d\n", buf.packet_cout);% E5 G+ u$ X3 }# ?' g' ]
count_copy = buf.packet_cout;- C& a8 e8 L k4 r* R
}5 t/ J- B. h, I- R. W# @; p* K
else/ `9 Y( Z5 u9 o+ ~+ z3 A( r/ p9 M
{
; M F6 p7 \$ J7 ]. t printf("No effective message!");
8 C9 Y; B1 \7 ~" v( m m8 ` }, P( E- i1 |% ^# ?- Q) M, {; x
}3 o$ h+ ?8 n% X7 r- V& z5 h/ p
4 T' a, H4 E. d; i
6 y2 o% P! o( W* v9 K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 B" N. M! W6 v8 x- S% K使用下面代码,对内存使用了mmap函数后:
! h3 p7 o( k# H3 A8 p9 f#include <stdio.h>8 b/ [* t6 M+ D( r8 i: `0 L5 G
#include <unistd.h>
. m# j( I6 n# ^# I+ H' M' s#include <sys/mman.h>/ S; x1 |# |# h2 o: Q* J' U* {
#include <sys/types.h>
; Q& f: x7 i5 R9 H& g/ p#include <fcntl.h>
( X6 E* I! M* p; C0 U) a6 X
7 k& S& P# z; X, @+ F% \#define SHAER_RAM_BASE_ADDR (0x80000000)
1 a, J. F5 C" V, P9 u* ] j#define SHAER_RAM_SIZE (0x20000) ; M( o# h/ f' t" g
' E0 n# Q, x, l- A2 W, T1 qtypedef struct4 q9 {. O0 q6 E, }
{
& g; ]; _% i# V( n unsigned int a;
* K7 Z9 P& L s3 Z, Q5 e: o" ] unsigned int b;
( b. P8 h* M: ]- H; h; g9 _ unsigned int packet_cout;
' ^6 a2 ~% ^8 k7 x; ~5 R+ z" A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ Y+ o# `! l8 t) O( }/ |9 i8 d7 X# L; [
void read_MSG_buffer(int *baseaddr);
, ]/ m! F. T$ r7 Z4 H" G; }) K( ?unsigned int count_copy = 0;/ L- n( u+ H& M7 J
. m% t. m$ s5 ?( T! q0 _5 Iint main()& x8 ^# y( U, e) \8 x
{) p; l* r g6 t* v
int fd;
% R. E. ] r0 F) [ d8 l! J int *mem = NULL;
, s% X6 \2 A: z0 l
4 A3 u( l6 ^9 N8 I( k6 g/ E9 o if((fd = open("/dev/mem", O_RDWR)) <0)1 j( i3 g+ \# W7 A e
{
9 T' S4 z/ L# z( ~ perror("open error");
2 K1 _8 n& X. z6 U! [ return -1; d" ?- H, G7 p9 [! Z& b: ?
}
) |( [" R/ G8 ]) K5 j7 [& w' t. | # t# r* b- @( A" ]
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, k0 U1 c( V% L/ n% G9 k% i
9 K2 a# E3 E; F* @
while(1)
, O- z; `0 B# a: C, P: U {
5 U% ?% U$ M o' {7 R- j read_MSG_buffer(mem);
" k8 f) a4 g' A% b- p, G- F' f2 r } # i: ^& V! |- _
}; `7 G: h0 `2 G$ G" G1 k9 u
8 F6 ]( ]+ x J: s5 a, Mvoid read_MSG_buffer(int *baseaddr)
- X: ~: u+ i- s4 Q; [{
* Y6 }# h8 I; s2 k/ ^9 c1 s pRX_MSG_PROTOCOL pshreRAM = NULL;, B. F% A/ z$ h: V# H# a
# n$ t6 x) d; I7 g4 A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 ? p" x* i' D3 ?8 f9 B. P
5 i" ]; t. e/ S: r
if(pshreRAM->packet_cout != count_copy). v" r9 N1 w* D" Z2 A* U# e
{+ g0 d0 k6 _/ L( D4 t. }' q# j4 {
printf("a is %d\n", pshreRAM->a);
: y* w9 |" x0 T% c printf("b is %d\n", pshreRAM->b);6 @0 \) q) N8 V. s+ T0 b
printf("count is %d\n", pshreRAM->packet_cout);7 K8 s, `2 N7 L' R
count_copy = pshreRAM->packet_cout;
& J; |! f$ q& D. I: M5 j }- f! K1 S0 A, I( N
else' Y3 w8 X0 O! n$ X* K
{! u$ w9 J' w3 q/ ]! o
printf("No effective message!\n");5 w% @+ u/ o" T5 T9 z1 a- E& e
}
2 v2 X0 U, v/ _, b$ P}
# N. B# B# Q9 F: M
+ b& ^; E0 E1 a. y- _没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" M4 _+ J0 w+ t9 t; I( D( y3 ]6 o* ~! B6 W! n) G
$ g) w. l4 M" v9 \$ b% T0 B1 q. q" q* b4 a
$ x7 l5 M, p1 D* ?: e* I |
|