|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 |8 _& @" Y) [) [& ~! [
/ c7 M1 F: I, ?5 ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ {) [/ J" u+ f [6 L4 a
#include <unistd.h>
3 E4 X8 _! T% A2 l i* ^* w#include <sys/mman.h>
8 T! X6 w5 x6 b& L3 }#include <sys/types.h>
* G# A6 B( G& J+ x5 c: |8 {6 @ J#include <fcntl.h>& R J3 u# o5 o; a# K8 a
0 b) I3 o0 {! z; X/ \
#define SHAER_RAM_BASE_ADDR (0x80000000) 6 g- g$ i# E# ~1 G
/ ?1 n5 f9 K8 V: a
typedef struct
5 M% H* O- i, E- G) g{% F4 j* F. `- [6 y0 i1 h: E' O/ a
unsigned int a;
r, C* U6 M+ \+ C. ] unsigned int b;
: C% Y$ d) H& S2 w unsigned int packet_cout;& f/ G4 M4 V9 q' \' y9 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! ?, G2 g' p5 J+ F
+ M$ r" N+ T! L: ?' n% W) Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% w) K$ a) {) T2 Q1 b- zunsigned int count_copy = 0;% D$ H& X" D7 N1 ], j$ g
3 c- U3 \9 t0 @# b8 y0 ?
+ O( @. \3 }1 F: \6 B, w2 r0 }
int main()) {& L) }0 ] F! E' |6 W. `; Y: ]+ w
{
* {$ e7 Y0 }$ R' s p) [$ b pRX_MSG_PROTOCOL pshreRAM = NULL;
; U, E! u' R8 s pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 w u- ~( c4 z8 _7 p( @+ T/ W
" v! F9 u- @" r' q7 C) l# m while(1)+ O' @" G$ P) E1 R
{
* l4 t6 y+ _$ C1 P! ^, v4 e read_MSG_buffer(pshreRAM);
4 q2 x/ u! k) I) C5 Q8 B- B% K- |, A3 ]; F } % \ F9 G q" _& Z7 }5 q
}
. L; I3 X3 E) D& `" N9 ?5 q) ]3 Z" e3 u$ Z4 y" O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ x; n& Q5 g" B( v+ d
{
+ h+ J5 X) B( H% H" Y. c v! y$ j RX_MSG_PROTOCOL buf;
! d7 G$ \1 `, k# A
) o6 \) m. h" Y. Q buf.a = pshreRAM->a;" R% ~( m9 Q* D6 T& C
buf.b = pshreRAM->b;; n$ s" [* c) Q# m3 |
buf.packet_cout = pshreRAM->packet_cout;
, U- y; V9 [3 ~3 T1 j( S, ]
/ r4 g# U0 Y3 O3 w if(buf.packet_cout != count_copy)' h! J0 K- H1 V2 v, U" q
{
1 n0 P; s% f) _0 o' o$ D printf("a is %d\n", buf.a);
& i; L! C c/ d6 S/ q7 f# @ printf("b is %d\n", buf.b);
+ K# ?6 ~2 J0 Q) { }1 s! b; V! V printf("count is %d\n", buf.packet_cout);
& V0 ?/ ]. a3 B, y8 h count_copy = buf.packet_cout;2 G5 b. f1 Y! H, q+ s
}
+ j# j# q4 w% F( A2 \" s5 r9 k else
h. k/ J _$ p {
/ R3 _6 \' ~' T/ ~ printf("No effective message!");( ~4 S6 q# k. I
}3 y% T+ D+ b( g5 }4 ^
}8 H1 V `% U/ E7 U+ G! S
8 }& q u6 V) `9 m
5 W* U( O# z2 a1 y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: f9 T+ g: g9 ` O
使用下面代码,对内存使用了mmap函数后:
) P5 G$ _2 Z+ p. T6 o#include <stdio.h>3 ]7 Z: q, m7 s* p
#include <unistd.h>
, K- A( e C* P3 _#include <sys/mman.h>" u( G" e- E1 Z
#include <sys/types.h>6 C; O) Z' J4 M* [0 ^/ M; O
#include <fcntl.h>
1 H5 Z/ S9 M6 k# L7 P
! v! g8 j) S$ Y. m+ S#define SHAER_RAM_BASE_ADDR (0x80000000)9 v: P% W+ ?3 m% s% f9 j( W n1 r7 i# Z
#define SHAER_RAM_SIZE (0x20000)
+ W! m( n0 n- `% p- l* c- m( ] _- N, I! t4 ^0 v
typedef struct
1 Q, z# B* ?* P, G: u5 t{6 ? a! ?7 \7 {# w( C3 p
unsigned int a;
' S; M- H4 v" |( J1 U unsigned int b;, w7 {5 \/ L8 l3 `( w
unsigned int packet_cout;/ y! y1 h/ z5 d! g! U* L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 ^1 S, N% v) |. F- x0 B
. N& _$ E" o3 K, w
void read_MSG_buffer(int *baseaddr);
/ S4 B- l; ]9 @7 O) Eunsigned int count_copy = 0;* R0 A0 Z! n: V/ p/ d
. S' O* E# W# `$ X' G0 Z
int main()0 P9 i1 R* j; z3 N8 q
{
! p; z" O$ j# Z6 k- L int fd;4 n9 H* `: C+ }, Z0 D6 f
int *mem = NULL;
. u P" S1 S9 x0 c! O" K# M3 q* k' ]: g7 J _/ e$ H& }% J f
if((fd = open("/dev/mem", O_RDWR)) <0)
& ?1 V) d" c9 B! P/ S: [ {7 E0 U! D$ B3 V0 ]# G
perror("open error");7 ^1 w% W# x) r9 Y5 N
return -1;
% Y* w' E% e/ o! ` }- b) W/ W# p/ M
6 e2 N" w& K* _# ]( ]) D' J. m mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% [$ y" C5 _' J3 u, v' b" F3 X
$ Q' n# H" ^& i7 i0 f/ l. Q$ ? while(1)
0 G* g2 _& w" o! V {4 g8 f8 k! j( j1 j/ ~( U
read_MSG_buffer(mem);
2 s, W! u) j5 L1 b; v) a } % _; ?' ^. u1 }+ A
}2 f _5 E8 {' P* h' M0 p4 B7 z* f
5 v0 C1 U s6 g! N) Svoid read_MSG_buffer(int *baseaddr)% q, U& n$ T# u: k; u6 d. i
{
3 Q1 ?' m1 } l! T. [* ` pRX_MSG_PROTOCOL pshreRAM = NULL;
$ q- \$ p4 Z+ C9 k
" h6 g) B; x- G2 y4 T/ k pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) G2 h- H/ z {' j! n e# G" F9 u2 i' }. R
if(pshreRAM->packet_cout != count_copy)) X2 a9 _4 t( Q/ j) n+ I; C
{: V' ]! U8 b2 `
printf("a is %d\n", pshreRAM->a);. B% A" q u3 |7 ~0 }3 S
printf("b is %d\n", pshreRAM->b);
# e1 b2 D" Q6 m/ p+ ~( M printf("count is %d\n", pshreRAM->packet_cout);7 I8 k" r$ _/ [; C% Q& [
count_copy = pshreRAM->packet_cout;- g& b O7 ]& _6 E& R1 u
}& O( z o6 g/ J6 ]
else2 k4 K% g1 v) H; @. c
{! P5 R S3 K: N) }/ K
printf("No effective message!\n");+ {: `9 u, h. n; M
}
7 D$ i' X% r, D$ h! a! t: t a}
+ y: ~% V& X6 q3 N" ~7 f0 S8 |8 d$ W3 s+ n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% x _9 l& a+ ^! v" |! m) i: D& k0 O% L! V
$ K) N, I( q& c
# `# \4 k% s7 i7 L9 g) |/ f. V2 M; P& _& R
|
|