|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' ?: ^6 p: |; A1 w% I$ M7 `5 D# s Q2 J& |1 y: V" X% K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& B2 p" S) j c) M! B4 R#include <unistd.h>/ Y9 f$ R1 C1 f% m1 E
#include <sys/mman.h>. a+ j8 u0 O3 c8 e( X6 f' L
#include <sys/types.h>
5 B+ F( t8 M/ u2 r6 z* I#include <fcntl.h>- Y/ x+ A( a4 X' }' F2 V
6 I' Z' [% }( L6 A#define SHAER_RAM_BASE_ADDR (0x80000000) 6 p! ^0 R: d% b% ]
0 r- j& n. q; O' z- ]3 A& b7 rtypedef struct3 u0 G) q0 ^1 Z. Y% L
{9 J: Y! v1 r5 @( U1 `- Y& P. |% E
unsigned int a; r1 O4 O1 o4 V) U6 u, g
unsigned int b;
' R4 V. Q P! j& d. d' @2 j1 g unsigned int packet_cout;
8 W" K! ^% ]' m" d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 I* u. O, {- E. ^
9 r6 W/ f* i! D' |) lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
n) j4 N8 G7 k% r* D6 e9 ?unsigned int count_copy = 0;( r2 Q- o! m' r" L; Y9 d$ ~! _
# A& W3 ^# s! w# E. c( H
( o4 H( o, F( x4 ?int main()
2 l$ E# { [' q! E+ f' P! \{. t4 g& g3 c/ j# H- C
pRX_MSG_PROTOCOL pshreRAM = NULL;9 C6 l0 d: R5 K2 J( R: i( E. n
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 k- l0 T0 R, i
, m) w) |# I# h y: H6 |; N while(1)
6 b/ _# X% { c9 f {( t' x8 o# n! ~! t
read_MSG_buffer(pshreRAM);7 p% _& a5 C& }9 \% }% I5 O
} + g4 e( ^/ y& {- ]) b9 I' _
}: t$ {, ^1 |3 _: |. m" V2 y
/ M' J6 i! y3 M0 n/ j+ j$ \5 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" p# W' L! k, k{2 V1 {( W3 u8 v8 I
RX_MSG_PROTOCOL buf;0 \- H( ^4 S4 e8 ]
- Z; O1 ]4 i* |# i% o, L' }
buf.a = pshreRAM->a;
0 w: i+ ? q# s buf.b = pshreRAM->b;6 k( `* P) ?. E. X& t
buf.packet_cout = pshreRAM->packet_cout;
6 i, u+ u" P) [! k3 n; p* J E 1 d c+ ]$ V' {8 t
if(buf.packet_cout != count_copy)% ~. r- R, A/ M6 T0 } v% z
{9 ?1 E" p- A2 t& p
printf("a is %d\n", buf.a);
) q0 i- d5 G: i- { N/ X printf("b is %d\n", buf.b);3 l( L% K( A( z; y; X1 t9 u
printf("count is %d\n", buf.packet_cout);
6 a* s6 u- }6 j2 b: Q count_copy = buf.packet_cout;
5 Y4 i* \1 S; N u/ m" K* @3 K }
1 o4 Q0 }/ Y: z& j8 X" j else8 f6 [# O+ A- \6 Q
{
/ n; j' V' G, Y5 g printf("No effective message!");" o( _# a3 f- R, O
}
2 v5 V- |' g: G}
" S) _! g" ]# R- q! x3 E
" v3 f" i7 ~8 j8 _* t8 y# G3 q" s0 C5 _( k& W- N4 h3 g% A' w- E' B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) }3 K( w1 M* Z
使用下面代码,对内存使用了mmap函数后:1 l" k* P! u" i
#include <stdio.h>
8 Q" L7 }/ E/ {5 e' b6 E+ Z) O#include <unistd.h>
+ G7 i, l6 y) r. X#include <sys/mman.h> ?! z1 a5 ?3 m6 N4 ^" }1 s
#include <sys/types.h>. {( M, o! T+ T2 p( R
#include <fcntl.h>+ Z/ _6 E* ]1 G2 F' `1 T, k
9 v" O" O+ J' {) S#define SHAER_RAM_BASE_ADDR (0x80000000)
1 O6 z A. }; A* t" p# V1 I' U#define SHAER_RAM_SIZE (0x20000) ' h& V" B+ O. c
3 V2 |' C" V$ m F9 U& n
typedef struct' j3 l" x# k) U, ~; f4 X7 F
{
2 s3 y5 z7 k. j$ v: S0 G unsigned int a;3 d6 X1 Q- W8 R2 E% w/ c3 V
unsigned int b;
2 F) o& U5 Y# T+ _ unsigned int packet_cout;
& [( r; N9 ?& W" ]3 W, r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 X6 _9 ]2 J# p1 S0 X) o' `* L1 o/ U- u
void read_MSG_buffer(int *baseaddr);$ r* S" F8 z0 j. v9 }' L5 R
unsigned int count_copy = 0;4 v! ^, M' H8 I5 g7 W
: W! C ^" `% h, K7 r
int main()
3 c+ ]* K3 {# t! o: l{
/ ~3 h c7 z; K! L1 m8 t9 H int fd;
y. r1 p( [" A4 r2 q# r int *mem = NULL;
) v# X3 X' d F$ w- I* ~
! l6 S. v0 ?% @, l7 t. [0 r) ]/ O if((fd = open("/dev/mem", O_RDWR)) <0)
; c- h2 Z8 P6 L+ c# _ {
& o: {! Q" w2 D; Q v* }" q perror("open error");
+ N3 Z6 [: o7 j5 R# `8 d9 _& N# F return -1;% I$ w) z' @; h, V
}
# N% Y1 q+ N. P8 Y% \- L
( @$ v( A: y. i! s mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 y- X1 R! q) T( n
9 \; C9 O* _9 s
while(1)
2 ^# B7 W3 ^; t+ A {7 s! {; D& {& E# `4 R* Z
read_MSG_buffer(mem);
. X9 @# N2 b8 S% Z8 t; S }
) _& `, g' d& \}0 D3 X, G5 \$ M/ K+ K
/ d- [" ]. A) yvoid read_MSG_buffer(int *baseaddr)# a! l9 R+ t4 X' Y
{2 ^8 V% S, Q8 [+ ~
pRX_MSG_PROTOCOL pshreRAM = NULL;$ j5 }; S) W. @( i9 t' E
2 R _0 X' ?6 U6 l9 q F
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: H, f# ?3 [, L7 T
: [% @9 o( x% K* \$ H# A if(pshreRAM->packet_cout != count_copy)
) p; j1 g% s V/ u w {
8 B& M) e4 x1 i) v6 S/ y$ z printf("a is %d\n", pshreRAM->a);' D+ Q! }+ _5 l4 [4 ?( E3 t. L
printf("b is %d\n", pshreRAM->b);
. X% n3 s6 }0 N4 L printf("count is %d\n", pshreRAM->packet_cout);
1 V. f; h. Q) Z: F/ r count_copy = pshreRAM->packet_cout;
S1 E( _% ~* l1 s }
- Y1 g% k9 \5 p: I' m& ^. H else7 y: I. k {2 A! \! P4 t& u+ s: I) V
{
8 N" y- g6 n7 R printf("No effective message!\n");: u( a) Q4 f$ B0 U9 X
} Y$ D! m# T! f* N7 T" S, s2 M
}! S- q5 T! H) Y S, ~
+ o! ^) V$ ~, b- b( g5 C, o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 Z$ Y+ k7 ~& P
" o! s" P S O! x- B) } g% Q5 Y0 R6 Z, {' M
4 d. B" g5 m* i0 e! V! |/ A4 ]) [. H; f2 D
|
|