|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 R" t% `; N2 _$ s7 v! P3 I( Y
2 Y7 \6 ^- ?* N1 b2 c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- E. y) s& y8 q8 { j
#include <unistd.h>
" W7 K6 ?9 V1 u#include <sys/mman.h>
0 |9 M4 n/ E0 R" N& M$ R2 R4 |#include <sys/types.h>( S* B3 `$ D: B7 h
#include <fcntl.h>
. q2 k8 V o9 L
8 q1 T7 I- n# Q0 g4 ]& {4 l" K#define SHAER_RAM_BASE_ADDR (0x80000000)
1 T, i& I4 U/ d0 e4 t5 c6 ~' c |! U) r: e( |
typedef struct
$ G N7 q, e# ]6 q6 ~; U1 I z{' L; O& n# m- r. V* N( U- ^) Q0 }
unsigned int a;1 D" W0 \5 s7 y1 Z8 u/ ~& }( z
unsigned int b;
) _4 w1 Z P, |& s2 d( A1 m unsigned int packet_cout;1 J; R( q. }; C) }* V$ c* b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ J. j4 u" ^& H% `4 c0 \
" y/ _' z/ ?$ x/ m: D* tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 _. \$ V5 p4 ^" ~
unsigned int count_copy = 0;
/ R$ r, C8 [* e4 l' V9 V9 K( W" v4 `& G7 r, \/ p+ M( a5 F* G
2 M% b. x4 w; @, L, U
int main()
3 y5 M! C/ i1 v# [9 e' S{
) S/ N2 H6 r4 q( t pRX_MSG_PROTOCOL pshreRAM = NULL;
! ^) d) E3 X4 O4 `) \9 b! A pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 D; m9 Q: L( }% k. ?* B+ T. k0 o C; j6 q! u' Y( J& E. B
while(1)
* F" L* Z$ u `! d/ N {
3 N, @3 x! G* T8 K* w1 c* h _ read_MSG_buffer(pshreRAM); g0 [6 t1 ]7 T, o; k
}
( O7 l' c8 o" `( t" m}9 s! t; ?- X2 [: P
; o1 q) y% O6 ^: P3 D! Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 b' v) A) r5 F9 l8 [5 v! ]+ I' V{
5 I+ e0 G' I- O, I2 l5 R RX_MSG_PROTOCOL buf;& y4 g9 l V% b: p- H! `2 `7 y
# F# b. Y; m( v" ]' h0 S, o
buf.a = pshreRAM->a;4 k3 p) p7 m7 |7 |
buf.b = pshreRAM->b;2 f2 C; }) u1 w
buf.packet_cout = pshreRAM->packet_cout;) u2 Y e; O/ A
% ]2 Q8 b- t, T: }8 E* I1 ]; H if(buf.packet_cout != count_copy)3 }) C/ E% G. h2 S4 a O
{% M6 S$ q% A" }; R; v- I( a( M
printf("a is %d\n", buf.a);
: x' \! w) d# Q$ e- N9 a printf("b is %d\n", buf.b);/ C. J3 D5 G! q3 ]' n
printf("count is %d\n", buf.packet_cout);' B! n% S6 U h
count_copy = buf.packet_cout;; a1 m* V5 |( ]! R
}
3 s- l! H. W, F& O4 F: u) I else8 A2 C' H) ` y" ?: K T3 R
{
) A$ F9 a- i' {5 P printf("No effective message!");" m& O0 x# g) r, X+ {( K' K
}
- q8 Q0 r& q" o}
9 r& `2 h2 D8 M4 K+ t) K" Z: w
( p$ P$ |! f- l: d$ b
+ |" ?: \5 p/ }- `! Y. r但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 j: i) b' ` M使用下面代码,对内存使用了mmap函数后:
$ U9 b- {9 S {) {#include <stdio.h>
* }6 O: R8 l' Z' \- m# a+ b: k9 L#include <unistd.h>
( m! {- e u% @6 F' H#include <sys/mman.h>( i5 B, J; h5 J; i* x7 L T
#include <sys/types.h>& \5 `& ^7 l o5 I6 {# t
#include <fcntl.h>
@8 ~6 _4 C) @% g- \8 L4 [- H6 J! Q
#define SHAER_RAM_BASE_ADDR (0x80000000)3 \; C% h1 |& M# c4 b) j4 n7 Z
#define SHAER_RAM_SIZE (0x20000) 5 I9 h- ?! E( ^: E: s: ?+ S3 p! o( M
$ n8 L. i% V# d0 F7 @typedef struct, B u1 n8 [2 }5 f" g
{
$ w1 m R6 p2 M4 a5 s3 V. { unsigned int a;; L" {8 M0 H- B7 v3 B) u N
unsigned int b;! w( { b6 g* q& s
unsigned int packet_cout;
7 I4 I9 W: z/ Z. L# Y+ q, e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# ]% l) K; A% D0 k
( {% g" S0 [; b6 j8 Q8 f
void read_MSG_buffer(int *baseaddr);9 V5 B$ h5 L1 I* v& P. a4 f" b
unsigned int count_copy = 0;, a, C6 q* X+ S, x4 @ ]! G6 f
0 l4 q+ u" l4 {6 a( iint main()5 A# x& X4 S. Q& q8 |
{3 y% y% r3 C7 h2 A
int fd;
! J( \" k- v3 L: A5 g, [ int *mem = NULL;
# ^ B1 ?9 R2 h7 g6 a, E) f
. y& X) z2 R( y. l if((fd = open("/dev/mem", O_RDWR)) <0)
0 w5 m5 v: q" Z! k, ^9 F1 ? {
2 F1 ]: n" H+ ` perror("open error");) |% ~! L1 N2 a
return -1;6 Y3 d# H8 S& Z# ]- u; Q* `# g
}
' L: a) X1 X4 |' s! @0 r , k; \# b# V4 _) Q! K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& M( @- |" {5 I
1 p* F' p1 Z7 G' `! l) f while(1)
( u7 h% z$ {1 ]# t {8 q7 R' I& I# b3 S; t. |" C- h
read_MSG_buffer(mem);3 Z( @1 b* Y4 B
}
$ z% C0 e) ]5 ^* N p$ ~" c}4 N' G" n3 [; p
3 q/ H3 |0 P6 f( x' tvoid read_MSG_buffer(int *baseaddr)
( R U8 g l0 d' G{, _; O$ n0 s" ^+ R: I
pRX_MSG_PROTOCOL pshreRAM = NULL;. y' L H' M$ x5 E
6 R2 D8 p4 Y/ j, Q& W6 F& O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* \6 s9 g; f3 N' J4 s O: ?( p" j9 r9 {8 B0 ?$ q9 v
if(pshreRAM->packet_cout != count_copy)
+ \! ^; n1 W9 A$ ? C/ U8 {: [9 y {, ~3 ]' J! {- {6 U
printf("a is %d\n", pshreRAM->a);( s& a- D# p. S i
printf("b is %d\n", pshreRAM->b);
, [- ^7 i& _8 L printf("count is %d\n", pshreRAM->packet_cout);
8 h, H; i x. h9 P0 U. x count_copy = pshreRAM->packet_cout;. k& _& z) j8 z3 v1 P
}
( V9 t I; M* W: K: Q3 v# f9 n else( t+ p, Y; V! j5 Q& N* {
{
. A; A5 D! Y4 i8 Y$ y printf("No effective message!\n");0 ]1 C/ Y0 ~9 |3 g! t
}0 U+ R- Q: \! p% |$ Q- ?
}0 G* Z2 N7 N4 [% a( Z g
2 d. t/ {: N$ y) p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& W1 G) @+ ^; V6 c! F; |3 f$ b- _- T
" M& C- `* ^/ i9 x- _% w0 O3 b" b. f6 i$ e4 m ]4 a- ^
. w* @3 j+ B$ y$ J2 X9 x& b$ A
: Z( l7 S, j6 i9 v2 E
|
|