|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- _* d/ L, U! {+ w) l4 e }- s. e9 _ m: S& `+ w# B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 \6 b& z4 }: E, o: @5 r2 F
#include <unistd.h>
& c6 E# C. Y- y) F* {#include <sys/mman.h>% D" l" F0 c( S- f* O
#include <sys/types.h>' U- r* S+ m2 `5 ?2 i
#include <fcntl.h>
5 M( `0 h* R7 D7 u. ]6 r/ X
" y% j' G) Y! ^5 c#define SHAER_RAM_BASE_ADDR (0x80000000) ; q9 d4 n" L+ Y0 J) A7 H. K
- g+ H; \: k! d- A: F3 G3 ^6 d
typedef struct
' j' R. L: B. A9 X5 j{
0 p8 U R" r* }! m/ C; C unsigned int a;
3 R1 O3 f* ?- j! |9 U0 e unsigned int b;/ W$ x4 ]) E; h& w1 w
unsigned int packet_cout;; T+ ]! p. o& J# @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- ]( m0 I5 G" q. v. o8 D& H2 [* M; F1 A) a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% X# F& U9 i$ S- a# d$ k: t' S) `( v
unsigned int count_copy = 0;
. \7 e: E- m& W1 N/ x2 }7 ]# [9 T
. m+ [( J) A) s' F' @) {- w6 y! b2 Q# m% A8 s* I) y
int main()
: S1 i9 ~, Y6 o! d3 q{' p+ g& G2 H3 @3 E# C
pRX_MSG_PROTOCOL pshreRAM = NULL;8 v5 E" K7 J) E$ v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( c/ m2 V* `5 O' D
; n- j5 z+ s+ h* C+ R
while(1)
! o% O! t- c3 N {
% e7 D" \5 N( {* ` read_MSG_buffer(pshreRAM);
0 a+ V. s! t. ?% z. k } 9 h }% f; o+ B7 l# @
}3 N/ @5 U) M1 I! ?2 \
# q4 S' v* O6 Z2 S4 F- G. L( bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, G9 B7 u, v$ Q; G+ W{
) d/ m7 `+ |" L+ Z( c RX_MSG_PROTOCOL buf;
- F6 |/ P# y9 A
6 b) X( K: \' ~+ S; U buf.a = pshreRAM->a;( ~* G3 M5 F& j
buf.b = pshreRAM->b;
; C1 K# U: x/ z5 _- A( b, N( [ buf.packet_cout = pshreRAM->packet_cout;
q* Y0 Y. B1 F0 S. t0 F4 B$ e
4 a% p" a# }2 g6 f6 W* d; G) s! [ if(buf.packet_cout != count_copy)
" B/ M& d$ k6 E$ C {
! i4 ~" f. B: X( f printf("a is %d\n", buf.a);
; p+ t7 T) Y' R, p printf("b is %d\n", buf.b);
/ ?& Q& e# c5 c( Z" a, ] printf("count is %d\n", buf.packet_cout);
* ~- u5 l' d* H3 @+ q0 o count_copy = buf.packet_cout;! \1 A/ e( V0 ^0 j; m$ y
}
. {/ O. H& K r, n( y6 c, Q else
* |# k* C9 E; X) O* i8 t1 j {* W: O0 w; e6 z1 b# y' U
printf("No effective message!");' o0 @7 E& G5 x/ i2 k
}% T( h$ Y1 X" y+ @& m
}
! w# B& d, b- X V& M4 K( ~! d* v B/ x, g; a" P
& s1 y0 {* R" }- M% j# C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 S3 Y M8 \5 s; t" P" E
使用下面代码,对内存使用了mmap函数后:
& Y& b3 T, |. z, }#include <stdio.h>
' B6 w' V+ F8 X, M# a+ N" A2 _0 j4 u& N. a#include <unistd.h>. Q) j4 v7 G7 d
#include <sys/mman.h>9 w% L. Z+ ^+ c
#include <sys/types.h>6 d; o7 P* n% c9 `0 z7 [
#include <fcntl.h>
" |7 X# g2 {$ S9 j& ?
8 E8 j9 Z- u6 P4 Y; T1 c* K#define SHAER_RAM_BASE_ADDR (0x80000000)
2 _. D# r& |- T+ Z4 I( g9 L2 `$ j#define SHAER_RAM_SIZE (0x20000)
, M; I; \8 c/ K* r, ]' A2 _# b0 d1 k+ i/ ?5 M
typedef struct
3 R% S0 V. D' W, c$ }{
$ |; q. ]# I2 C) Z5 l8 k unsigned int a;
( ^. n5 A8 C) z% W8 R3 b unsigned int b;) l9 d3 D# n3 s9 v, z
unsigned int packet_cout;
& \2 ?- R% x) F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 a) J* H4 a! ]$ V0 y
1 K7 h9 f( l. S+ b5 k1 X2 ?void read_MSG_buffer(int *baseaddr);- u. M% t2 l2 [: X9 K
unsigned int count_copy = 0;
1 ^$ Z* Q$ |. [. y0 f5 e1 ?, C% d- [) y U. p* J6 ~
int main()# J( B* Y! O5 n$ R
{. a8 _ J# F0 B+ R' Z
int fd;
8 @( x5 p- E f( t; d7 C5 X+ r int *mem = NULL;
1 u) d2 g/ J! y, }( ~3 a4 P/ L; U1 U& }3 Y
if((fd = open("/dev/mem", O_RDWR)) <0)2 q& b0 {) A( G# _/ w
{
7 C4 `$ b O% R. H8 l! P# ^ perror("open error");
_( a6 ]& Y! E2 ]( M return -1;
+ j7 A7 g; \, J }
* p" z N& g- z8 S, i! V* W: E( | 4 S0 T; X# y7 t: b" Y* X0 ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! a- M2 [8 J& s. q i: S7 l5 C( N& l
while(1)' ^ k( |0 Y9 S
{
8 i. Q8 e. @) _ T3 ^# b9 r! b i read_MSG_buffer(mem); E4 _7 I/ h5 N/ c# R
}
o8 J9 r" i3 a, V6 ?}
* i) r3 ~$ S9 o9 m
& b. U3 o+ [( a1 S8 c4 |void read_MSG_buffer(int *baseaddr)
/ j. w2 q+ s& b8 r{( n: n$ }/ n7 o R8 L( D
pRX_MSG_PROTOCOL pshreRAM = NULL;% q( u9 t% z. E3 [
% a% v: m" Q6 r5 p- }( Q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ I1 A' _8 ^, I( _, y- a6 T0 L5 J! L% G l6 t, Y3 A
if(pshreRAM->packet_cout != count_copy)7 o, O! ]# u* _4 B9 j( M
{* {" T: z' X3 ]( I8 l4 _7 ]
printf("a is %d\n", pshreRAM->a);
& n: M3 p# C% P/ _( s printf("b is %d\n", pshreRAM->b);& J0 q8 a+ _9 T5 p
printf("count is %d\n", pshreRAM->packet_cout);/ S$ W2 h; v2 E! }
count_copy = pshreRAM->packet_cout;) l, h0 _$ I0 ^* ^) B
}
( k* p; G5 [0 H else
. H; S* t; h8 a) F2 | {9 x# c$ j1 u' w7 P. y5 W( L
printf("No effective message!\n");
6 T( l& F* a; I' y. \$ U2 b g2 p' d }: z3 f# n& J/ `
}
i. \9 W0 N$ l x& a1 ?; n( c& ?: |4 I/ G1 e( M4 N; p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% @* b+ X( \4 v/ F0 A
# C8 U# X9 B) t
- s. p+ ?+ a9 ~' C4 g% k* E1 U9 h, X/ Q; V
0 W- E& g5 |! C$ c
|
|