|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ y, j1 l* P1 W5 k! I' r" Z( r1 O8 I0 n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! W6 }$ @6 o* k* g; I) N. R#include <unistd.h>" o' ~9 B! s4 c0 y* A- l
#include <sys/mman.h>
6 p5 p2 ~% t! t* v M* T2 `#include <sys/types.h>
( E7 p' t5 I+ r( `9 V#include <fcntl.h>
/ y, k, B5 P# r
9 f n* I6 x \/ J#define SHAER_RAM_BASE_ADDR (0x80000000) 1 n5 F% T8 v% u4 B/ t8 L9 q
. `- T9 m$ o S5 i' D
typedef struct# ~' j. i$ P1 I
{" `, }: Q, S5 ?) f/ c4 E
unsigned int a;( J* y+ Z2 S {& P
unsigned int b;
! N, k f3 s* O- x# n' | unsigned int packet_cout;
# {% R: P" v* ~- m; H. i1 a" f" u. y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 f* P3 p5 V0 S3 W2 P3 d
& [ X' M# A' W* r$ r' C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 g. g) l8 k( T$ n- b
unsigned int count_copy = 0;8 v4 e+ g! g5 m/ u
- V, K! a2 m1 ^0 @% E! [
2 \; C+ k! P6 ~+ L A
int main()
- q' g: s& _6 d1 e{, b% r! I1 M, \, [# v; y
pRX_MSG_PROTOCOL pshreRAM = NULL;; V. G+ R: r: H0 J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- k) `, S7 Y6 i: Y( r. r
( p& K$ ~( ]3 X; o2 ~
while(1)9 n$ t& x, p5 o( _# A7 Y3 C0 |
{
& ~2 `2 s1 Z& S6 @% @+ @+ H read_MSG_buffer(pshreRAM);
/ Y3 y* M* R+ Z2 K/ w } " s! C9 {- p) i# {% @3 H$ H
}
3 ~ Z p' {5 _+ ]7 L
0 ^, m. G5 Z! a" svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) R8 |+ t* d7 j4 H) `4 o* n
{% {% |+ A: }* s
RX_MSG_PROTOCOL buf;
0 ]/ H) S( [+ M7 e
( @2 J9 E+ |9 A: H buf.a = pshreRAM->a;! o2 v2 A! L) a5 \5 f
buf.b = pshreRAM->b;
$ Y: l5 X$ X- s W, i; k( t# b# J3 | buf.packet_cout = pshreRAM->packet_cout;
# z* N6 P! X0 z$ y: X 2 @% W) u8 h1 j' n" e
if(buf.packet_cout != count_copy)
& N @0 ~0 h0 }4 L' i- M; J j {4 _( O4 n; ]: ?3 X1 I# E7 {
printf("a is %d\n", buf.a);
! y, u; g2 i; K5 t9 h printf("b is %d\n", buf.b);* w8 U4 H/ y, O% T
printf("count is %d\n", buf.packet_cout);( ~8 z; R! p5 Q7 s" o |! f! Z0 Y
count_copy = buf.packet_cout;; u- i+ G! ?0 H t* \2 B
}( ]$ Z; D$ X$ [) p3 {
else
1 D* p8 u, ?9 Y7 S# L {' Z- r @9 `/ c8 T% T! ~
printf("No effective message!");0 R, F* v; { t, _, f% Y( C
}" {5 O* H3 Z; H4 }- I) H6 K
}# w6 @1 _( r7 M% y
+ O5 C- ^5 }' {" v3 m" r7 p. D1 n1 Z9 E6 }! B$ [ j, C0 Z% Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" V: l8 j& M, G. y; ]使用下面代码,对内存使用了mmap函数后:3 y# s1 f( `1 q+ \
#include <stdio.h>
; B5 y! }% k5 U5 E0 l#include <unistd.h>
% o z( B# m3 y" [2 @- p* Z+ U#include <sys/mman.h>
* y/ H% y% ]5 |6 `" r' A# ~+ {% J#include <sys/types.h>. _6 C9 X; A4 D% b' |
#include <fcntl.h>4 s* D& q( q, P# V2 _
/ ?" A# H# n# d F; @: H6 s
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ N5 E* ?, S, B X# p1 g7 l) @- j#define SHAER_RAM_SIZE (0x20000) 9 t' I9 @3 E8 Q% F) n/ ^ y
9 H2 @; N, |7 V3 U; k! A1 Htypedef struct/ Q% J3 c P) q; n2 a0 k, b, ]3 Y
{+ T; a9 s( ^$ N* M% g4 Y0 Z5 }
unsigned int a;0 S' _0 M6 x6 H2 k9 s( {* y
unsigned int b;% D6 G2 ]4 s7 K
unsigned int packet_cout;
# ~# g) G) D1 {1 i2 B; d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; `" V0 Y3 X/ y
4 w% D( V# Q: i; O, h& e3 Ivoid read_MSG_buffer(int *baseaddr);# v# _, C: X" v' g `9 c! I( c& }7 P
unsigned int count_copy = 0;
; H4 e, ]& g8 L. l% p4 r, z2 Z0 a: m8 w7 i5 x3 E. p
int main()7 x5 K- Q, ~4 h. Y/ B. g& j
{# t# {" r" F- U3 k0 t, ?$ K1 S
int fd;( K( Z5 A. Y! b( m7 G
int *mem = NULL;
8 F* l0 U: [( Q) n9 E. u
1 {5 H, R1 h3 \! J* s) V3 C if((fd = open("/dev/mem", O_RDWR)) <0)1 j& ?! o# H a, H5 R0 c
{
4 l* U2 L) x3 x- q- c5 v# ] perror("open error");) T! Q% P# {) A% G; _. U
return -1;
/ ?7 m8 V+ |, t }
9 ~( y4 \+ y! T. [4 O : i2 }& e Z/ y! A- x' E" Q: }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 S) h5 t1 ~7 d$ B2 j. h# Q6 m- C8 Y* D# O3 B, G8 }3 u
while(1)5 o) I% Q3 i# F
{
3 U( r G( T6 X! {, ^; e read_MSG_buffer(mem);5 b8 ?! r% s9 e; |' N6 ?
} 1 G( w* a y, h' B* U: u2 I
}
, f( N" w. J5 H/ u" t8 I0 R
* [1 b! |; I) u ~ `void read_MSG_buffer(int *baseaddr)( y6 B2 u! W# \4 `
{
7 s6 m- x! i. _! b( ` D pRX_MSG_PROTOCOL pshreRAM = NULL;/ O6 H3 H9 J# p; F3 z; o
% ~+ k9 B$ a8 D) Y' r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* r4 x2 @$ j8 z7 v) u1 F$ r. x
* m( g* P3 _3 S7 b( K3 m if(pshreRAM->packet_cout != count_copy)( Z5 {, b7 b1 m- c- @2 Q" U9 X
{1 Y! h% }0 p$ Q* J
printf("a is %d\n", pshreRAM->a);/ {/ d7 G- ?8 v9 _
printf("b is %d\n", pshreRAM->b);: r! z% o/ b4 L8 T8 T: {. k1 F
printf("count is %d\n", pshreRAM->packet_cout);
' |0 s# F7 S. H }9 ? count_copy = pshreRAM->packet_cout;
0 h G a3 G1 I8 h }4 s5 s! I4 i- N5 h: u7 W1 e' [
else
2 c9 p% P% A- m! r3 d/ b% P$ C {
; K. m, J" Y# D" c* c3 v6 k printf("No effective message!\n");
; U0 e/ R6 ^. I% | }
0 h1 D) H! g+ `, n2 D2 m# \: @}
( X* _0 g" a7 ~: O$ ]3 L' u: }, w3 U2 N* @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& e7 R- U/ U* Z
/ {9 T% ]3 C- m2 L7 u, B
3 b/ Y# K8 x+ e3 N8 v. ^7 I9 U3 B. M4 ^# O4 G( \ O- x3 d9 _) u
' H0 o' p) R6 K6 V' [
|
|