|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% I( H P/ j. P6 ?/ m0 @! }* ?) Z/ W
9 X$ e* Q/ O8 F7 WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 M' z; D4 ~6 `& ^4 ]#include <unistd.h># h6 i+ j: `8 t/ r
#include <sys/mman.h>
) a/ o% D1 |. k9 z. {#include <sys/types.h>
% B) i' ~2 K. |2 V8 s7 q0 {5 x' C#include <fcntl.h>, E( z. j- x0 d5 `
+ ^: o, C8 D5 Z
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 R$ S! m) F. \* L
! s! z; `9 D2 a m& |" J7 t7 y, [typedef struct9 D$ V' R1 k' ~8 X
{% ^6 O) i% a. D
unsigned int a; l) s! j8 X8 P) Z9 S
unsigned int b;5 `9 X! A' z( Z& T( B9 K7 M7 `4 m
unsigned int packet_cout;& A/ [- `: E" E$ ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" s. i/ K+ n) X, `3 P6 R% v+ s: a
! p9 t9 a1 ~ W. I+ g; {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! ^) Z T/ @" t9 ^unsigned int count_copy = 0;
9 ? p' M" f8 L- Q2 s: f4 j! S$ e) ?+ \ ?; h& V( x
, p% L( U0 `0 {int main()* V8 r b" R7 t8 c4 K3 |
{7 X; H+ u. L- J# u: q
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ w1 f4 `6 U$ ^6 X; [% x! B pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) r& n$ E. c7 V
7 R( K" I3 ?$ a# `( X3 ` while(1)
% A) q, n# Y4 u G; M0 v4 j4 \, ] {/ \! X1 n8 C& x2 p- U$ o* K( I
read_MSG_buffer(pshreRAM);9 R3 Z. Q$ H0 o: H
} 9 t7 ?4 g* Y- V6 [8 W5 P$ O2 x3 I
}) u3 d+ F" |- u9 E% g
1 S& s! Z. j8 e2 ]4 T: V9 [+ ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 b- \3 r: I8 F6 E3 ^& }{6 N5 b% s, E4 B6 N1 N# P
RX_MSG_PROTOCOL buf;
& Y1 @2 V5 g. M" K# N( e
7 h, s |" V" Z. P2 q' h, v) S buf.a = pshreRAM->a;
5 ]0 b' Q2 {7 c( M+ e buf.b = pshreRAM->b;9 c6 V; L% F9 N2 t! l: s/ d% }
buf.packet_cout = pshreRAM->packet_cout; r; D, t) u" U7 Q- ]+ Q' C
% l9 x' f @: b+ w3 h
if(buf.packet_cout != count_copy), Q- d8 H7 @0 N! S E# V
{9 Z/ W/ }% p u0 x8 T
printf("a is %d\n", buf.a);( s- B+ F. ]) H: y( o) x W! s
printf("b is %d\n", buf.b);
1 E4 l* n; ]. v printf("count is %d\n", buf.packet_cout);" \. {% I) Z0 c6 m4 T
count_copy = buf.packet_cout;
' h1 _$ s. P9 U- |8 h; b }
3 j6 t7 `( [( d8 ~& n2 R else
( c8 |' Y- o" n {8 z# ^' v3 Z& u% V
printf("No effective message!");
& h! |' x' K( s$ g7 |8 @/ H0 U }
8 I1 e! N3 j% k}
# T5 S5 ^6 i$ H) w9 D# S* L' D7 l% A. `0 U: q, l- O* q0 \9 \
8 X0 U( ?% l8 `9 A# G但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 V" S$ N7 a7 U& i" J' L1 |使用下面代码,对内存使用了mmap函数后:; h3 G) b+ b2 l9 E
#include <stdio.h>
. F- |- k) J+ e2 H& n2 s#include <unistd.h>+ A- A9 z3 e8 x( t! d! S
#include <sys/mman.h>
1 A; a3 E4 m6 I8 o- h$ H#include <sys/types.h>, ~' t+ J+ S% W. Q/ S
#include <fcntl.h>4 }6 Z- p/ d* h" M" ~, ?$ |
* {5 j! U$ { A! L8 P
#define SHAER_RAM_BASE_ADDR (0x80000000)0 K) s5 M4 t" r! a$ o
#define SHAER_RAM_SIZE (0x20000)
6 }/ [: ?3 Y) ~0 l$ l% `4 v' f2 V& v( d7 t7 p. ^" V0 i
typedef struct
1 {# c. Q0 b q% W& J6 B{
I( W& K. C- `4 r unsigned int a;
) Z" R4 w9 o+ A" \ unsigned int b;) g* o* X$ `& ?; J7 d4 S
unsigned int packet_cout;
/ v A! n3 o9 A [2 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ r H8 j- l- d9 |' S0 ]; f
8 C! q% C; `4 m( ovoid read_MSG_buffer(int *baseaddr);
5 m) x; X) I" H" P; hunsigned int count_copy = 0;
" T+ ~2 i+ Y* f w2 T( B
3 H6 s* q( b" q7 h L* hint main()
7 z/ `; h* Q7 q3 ^' E& |- B{
; [# q2 E! ]) ]- R# }! G# i5 C, b; h int fd;
3 K$ y$ j3 j% i$ v$ G( I) t int *mem = NULL;
" T# l" [. f4 h. R1 A; G6 y6 k
& d8 s" F0 w) I0 z if((fd = open("/dev/mem", O_RDWR)) <0)
: i8 h9 X# r1 ~0 @" H2 Z$ ]- X {
% ]) A4 b( S+ r5 s" x" ` R2 } perror("open error");: u8 Z- q, n* {3 n2 P& `5 P- c
return -1;
9 r# j* q4 r9 u4 \. }: e/ _: \ }5 t! A! G* k6 M/ e `
7 z) b1 n& O ]4 ~) n( l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- H6 n+ X& ]4 V0 G8 L% v+ ]
' c. T: v: j/ L# Y' `' j while(1)' u; Y9 e% \% _* K
{
4 I$ \# J& |# @! ?8 A# s# c read_MSG_buffer(mem);
) H* Q5 ]! h3 _ }
- t" y9 g; e/ Q0 U% D8 w5 d}
1 d0 S6 I% b( l* @2 d8 G$ z) H" [3 s k
void read_MSG_buffer(int *baseaddr)
5 Z! C# ]3 ^8 N/ B! i{& s% L q! H {/ D3 H& ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 B8 a& G# N# D# t8 A* l; g2 h, S
6 q$ o& i7 _7 ^ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 x3 u, T+ ~; e8 Z. P) r% _, {
+ B" P) E0 h6 ^! V7 p& J if(pshreRAM->packet_cout != count_copy)) X7 C/ c$ p3 }. B* L
{( t) j, o9 g3 B' U* }( B, U
printf("a is %d\n", pshreRAM->a);
" {2 M5 {7 k5 k: S; k printf("b is %d\n", pshreRAM->b);
( O/ ?1 m0 [/ l0 c- }( k, ] printf("count is %d\n", pshreRAM->packet_cout);
8 U+ o- |" x5 m. I count_copy = pshreRAM->packet_cout;
8 p: L# k2 K* ^4 S R+ H( C9 \ }
* `% ^ A$ n, T# ~* ~8 T+ n else% {0 _ Z- v8 U7 R
{" S- L0 s7 @) k; B
printf("No effective message!\n");
" s# M4 |! D9 N, L }
5 Q# W) _' S7 w3 S# c0 @}8 d5 l4 O8 W; m" y7 B9 [/ L
7 R1 N, k/ L4 d+ k: Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 u3 R6 t. _* B! y' L5 Z4 p( ?. A/ d: n0 K: a( h
7 l6 M' N8 f7 _1 R0 u8 O
( o; T1 ]) a* G* F b/ c# _7 t
2 d, T) `0 V, c; E% X7 c3 T |
|