|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( ?; c3 B* ^5 `5 g0 ^
1 F% s& R2 X+ c# f h" HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- \$ |/ h: q# ~8 @0 ]
#include <unistd.h>
0 @$ `! r/ _2 d; \3 _0 ~) I#include <sys/mman.h>- W. x$ N4 L! F% j o
#include <sys/types.h>1 t) J! M# y0 b
#include <fcntl.h>6 W& L. Z6 \7 j* A& x( {
# f5 z+ V6 v! W#define SHAER_RAM_BASE_ADDR (0x80000000) ) [6 Z! W% ?0 `5 y) C+ u
" O ]+ {- U+ F! ^+ Ctypedef struct
( \) y1 Z3 j' U; |; n# J" ~{
2 A( S2 h1 Z3 e; m) O unsigned int a;5 g7 A8 m& x+ h; u* } `
unsigned int b;
- t. e1 h- a- W; B$ g+ g unsigned int packet_cout;
% [' L: K6 m; s) F7 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. V7 C* {, J5 x5 p0 h8 H8 p; S! N# n9 l6 N5 W5 F4 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 ~$ n, F* E1 P% ~- o5 [unsigned int count_copy = 0;
& l, ?7 F) W, o" k- G" `' S
7 p7 [+ }& L( `5 x4 U# C0 ~, k1 I j$ T
int main(), d7 [6 ~2 ~/ s5 w5 |
{
W7 m Q$ U9 B- ~0 g; Y( E pRX_MSG_PROTOCOL pshreRAM = NULL;/ m) Z7 J% N+ x/ U
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 ^6 r. O( w: a" Y/ c8 S
5 N% h7 q& g9 Z# P. B9 h
while(1) w3 G" z8 ^) r, c2 r
{' W$ R8 k7 N) V7 ~% ?' s
read_MSG_buffer(pshreRAM);
+ a, T! ^. M. A P" C7 Y+ G }
! ?: w1 m9 W# {- ~}
+ q5 e7 h" b9 F( t4 y! U% [7 c* d( i& `- _/ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( T. `0 T% L8 {- u }( R/ `{
9 U7 Q2 |. J, a- q! }" ~ RX_MSG_PROTOCOL buf;
! A. X9 S: x" G$ z : @0 I; `5 X& M- w9 ]. E- y
buf.a = pshreRAM->a;7 r0 |5 |: c; a2 L
buf.b = pshreRAM->b; ^0 l6 a& n+ o/ J! ?& j
buf.packet_cout = pshreRAM->packet_cout;
* ~% Q6 {7 \$ ?, C1 r4 R7 V- [
, f/ D3 B: P+ K% v2 _ if(buf.packet_cout != count_copy)
! q$ h$ g# v& Q8 L( K" E! _+ U: l {
" S9 ?# z& Q r7 f printf("a is %d\n", buf.a);
- f1 z! B" E# [* I/ s' N) J% D4 \ printf("b is %d\n", buf.b);6 ^% Q" I7 p/ b) _0 T- W9 @
printf("count is %d\n", buf.packet_cout);2 S/ [+ F" F, p( v$ s+ F
count_copy = buf.packet_cout;
$ v1 O/ C' N: p7 A5 a7 b }( t$ B9 ?; r4 l" g3 k9 g
else
, k% G# n6 R, I+ ?' Y {
" ~. |& ?, D0 R3 n1 x ? n printf("No effective message!");
" u3 r# g4 R2 A }
- Y% `: G+ l) W1 D* r& y}
% z8 }( r/ _0 \+ ~2 h! Y" a$ w: H5 u+ h$ @0 Y- T' }( y
1 g/ m% {! \8 j- l) o2 R0 E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 P' v) I* R! s0 o9 s5 p; S
使用下面代码,对内存使用了mmap函数后:
9 c( T) a$ K8 Y; i1 A; d0 Y& _#include <stdio.h>. v2 S' ?4 ~4 R
#include <unistd.h>' s( p: A% U7 {* Q& Q! E
#include <sys/mman.h>- t Z$ c* W9 k
#include <sys/types.h>% g" @& Q, R0 H. I4 V+ a
#include <fcntl.h>
5 H- p- j0 z& V X c/ ~' Q1 E6 N, D2 r' @ y
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 D8 m7 ?: X E/ R% h) q5 i#define SHAER_RAM_SIZE (0x20000)
& J( y0 e- Z& f {, Q' F$ S
, H3 K, ?) `6 stypedef struct
, i4 M3 T* M& R0 P6 U" d" @" |# M{
7 d+ _3 l3 e# h9 Q! D0 ]& x unsigned int a;9 [& I4 y- r" m% R- c7 \' ?
unsigned int b;
0 J" o4 h i! A+ Z" n unsigned int packet_cout;
9 }( l0 v( P M/ t, w9 b b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# B2 E! L/ Q+ `/ ]2 M+ k! W" n/ N# B1 L3 f& `6 t+ g
void read_MSG_buffer(int *baseaddr);) c! p# D/ K& m
unsigned int count_copy = 0;
7 {# d3 D+ C2 N/ t( a( ]+ x& a# ?2 E% j; B/ |
int main()
: o/ O; |! M j( N; G+ k! n{7 e: l& i* w: A
int fd;) }6 h$ X4 c" j1 i4 z2 G7 ]
int *mem = NULL;
& R5 d3 i, C( g3 v2 N8 L* C( A2 y: U; X
if((fd = open("/dev/mem", O_RDWR)) <0)
" C4 S7 J, y, U1 I7 M/ z9 ?8 R8 \! t {0 h8 R. M% M4 z4 o4 u7 T0 F
perror("open error");" i: a, c/ V0 m$ y7 w( [* b! l1 o
return -1;
) _# S3 ~' [) Q& U4 L" d }
7 u6 z0 z+ \- p' O
: w3 l# M7 _6 f% Q: v" P mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( k8 P3 t4 N& ^* M) d% n8 f
# i5 |3 ?; C0 U4 B) [
while(1)
' V1 W5 N$ F; @, `2 d {$ K2 z/ W2 v5 \/ A! O! [
read_MSG_buffer(mem);) z9 Y2 c' _, V: q& E
} H( P" U- K: Z5 a/ J# _
}0 R. f, n$ n7 J8 m1 Q" n
; O$ H L i; W5 ]& Y! ivoid read_MSG_buffer(int *baseaddr)2 F# w5 ]" P8 v. ^) z* O# {
{
4 Z9 j9 j) c! E pRX_MSG_PROTOCOL pshreRAM = NULL;5 v% d# ~8 J' u$ q, f/ J8 X0 z
4 e4 c3 E2 V( F: x; P- D8 q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# J& N1 j. A/ z1 A) A
: Q4 I8 Q7 }! P) l5 f v
if(pshreRAM->packet_cout != count_copy)
/ A" t! _( k! y7 a( Z {
& i! D% @( A/ F$ [, r$ X9 X) Y8 @ printf("a is %d\n", pshreRAM->a);
" i+ ?, {: p6 L8 M2 B! q printf("b is %d\n", pshreRAM->b);
9 g: E4 J1 |' O( @( S6 K printf("count is %d\n", pshreRAM->packet_cout);
7 T# D" W, z+ `& L! `* Z count_copy = pshreRAM->packet_cout;
% s% N% ]$ P% ?9 k: s1 H }
" b' T M. u/ W* J: T$ } else# }# u7 m: R2 X& W
{
$ c7 Z4 r% c% j- T printf("No effective message!\n");
: H4 N" e1 m+ N2 ^3 Z/ [5 `% u$ | }
- H* y8 A4 h) G& k6 i9 q}; A% ^- ^) G/ t$ x1 [: J* g: P
& ~( V5 B x0 b. ]7 ^ y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ N& o% m/ I9 ?4 z3 x! u8 z; X% j0 y! ]* w% D
# x6 C, C* B+ S& U- m
2 C" U4 q0 e& @2 r3 s4 Y3 ]
6 Q( _# f5 r( I, ~! |) Q m6 K* I |
|