|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % I$ w6 i# e i
; @$ t0 U3 U6 |) W( j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 B0 a9 e0 g; y) J+ d#include <unistd.h>+ Y5 d' }" k. Z$ k
#include <sys/mman.h>
d4 ?! c7 u3 u( L#include <sys/types.h>' G+ Y; l2 _) j: E( l
#include <fcntl.h>
8 ~& y+ i2 u" H% ~# s$ r! J# U6 U0 x7 N# k2 \
#define SHAER_RAM_BASE_ADDR (0x80000000) * @+ R3 e8 \5 t4 j W5 V
. A3 ~" c5 T# E( m( Ytypedef struct1 Z" c1 v! l! L0 B9 y& E7 }
{, _9 S# E) X0 U
unsigned int a;9 _+ j. r7 s3 E' o
unsigned int b;0 p' O& V6 N# D0 B
unsigned int packet_cout;% n& B* M7 |0 c/ x: v* ~- f4 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ |) M: i# y& c9 k) c+ I! W/ S$ E! |% X7 M3 A8 x" h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
~0 ?; o" y; g8 q! n: p& {unsigned int count_copy = 0;
0 h( U8 d; l/ C6 E3 V& t% q1 G* J; f& i+ @. g" _: k
$ V) D% v1 ^& y- Fint main()9 j0 I" w) D% d3 {7 N: b6 ]( x
{+ l4 B, I" ?$ K+ f4 p1 t
pRX_MSG_PROTOCOL pshreRAM = NULL;* |# n- F# i- v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- w3 K& ~' J- F$ P! C% r
9 f$ h) p" u2 y' { while(1)! q$ d1 f) m5 Z; a2 ~1 g9 D
{
a E e7 K% M; V" i- g0 c- W read_MSG_buffer(pshreRAM);3 B, a3 ?& P; s1 m
} : Z$ \8 {6 d* C2 p' w+ e" M- C) W( c
}2 Y$ R1 S# l% m+ L9 {% @
V6 b/ |4 J- e# G) B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& K) c8 w5 X( L0 x' A
{
7 v) I0 ^" d& [/ c1 Y; R RX_MSG_PROTOCOL buf;
/ y2 H% v# J: Q: O & l0 O, M' r. R) ]
buf.a = pshreRAM->a;2 s( G: w4 }8 T* q0 U
buf.b = pshreRAM->b;) c! a5 E7 t' O3 F, }0 o
buf.packet_cout = pshreRAM->packet_cout;
- x1 Z6 s$ x& `7 F) \% T3 ^% S% o' k 6 O, s1 `- v ]. m- G( o
if(buf.packet_cout != count_copy)
E! ~* ]7 G. _4 _7 [ {3 \9 s, S2 L9 n- b6 F) F( _
printf("a is %d\n", buf.a);4 `' [0 t* X% Z$ _
printf("b is %d\n", buf.b);- _3 [. M2 X, k( o* U8 m
printf("count is %d\n", buf.packet_cout);
3 r2 d6 C3 ~% U a5 Y2 p count_copy = buf.packet_cout;- w* { C' J1 F6 a( o$ H" }
}
, Y# h, ?+ a1 _& J0 C- G$ k N* h c else
* A. R, C: {: M+ ^, W {( N. c, d6 w0 d+ h/ U
printf("No effective message!");
+ k5 k1 x" Y# S) a4 |% p( x* a }( w. V4 @3 L; Q% O+ K
}9 P: ]; h) I* G- _' e; ?
' F2 k l) b( v" O
9 B) f/ y$ |5 k- w& {. G" o0 O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! P- z+ L/ u( [3 Y% c, {' D
使用下面代码,对内存使用了mmap函数后:3 d/ N0 X; k4 E0 p
#include <stdio.h>
/ j4 U2 L# ~' p2 ]#include <unistd.h>' V+ p! m$ T" W6 U) c: \9 E
#include <sys/mman.h>- g( b& h, c3 d4 c* E
#include <sys/types.h>, n1 C( n/ J- j. s6 H2 v
#include <fcntl.h>. G! n r; V) ^4 `4 ]( F
* f( n* k* l+ x, }. a, ~( U% n
#define SHAER_RAM_BASE_ADDR (0x80000000)! E- v* W5 ^% F; b- Z+ Z
#define SHAER_RAM_SIZE (0x20000) / v/ ]- p4 @" G ]" c
) R0 h4 f* L' j+ O, I; ^" _typedef struct
; l7 j* i; a; ?' W" a- i{1 p: z* m" v1 d- ?3 ^3 q3 d
unsigned int a;
, p( P2 P9 \, d) \; m* e unsigned int b;
# X. E5 a* q% s4 k$ i! t unsigned int packet_cout;" u) R8 v- P- J1 R; B5 o; N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* ~/ O" P6 n0 A: ~9 T
& z0 P3 b* ]" v0 M" y, B! Y* b! Lvoid read_MSG_buffer(int *baseaddr);. t, L0 X& \# P% w& U6 X! B% l
unsigned int count_copy = 0;
% {; Y1 d) d3 I/ ]) e S, v$ E
h- O) _& E3 A5 x4 Iint main()) \' g. B$ u, Y$ ]# Y& `* e
{
$ I; ]$ T# n9 g' _ A int fd;
+ A! W, P/ g" M7 B/ k5 J" P1 j int *mem = NULL;
$ F# a- g/ m5 p/ _; l
* Q1 l5 {6 e7 W8 g+ l6 V if((fd = open("/dev/mem", O_RDWR)) <0)/ G0 r7 S. p# @( N) t$ g: z
{+ f: U$ D `5 {2 T
perror("open error");
+ ^5 k4 R' k7 Q! j1 u! a6 l return -1;/ [, S& Q5 m: X1 @3 {* O
}
8 Y2 h F; P, O P2 C! q/ E. b 8 V, l/ H, ^( _; r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& w+ G8 j1 _$ g. j& U4 ]8 w6 G( `( V" P0 A! O/ I( x3 m
while(1)
, b+ i! c: E4 y& R$ g5 o {
3 v+ b D' K2 K0 D3 \ read_MSG_buffer(mem);* \& _" M, S) m
}
6 c5 H+ N' p+ l# p}$ e; v `" G1 ?
' v9 {; }# y) r2 uvoid read_MSG_buffer(int *baseaddr)% s# i; Q- Y* e" s+ Z2 U
{
! |8 U- \0 k6 G' N" N pRX_MSG_PROTOCOL pshreRAM = NULL;
& r+ @% E1 @! ?2 U4 c* F7 O. y/ f A" s; M( Q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ t- z- U, W" T- U j" _' A
7 |7 Y* z3 r+ }9 K$ f3 O0 U if(pshreRAM->packet_cout != count_copy)
' C4 O: x; T; z$ a. b1 H4 Z4 j {
; |) p& e( x9 F9 \ printf("a is %d\n", pshreRAM->a);
1 L: H9 {% [+ U; N/ o printf("b is %d\n", pshreRAM->b);( E8 v$ e! A/ c: v
printf("count is %d\n", pshreRAM->packet_cout);
; B' n; j! r- _ count_copy = pshreRAM->packet_cout; `# |7 ]+ Q N: a# J
}
! b- S3 r5 H! H- b0 I! M# f, ]$ k7 A else2 D; ]: m, ]+ D- z
{
8 M* z* t6 y& _" R" H) G7 [4 N- d( f printf("No effective message!\n");+ }7 X7 `+ U# C" v# I
}
2 E; N8 G) O, N* K9 {9 ^: B3 O}
% r+ K0 N4 u+ I; B6 E
/ m# {3 m) l- q0 t) l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 Q. g, r' p3 i2 C
1 w# Y3 e& J6 ?# l* n
9 \* U0 ^, q& I# j! `( r, v i' ~2 Z# Y+ O5 B
4 U% d1 q- o% K! u2 x |
|