|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! k) e( A* [; g0 u& r: l
5 w: p s. n* e, x8 l- K5 z1 b/ K& Q8 qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 b0 B+ \* ]. j: l& E) m
#include <unistd.h>9 `) {$ C K2 o6 G8 ~6 R( ^0 Y9 O/ L
#include <sys/mman.h>
9 X& x$ f" Q+ r* a# R! \- w#include <sys/types.h>% J, i, ?2 s1 K
#include <fcntl.h>* O( `) X. w4 E$ O' ]- ~! m$ N
( z: {! ~9 ^* Z! k- H6 `
#define SHAER_RAM_BASE_ADDR (0x80000000)
) j1 O1 O& R9 F* [& l4 z' C0 I# D* t+ b3 u
typedef struct' s4 E# ~/ X$ ~3 L3 `6 q9 w
{
`/ }3 Y8 p+ I1 x unsigned int a;
! Q2 t2 m6 D# q% l: x4 R3 R& y8 x unsigned int b;' ^9 |1 Q# n$ y1 K1 D% \% e
unsigned int packet_cout;
4 ?: K% Q* X& t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ d5 u6 n A" {3 o6 |2 K) M `% l, D; x' Q/ R5 p' I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" Y$ F0 T q8 J- Junsigned int count_copy = 0;
: U5 x1 A4 W R* n0 U
% l/ U% S% {7 _/ }5 j" u2 w# n1 ]: a9 b1 b( E7 o
int main()
* B7 w& Y8 Y2 L/ x' C! K8 o f{9 a8 _8 H7 w7 K
pRX_MSG_PROTOCOL pshreRAM = NULL;% a! {0 V- Q) K/ K9 R( y |3 b
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) D5 T/ \$ B# N! T
! }/ Y) E& s3 W1 i7 f7 h8 g
while(1)3 c. C `1 q1 f/ s2 G
{" e4 ? M0 s7 j W
read_MSG_buffer(pshreRAM);- }1 N- e$ C* \) T/ O% `
} $ y. u/ h0 o9 N A$ f' C7 H
}3 Q6 I+ g% ~ ^; G( x
$ ~. l- h! o5 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 [6 p+ Q0 T: }- Y% V3 D{% B8 L3 W1 a* R& M4 `- C7 V
RX_MSG_PROTOCOL buf;
! e# f" P" X4 y+ M+ F4 n
. n3 @% Q5 e% f) N/ _0 _ buf.a = pshreRAM->a;2 i: j( M1 G9 @% y0 B
buf.b = pshreRAM->b;
' z- g& W3 B1 A9 c+ B6 z* |/ r% ~' g. t+ q buf.packet_cout = pshreRAM->packet_cout;9 p3 g4 ]' p$ E7 z! Q
! p0 ~5 o/ s b7 d7 F6 U! d$ I if(buf.packet_cout != count_copy)
+ ^# J8 U0 H& f5 {9 p) \1 q5 Q {: ^/ A' M9 M! W r, ?+ P* Q% n" o
printf("a is %d\n", buf.a);# e2 w& N: E6 w1 }
printf("b is %d\n", buf.b);" b, M" s- P, j
printf("count is %d\n", buf.packet_cout);; c' N, x; S/ ?: Y$ \1 |$ P/ g8 K
count_copy = buf.packet_cout;/ H6 y: R6 ^8 U
}
7 R/ \7 B4 O# x d else
; X% J5 a' z6 c4 H5 r/ d {
( l5 h" M6 [. B/ P printf("No effective message!");
! O5 Y; P8 f9 C4 x" a4 z' M }
, }- G! f' a, T/ r B7 Z0 W}
( x4 i# j& ~, {! H& C8 D
1 v( N. L) S& f$ E) y- `1 N) p; A3 e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 P6 ~3 ?3 a/ }
使用下面代码,对内存使用了mmap函数后:9 c7 Q5 B$ m, g' W. y
#include <stdio.h>0 B0 |9 @ x6 W% {0 v$ X, v
#include <unistd.h>' ]+ J. x8 R+ @8 b# t
#include <sys/mman.h>' b! T$ c& }, J% Q
#include <sys/types.h>
! S# v0 l$ a0 [4 ^$ T#include <fcntl.h>- ^- e0 i: V! o6 W8 z+ J& y8 d" c
" L' B9 H7 |( Q0 ` \' h8 o#define SHAER_RAM_BASE_ADDR (0x80000000)2 f. v9 y* g7 g9 g O/ y4 l( X6 U
#define SHAER_RAM_SIZE (0x20000)
- ^) F2 B( o. n& Y6 [ [% U& `
& }' s+ \* F& p! k& Itypedef struct
/ d# P( N7 R; r) e5 M+ j6 v7 Z! i{
4 A4 h8 b. G, v. z5 P unsigned int a;
, T+ [4 Z, g) E unsigned int b;
3 a3 p: F: h1 f- R! k9 h* m* Q0 @ unsigned int packet_cout;
+ @# j0 U7 K. M; D# n5 c* E$ G% v5 C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 p( g$ `6 ?9 t$ R5 O% k7 g: J
void read_MSG_buffer(int *baseaddr);
1 U- u3 q! r$ @; ]8 Dunsigned int count_copy = 0;8 k2 W' M5 B4 z6 l4 T. T2 ^; L% P
1 |3 S. V6 F% {- A
int main()4 L' W/ R9 Z% V# A0 }: r" L
{0 P4 p% K' @" s; o7 v8 l2 x) O/ Y7 g A6 x
int fd;: g; Q" P7 J1 U6 G& U
int *mem = NULL;
/ C4 d6 G8 Q' a9 h# I
* \; d( o* J' [( C, r% b& [( \6 x$ m if((fd = open("/dev/mem", O_RDWR)) <0)
, G7 T9 N, w0 A( c1 X4 f H, {; d {3 c" o/ @( v) s6 K: ?. w# N% S c- {
perror("open error");
; V# @3 H+ M, p z3 T; H6 ?6 Y# ]$ Z+ L return -1;
9 ]" @, L0 L; }; g }/ |$ ^- Z$ c; s5 y1 d9 K0 m, }! U
- b% i, A( l1 l# Q) F mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& r8 U% x" U- [3 h
4 |) X8 D$ I9 e7 q- F' ` while(1)
+ W# e/ A$ ^6 C) L6 Y {
9 l/ J0 j+ ~- R5 m5 M$ [/ J9 | read_MSG_buffer(mem);
" n7 B- J' B: f |/ `1 z } % j4 L, @- P) ~$ [8 l
}
! E9 _7 p# f" {! _; s# {* X- O* W: t% g) C
void read_MSG_buffer(int *baseaddr)
3 {$ G) Z" G5 H2 U{
8 S- C% G `; i4 C* @ pRX_MSG_PROTOCOL pshreRAM = NULL;
2 g7 `) G# [$ p+ t! z+ B& J" F( Q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 o. o6 r' n m
( V6 ?# A- A O% s( K" A if(pshreRAM->packet_cout != count_copy): h& n! b5 e; A) @% p' ]
{, | q9 Q# V. J, v
printf("a is %d\n", pshreRAM->a);6 x8 u) d. d: k. W& d
printf("b is %d\n", pshreRAM->b);2 L& X4 |- F9 k* g1 d
printf("count is %d\n", pshreRAM->packet_cout);: K7 p; z. G. r+ B; p6 U, ~
count_copy = pshreRAM->packet_cout;6 ~: N& w7 Z7 C5 F
}0 j2 l: C8 G7 `3 o. v4 {, H
else
6 P7 {4 ]) D o {
' S% W$ H4 Y8 K% R- X printf("No effective message!\n");
& f. Q# O* e3 d+ z }
* C) m. |1 S+ m% \ `! ^}1 x8 H. z4 z" Z; i, s9 {
: [% C9 h. n2 |" U" ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" ?- V: f0 p# j1 u9 {* b( d. B: n( n. C8 b+ T
* S( u8 R7 t' W% s+ Z# M8 D( M
# ]) Z. q8 ^. m) M, J9 y% L" C
9 q5 G% D3 ?2 k: d |
|