|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * t3 T7 |7 O1 Z* l6 S' h0 b* b
X: }1 d* Q: n% r1 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 i/ E7 {. z6 G2 x; ^0 I7 B$ d% r1 G#include <unistd.h>; H2 ^- l3 a) J. ~
#include <sys/mman.h>3 j, \6 [4 d$ b# ~" p1 W0 B9 j
#include <sys/types.h>
4 B3 r' E/ ?; r1 N2 g: c0 u. k. q#include <fcntl.h>
+ k* m; ~* \9 ?. |, f. W- s* _' g, n4 g0 c8 U* m
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 F& W, B1 [1 [5 N( f/ p$ g( s* x; N3 z2 Q" w/ E/ i7 k# a9 G- y9 _
typedef struct
# x# D* s6 T9 |* w$ P{
: ~" M I# _% `! t4 M+ k: r/ b unsigned int a;# _/ r, v7 h" Q. I% L: a
unsigned int b;3 t: k* u9 A, r4 Q
unsigned int packet_cout;9 R9 A$ @7 n- X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 x A6 d3 s; v/ W0 U0 o" E# v" S3 ^4 R- O8 g: {: b- M1 O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. X* p4 Y2 ^. y6 S# |+ ]unsigned int count_copy = 0;
/ ~1 y \! V5 E, ^& g {7 y) `- ?3 S# \
8 k _7 h( L: G6 E, z' jint main()' D0 d+ _' m* o+ p. K' @4 d C
{
. b) ^' |& a0 v- m/ x0 C: v pRX_MSG_PROTOCOL pshreRAM = NULL;
/ q0 {' n2 q$ s pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ Z0 {$ c! k+ W: C2 N3 r- M' r! l% z
while(1)3 {4 Y1 E9 d! D: I( i4 x! }
{
# m7 x. z( n2 @ read_MSG_buffer(pshreRAM);9 S2 y! t8 ]5 L e4 X
} & Q. T: }( L( g$ B8 o1 h( g2 `
}
7 \9 p# X' e$ o7 A7 x( c' |' e0 ?0 u2 T+ w R& i) e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& Y* S# O( J0 d' i7 t+ h- E7 |4 W
{9 Q+ A# }7 R |( Y* m- e, r$ q: G
RX_MSG_PROTOCOL buf;
! D( {5 j) I8 P% }% K % M8 f2 X7 t8 Q4 w0 L
buf.a = pshreRAM->a;
$ f4 I9 b8 @# W) J1 Z% I buf.b = pshreRAM->b;
# R: h8 J, M& | buf.packet_cout = pshreRAM->packet_cout;
% ?0 A. i, x( d+ s9 R$ c/ p
5 a# P+ t' V, Z& H if(buf.packet_cout != count_copy)# g0 Y7 Y1 ]3 V$ X7 W4 v1 ^
{
/ e& Q; j! u9 u! p printf("a is %d\n", buf.a); t# N& C' J8 u/ h) o4 f) h
printf("b is %d\n", buf.b);
3 Q: r$ }! u9 ?5 u printf("count is %d\n", buf.packet_cout);
/ @! J* @- d( Y- a count_copy = buf.packet_cout;
- H8 @ w; E5 F }
! X" T2 ~' v3 R' k else$ k5 q% ]4 m4 e
{
" `9 ]5 ]3 Y8 Q printf("No effective message!");- |. B7 x- N- Y! W; W7 p5 p
}
5 E A; n( Z4 ]}3 T, i% D* T; m& d
# D m% y7 l+ Y F* |
4 T; | i) }, R5 u, Y/ l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ i, {; B' i5 _) y% d" ~* a! H& h使用下面代码,对内存使用了mmap函数后:
. r+ ~" K9 E7 Y9 ?) s* O1 b#include <stdio.h>
* O7 w# n3 H: L#include <unistd.h>
: D& k" K) j# r0 j; j5 R- w#include <sys/mman.h>
* p5 W ?. x3 A9 |. B#include <sys/types.h>2 X9 S" T0 s l
#include <fcntl.h>
+ w& b2 k' w# c# S. p- ]( `* M, s0 q- z7 z# y, b2 w6 x, O; m
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 v! |& T- P5 V2 l& R0 A3 r9 e#define SHAER_RAM_SIZE (0x20000)
1 l: c0 g/ \ M. ~! L1 k2 K
7 D* \+ y p( H. M) Otypedef struct$ G+ ~- p2 j& D. B, j8 W
{
% _/ M. q! [' B: _& {" \ unsigned int a;9 X. y4 v# }5 L! `/ c# M
unsigned int b;$ b7 `/ A! v! V3 T0 ^
unsigned int packet_cout;
$ O4 H: i, ]% c) x! |" c- Y7 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 r' ]- ~# Y% i& s4 I$ s& _, r1 X( ]4 z0 c' G: W8 N H% O0 @
void read_MSG_buffer(int *baseaddr);
) i+ d- k8 q8 N$ O- A5 g6 hunsigned int count_copy = 0;
1 P2 L6 {. f9 D+ G' J. z! E
: Z7 W" C9 D3 Dint main()9 `" d4 z1 h* ~9 z ~& Y
{( d! a d0 W% s3 s. _
int fd;8 @# U+ x$ f, [1 p9 v
int *mem = NULL;7 a! {9 l$ \. u# `# d
; e8 P7 C) h* m: Z [ }: r( g
if((fd = open("/dev/mem", O_RDWR)) <0)
# v; |+ y1 q2 t+ J, W# _* j {
8 e% V9 I' u& P. t( Y0 E, B2 [ perror("open error");* t( L1 O2 S- f0 Y" d
return -1;
- y4 C" k$ q$ Y }/ P }6 U* s2 d- [
8 C) l) K- {2 e
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 `. B3 Y* i; K7 f( [, ]
% [2 ^% k! ?+ ?: I- W while(1)
( Y1 Z$ ]- B% D; L3 x" r {
. V L' v6 g' s! \$ Y# Y4 u read_MSG_buffer(mem);* Q% o& ?* b7 ?( \# F
}
; E/ Y9 u4 X+ T3 k}
/ S( o* v* s/ u* `% @, r
( J7 J- E+ Q9 u# s6 Lvoid read_MSG_buffer(int *baseaddr)
) ]; V# g0 L5 `+ i9 Z8 |* M{
1 V" ~+ I, x6 W# S: U- d3 V, E pRX_MSG_PROTOCOL pshreRAM = NULL;3 `$ I) M% |/ p1 {% B
) @* N: g; H9 X- S) l pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 G$ V& {+ R$ F! B" L+ g9 j- ?; W
8 a% `8 ~1 U" ~( S4 T$ s
if(pshreRAM->packet_cout != count_copy)
; L3 L3 q8 P5 Q {
% a. _: i' [. k, {. s printf("a is %d\n", pshreRAM->a);. j% J! R: Q1 V- d( w% k
printf("b is %d\n", pshreRAM->b);1 y% t7 ? R* h
printf("count is %d\n", pshreRAM->packet_cout);" ^) C* k$ R( o! L9 l* V; V
count_copy = pshreRAM->packet_cout;
; M" k, g, `" j7 V# x. ?4 l7 ?* @" ? }
; I) v1 R. q4 f else" ~+ v$ M5 L+ _ b! ~. B( y9 p
{6 k8 y' ^* _3 S. {
printf("No effective message!\n");
7 H& `' U$ V$ o2 z3 w2 R7 B( ^5 d }
( {* Q) L z" d+ t- y: w& e6 @2 @}& M) l1 W. r. ~1 E0 J
i+ U9 W3 m) O+ `7 E c. N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" q8 N. X7 T% Q$ v( Z% L& i. X7 K3 _8 a
1 F% I' }# ^9 {! U! S! q! n# d" x
" c1 G% o" O2 J" @! Y0 V8 P% G! a- C/ G4 G7 H6 r* K% `8 e* q% C
|
|