|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: a4 \7 t* H7 `
( S3 u9 j2 K2 `' POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 @# t1 p) G: E/ b
#include <unistd.h>
4 j4 C, `8 m+ K0 B#include <sys/mman.h>* S, R) A$ z4 V! m$ q; Y
#include <sys/types.h>( Z8 B2 J& B" o0 H9 V D0 z+ q7 E
#include <fcntl.h>
; f, t$ o [8 M* B. I* @0 R: H" M( p
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ J9 T5 T1 G" E& i' j/ _ H, m* v( H) \( [$ {
typedef struct
2 z8 k$ E4 S# T7 ^1 n{
9 }2 T1 X6 r4 d# |( o& G# V g1 ] unsigned int a;" v* ~6 Q: A8 i9 L9 d
unsigned int b;" S' e# y. Y, H' h' b6 n; l- b
unsigned int packet_cout;
; J$ o. X+ s' ^! W) I! B! ~8 M% c+ j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* O0 H3 u5 l; O8 V
/ T1 N7 K0 y n) M3 d+ Q$ xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ m4 U' E6 V; p0 k: h0 ~unsigned int count_copy = 0;
. v4 y. t6 c: s" @: S. B# E
4 R, y3 t# X& @ o" g$ N6 y5 n& f2 ^% D# R' P. ]- k! ?
int main()
* g& ^+ v2 F/ c6 G9 ^% l{
" A9 b4 ]5 q0 T) v& J pRX_MSG_PROTOCOL pshreRAM = NULL;: o: ]6 E( y% g! m. g/ D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( _# l3 d: `7 b( q) b* ~
) A1 w6 h" A, C% h
while(1)
* I) Y5 F( c5 M$ I; h- p {
% U4 ?' C; l$ g read_MSG_buffer(pshreRAM);
3 { B0 c% M7 l U& G$ I" n q( S } / D. K. u r9 b1 a9 Z
}
! K8 {! R2 U; t7 K' j5 r2 \9 F9 U8 w6 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ ^9 g- @; d# h! p
{0 v2 o0 V4 U; P% S
RX_MSG_PROTOCOL buf;
2 ]' g/ I/ c& D! g) T9 {0 _ $ R7 |& v( {& ~
buf.a = pshreRAM->a;; [3 S/ r! {% E1 k
buf.b = pshreRAM->b;
6 ^ S* u3 @8 w buf.packet_cout = pshreRAM->packet_cout;
5 w' z* |. L9 g4 ]' h / |4 ]# v1 O3 ^' I
if(buf.packet_cout != count_copy)
1 k$ `( _4 z. U7 S8 B {# d3 [) u& x& s8 A
printf("a is %d\n", buf.a);
5 f- t- E# z( s6 v$ a printf("b is %d\n", buf.b);
* _# |. R2 _1 @1 f printf("count is %d\n", buf.packet_cout);9 {8 Z' ~4 l1 w6 X% M" P9 U6 N; o2 M
count_copy = buf.packet_cout;! Y" V7 m4 R2 B; _; [* ^
}" ~5 F5 e+ N& [1 O
else/ l0 D. i9 X U8 J$ ]" c
{! r9 t. t, W1 T4 L
printf("No effective message!");
( f) p3 M5 a' W* d4 I3 o8 i }$ F2 e2 D$ V& b* D- a5 |& X
}; g( T4 T9 B2 x
" T4 W, Y" T/ K1 O J" @2 _& q
5 m9 P6 D" k5 |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 M( A) [8 ~4 _& e8 `$ J4 T5 M7 {2 J使用下面代码,对内存使用了mmap函数后:
1 x; Q; N; E) ?4 P* a# G#include <stdio.h>
& m4 ?2 e% l' {' X& s6 v9 T% k#include <unistd.h>. X6 S8 u4 a; s3 W0 a
#include <sys/mman.h>+ F/ B( b! I, O* K/ {
#include <sys/types.h>
7 b# z7 k8 y. b' Z) c) z. y#include <fcntl.h>/ v5 T2 s; W+ M& V
5 x2 U( |% ]. \4 J#define SHAER_RAM_BASE_ADDR (0x80000000)% ]4 F: {; g' O
#define SHAER_RAM_SIZE (0x20000)
" s6 R- y2 j; ?+ F) X
2 U6 z/ | H! d" G- V$ ftypedef struct
' l4 u, |* c8 M{
& Q6 a. C! M+ ?& o& d3 M unsigned int a;5 f7 ~* H- I+ D; a: ?+ ?7 y7 g
unsigned int b;% z+ x. Q0 B+ X
unsigned int packet_cout;
3 K u; W1 _8 ^. C. _2 K/ `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 e( J& ]! a! z. {" t- q' `! @2 C
2 a8 S2 A- b- B: Z [
void read_MSG_buffer(int *baseaddr);; T( y! W( E0 i: M% a3 M
unsigned int count_copy = 0;
# {6 V! q* e6 o5 n, g- v6 }$ o9 n; Q
int main()
: W7 V1 ]1 ^# Q0 S{7 y% \* z, o* a1 y$ G2 K
int fd;
0 _* s7 K: }1 @ int *mem = NULL;
! b8 G8 ]9 ^. j$ z0 s8 _: G- P$ P! p' ~/ Z5 T; E) x4 u* ~
if((fd = open("/dev/mem", O_RDWR)) <0)
0 I4 e9 V" }! I2 @* [7 A8 p {
/ s. K8 Y+ w _ perror("open error");
! F' V# `+ l/ a/ j1 ~ return -1;
5 M3 ?9 @0 y. \0 G, ?' I2 r }9 w' [; ` z A, }$ n
" C1 N: f9 e' B7 T' `& g2 e& U" C$ s
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, t7 }& w" i4 l \* M
# x) t1 D6 [: H, N9 A( R* M* u while(1)
$ j# F1 O; M# H4 m {
7 a) Q. c2 h5 N# f! R# y, z" @ read_MSG_buffer(mem);
) C6 f3 o. M* ?, X' _ }
$ j( t5 ?* B. i' T4 R/ k. j}8 n& b0 t/ `/ v( u
7 q* ~ ?# V( C
void read_MSG_buffer(int *baseaddr)9 E M8 C$ G) j6 k2 i2 P7 D+ o7 y
{
n- [$ T# X5 T& N, N5 i1 B# J5 r, }3 d pRX_MSG_PROTOCOL pshreRAM = NULL;
* w! {! _. H& ]' e3 W8 A4 H( r' G, ]3 N1 g; a* c. r- u6 k! v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 t$ b' C* c/ p
6 a8 |" @. [. x( @- m
if(pshreRAM->packet_cout != count_copy)
# z- \+ A4 u7 X3 \& r6 Y {6 E4 `: M" v$ i6 g
printf("a is %d\n", pshreRAM->a);& ?( e" Q1 L1 c0 `
printf("b is %d\n", pshreRAM->b);
; J) l( X7 `2 L printf("count is %d\n", pshreRAM->packet_cout);" W& f+ l3 h1 ~+ d
count_copy = pshreRAM->packet_cout;
& b( r- H( R/ B1 R! r; c! D% e }7 }0 M0 o) u" y7 j+ G# C
else
{$ n7 l. ^0 U H8 n/ c {+ l( I3 F2 J A" w" t t4 c
printf("No effective message!\n");
3 j( ]* b/ P7 F8 x# ]$ v3 S. s( x }
& B. S/ D" ?6 B6 Z' I}: T& F7 C! _* T/ L
* H! s1 L/ Y0 I# L8 s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" l& J- c' ~! e( ?5 N5 ?4 Z$ L& r4 ^+ y. V0 a5 ^7 S5 ~7 z
* o( c* n9 Q' r$ ]! g) Z9 _
9 u: u! ]" F* C$ z" i4 ~
, j4 a4 l" O+ ]5 N8 a/ [) v7 ~
|
|