|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 D3 L/ m7 C* ^
+ F3 H; h. X5 u" LOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 C! T. W) s% C& ~
#include <unistd.h>8 U# Q; a6 o4 ?9 c
#include <sys/mman.h>! T# z$ |$ Z0 f( Z& f- g
#include <sys/types.h>2 H( f4 I( Q& ?4 Z/ l( C
#include <fcntl.h>% R; W% M: U& i+ ?5 o) x
/ P% `& X, \) n2 A4 t( ?#define SHAER_RAM_BASE_ADDR (0x80000000)
5 G& |* L9 b# U$ n" h
6 n/ ?6 L0 h; vtypedef struct
2 e6 g# G* c& d: T0 X{( [6 I/ a) t4 \1 E0 T
unsigned int a;4 A2 Y- z) g8 }( c- K8 a5 d
unsigned int b;7 u6 z) ?# B5 h
unsigned int packet_cout;+ I0 E: r6 h7 ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: Q4 [" @) m# O! V m8 o, r( y8 k# u z* M# w8 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; q" k% I3 L, S' G% u; w1 U! G
unsigned int count_copy = 0;2 s* f: [) j( Z: _0 F, }
! L( S I$ a6 M2 e6 K; `1 ]: J
- G) u! Y g7 [% K5 B
int main()8 u7 w4 P4 H0 b
{; m; _2 B' s3 w& c% V1 s: `
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 J4 U0 q r D) j pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- D" Z0 o3 Y+ h+ m
# @; `9 i1 C/ H; r7 J5 z# Z
while(1), U. d' n) B/ d5 J( G
{" F( x: D2 A& T; O; Y0 h' ]
read_MSG_buffer(pshreRAM);
& @! R6 k0 f2 ?3 c }
0 T! b2 N1 u: I e$ T! D5 O9 y9 o}
$ `5 w ~: U; R; X; a% ?; t9 c/ j4 _3 ^, Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& p G+ m- j. g, Z{
2 y# [1 p; M+ T% B. O8 X( N) z RX_MSG_PROTOCOL buf;
. I d- V# Y" x7 S+ q7 i" b' Y t# @( M( b9 l! m( @
buf.a = pshreRAM->a;
' V( M4 n" ]/ X% V buf.b = pshreRAM->b;
& h( Q3 E9 d: H" j, s9 z6 l9 m buf.packet_cout = pshreRAM->packet_cout; R& Y: c1 c+ ]# U, y
* H( c e) [! Z3 i if(buf.packet_cout != count_copy)4 i/ J6 v3 O! Y
{* V9 s0 a8 \( M# `, o
printf("a is %d\n", buf.a);, e' }# ^3 {1 }6 U8 u
printf("b is %d\n", buf.b);
7 U9 T$ l4 e" Q$ D( H) Y9 u printf("count is %d\n", buf.packet_cout);/ P0 n- j* A% g) Z, [+ _
count_copy = buf.packet_cout;
3 S _0 |5 t# E) _! w }
8 y; N/ f! t0 ^% S$ M, u) ^9 v else
, k- W+ S- {% P/ S& B% D {- ~2 C3 B# O( _5 O1 B6 L' j ?; K
printf("No effective message!");2 b) N- M' C1 r6 d- F5 @- X
}
8 A' a, ~ ^* ]' x& L" c: x4 T$ K4 |$ w}# h: h! W8 A* |9 S1 \0 q; [
5 n5 F: T2 n8 F! r+ t
3 {2 h* P5 j; A0 u- R$ U& X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 ?! t$ f# S, G p; {( z R使用下面代码,对内存使用了mmap函数后:- W& n3 R6 C+ ^. a V
#include <stdio.h>
J) B& k! v" d: j#include <unistd.h>
3 O) F$ J, N0 \5 q2 Q1 A, s+ \#include <sys/mman.h>
! x: t' x; U& u- m& D, v6 l& F) ~, R+ L1 F#include <sys/types.h>+ s2 j) p4 b8 B) a# s4 _* r
#include <fcntl.h>
# r7 h7 @! |1 a, L* S0 y! w1 z, T6 i& z/ C! L
#define SHAER_RAM_BASE_ADDR (0x80000000)
, s, ]+ V5 ]5 _#define SHAER_RAM_SIZE (0x20000) ' r$ @: c3 c: }; D
- U3 `3 U6 i& q( r8 ^+ F# Utypedef struct" N0 K( l0 K! U- `) F+ ^, f8 u
{
n! ]0 N! q9 u: z9 @% i unsigned int a;+ G8 `& T6 Q r# K$ T3 }
unsigned int b;- H. b: G- M: b$ Y2 G. M( u7 e- U. Y
unsigned int packet_cout;
: |. h* T. R' q8 Y! o0 Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' u) J% A5 n# s' \% {' z
- L! h& y" O; z, X/ I
void read_MSG_buffer(int *baseaddr);
5 u$ w# c, w% v! w- f- w$ kunsigned int count_copy = 0;! M; U0 p3 G8 m% R
- A8 b& N! j% X' ?" W
int main()
( r F7 |, O) l! K) |7 \{# ? g9 T0 C0 @& j% L
int fd;! i* E! _% B# R0 D1 }
int *mem = NULL;
, W7 m. @" R8 ^# l' v- V% B* [ P- J l. E3 l( K/ @
if((fd = open("/dev/mem", O_RDWR)) <0)+ _$ O" Y; u5 l3 ~& N2 k, b: p
{
4 D* k4 p' e( _ perror("open error");
' p9 K, N" C/ ^3 _6 i$ i- | return -1;
, n0 R2 \# f, ~9 e* r }
$ u. P0 R" S, f( j+ \
$ D# |7 E7 C6 g% d! C mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( P" w. S) ~9 B; b7 V* f6 Y* Q. [* _! a) B
while(1)
; W- A# y' W* F9 V3 Z$ v {
0 L' U8 k# Y) e7 }5 r read_MSG_buffer(mem);
3 J5 N' h8 b6 F* y& D1 H; } } 1 M. K3 u R2 c* V; w- [; _$ Z/ f1 z
}
! N. e: y; z+ e' E0 {. |# B
" V9 ?2 s, @$ wvoid read_MSG_buffer(int *baseaddr)
8 b9 j: w$ S: L. l, d2 \{
$ R9 m% h$ R- \/ H1 [ pRX_MSG_PROTOCOL pshreRAM = NULL;
* E: j/ \$ a/ a# U6 o# h9 f8 k( c/ a3 T& Z$ |8 U; f( r, i) e7 L _" m! H0 Y. v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ ^+ I5 w: b$ s8 O& a0 M
5 k, U; c, i. ^' m p! q2 W3 @ if(pshreRAM->packet_cout != count_copy)2 a. `$ j5 a* U3 l; E2 H5 D I" q
{9 ~) u6 I: Y7 K7 D& I
printf("a is %d\n", pshreRAM->a);
1 H( h3 |) C! b* e8 i) i printf("b is %d\n", pshreRAM->b);
; }3 K$ ^* C5 Q9 u0 C- v2 H$ A printf("count is %d\n", pshreRAM->packet_cout);5 w$ s" w! J' [3 p
count_copy = pshreRAM->packet_cout;1 r, X# D- ^! W: s
}) x) B3 F: ?0 [9 h- [9 ?
else5 n0 ~2 Z5 Y5 p. c( G( o) Y% W
{: T4 M8 k; {- u. `; E
printf("No effective message!\n");
2 \) D' v, R, g7 K# i3 V8 S }
9 Z6 s7 ~6 Z6 ]: |( V}1 d7 ~/ P( A- m: h
* V3 v, g' d7 ^; ^. f! E( \$ E. w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' ~* r1 h# V. N, L" L; E% \- _
# y; O& L; r5 q0 z
; O( R2 T* `/ C0 c0 n% @7 T5 g# y+ Z( ?9 ?/ }
4 ~& f* o7 g: { |
|