|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ I, z: r+ m5 P) _+ S
3 y g/ Z+ } F4 J( `5 N7 b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& {1 ?" @/ X: C. w* k5 k: {#include <unistd.h>5 u2 p, g) @4 D3 z* V
#include <sys/mman.h>1 b; r0 W$ J: i: p
#include <sys/types.h>* a& t+ m ?) H7 F! T
#include <fcntl.h>* S- m! t* r% i. J9 x
% x5 x, ]: s7 Q+ ^1 x2 ?#define SHAER_RAM_BASE_ADDR (0x80000000)
8 l: B9 r) Y7 ?) r
3 s0 |5 y2 F/ S2 Q( gtypedef struct
1 {) N+ ]: h3 ?1 e{
! S- f# Q4 r* V' W% s1 d unsigned int a;
- U! T! b9 A& b7 Z unsigned int b;* p/ r! ]; X, ]. j) O
unsigned int packet_cout;) F3 P* K8 _& P0 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% |7 q# `/ ?* ~& w5 o! @( c9 R/ a5 B
$ g+ P; }2 P* p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 f( Z) V8 k) z
unsigned int count_copy = 0;
. ?2 V6 V. r% m, y
& r$ v) p: a: m+ B' {( @
* f) m5 k/ U. x0 Nint main()+ V+ g3 N% u1 q9 k! |$ _: d! h
{
, }* o3 P/ ^; H6 G! X pRX_MSG_PROTOCOL pshreRAM = NULL;; S9 N. t6 s$ i; G: W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 y# S$ ]$ @3 x. M# T+ e4 v
: `+ N' `( v2 v3 Y" F, r1 }6 j while(1)
$ [9 f2 M2 N4 n {
* }+ m6 Q! h3 O read_MSG_buffer(pshreRAM);
! k3 R2 z; V/ F& Z$ [9 s& y8 j }
6 }' @# @+ C$ X0 B) e z' s8 H}/ v* ~1 S5 ?( g& z0 U; \) y
8 h2 n3 c2 F% {$ @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ F5 x0 G9 ~1 ]4 _1 `! _
{& b1 g4 K' j# A n8 |: i' M" O
RX_MSG_PROTOCOL buf;
# U$ N* ]7 [9 I# Y: S: L 2 E( q0 q$ W- W) P2 P
buf.a = pshreRAM->a;
% Q' D( N5 D# J* A8 q* P buf.b = pshreRAM->b;
" n' P+ }2 @/ j buf.packet_cout = pshreRAM->packet_cout;; d3 ]1 y, F" \; Q8 Z8 d3 M9 Y% b- J
5 T5 z/ K Z0 X
if(buf.packet_cout != count_copy)% J! R$ t) ~" p# \
{2 R! r) w$ Z9 ~$ u& U
printf("a is %d\n", buf.a);
7 W- g, d6 Q$ G5 X' @- T& H printf("b is %d\n", buf.b);
Q- f; V4 @* W2 w$ E printf("count is %d\n", buf.packet_cout);# L1 n: i' H5 [, D+ ]) l
count_copy = buf.packet_cout;
1 Q1 h+ p. U O }$ m3 ]; z0 f" f
else
1 }( j$ u8 [( b {
% j7 [3 Y9 i# d! y5 N printf("No effective message!");
[. k/ q6 R8 O6 ^) \- j+ [% Q }; L, x+ B, b) @( h' ?- i
}: Y% V5 J2 k" m9 Y1 }; R
c2 ^( h" o; V9 c$ W
# R: x9 s9 `6 ^4 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ G& z* J+ ^# d1 f: [8 _; s
使用下面代码,对内存使用了mmap函数后:
0 u5 g4 t2 I# X4 i5 d3 N( Y& w7 W7 y$ e#include <stdio.h>. ^1 N$ \$ w7 f8 i" n$ Y( d0 A
#include <unistd.h>3 ~& U: V7 g2 U3 c" E) \9 h" d+ }
#include <sys/mman.h>5 s2 {+ c5 X n3 z! V7 X9 L
#include <sys/types.h>
7 {" @9 X0 u) B, D6 P) l#include <fcntl.h>
/ W/ L. q; v$ e0 y+ E
# L: u8 J" J9 G* C( h' L#define SHAER_RAM_BASE_ADDR (0x80000000)0 t* b: ?+ D" ^7 D* P
#define SHAER_RAM_SIZE (0x20000)
( W; F, ~7 o4 Y# M( M4 j9 Q$ q: u+ V$ M; \
typedef struct
" O- R! U' q9 B( {{" `, Y8 {6 ~; w! H4 F+ T
unsigned int a;
4 I0 Q# O7 a w9 ^9 y unsigned int b;
! j+ X/ n* A% y2 [8 p% h unsigned int packet_cout;7 {. T& J4 j6 ?% \4 }5 C. K% ~2 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 j' N; U l9 c% K! p# d0 X5 x
% U/ w, W$ {! ?. K+ l; B7 h# Avoid read_MSG_buffer(int *baseaddr);
" I' H0 T! C" O: q6 ]unsigned int count_copy = 0;9 z! [3 t3 A/ S/ f! t0 U' W
: T% y% }& I$ `1 @1 W/ Kint main()) ]3 ?0 ]# V4 W) b& x4 w
{5 \$ t: K" n! {$ B+ h( ~& R
int fd;
; p. @% P4 Q1 v8 D9 T: m; o# F int *mem = NULL;4 l9 r( W, p" y: ]* o
- Y) H; Y5 W4 _/ a
if((fd = open("/dev/mem", O_RDWR)) <0)7 C6 c& m: J0 M3 B' k% @* L- q2 A
{ w) {" t4 q9 C' n* _- m* j: j
perror("open error");
6 x# ?. V$ z: t9 u% I- X return -1; t. {% m8 r' v
}
% }" g; i! M; D. I
+ E# ~+ H7 v5 C mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ }; m& M4 S" {- l; o- }: ]. T; Y& k0 W
while(1)
0 O; W) `2 x' q& ` {
: x! o6 T3 A4 @ W7 r& l8 W: v read_MSG_buffer(mem);
& X8 _6 U% w0 ^; I }
& j7 z! { X& A3 p" x! ~2 }" `}
6 {( }/ A) g6 u3 l( h4 v3 Z6 v. j( w# D! _0 Z% l. `7 d
void read_MSG_buffer(int *baseaddr)
- n# E) z2 H" s& ]/ s, n1 z{
- y6 z3 P y' R pRX_MSG_PROTOCOL pshreRAM = NULL;
/ V! u, R3 R& `9 k
" Y g( ^# e1 _8 Z0 Y V pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) _, n5 ?1 n/ u6 _% y, r, S' J2 n- f
$ Q# m' d# t3 U% u( v! D" ~ if(pshreRAM->packet_cout != count_copy)' b1 T. D9 `, F: @+ R0 a- u
{
* \! h4 Q& @; l printf("a is %d\n", pshreRAM->a);
9 |# G' l7 F3 N, e2 d4 G0 ], U q printf("b is %d\n", pshreRAM->b);' W2 V P' Y' ?" q4 Y
printf("count is %d\n", pshreRAM->packet_cout);
+ \8 o# f$ N3 o1 i count_copy = pshreRAM->packet_cout;
7 k/ }$ o- I3 D }- N5 V: O. l! ~. A2 {
else
# t( s/ u5 i+ B. r7 O {
$ P c) O4 \% S- ] printf("No effective message!\n");
: Z0 y4 |4 n9 S6 v- j3 \6 L% _ }9 m4 H9 ]) m K' t# g' j
}( O/ F; g, u8 O) `8 a
1 |! P& B$ \/ y# D+ b) Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? ^. k! j7 h: W, r( e
5 I0 k7 o5 N {: q( n0 Y
9 w- L# a. r" I7 |7 ]) u* v) U
3 A% G n1 Q Y7 `% V6 v
4 }8 g m! K6 W! H
|
|