|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . O$ Z5 I2 Q% k8 c [
3 ?' X- F& t4 E+ f# c! YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> N. E" S* x' c1 g
#include <unistd.h>
0 U4 x: b' ` K! Y1 s. L" {& B#include <sys/mman.h># }- N" q K# S
#include <sys/types.h>
1 y" Q3 U1 P8 e$ d#include <fcntl.h>
5 n! i' X7 \1 |5 {* d( o ^" M: M7 z, k8 ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
k) X. H* V; u: M
0 Q% z* L' D$ c- J* d5 ]typedef struct" N) s% d1 M3 _6 m8 z8 _
{$ a" W8 N1 K: c) Y7 T. ~, Y \
unsigned int a;& A1 z8 I, z6 [" r7 S( `: d7 K$ T1 G
unsigned int b;
8 c% y: y' L0 Z6 T+ n3 ^" o unsigned int packet_cout;
( P0 J2 I0 G w; O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 y0 |# x; s1 r, R& i
; X) |7 @- D, r! S! {( V2 P# I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' [- T1 r6 W& i/ ?) ]8 O
unsigned int count_copy = 0;% A, }% }7 E! X2 t! Z4 Y+ v0 c
+ }: p0 p, L) U$ s
, S8 n* e8 v: ?% U, e: X* fint main()$ L, _6 e* ~/ V' [% X$ R& A- ~! g
{
( P3 c% T; g" E. N7 a0 E pRX_MSG_PROTOCOL pshreRAM = NULL;
0 u( X1 V/ K9 W2 m& p! ~0 ` pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ y. x4 D: Y" U- l8 z! i( J- f0 x& P' X2 j7 T- v
while(1)
$ k G+ V' p1 W: ?5 o; O | {" M) D K. B( L; F# I% G
read_MSG_buffer(pshreRAM);
7 l; ` x' j) r7 D; G% h( j } , g3 W1 Y* h m" q
}
* @+ f1 J# [( E5 {; [9 L) V( K0 l
/ n1 z5 _6 z' C0 ^: R+ d5 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% s, \4 _- d7 Q$ u1 n S* k{
: }% Z" T/ i2 m RX_MSG_PROTOCOL buf;/ y0 [& B( Z3 C c" L
. k" l L/ z) j" H
buf.a = pshreRAM->a;: \1 R% E5 \0 `+ \( D7 i( m
buf.b = pshreRAM->b;
T0 m1 i5 Y- I7 @ buf.packet_cout = pshreRAM->packet_cout;* a7 I- D. a& X, G. ~7 [
6 c5 h2 J; {: b1 f if(buf.packet_cout != count_copy)8 W0 ]: C* O( j# n* u" |+ {, s
{
1 `0 S) S' ]1 @" D' | printf("a is %d\n", buf.a);& Z6 F* r8 v. E& I" P
printf("b is %d\n", buf.b);5 O2 P) S& W. B( x
printf("count is %d\n", buf.packet_cout);, Z% W1 R' B2 [( P6 i& Z! G
count_copy = buf.packet_cout;! n& p, Q0 j; G2 w
}1 b; X3 E4 I. R: k
else$ D5 R6 L! `7 Y( \
{
$ P/ D4 J1 I5 ?' y: p printf("No effective message!");
- F( e7 |" b1 ~# ?" K2 u, m }
. q8 c4 E- ?, W8 f* n}
# s5 S1 s3 U7 v# f" m3 q
6 I0 Z' N0 H* k1 d2 v0 ~* n+ h, Z9 A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* m' A# y! X, y: w7 V, r; B* Y3 S& G0 W4 r使用下面代码,对内存使用了mmap函数后:
. m" A' |# U$ ^- @9 d- R/ j#include <stdio.h>
3 ?0 j, I( N; M y# B#include <unistd.h>" \ H7 K# J% R9 j4 Z
#include <sys/mman.h>
" C* R# A# L. A- j/ ]1 R#include <sys/types.h>
. ]1 S& N* v% S#include <fcntl.h>' S/ K1 V- N6 E% |. ], t8 F, T
4 l/ [$ C3 ?/ {4 u' Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 M' v' B& K7 d( j4 O* P#define SHAER_RAM_SIZE (0x20000)
- C, C- D0 a5 N* {" G
1 k/ n2 O: x# |/ u7 stypedef struct
0 E$ ^2 E3 H: L- p: [- Y. A{+ p' V( f+ `1 F5 c- o7 C9 E
unsigned int a;
8 H2 C$ e; g6 t! k S6 G1 t8 `4 { unsigned int b;
# {+ U" I/ f5 n8 X$ W unsigned int packet_cout;
1 N( {$ l+ Y. U! d6 ~ q/ C$ {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ F; p. c) Q) w# }9 T
4 P7 V# V2 B5 g" U: f
void read_MSG_buffer(int *baseaddr);, T. t9 a4 ^6 a! I: [0 B& ]
unsigned int count_copy = 0;
/ A/ p9 U% P. x6 y- e6 N+ t e) n
' \$ W# }4 {( g. Jint main()5 t x+ J' V7 A4 l
{% Y* j0 O7 ]% N9 X* A
int fd;
) z& \0 |1 i9 K" m Y int *mem = NULL;
8 r8 H! z3 R% C2 q" H" f
7 p L) h+ W& y, d if((fd = open("/dev/mem", O_RDWR)) <0)7 M# k' a. p" r- o. J$ A5 M
{# i! N6 ]+ F; C. N
perror("open error");) n* G S' }4 e7 P
return -1;
5 E9 b+ L; E, S# w* q6 h }
4 P4 E6 i8 P2 Y5 J1 u7 y ) ^0 K8 K% V6 f/ a! R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ Y# j; J: U: C5 Q$ k
% t' A' N+ G+ s( ~7 Z# y. K while(1)7 C' d$ g; x5 [8 ^
{
- p! M2 x* v: d0 |( o! s/ Y# S read_MSG_buffer(mem);6 V( `5 l$ P) G1 c0 ?' n4 j' y% c
} ( K$ u: [1 @3 v, S+ t' E8 G
} ~0 I o7 S; [
( b( ?6 V- w& i+ S; G) {void read_MSG_buffer(int *baseaddr)7 _. ^; W; r* Y" e; {, b+ y
{% E$ P/ p R7 H: O% }3 |7 t
pRX_MSG_PROTOCOL pshreRAM = NULL;& c! H3 ?! O3 |+ h7 z/ q c
- f: T! @& f F- ]7 |! }
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 E. f1 c/ R2 ?8 u* f
2 w- {: x4 L7 o( \" E( T if(pshreRAM->packet_cout != count_copy)+ P6 }# p( X G% w+ q
{
- Q5 W3 g4 S3 x6 R- A; K9 z printf("a is %d\n", pshreRAM->a);
9 ^7 I6 D5 b6 F printf("b is %d\n", pshreRAM->b);
% J$ w; _* `- q' P s printf("count is %d\n", pshreRAM->packet_cout);
+ W. l% C( L$ E. K1 M1 b# g count_copy = pshreRAM->packet_cout;5 U: F* m' w) X1 j5 j
}! y F, j5 g$ O2 w7 p5 P
else
* \0 T9 ?3 |1 | p% |. l {, E$ \; {' X. Z8 Z& H5 G; G1 I q
printf("No effective message!\n");% r! q J/ z$ O& G8 B% c
}/ b [7 E( i/ X, A( i
}
+ V/ ~% b1 x, ~3 F# m4 U7 r- L
! V/ [) F: b# V6 E; X( A) J# U+ ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 K) P8 s" r+ C" w; O+ n3 h" b a. ?" a$ x: h; J
, _5 ]3 h4 Y2 G% Q" ` Y
. o0 R9 x2 _0 R2 z! ~3 c" x q
/ s: A7 H7 L% q @8 @, t |
|