|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 N/ ]. W! v" m7 M2 H( O' R
6 ]# }( ], e. |! C: G3 ROMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ _+ H& h3 c6 [ z6 A. _# u5 O, ^#include <unistd.h>1 r$ R; ~4 K6 f( R' T8 r1 _
#include <sys/mman.h>: Q5 g+ j/ _! ?
#include <sys/types.h>$ ^ z$ j8 R3 C/ j) U1 W7 k* z
#include <fcntl.h>2 v9 N+ u. T1 P. ~) Z& C- L
+ z4 _$ B. Q; z, |% t( `
#define SHAER_RAM_BASE_ADDR (0x80000000)
" X, W8 D( [5 A& h E
% s% }6 @& @0 ]3 J! wtypedef struct
6 z6 Z" g) p% t* }& G8 X4 [9 A& v5 |{
' l2 p2 @7 O! s; K unsigned int a;
; }& |; x4 u- K! v8 @ unsigned int b;
# a: o4 j; D6 H" F unsigned int packet_cout;
3 }* y1 |0 T* q! b$ Z- Q2 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A( h. y) X( b; l2 U! T3 t' Q) E! g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 P/ U3 m% v$ N; N8 v( H" Yunsigned int count_copy = 0;0 h, H8 V% D) A% n( ~: O7 ]
# R) |9 |- N' j' |) W X
' n* J9 k0 p( Q7 ^5 Z! K0 Q% n$ N2 Kint main()
9 H0 z! }) O# H{
0 a) g' K6 q4 w1 U pRX_MSG_PROTOCOL pshreRAM = NULL;
9 Z9 A$ f6 C3 y2 r1 e# i pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 A" ], |6 r; b/ [$ G
6 X4 i. |# g7 X, o+ h# q, z; L while(1)
* S' _ W8 r; Z {8 l5 t8 L5 F8 o8 L; e/ P
read_MSG_buffer(pshreRAM);
: e! V+ C7 M: C4 X- q, y } ) _ C$ \/ L/ b4 A- v. v9 F
}
1 g. h& o/ o4 E
2 p5 G D# M3 U! svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 m" z% Q$ L4 J{5 d7 f! V/ c9 E& M5 J- ?$ f/ H
RX_MSG_PROTOCOL buf;
# N. V8 h; }! w9 q$ W6 s
, \+ \. m+ K: G7 z buf.a = pshreRAM->a;
8 y' W5 b6 I5 ]5 o( f/ O! G# ^2 ] buf.b = pshreRAM->b;# R8 \. I6 L: {
buf.packet_cout = pshreRAM->packet_cout;* N% g v" r: R9 c8 w
" A3 {+ b* Y# X* D" ]6 v
if(buf.packet_cout != count_copy)
& r/ ?2 Y y Z' ?$ y% F {' ^8 J4 @3 ~* E. o: `) u
printf("a is %d\n", buf.a);! H5 {" a9 N ~$ `& h
printf("b is %d\n", buf.b);% N1 e$ `& B- O% b$ w
printf("count is %d\n", buf.packet_cout);; q! b' R P \$ Z1 l' ~/ e, n
count_copy = buf.packet_cout;& ]. }( I- }0 n5 _, {
}
9 n9 ^4 a" u Z7 Q; M7 n% O else
3 B, u- V/ j# H: [5 a7 O {/ }4 p8 l( q1 b
printf("No effective message!");7 t+ v& H- d7 X3 N
}- O' ^) F3 W7 b7 r$ R% C* K
}9 \8 a Z. d/ K9 j% v
" { n& | P" n. Z" Q: o' u1 ~
7 \. x, e: s4 y' G: w6 b+ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 E5 |" Z$ }% f' w- A
使用下面代码,对内存使用了mmap函数后:
4 ^$ `. t& E& r" z1 I+ P6 k#include <stdio.h>" {' j* v, `9 e! ]" ^ x4 Y. I
#include <unistd.h>7 T8 c# N- Q9 O4 Z9 A; n: k ` q
#include <sys/mman.h>( U% Q& M. Y9 M3 q
#include <sys/types.h>
, E9 X* Q: Z" z' Z7 ]#include <fcntl.h>
% i7 q! ^% X6 G
+ j$ B: q; z0 F) R5 ^" H' [0 E#define SHAER_RAM_BASE_ADDR (0x80000000)
: W n: ]8 w0 K! D7 a& A# ^- M3 X#define SHAER_RAM_SIZE (0x20000)
j! ~4 ]) q% R& d7 d7 I. I# B* V$ b# |
typedef struct
% S9 W% m& X7 S" S{
( Y. D9 R2 K8 ] unsigned int a;
0 Q" c* m& F" i( j! [% o unsigned int b;
5 m1 ~) o+ }( e1 w5 o0 }$ L1 c unsigned int packet_cout;( J6 L: M4 S' X6 t; p/ N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 {2 b& X8 \) \* p
3 ~0 @3 k3 ?% c8 p. Tvoid read_MSG_buffer(int *baseaddr);2 u& z& {4 R {$ q/ K4 Q& e
unsigned int count_copy = 0;
. |$ {! \ z& C8 G8 `# {0 w1 ]
8 @& l3 e. {- j% Lint main()! R. `) b0 Q# l7 W" a; f
{
3 A2 B4 m* X$ x% M4 k2 D1 K int fd;% _0 b0 T3 R* j0 e+ {; G8 I" O
int *mem = NULL;! D; [7 A' N( D a! J
( X+ A- k& |# q
if((fd = open("/dev/mem", O_RDWR)) <0)$ \/ x1 r4 L% R4 z
{
, E% l( A( s" k- R l perror("open error");% C6 G, d/ n$ A* B$ b
return -1;
+ s8 |, j# _3 e q1 Z }# R# A- m5 W$ s/ x6 ^2 D/ ^2 u, |
# q' d3 L" [) G
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 Z/ \7 q8 W3 W6 g( ]6 U% k% j4 ~: s" w5 B" H
while(1)6 ?, ^% ^7 A: h# @
{
) L* l2 g/ i# y" I$ F read_MSG_buffer(mem);
( e1 D2 Z3 y! P8 ]9 e1 t }
1 N( p8 J5 k+ D! S+ F4 v' `}1 l% W, ^1 |* W
- m) z9 P# j& h6 }6 Yvoid read_MSG_buffer(int *baseaddr)
4 h" a; d3 S2 u. ?" E, t# O3 s{
4 q: z. K3 w; `. A- W5 F5 o; O! f z pRX_MSG_PROTOCOL pshreRAM = NULL;
2 O1 }* _' t2 N, k3 G3 W$ V
: w- i/ e- Z! C; E2 g, \4 t0 H$ b pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ b+ Z" V. ?0 E+ w. `8 K: Z( Y
1 a1 q( Y: e/ G3 ?- _7 {( Q if(pshreRAM->packet_cout != count_copy)" V7 F9 P4 a/ \. F+ Z% A5 r
{/ ?1 X4 ~9 E) a* a1 i3 M( r5 [
printf("a is %d\n", pshreRAM->a);
) u9 `1 z# L" j' } m. H printf("b is %d\n", pshreRAM->b);$ z+ i! G* h5 r* C7 j0 ]2 @
printf("count is %d\n", pshreRAM->packet_cout);
0 h" j" x& e S, \ count_copy = pshreRAM->packet_cout;" M- D+ P( A$ e1 c$ `& y
}
& |! S3 G+ ^$ g6 `% c: ? else# A z# e, V2 Y' Z9 F" `: Z0 M
{- W& s" H3 D, G v u4 F
printf("No effective message!\n");
3 d+ P9 X: R0 g. ~ }
' n1 y3 n& P0 t% Q) X' N W) ^}
) c ^: D2 V# w0 i. g* w$ w
! r. y, l, P, _: H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* k' m7 |8 O* U; G& Z% y2 ?
* ^8 y0 O$ O( \
# j/ {# t9 Z- Z) @) w8 R6 _) `* F7 o
% Z# l! ^: O" l6 L0 I4 R0 Z: Y9 R5 C) D. l# i6 Y/ {! m
|
|