|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, i0 E' R& t) h9 ?- R0 h6 T
7 \8 F' g1 {: S5 L4 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 Z- W4 |; i- Y: r( e; [#include <unistd.h>
8 q( d6 C+ h) j" p6 W9 [; M#include <sys/mman.h>
3 Z; t+ Y$ D9 R" i#include <sys/types.h>
# O# u; [+ f3 c#include <fcntl.h>
: y, S; ^9 G m
6 R p% ^3 |- E/ `" a#define SHAER_RAM_BASE_ADDR (0x80000000) 9 }% @8 p- ?- u3 S0 r6 |' Z
6 [3 ^+ |* w2 _" L) A# |typedef struct
2 u' O8 e- [) ?/ p8 J! d2 c m( }{0 L& k/ i; m. m8 V
unsigned int a;
* Q2 y: l+ _3 {- l unsigned int b;
' A6 f! t6 o; W; e unsigned int packet_cout;8 M4 m- u9 ~3 X/ k5 ^3 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 [! G( x8 X, Z1 o/ S% {. y
; w" Z4 ?9 N6 L# U9 X1 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 p$ v# t8 a/ F! C/ P! O* C9 l
unsigned int count_copy = 0;
, E" {$ L1 u6 n5 a& U( m8 ^
, j# ]% a) L! n Z& w+ }7 n
( j J8 X, s: V) }& J$ bint main()
0 a6 e7 @- A0 Q5 d{, t/ ~+ c0 \8 x7 d0 x
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 R& a* h4 Y( ~- b pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 B( v( o6 O+ y+ m0 j7 e9 c: z. ?4 w8 J3 g, ^) k5 Q
while(1), D( d" A0 A" M
{7 o& f4 [2 D* S6 c7 \- f
read_MSG_buffer(pshreRAM);, ~ R4 F# e& a2 k: k4 l0 U
} 2 X7 m F) a, v5 B1 [) W/ b
}
. {8 Z) o9 k% f9 D$ e, ~0 R
* O; A' G3 ]6 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" F( r0 Z9 M9 P{
9 v; w. w( l% w RX_MSG_PROTOCOL buf;
/ h, P0 W/ Q, Y( `
& z2 n' ?5 o+ x5 p buf.a = pshreRAM->a;- u: b) S" `3 \$ O) z/ A
buf.b = pshreRAM->b;: \4 `+ P$ S- a+ K1 S
buf.packet_cout = pshreRAM->packet_cout;! L/ Z' V( l8 ?/ b7 B1 h
8 J& w7 T5 U1 W. S8 A- t if(buf.packet_cout != count_copy)6 D' A0 w2 N: E& e. ~
{
0 z/ h T2 p' P2 d9 `4 f% d: F. p printf("a is %d\n", buf.a);; ~# B+ q3 @9 _! U" o" B
printf("b is %d\n", buf.b);
4 C" L" D4 C$ V v2 m8 v$ D& y printf("count is %d\n", buf.packet_cout);: q( Y% |. f- f- E9 {! }
count_copy = buf.packet_cout;9 D" _) t: Z9 ?* A$ J* G
}6 I; `. r- `8 P1 @6 W, u0 s
else
+ E* Z" h* [/ q% ^0 l {
% L9 `% j9 x; d* b9 t' W& s7 A printf("No effective message!");
) ?, v# o7 Y. W d- g }
3 T- C! X/ ^" E# M}
4 K/ n6 b7 j! A8 j
0 G2 S- v% p" w# N) W
5 f9 b) w6 {2 l, X8 l5 [( L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 }& } X% g) U使用下面代码,对内存使用了mmap函数后:
) C' R1 S; a. H+ T#include <stdio.h>
' K1 q9 P- B* ~$ O: P! s#include <unistd.h># z3 P! G7 S. ?! ?) D9 c
#include <sys/mman.h>! |& C& K) P1 K8 h) I
#include <sys/types.h>5 I- `8 W4 j/ z! S2 P& |
#include <fcntl.h>7 @8 k [: j0 ?
, ^. P( Y/ `: X# w/ K#define SHAER_RAM_BASE_ADDR (0x80000000)
) s! D4 H6 s. _0 S$ r2 Y+ ]. Z$ `3 _& w#define SHAER_RAM_SIZE (0x20000) 8 ^9 C7 Z+ u2 k) C7 D/ N
$ m i+ e q" j j* U# g- t P
typedef struct
9 O/ K, M8 G; h# E# N{
* P* U7 E/ }% _4 \* o unsigned int a;. D% C. Z& B5 j1 q& v
unsigned int b;4 m' ~: r4 L1 M$ M* Z4 \8 P$ t3 z
unsigned int packet_cout;
0 ~! ^, ?( X D5 e' t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. n1 @: O+ A% X3 D- v( q4 S: z" W. _. |) R9 W$ S
void read_MSG_buffer(int *baseaddr);2 b ~3 A# M% @5 F7 j# G: v
unsigned int count_copy = 0;3 N) l( ^/ H% n: W
" ~- L. `+ f3 F* X/ K6 r& L- N6 C/ z, v
int main()
1 o! B4 L. _9 N* y( x{
4 ?$ Y5 n& m% }) d5 T8 j/ C int fd;: h7 ?3 D0 G8 T3 l8 C
int *mem = NULL;5 Z- I0 A. r& t
2 Q6 p, X H, O" Q9 m `0 A4 B
if((fd = open("/dev/mem", O_RDWR)) <0)
. |# H8 v2 L7 t# P/ b' ~3 p6 I {- [9 U1 R2 |$ F& {1 `
perror("open error");6 w F7 A5 x$ ^1 T5 b
return -1;+ V- r3 ]# L4 _2 {
}
. Y( @, D5 d4 m: p" D
: |$ K% @! Q( q0 Q' v6 l mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. _9 [4 S; _# L( J6 r
8 ~% [! c! W$ x while(1)
5 n/ j9 \0 |, r* ] {* j4 X* H. j7 V8 b' m- o
read_MSG_buffer(mem);
+ l9 d7 ^6 ^, t/ L9 |- E( s3 Q }
) X h9 O1 V9 W/ ~: L}
g+ n8 P* l, Q/ Q" x. v& y# B. W# L. M+ K: |' g
void read_MSG_buffer(int *baseaddr)
) z$ ]& M$ Y4 X2 U9 d3 n{( @( X+ L# @# `- t9 j5 o
pRX_MSG_PROTOCOL pshreRAM = NULL;- w3 }- t& d9 H% e0 W% B+ n/ s
; t7 e: g0 @ R4 C7 I pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& X* X& o* C6 |, o
3 ^; ^5 _3 q F& o8 c
if(pshreRAM->packet_cout != count_copy)
4 F, R R/ g2 E3 e* L% T, ^7 y {
6 P4 x0 s' q2 V1 s7 K( B, A printf("a is %d\n", pshreRAM->a);7 W2 m- {( J4 }, {
printf("b is %d\n", pshreRAM->b);
( T! T& R O0 j) s printf("count is %d\n", pshreRAM->packet_cout);
, Q8 S4 V: K w' @ count_copy = pshreRAM->packet_cout;9 E1 t; y/ u+ N9 o- B
}
z: f. y/ o2 r" r+ m else
; c5 p. w- I; Y" a/ L- j- R1 {4 C {
3 j( m) M+ Z; Y printf("No effective message!\n");' [ Q. g& T, |( f% V' d$ p! V
}' b* N# d5 } N' O1 ?2 \* p: _
}) j$ \5 n3 x" h b4 n+ M6 e
: ~0 w. X. w9 p5 T: O: J7 Q( Q# [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 i9 _" E2 k. h
1 i. ^& j6 u! ]& S9 }; z( x
O E& q8 ^+ I9 |5 H* A% X5 h3 F$ \( |
5 H' c& [% @% e. s |
|