|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. B8 [4 g6 u8 \" T: G# N
# r% ?- Q$ t7 d" ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" x; S* W1 w" p$ |8 s! p( E7 W#include <unistd.h>
/ w. j# B/ Z' i8 D$ q#include <sys/mman.h>5 ~1 w6 P& _0 c
#include <sys/types.h>9 o; D7 e4 C# C! w) {& a/ t
#include <fcntl.h>
5 R" E# H8 i. z: A2 G, M6 m- P, B5 a5 }: C# ~/ S3 r) D
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 a9 s% O; ~* F, `( |" X: |* L' O$ F; R$ r- o. H* x6 \, Y
typedef struct
+ z e6 v. S3 J$ B2 m{* x+ {5 E+ D: X/ T
unsigned int a;
! N( o+ y2 y5 O. X" I unsigned int b;+ H2 I' l' [" X
unsigned int packet_cout;4 Y1 j+ p1 a/ v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- q( m, K5 C5 v* e( v/ q
8 D/ w) q% S2 W3 k/ gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# [: N3 y* [% W5 \unsigned int count_copy = 0;2 H! h* @! f% U
! n: I- {0 ^+ R: d
4 g) \; @3 U- Mint main()) W2 g1 a1 ~& F8 ?9 ^$ F: X9 |' ?* C
{6 C, w9 d7 u. \- W" m
pRX_MSG_PROTOCOL pshreRAM = NULL;
; h9 W* q% @5 F* K, a, f pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 {, |" a0 ^3 t! ^! R Y
+ `+ C3 D* Z7 w while(1)
, F, F/ g; J0 n* d T {. _ K: p) f; g: _, Z5 z2 c) ^
read_MSG_buffer(pshreRAM);1 s# Y6 \% f" j4 J2 w9 I4 {* l: L& ?3 S
}
2 I- U3 q" Q/ g} |4 ]% J2 M9 O% f( Y) o+ i8 Q$ p
' d2 i0 |* e' Y8 @! q& }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- A4 l4 h: `. F
{- J. u% w! W& W7 ]4 N
RX_MSG_PROTOCOL buf;
& y- K. g8 [4 n
W2 n- W* k( G buf.a = pshreRAM->a;4 _* y3 x+ X$ y* l1 b3 p0 x
buf.b = pshreRAM->b;" t/ p, N- C6 X: a+ P: R& s( _
buf.packet_cout = pshreRAM->packet_cout; M) n8 k8 J6 N1 s- }
, p. |7 y& Y+ Q( P
if(buf.packet_cout != count_copy)
7 r7 n/ u* C( A- G* O" } {
( s8 k+ @. b) o; v+ Y printf("a is %d\n", buf.a);
! g; k+ v) a1 J5 O printf("b is %d\n", buf.b);1 I6 a$ z5 D& T& L1 I
printf("count is %d\n", buf.packet_cout);6 q( M, V1 B4 A5 f' O3 Y) J
count_copy = buf.packet_cout;
. i7 j" w9 P8 m }, T2 q O& [9 |- k6 {# B* @8 O
else; j( y8 m% f2 y E: b( s" ?! y
{
& s- ^. x" O# V7 D3 C1 Z8 E v& Y printf("No effective message!");
" X5 {; I8 x' n* |6 U }
5 M8 U0 f9 h% a: E8 K}+ @5 t+ }1 \1 L/ y! u
& e) P; Y" G, H9 }8 [) v) ?+ {- D" K$ h: d% m: l( L3 m5 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ c/ e* @. C" p1 e. q* k( ?' N使用下面代码,对内存使用了mmap函数后:) ^7 l7 k3 }5 M- q4 {6 P
#include <stdio.h>8 C" G" G. F4 e
#include <unistd.h>
+ E# V' E! }6 b* K: Y; ~#include <sys/mman.h>
0 |! ? Q' I3 J: v C- W [#include <sys/types.h>8 I I' M7 o1 y4 _. s! X' @4 }
#include <fcntl.h>
% l8 f1 `5 U: i g# l
) f% Y* y) P2 P6 A. ^#define SHAER_RAM_BASE_ADDR (0x80000000)
6 T6 P D$ e( |+ B2 ?& s; h' q#define SHAER_RAM_SIZE (0x20000)
! j! _ i; [1 D9 i# }& g/ i( O
+ M$ q0 R7 `2 d* I, q9 o1 L0 Htypedef struct4 w( B5 y5 V$ o3 ~2 i2 Z. A
{- j& \+ Z6 a. Q$ k+ M
unsigned int a;5 |" k( ]* B0 [3 E, s
unsigned int b;' }) j* L( ?, r8 u
unsigned int packet_cout;; ]) M. K: G3 P" N% k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 X9 @4 d; \' V/ h n; C5 Q! H9 k3 G9 G
void read_MSG_buffer(int *baseaddr);
& w! a, ~: x* d, junsigned int count_copy = 0;: Z3 Y" u* Z1 I
2 L- b1 ~! `4 ?( U; e- G' qint main()0 v2 f& _: |- `
{
) q% i) s; b5 V* c% } int fd;4 I( _% D, ?. x: d) O/ g- x
int *mem = NULL;) q0 v& V+ A m9 B) Y9 B
2 z m$ S# I! g1 Q
if((fd = open("/dev/mem", O_RDWR)) <0)
% I$ s# P& |7 G: ~( |3 a2 i, v- i {5 @) ^' w! h: l, S8 Z. u8 F, t. z- M# L1 ^
perror("open error");- I. @7 t: c" k7 |# a- e
return -1;
* T; z! V: g& a" D. @ }
/ H+ S" u/ f$ U6 J" n0 G0 q; _ L ) S6 S' ] M/ n9 D5 x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- e; e1 l+ o) b8 W) K9 M7 z
, Y4 c; w& z! O8 [; b0 ]6 _
while(1)
9 c) I1 f5 a7 o9 V' ~$ \) V {
! r7 t' e8 x2 c% B3 U. Q read_MSG_buffer(mem);+ L; l0 \8 G* H$ {5 M
} 5 Y3 m; R; Q+ H" l" y1 E7 |
}7 ~* I/ _( w% N+ D
. k2 J5 |5 U3 i1 j K% H$ j5 L
void read_MSG_buffer(int *baseaddr)- v5 B( n* h9 S+ X
{
9 I- x7 O* {) o! o V pRX_MSG_PROTOCOL pshreRAM = NULL;
( Z4 z) | x, w! e1 w8 O. H' k6 H% ^4 L! x
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
O' s% M7 @6 E3 D( w
1 f8 _/ H) Y- c; Y3 P+ [4 P if(pshreRAM->packet_cout != count_copy)- _: F4 ]3 H2 v) G# `
{, @, g% w/ A9 w
printf("a is %d\n", pshreRAM->a);% D7 W6 v& L# F- |) o* l' r% C
printf("b is %d\n", pshreRAM->b);
6 L9 T$ t5 M5 h" f printf("count is %d\n", pshreRAM->packet_cout);
6 `8 m* e3 K* x' y count_copy = pshreRAM->packet_cout;
4 ]: F9 f/ o4 q2 G0 R }
( U8 p8 J5 Q% G9 E else
& a' |5 n* O( q, Z8 I- Y/ G {
/ }- a# n, m0 A/ T# H printf("No effective message!\n");' ]5 `! {+ C# K1 @
}
7 r" Q1 P$ s \ d2 ~! J2 S}) \: h; S; u9 @9 O5 v
7 t+ ]4 i I% @. p, ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) j# [" G# L3 `+ h/ l6 P3 l) D+ U! ~; O$ d+ z- w5 U
/ }' I" [5 f! Z7 A4 ], z s
7 W* ^+ n. j# }; r- a
+ O+ u; v% X& H) F: k$ x: I* J |
|