|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
T' ?7 L3 h! \' a" G/ y7 Z
0 U# T* p- {7 y* V& o9 A$ Q/ [* _OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; k1 ?4 _6 B5 ~ V
#include <unistd.h>; W/ m$ W: A: H$ X& x. y
#include <sys/mman.h>
4 q- P7 b$ V) a4 a! |1 i l: V#include <sys/types.h>, b P6 W# v! Y1 H" F# H; h
#include <fcntl.h>
2 B; m+ D1 _+ R, S& K
; {/ ?5 k" y1 Z5 Y: U8 Y: ]" S#define SHAER_RAM_BASE_ADDR (0x80000000) : f% h2 W% k" ~
2 m' ^ P. }* Q4 j Btypedef struct. w' ~; x* B" N
{
7 Z3 l" Q- r2 M' l unsigned int a;
) I6 G8 @* k- M3 _8 _ unsigned int b;
8 @5 l) e/ _+ ?( ^, S, [/ i unsigned int packet_cout;2 B( C/ }8 k4 B% W L* o* N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 P( i3 W- c$ g5 u
/ k4 X5 V' G0 o* _9 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: a7 C9 s6 w0 b5 ], _. O/ ?& C, j+ wunsigned int count_copy = 0;( W5 ?6 M& F# v% v% q6 ]
; t6 P1 Y/ r; `3 P! X' w6 I; n
j: ^" s) w J1 f/ S4 `" V2 Y% gint main()
1 b5 c1 H7 j- y) j. s{
( U I* d7 g5 q pRX_MSG_PROTOCOL pshreRAM = NULL;9 ]1 R! i* X3 l+ a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 P2 U( r" `1 w: `4 B1 V9 K+ @1 D
3 R' m; R/ a' Y3 B while(1)
P; \- S0 k+ S) O8 j. }5 G% A5 u! N {
$ B1 |9 p4 u0 v3 x read_MSG_buffer(pshreRAM);6 V5 v* Y% L; w8 T* B6 G/ }) ]8 }( w
}
7 M2 Q) M* c% u% `: `! c3 \}
# R6 h& S5 ]$ Q3 M d- D; ^
. z* u# s& y4 r, Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* o9 X8 B" t) J$ @2 ], z4 ?1 Y, B. V I
{
5 S: z6 H+ K+ H \& t. z0 O RX_MSG_PROTOCOL buf;) e9 F" x- a2 I2 i) X
+ F* ?" q- v, Q$ n0 f# i buf.a = pshreRAM->a;
, m9 P9 ]% b9 L9 h5 v) V buf.b = pshreRAM->b;
% d/ e, I: R" I" W/ P buf.packet_cout = pshreRAM->packet_cout;( w0 H, H, _: h3 B! e
& {6 b4 ^. f- c' d$ `5 Y E$ f2 A { if(buf.packet_cout != count_copy)
# z5 x* Q' ?; L$ N {
7 @( Z( [% K4 n e# g printf("a is %d\n", buf.a);- O" D9 h" ~; F' t
printf("b is %d\n", buf.b);
4 J6 s# `2 m# k1 n$ Z% u& Z printf("count is %d\n", buf.packet_cout);
; ^' V8 L L3 }- f/ G, ?* T+ p count_copy = buf.packet_cout;
, s' K4 b- C* ]0 \+ a! g }
" M" [9 ]5 }6 J else
4 ^: S. o7 }& ~1 Q1 j9 D9 V! L: R$ K {9 m, A0 F) @# f, I7 g
printf("No effective message!");
3 F9 x9 _* P, h6 P9 c. i( Q }
! }) M0 T- s O; r# u& I}6 J: g$ J0 [; j' G/ c3 q8 U
6 E4 U1 b5 k( l* L5 D
: x+ s ]% X H5 X! J, h- b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, |3 ^% l+ ?( i& H* }# J使用下面代码,对内存使用了mmap函数后:
3 h |( r3 Q( p2 a5 u: l#include <stdio.h>
1 ~7 \7 S5 Y( s6 [#include <unistd.h>
! R2 T3 t3 s/ b" j' j#include <sys/mman.h>
/ r1 D: Z& d, S7 O#include <sys/types.h>8 Q9 u1 g( s/ s- H
#include <fcntl.h>7 w+ v/ T T1 X% y" x0 h3 K
" j$ o- T% a* {& E L) \#define SHAER_RAM_BASE_ADDR (0x80000000), ^& {* b5 j, Z# @( z4 |
#define SHAER_RAM_SIZE (0x20000)
/ B1 u7 k, T1 O) O2 ]
) {* S1 K6 J+ }. t+ T9 \! ?% v8 etypedef struct
$ _ u4 e8 V) l, K{
: W0 d9 d& B+ n1 Y9 R" W unsigned int a;2 L4 O+ r/ L( k( j0 k# [
unsigned int b;
) @5 Q+ R4 E4 E2 f3 ]# k unsigned int packet_cout;
" ?' e( O J7 g. D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 S; c* z8 K/ w' N9 ?' h6 r- T; r$ \- L
void read_MSG_buffer(int *baseaddr);
' N( Y k7 G; gunsigned int count_copy = 0;
) T+ @+ p( U' ~8 E8 C
# s8 {3 I8 k7 m' P7 m$ g H8 Kint main()
* s1 \7 V) \; I% g1 o- E{
6 m. I% \& n2 m, @( R0 `5 a int fd;
9 Z2 C' P* g4 a) v; i int *mem = NULL;# {# ?) x) ^9 u7 G8 H- l
3 l1 w+ @2 T% F7 g; K/ ]
if((fd = open("/dev/mem", O_RDWR)) <0)
# T1 m# x: Y& R. a: ^& k {
3 e; X6 q1 a. B( Z* A perror("open error");
% Q+ q1 [. F! ]. ?$ K# i return -1;
B7 O6 ]1 c7 j O% D% ?: ` }
1 A' E" x- o0 B! V" k& u
. S$ L3 d! _' t* e1 }! y* W mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 @4 ~. y; X) s; ~+ s. G
: i6 C6 W/ k, r
while(1)5 W: N- D1 K6 P$ O
{
+ f3 P9 L$ g" U. p2 X read_MSG_buffer(mem);
( b8 X" Q: M, k* u4 D/ |' ^ }
/ \; r" Q1 a" B9 w C8 @}
- L0 t/ `8 I4 U4 p. c* a6 j. V$ z( { q* {5 E
void read_MSG_buffer(int *baseaddr)
) G. H2 _7 V) E$ ]{* | Q0 U$ f! B+ a$ F
pRX_MSG_PROTOCOL pshreRAM = NULL;) U Y0 @8 B5 q0 T. e
( J8 [8 m! g! `+ J9 C pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% x9 W0 j" x* N
* Y6 _- A3 i% p' F8 z* O if(pshreRAM->packet_cout != count_copy)
6 J% H% u9 L% }+ I8 x, n {
3 ^" |+ q, w! E! ?5 ~ printf("a is %d\n", pshreRAM->a);
! A/ I. `, H' N1 c, i4 o printf("b is %d\n", pshreRAM->b);0 H6 [2 ]- n5 j( r+ E z
printf("count is %d\n", pshreRAM->packet_cout);
, K# |, o9 F8 X3 J4 }: h count_copy = pshreRAM->packet_cout;
! B7 `1 M4 t* C8 e2 \ }- |- _5 ~% m' ?' b, w7 n$ c
else
. `! ~- U; c4 o( V" ~ { J i3 a T$ F- c: Q
printf("No effective message!\n");0 W2 e* i9 v9 U
}
, y7 |( p* `2 y}& \2 q$ j- E6 t' c" K# z0 A
6 l, K; Y6 k! {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; K7 Z2 i- u* b1 W
% s% e/ m6 d- s- Y& H. q. z
1 B4 A0 G3 E1 p7 w- R9 Z7 A4 a* r$ g9 N6 X/ z C, Z6 F) [, z
9 I4 F, N, n) q$ N8 N4 }7 _9 j
|
|