|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & ?+ @" x+ X$ l% m# v4 @
7 w- C9 S; {9 xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 b3 A8 c- g- G7 o; U#include <unistd.h>
9 z4 { Q% k+ x3 H#include <sys/mman.h>( T; o- p) u2 ?" j& Y3 t
#include <sys/types.h>7 [/ L: R; m" k
#include <fcntl.h>" G2 i. V3 B2 S2 M/ f
' r8 Y% g9 y ?2 g+ @ V
#define SHAER_RAM_BASE_ADDR (0x80000000)
" P% q, g7 }) H, F( `# n4 T8 a" v" s4 s( d
typedef struct
* i; W9 r! `& M) K2 |! U4 f0 E' |; A{
m' I4 A+ M: [1 h i; ] unsigned int a;
; O/ X" q# K1 Q- q, D. Q unsigned int b;
V( Q& i. w, j& E3 P* t+ G9 h unsigned int packet_cout;- l" ]8 i, q! k' c0 D6 e$ a. ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, `" f, s# z. r( P5 P, z2 A7 ~" {
& P$ m' v" C1 `4 j# H$ }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' m' f9 a6 W3 d" z, w* L3 r
unsigned int count_copy = 0;( v7 S0 j6 Z. h- J
% }* m1 t- m. [3 B: c
8 y6 e, D' t- vint main()
: s. T9 B/ ?* @- O C3 C: H# w{
8 X$ i. I' P5 N3 b- B! ~* w pRX_MSG_PROTOCOL pshreRAM = NULL;& t9 U3 \" R" |! |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 I& `6 r1 _" K
" H& H4 b: o! P7 A/ V+ B while(1)
* `* h: @3 B# W: b, t2 v {
1 I. p4 y1 c: N' |6 ~/ N- X7 U read_MSG_buffer(pshreRAM);
3 x- m" L% ~. F6 }; t1 ~, h$ R } 8 W7 B" Y" w+ [8 p
}
" [2 l+ J3 K7 [+ I
# E0 @% O6 [- V2 I" j9 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# K. c) D5 M- {1 F/ i{7 c! q+ o3 H$ L% k4 r
RX_MSG_PROTOCOL buf;
( W. H# [3 Q+ f' g) B: D9 t 7 \2 z; D4 f5 o; ` [
buf.a = pshreRAM->a;
, T* O" y' q8 ]% Y. h( \ buf.b = pshreRAM->b;1 f3 B4 b/ |/ B' I& q7 h+ x8 e
buf.packet_cout = pshreRAM->packet_cout;/ x7 {. I. d. U5 n9 s- ^
' u8 x) i! c5 J: B if(buf.packet_cout != count_copy)
! k+ T( }) v! D# q {1 z) X% W4 _/ g( e6 t
printf("a is %d\n", buf.a);% U; `" H, x7 \6 I5 V4 e/ X) t
printf("b is %d\n", buf.b);4 F6 y* i9 s3 k% W$ q3 [
printf("count is %d\n", buf.packet_cout);* a9 H6 T1 O% M
count_copy = buf.packet_cout;1 m# d% X0 T) |5 T
}' M" S0 F+ Z# @( S0 D
else6 a! O) l2 G0 \1 m7 G/ a/ ^
{
2 F! b9 z; G5 S r& f5 |# E printf("No effective message!");" T. B, u( w2 Z6 o7 z0 N1 [
}
6 Y! m* k1 }7 k" `* y& `}
3 [/ D7 L; ^6 K1 g4 v* L6 F3 g
7 K6 y0 M* |% {! }& W; T
. K$ M @: W: F' F: [; J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 T' b2 X; j, R5 w8 q
使用下面代码,对内存使用了mmap函数后:
# E% o: w9 |# i8 O1 D#include <stdio.h>! ` d+ C1 Q: v) r
#include <unistd.h>2 t( ^' t7 r1 Q8 G( J' n6 I
#include <sys/mman.h>
. @: \+ L. B9 n1 m+ d2 G#include <sys/types.h>
1 G( E1 c3 [8 {- l5 C#include <fcntl.h>
" ~$ z5 `/ T7 W: G. M& D f" o: ^1 m3 A6 P% D8 G5 R6 I5 B
#define SHAER_RAM_BASE_ADDR (0x80000000)3 R: l/ D8 g9 L, c; V5 u# ~; F' m
#define SHAER_RAM_SIZE (0x20000)
1 P; z/ P5 m- }
4 L% j4 U$ X) E$ ntypedef struct, a, ?) p2 V& f) q/ |
{
: ?1 d: k! M6 f' P+ `$ J+ [ unsigned int a;
9 T( v T+ V9 Z8 V* E6 G! M, @ unsigned int b;2 p, t7 U# H3 x" M& P
unsigned int packet_cout;
: e# x! D/ l* m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 H) t5 K3 B) ^' R' Q
- U- `& U6 ]& d$ dvoid read_MSG_buffer(int *baseaddr);
/ ]# z$ k% r: @unsigned int count_copy = 0;
) {$ w9 M% k# p! K% J# _+ W7 B R
# }, h* J6 J3 G9 yint main()9 T0 H I8 `$ C M' W4 A
{
; h. A) Y& b7 C: J, j0 q int fd;
5 E7 T% [5 C" S F int *mem = NULL;
% p, ?' j9 o- k! r2 z5 ]' }6 d+ \+ Y: p" f& c1 [4 [/ o* {
if((fd = open("/dev/mem", O_RDWR)) <0)
. Y' _! b j- g+ T( Y5 g; A$ `1 m& o& y! H {
, x2 R8 R3 T! Q% W2 J perror("open error");( D- n8 ~1 e0 O: r2 { x
return -1;3 `% L" l$ n4 r' e. R
}
: j8 r2 }% B7 ^/ i, T* j: T
7 \1 y9 d1 V5 z4 m mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ Z% |! X/ h; {( a* q. R# ], S% F& X0 _) V* I
while(1)3 t+ _4 b/ ~$ [6 N
{5 h+ i) t- q, j5 N7 C
read_MSG_buffer(mem);
- v6 u, y3 u4 O3 @( L# X* h } & G* d, w, _ L$ _3 ~/ P3 ]
}
3 a* Y( Q) Z& C# J, t9 R7 d. j3 I: [5 O( Z# j, U
void read_MSG_buffer(int *baseaddr)7 s# y# ^3 o) H1 U1 ], Z
{
9 u3 O) M* I+ S/ Y( \' a pRX_MSG_PROTOCOL pshreRAM = NULL;
; G3 C! K# w: u5 p
' H p* X& \' B; X6 N pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& Z( L) f, p: e: s1 [6 s* H
! B2 W- l1 a. w' E3 b
if(pshreRAM->packet_cout != count_copy)
! W7 X! W- }5 T4 I M1 M) U. ]3 d {
: C; y' Z8 `+ b" _' J1 q! h5 I( d printf("a is %d\n", pshreRAM->a);
6 s2 U$ t7 S" i4 [/ a E7 w5 O printf("b is %d\n", pshreRAM->b);
% z0 `! _" a4 I( w8 r, y* C* `* B printf("count is %d\n", pshreRAM->packet_cout);
) _' [, ?7 N; [9 E count_copy = pshreRAM->packet_cout;
9 x; `" \' h: ?) O3 G }
3 N; M+ {9 T- V! ^( R else" M6 E% t2 L& |' u* q
{ K# H$ @: r# }8 g$ ?2 o
printf("No effective message!\n");+ D; @* U- W9 I# M
}
3 a7 Q% s) v) h! h0 A, R F}: |( N' f1 a9 H
2 h; ~4 b3 a9 r ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* P5 } k4 j; P8 [8 _6 O3 K9 r
$ \: c) }, r# b# Q1 p3 J
- x, C, o1 S2 m: ^: }0 t
+ L0 g: M' Z9 g# C9 g$ K) W$ F% E" r* r
|
|