|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & e( u$ h' G6 H, w! W# N
4 L: u% g$ U, j/ r2 w; t& E% n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 B$ L& [* Q6 ~$ o# W7 A
#include <unistd.h>
4 _ ]. d" g, [; J4 [: B+ b#include <sys/mman.h>
0 B/ n5 \" s2 _/ b: O" |* V q; K#include <sys/types.h>
* @5 K" x6 L7 a+ Y#include <fcntl.h>8 ^' ~" E7 b+ x
+ k; l3 I# u" A( T4 T* g
#define SHAER_RAM_BASE_ADDR (0x80000000)
# C, ]- x9 N! R# \0 M+ V- u4 q6 t) e8 U7 x0 n" k
typedef struct
* o y5 a7 X1 A1 H{9 p1 _3 Z2 G- ~9 r( u7 J0 h
unsigned int a;. P( E* g3 g+ y+ S
unsigned int b;
! F. H3 ]7 b! R* v) c unsigned int packet_cout;& d+ ~& K) `" u8 T. T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, j/ c% U* m. { a: D+ `2 x' c1 L0 @
+ e6 B( ]+ ]4 k- }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: V' q6 J( m% z+ _/ z" K5 Y# P" zunsigned int count_copy = 0;. d+ j* ?. r+ u. Z
4 I0 n# ]9 Q. _6 Y- Y K
3 M4 T6 K0 l6 g% X& W0 g Rint main(), ]9 |7 `: v% K1 z/ m5 `! L
{4 @* S4 e! G+ T& D) ?
pRX_MSG_PROTOCOL pshreRAM = NULL;! {1 L$ `+ s6 L
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 o" ^3 c( d. l4 T
, e0 ~- r5 `/ ^ P1 I while(1)1 r; R1 S/ D( D( I! _. B
{
' A3 ` h9 u3 N; x9 T4 ^5 u read_MSG_buffer(pshreRAM);! B3 n3 l* t7 R7 b2 D* \- n
} 1 f- b! P" h8 a( x( T Y' n# i
}' M( V3 }% Y, Q& ?4 A
/ v% c( G7 l: l; |/ u' B9 }2 K3 n5 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 h% V" D$ O, h& _{
( i$ i2 O% `, r' L# t; K RX_MSG_PROTOCOL buf;" d8 N7 b# o& k; z' N0 v* j
, F4 x$ x9 r. d% W buf.a = pshreRAM->a;
; G! M( ?& O! ^ buf.b = pshreRAM->b;. b/ W9 i* J5 @: G& Z' H
buf.packet_cout = pshreRAM->packet_cout;0 h- Q8 }4 O( s+ w0 E! {
* r! N1 {/ M0 D% o' f if(buf.packet_cout != count_copy)
0 B& d2 i7 W3 |& F$ F1 O2 h {
$ V! v8 K# d4 G: H printf("a is %d\n", buf.a);: W" }# E" t9 O1 R7 c$ @
printf("b is %d\n", buf.b);& O% z1 x* V7 A# L- x# Y- \# p5 N
printf("count is %d\n", buf.packet_cout);
1 }* K6 ?/ d* B1 d count_copy = buf.packet_cout;
$ t# L5 z& U( D, e/ G3 G* J }
& `5 G& O, O( D/ M- L else
/ s$ B$ d5 A* \ {
5 l6 _* O9 W2 ^( U: @* i: h, p: E+ @ printf("No effective message!");1 a0 L) y; |; ^
}+ n: v4 F9 z, Z
}1 y2 j; [' H2 D- ~% T
/ z) M. U# _7 f4 k% E
, W' g* B' i0 U/ \9 U, z- ~! F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 F* S, f" |. o; L2 P2 w使用下面代码,对内存使用了mmap函数后:) Z0 s- a) t2 l& w2 S9 y
#include <stdio.h>
* o1 C2 ^6 _0 ^, e) m8 P#include <unistd.h>
D, J% N, V7 ^ Z5 W0 h R0 e% `#include <sys/mman.h>
4 F, J. l4 m1 x#include <sys/types.h>$ H! l% i5 [" e; K% e
#include <fcntl.h>7 u- w- a0 g' {; S& r6 [2 x
* O# o- H% n- _* Q1 w" I
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ }: l( q( f. R- G$ ?* w#define SHAER_RAM_SIZE (0x20000) # {$ m& l; Y7 r3 w% I2 h
+ M, A9 v6 e" v6 i$ C
typedef struct6 f" L2 f g. B
{
/ |: O) ~: X" I ]6 X3 @3 I unsigned int a;
Z3 ~$ O* `' M* C5 L9 ]2 o unsigned int b;
& V! f# M+ n0 f" \! a: D unsigned int packet_cout;
; z/ v/ ]% \7 {5 Z1 o" q$ i: R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e) s; {$ j1 Q- X, J
" r7 L' X, I) e2 p# z. rvoid read_MSG_buffer(int *baseaddr);4 o# u+ a- b9 k/ l+ q
unsigned int count_copy = 0;+ `: q* g2 r5 {0 X
7 L' z; k6 H3 Z1 a$ v/ p& _
int main()2 E0 O0 Q) Z0 S5 X" g' I7 ~
{
* o. o$ X2 y) \6 d+ x1 ^* W- \ int fd;/ o1 w* P( y$ R
int *mem = NULL;& N' j' d: R. B1 f4 b+ p" s
" E$ T; J0 Y$ ~' c# u9 X4 f if((fd = open("/dev/mem", O_RDWR)) <0)
2 {) O6 k9 o6 I: c- w* c {
) t5 X2 O1 Z2 f7 ~& ? perror("open error");' L4 t, F: V0 u; p L) V8 _- l
return -1;
$ J% A$ T* H) d* H8 t }& `" E- U. u n% O0 w2 Z, k# e- Z
# ^1 F% R) J9 J; u8 Y mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( j5 k |6 v5 E$ g5 t; K, q
# b& P$ U) F8 U5 `2 `4 W while(1)6 i& `$ G, c4 t3 x1 X6 u8 ~
{
- _: o. Q& M6 M) g2 I( T& l5 b+ Z read_MSG_buffer(mem);
: `, c) L6 [4 \2 W0 _ } * F9 Q3 g. q% t4 j% ^* G
}) ~& R; d" ~7 P5 d4 U+ }. k
0 _9 u. r# o" m+ ~+ K9 ^% J
void read_MSG_buffer(int *baseaddr)/ o6 n$ O: ]7 V1 u! A C
{- v- g5 h2 y5 i0 S
pRX_MSG_PROTOCOL pshreRAM = NULL;& G/ j1 n5 R, A
$ u" E! `% A) }# c
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 Q5 u2 T* M7 T5 o3 m
_& ^) u$ q/ B
if(pshreRAM->packet_cout != count_copy)8 X! R, |. j* _7 s1 ~. \1 O
{ J' g+ Z+ d3 X3 W8 k3 _
printf("a is %d\n", pshreRAM->a);* B$ w1 r4 C4 b6 v5 g9 J: L: S# d. x
printf("b is %d\n", pshreRAM->b);$ L- y1 V7 q! \; _) p, F
printf("count is %d\n", pshreRAM->packet_cout);
k8 A# A' m' F& W, v count_copy = pshreRAM->packet_cout;( V! m9 T3 i/ W7 `4 y5 ]2 n
}; C+ n' g) i3 G3 w' M
else
/ j% Q& T2 W% l' S {4 T0 ?# Z' v8 h' J% g0 X$ Y3 S
printf("No effective message!\n");
. ?7 a$ `9 j; u8 i) _, R }
' }/ e3 i* e2 O, w, | g- T}& R- Z2 }0 O5 D$ x0 r
# u* p- Q8 m7 O; v A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; L, g3 y9 y* d+ D# h2 G
( ?5 H- d! L) `) \/ Z
0 c& S4 H0 \; {% V+ ]. _6 i9 V( l: e5 \! W! j& E
+ f) B$ t( a! o/ r7 P) {3 F |
|