|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 i5 v; \# m+ q$ ~+ P( b% u/ f u
* Z6 @/ ]% y4 {% C$ e9 G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. {* S8 f" p, ~, L8 |. {
#include <unistd.h>- B8 i. O3 J0 Z' y; d# A
#include <sys/mman.h>
- M7 u# X) |5 P! F2 \; ?' J' J#include <sys/types.h>, q1 z4 X' ~9 W6 a( s6 q
#include <fcntl.h>4 |, G1 i6 e0 K/ {2 q! \
* i" X. i& ~; y$ R6 V
#define SHAER_RAM_BASE_ADDR (0x80000000) % M- m ~/ Z' i/ O, q- U
* B4 W( B* @+ [6 T! B9 rtypedef struct
" C6 n- t* t: V7 f5 O o{% U5 V. I+ h/ d# X1 j, l
unsigned int a;
) l: h& j5 i7 Y% Q, s: |" } unsigned int b;0 n |) Z0 C5 _3 e4 ?
unsigned int packet_cout;9 }- U- S' Q- N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) r& p/ l3 Y* \7 Q v, h$ N- s
/ u2 e; C3 Q3 D+ w ]6 ] y$ t2 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 j# c& ]1 l( I R! o
unsigned int count_copy = 0;* r: M3 R& j3 W6 ^2 N1 m' t
0 K. h* [3 c2 f5 [5 F
6 O) r+ ~, S$ [8 [& {& _* d+ k
int main()
0 a& {# Z e( u8 N; O{
! k8 f' y, J H pRX_MSG_PROTOCOL pshreRAM = NULL;5 V! l; H# e% O H3 e# D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' B6 ~% V. _! k
8 f# E+ S, k+ q: c# P% K- i4 X while(1)# }+ n- R, v3 K Y- n
{$ E! Z- I0 K ]) Z0 f1 e
read_MSG_buffer(pshreRAM);" X) b" r$ e" M3 w' \1 |! W. z
}
9 @ m$ W8 E( }9 ^ D/ a5 G+ M}4 M- R" D* f4 u4 A: E* w; q
3 X: }/ Y7 m" o K0 T% r. O3 N6 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! }: J1 g9 f. f; P& C5 [{
9 g. F& U0 D) B0 D: T RX_MSG_PROTOCOL buf;3 n/ t2 i9 r+ ]5 A/ `
! P3 ^/ E9 |) w1 b9 i2 x
buf.a = pshreRAM->a;" h( ]! G/ ~! C$ V
buf.b = pshreRAM->b;
# M# Y$ p; U5 i2 ^7 f; ? buf.packet_cout = pshreRAM->packet_cout;
& R1 Z4 o" x: r. [; G+ t
- p9 t+ [+ o; I if(buf.packet_cout != count_copy)
& N1 \" o ]& [3 P: j {" ~- W: B! S x0 v' S
printf("a is %d\n", buf.a);! L# X$ W. g9 x" ~! B" L! M& F6 b* h. e
printf("b is %d\n", buf.b);
/ q6 ^7 [* w% v, f printf("count is %d\n", buf.packet_cout);% h/ V2 l0 {' Y0 v( ^5 V
count_copy = buf.packet_cout;( s& Q" p7 @, u' H# L) p5 b
}
) r/ r2 ]0 a6 i4 ~0 b8 ~4 l1 y else
6 x) O0 S9 @+ Z$ Z$ Q {" ?% X7 z) p2 Z6 c
printf("No effective message!");
) ]2 n7 c# f% a }
8 k) O. h3 h' D} K' w4 p" ~) Z- o
0 z) q7 r; @! ~ @% Y; j2 f
8 K: j# n* E/ Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. m0 D- a4 T+ v: ?5 z使用下面代码,对内存使用了mmap函数后:1 ?" |% F1 T& z0 x8 b" f8 D) y
#include <stdio.h>
" ~3 o: W0 Q1 Q4 D; H#include <unistd.h>
: @) O- W8 h9 f7 ~3 |#include <sys/mman.h>
# P; t+ P2 k& n: e#include <sys/types.h>
/ f) n8 K/ c) ?" {8 ]3 ?#include <fcntl.h>9 h$ W( F# p, [! J$ _
& u, `2 L5 m& Z& I6 Z2 N! M. y- s#define SHAER_RAM_BASE_ADDR (0x80000000)& S. ?* Y5 ^) `9 u% T
#define SHAER_RAM_SIZE (0x20000) K b3 P; l: a$ }' P
% o; n v) H7 u7 [2 g8 K0 Z3 Htypedef struct
; g. r. W- |/ b3 G. n) D5 a{) l# K" M1 |& J% \! j
unsigned int a;
; L) W8 k# k2 z; J/ u0 D/ p6 ` unsigned int b;
% W2 T3 D c. F, ^# x8 P% ?% J unsigned int packet_cout;
) `- S. x3 b# N3 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% ]5 U9 T6 d' p8 j ^
$ Z* V& p7 u" h+ a+ Xvoid read_MSG_buffer(int *baseaddr);
4 B& v# W" S& U! funsigned int count_copy = 0;9 c3 T4 h5 P6 [; ]( p
/ v# g- P0 A9 G4 b" v. x$ gint main()# f* j3 M4 ~. ^# u9 f: f5 i+ W: Z
{
# s% e& B$ l3 J a int fd;6 r' U2 M) b/ |/ g
int *mem = NULL;2 a2 X) { [- L) S. n# Q
3 Y1 `- C5 ~9 F if((fd = open("/dev/mem", O_RDWR)) <0); j- J: k- U; M( m; q5 n
{
6 ^# {0 K q- I3 M+ n0 `- ^$ o perror("open error");1 K. G# T+ Z1 K0 C6 k" g- d
return -1;
2 V1 p _, j2 ] }8 h4 o* A0 G2 `4 y
8 K; ^3 B1 C+ g/ T( S( g) g$ O% }4 n9 Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ w ^5 F) s2 I! Q
8 g+ S3 G( H( x; d" I while(1)0 J" @% l/ ~3 I) S1 m
{
9 K" |" {% Q5 A' D3 o+ W" G) b3 d read_MSG_buffer(mem);0 O/ w8 e) c% T2 v! F2 n
} 5 w( D) h0 y6 N2 g8 y4 V
}0 m0 M- F% f! v7 J: j
7 e: m+ ^# k9 d) H3 n% wvoid read_MSG_buffer(int *baseaddr)
( I: N L# O) N8 U" y/ U1 L{
' u6 ]7 ?6 h5 z5 l G9 f, G# o( \ pRX_MSG_PROTOCOL pshreRAM = NULL;% A. r9 p2 S' q1 m, Z& j+ B. @5 M) O
% ?9 o8 F' @3 K- t
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 a! @9 c, x% Q- E/ H6 F/ p1 w
) t5 O' Q3 j* l0 R if(pshreRAM->packet_cout != count_copy)
% _5 k! ]' c- |, T) y {' p0 f( M% z* X- }$ H+ ?+ t4 t( d
printf("a is %d\n", pshreRAM->a);
. q* |: [8 \' T# f printf("b is %d\n", pshreRAM->b);
4 B# Q& m, e9 Q printf("count is %d\n", pshreRAM->packet_cout);
* t6 ?% A) u9 b+ a3 j count_copy = pshreRAM->packet_cout;; W# y: n" y8 S6 j3 ~
}9 |, q: B! Z: f
else4 b3 b, Y) M, Y/ `
{
- L) @, L" v2 R/ N; v printf("No effective message!\n");/ d, T" g* X/ C9 m
}
& D7 h- l2 y' l* k% s9 V* w}! V4 U! F2 H) c. h
& z/ i; O- ?. @ q7 d6 J2 a1 A+ U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 v2 T1 H! q. o- v
5 K0 m+ s' r0 L1 A4 t5 H
7 ?7 v6 o5 F% Z) ]/ R
[9 @9 x) L/ r1 z4 k0 ? j4 A* k
) k; C; `& ?0 @1 |+ T7 A6 }/ ` |
|