|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% c1 {' E h& C6 l5 i+ S0 x
6 Q" E' r% G( N) y$ D. X* mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 h t6 k4 o* i5 l6 C1 ^#include <unistd.h>+ I1 }* L& X# b4 x
#include <sys/mman.h>
f+ ?" m6 j8 L4 v! O N#include <sys/types.h>
5 \% K- ~3 D, F- |$ _5 g#include <fcntl.h>
' }0 q [! K* M" I
' E6 p) b4 w) {6 [2 J3 p#define SHAER_RAM_BASE_ADDR (0x80000000) - F' ~6 Y. O5 q; w
" _8 y3 b# j7 C+ e8 [typedef struct& I& |8 Q; C: b
{
3 k8 I/ ~8 A, {' U unsigned int a;
8 m) q7 h2 s4 a9 U+ j unsigned int b; i- R6 x. Y2 R
unsigned int packet_cout;
2 c5 q! w6 U- W6 o# w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A& ?4 x- [" X* ?. n, @7 b' o7 a- A% {1 {2 ~9 ^" t/ B% W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 l% X# F6 U" I. Q+ c
unsigned int count_copy = 0;
- K6 D" v2 t9 m0 [1 Z1 O$ u/ J
" [, T- ?1 S7 a H# e8 N% I7 S$ ]2 q, [int main()
8 L) ]# A/ o1 E3 }3 n{
; P1 U" K3 W- I! B! y+ l u: \3 M! b pRX_MSG_PROTOCOL pshreRAM = NULL;
W# F7 S% A& N( U pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ m* {) q: g: M/ Y
7 L8 s6 k2 s+ F7 ]$ T: v while(1)
2 ?7 X4 g5 u/ {2 w7 c {
: v2 w# C6 b1 L read_MSG_buffer(pshreRAM);
. m! b+ X# c% t7 p5 u5 r( A- n2 t7 I }
y; {4 x4 x& a0 m; t}
$ u4 g6 F! _( Y5 D7 I& h# `9 Y }" h5 B- b2 ?0 ]* J6 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! R& w' f( o- n
{
# c# m1 j. Q! T3 t5 K) H t RX_MSG_PROTOCOL buf;% b7 ?9 h1 R# U1 [' I$ e& D3 }. }. x
8 M* @. Y j% G* g) a: I0 x
buf.a = pshreRAM->a;/ ?. X t; [7 \2 }% u3 N$ y; ~. Z2 H
buf.b = pshreRAM->b;! r8 J& R S9 a- b$ J
buf.packet_cout = pshreRAM->packet_cout;' t6 ^) n9 V9 B' s4 X6 n3 b
$ T7 ?% @3 C8 B/ Q. H if(buf.packet_cout != count_copy)
( b3 b" u& t) z {$ q) b3 R3 S. o9 D
printf("a is %d\n", buf.a);9 M: s# b9 F) \
printf("b is %d\n", buf.b); N) f, k& _' q
printf("count is %d\n", buf.packet_cout);- A. p3 _4 V% z" H2 y
count_copy = buf.packet_cout;
- p+ M) j+ y* `6 t8 Z: S4 ] }; a4 V; h Y7 i& x$ T( Y' x
else! p% i! i9 z6 V; c2 j
{, c# h! u$ G: H' o* R# h9 [
printf("No effective message!");, r6 b( m2 p7 d% V) r
}
4 K. `3 U: ?1 e% A}
: p- O0 o- L6 S3 ]" j& @2 Q1 Q( s; C
8 z f7 \2 I3 A0 ] z
6 n! A: h, C+ E# s% F1 E" X3 F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. j8 r0 J+ Z E使用下面代码,对内存使用了mmap函数后:$ O, K7 I' c! R5 `1 [6 I& J
#include <stdio.h>: N2 h3 [+ f. W2 j( s B
#include <unistd.h>
- N, J' R0 l+ y" G9 @' D( \#include <sys/mman.h>
% W' R/ O% p& y" g/ d9 Q#include <sys/types.h>
& E4 }6 W4 U- n; `* u#include <fcntl.h>* O \2 Y4 x& j* L' n
' E2 c+ f7 L% l* N1 s#define SHAER_RAM_BASE_ADDR (0x80000000)
- U f: t: }+ X) W#define SHAER_RAM_SIZE (0x20000)
M! Q2 {/ H3 L( S z, F$ J) }& I% P* G7 X' Y$ C
typedef struct- r6 x" k9 g& f' s% w# [8 [/ R! O8 f
{; X, C$ D: v V M( o
unsigned int a;/ t' L1 X# X2 E1 F2 r A/ v
unsigned int b;
2 I$ L( ^: A; t7 U; E4 F. Z7 s* s unsigned int packet_cout;
- u D# ^; e) f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; {8 X5 v- a6 d( @! o6 J; N
S" y9 M K3 _) @9 ^! X: H7 Lvoid read_MSG_buffer(int *baseaddr);% _9 p( R2 F6 l; @/ A
unsigned int count_copy = 0;
$ G+ H- q8 ~9 V0 K) T4 W9 U. y* k9 }# x
int main()+ u$ A, _3 ], e }, G
{, z3 d3 K" g/ R
int fd;+ ^/ n( B: f$ m- m
int *mem = NULL;; c( H7 m; Z4 n( R' X
+ g" P4 Z) @: @4 m if((fd = open("/dev/mem", O_RDWR)) <0)
+ `5 K4 b4 e0 i" @# |; U# o' v {8 u ]- [( {2 p2 l
perror("open error");4 s3 H% N* a% i& s% H3 o
return -1;
4 {! G0 s5 c' a7 v8 }( i' C }7 |8 Y5 W: E3 l l
3 p$ t( F$ a" |) Z, n mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 R, t$ o U- T
- D' J+ {0 R* d while(1)
0 S8 e0 o; Z: I# O1 S9 G {
$ \! C1 X! f# S0 N! y7 P) L read_MSG_buffer(mem);
" W5 R2 M" p& E1 @$ \$ ~# p I" P } ( @" J$ y# n, \) T% h% P
}
- H3 n$ ?- @0 M! }) v. b X% d. M$ [3 ~1 k
void read_MSG_buffer(int *baseaddr)
% ^3 F8 I; r& F G7 t{
0 c, j% L% S& ~ pRX_MSG_PROTOCOL pshreRAM = NULL;9 x! b4 Y8 A6 E4 e
" _1 n4 b1 ?- J. s pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! W; W% T7 E& X' h! w, C
9 k) R j) D& } if(pshreRAM->packet_cout != count_copy); i0 o: U. w% i" r& k
{2 l% S% D! e5 ?& y: D8 R0 [
printf("a is %d\n", pshreRAM->a);6 f) z3 k" w' {7 y6 ?0 w' Q$ Q
printf("b is %d\n", pshreRAM->b);
D8 A1 r1 ?, f! \; @. r printf("count is %d\n", pshreRAM->packet_cout);7 c3 E V/ l+ e0 V% G' I) ~
count_copy = pshreRAM->packet_cout;
- H$ U. X) L- O* k8 }! ?* ~ }
2 v% k% @1 n+ W; s8 Z else/ R* l) q2 H3 l w
{
! i* S* Y% E/ @* N5 V" B) C( p printf("No effective message!\n");
9 \2 J( q/ [2 [5 C }
. @: Q6 g7 e5 I4 L. q}
/ W2 @% y6 r- j$ t+ ?) M6 o [: j$ m8 @6 g( d! B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 D0 o" a6 a3 u1 i* }
# t7 t: `* q' N4 i0 T% W5 P' S- h) {6 B5 {& M6 y
( B+ A( _2 K# a$ G- v! a; V5 O3 G; w j
|
|