|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 B6 } F I7 ]* L. o
- z7 X$ @; N% O9 d. X+ m6 l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% N9 ~7 r: J; F, g7 h# P2 s1 s
#include <unistd.h>- I) J N( ?7 L8 E
#include <sys/mman.h>
8 f% r4 L9 t! y# f0 _7 t#include <sys/types.h>* ]5 ^- ^5 m F8 e
#include <fcntl.h>1 E8 B6 s# M3 D
' ^! f2 E# ^/ i* [+ G1 O: \#define SHAER_RAM_BASE_ADDR (0x80000000) ( K# I+ L1 H$ a
) L% {% y: j3 `$ |) Q6 ~typedef struct: T: a% i, j( _4 c6 X
{* `' r+ ?! c# v" C9 C
unsigned int a;
; O2 s0 B u: F2 \ j* t) ~ unsigned int b;
0 Y7 w5 k& ^0 J# F# X% |( o unsigned int packet_cout;, q1 u/ Q& T7 ~; ^ \6 w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' u, Y- j2 m' K0 }/ a$ ?2 |4 k: N w0 A7 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ \; o. m. H. i5 |) v2 t0 _* |unsigned int count_copy = 0;+ V, c, d- }7 [* h w6 r
% z9 \9 ~" J( i3 n+ W( q
& S0 n6 O! h+ p; U5 ~4 \+ U
int main()" A- X' Q, ~& A ?7 \
{9 `1 E/ Y4 T) b' r9 F2 G* ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 j' r* @! [3 a4 y! x* t E3 W pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& S: a! M* F8 e0 r- n
4 f9 I- ]1 \- y) ?6 y) o# G while(1)
" P6 k: D' s" E# {: H0 h. o; Q; g {+ L8 {( v b4 e$ {9 X! t u# O
read_MSG_buffer(pshreRAM);
/ E) Z5 }1 Q* r9 F; ~ } ' [/ R" y; u r. k
}
1 _4 n) F( G1 Y' h+ X9 `
* Y7 o. m' |0 t) {. E: dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! d& c- U8 X' J{
7 B! b2 o. e- z RX_MSG_PROTOCOL buf;
- I7 i! o3 w# b$ A" \3 ?5 w; P
2 K9 w& ~1 Z/ ?% D. T0 W& l3 E buf.a = pshreRAM->a;( Q& U: t! f- j
buf.b = pshreRAM->b;1 B6 X( _( e. H
buf.packet_cout = pshreRAM->packet_cout;
$ {$ ~/ ?6 Y& u3 W0 \4 H2 S
4 Q- O5 W2 [/ G$ r if(buf.packet_cout != count_copy)( [8 l7 B& F( k- G/ m: g4 ?/ n
{+ C, {3 u& z- p" K: V9 y
printf("a is %d\n", buf.a);$ m) i' L9 F7 W! h9 l+ y6 p
printf("b is %d\n", buf.b);2 ~) t* i7 V: ?# b
printf("count is %d\n", buf.packet_cout);& [4 \# S/ ]7 o& [) l, w
count_copy = buf.packet_cout;
) d' `% x+ K; A( M W5 Z0 @* W }
8 v0 L' v2 a6 H+ ` else. g5 Y* P; f* ]4 y$ h
{* Y. r/ u: x/ c) u+ e( ~
printf("No effective message!");
5 K0 A/ t- X* j }# i1 }0 K- b% P' Q2 x: _
}
7 R3 X1 W: p3 a8 U
- @- T6 D* I" Q; L( e9 J
: f/ r9 P2 F7 ? d, P ~( V但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) M& ]! @4 B4 V- O$ ]- o
使用下面代码,对内存使用了mmap函数后:
% X' ?; T |8 \) Q T#include <stdio.h>% E6 Z! ?5 `8 G
#include <unistd.h>& o3 k% g' C. j3 m
#include <sys/mman.h>
0 D; y8 P4 Q$ m#include <sys/types.h>
5 U7 K1 h9 b2 T) n9 y#include <fcntl.h>
% n/ D& I6 e& ?# R% |) D; s* N' G6 B3 d5 n
#define SHAER_RAM_BASE_ADDR (0x80000000)- v5 N8 h, y* @5 C+ s0 a' n
#define SHAER_RAM_SIZE (0x20000) ' p7 E+ ~+ Y' G
5 L. N7 V& E! n7 ctypedef struct2 Q) l- I1 \2 r" W6 P2 h$ g7 q; U& |. U
{
0 o6 s' z: @ U$ [) p5 ~" z$ B unsigned int a;' G y {+ k& Y' x2 c/ y
unsigned int b;5 E/ w) f ?/ F4 \% k$ Q: v
unsigned int packet_cout;
" ^& G6 f# a$ G/ x0 x) V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' n8 o* `& h, Y; r
# {! H% K( g& i3 z2 {9 z" I5 Tvoid read_MSG_buffer(int *baseaddr);6 C; A. N) ?9 Y
unsigned int count_copy = 0;
N! j, q3 ^6 Z( g3 N
+ A) y- R) ^# e* dint main()7 V* H# b* X" ` ?* A- g- V
{, X z( d$ j' g) b7 Z, N
int fd;
1 u: O5 a6 Q* g int *mem = NULL;6 |5 Q+ A" p" E
( p6 n3 B% F5 \* O
if((fd = open("/dev/mem", O_RDWR)) <0)( ?1 S$ u$ v: D7 H; x" V6 X1 e
{$ c$ o3 G; V& i0 O
perror("open error");, v5 C- q9 Q" c. n
return -1;8 B& V& P2 z0 Y% \, A3 O" ^
}
/ V" G* n& z; B; I+ ~8 ~4 s6 @ . @: T3 j7 O5 |% Z' Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" ]# f/ u$ w' z6 k8 F4 r; B6 S6 j E' x' I
while(1)' j+ n7 G6 u; t# N: X4 j2 l
{
7 w, a# [9 }$ i ?: i9 h read_MSG_buffer(mem);
0 a* o9 I* r7 B } 3 j( w% H% j5 \$ N/ l
}3 X2 o* {6 @* B. A
# P+ H9 _/ ?- ]+ g- O9 yvoid read_MSG_buffer(int *baseaddr)
- D, D5 h4 i6 I{0 I/ V! j7 c1 E' S e+ V
pRX_MSG_PROTOCOL pshreRAM = NULL;
], H! K7 j; b6 { M
# d' h2 g0 f" V0 p3 U a pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; j, B3 D% `1 {
8 Q% v% D5 Q- g; R2 K if(pshreRAM->packet_cout != count_copy)
0 A: I5 ?6 t p. n2 _, D6 U3 y7 Q; ~ {
& B% W" b" g4 `6 q: l4 a printf("a is %d\n", pshreRAM->a);' T8 G) s, O/ z4 t0 M
printf("b is %d\n", pshreRAM->b);1 ]9 b. n+ ?8 E% N" C5 X
printf("count is %d\n", pshreRAM->packet_cout);3 J2 c* h! a! S( I( E
count_copy = pshreRAM->packet_cout;
$ b- L" u! A2 Q }! s% S3 {1 \0 K' T
else2 x: } K7 M3 A& q b7 N* U: I& S/ L
{
% o2 _% d# F' T. v9 X% W printf("No effective message!\n");. d% I0 h* c! _* \
}$ P; }$ u1 T4 g+ W# @; x
}' {! g' u Y+ b( S# F
- D1 g3 ]1 s; r! y3 d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, @; Q- n6 u9 C F3 w0 w& A/ a
4 Y g% h# n/ Z4 @8 n5 `% V0 J# Y9 {' ]7 G, A3 j
: d9 H) e( l( ?. x# i, J( b2 c* Q
9 b" {+ B# o& d: k |
|