|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
z' Y; J; C9 p" s& t2 I
! `8 R+ ^& A# S! F* EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ Z0 p8 q o! Z3 S' c% e$ q#include <unistd.h>
5 C) \7 D0 Z+ ^4 i#include <sys/mman.h>
5 P u# g. b& ]: Q/ z* t! r' J#include <sys/types.h>( H6 |6 Q e- k$ h
#include <fcntl.h>
# n7 V6 [) n6 }
1 v: f8 W: Z) `0 x#define SHAER_RAM_BASE_ADDR (0x80000000) & K# G8 \* W6 K9 J/ ^/ a
# E3 ?* {& ]& l$ L) I3 jtypedef struct% z9 v0 z! J/ U8 e
{4 R: ?- X9 { C
unsigned int a;
. W3 L- T- K. W4 l7 T/ k unsigned int b;+ Z$ L% S: V7 K1 [4 _
unsigned int packet_cout;
" P3 L, q! v, s% W9 L0 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 m- f8 ]4 q3 U
1 z/ ~# M+ U( i7 N2 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 U$ a0 h1 ^: _) Junsigned int count_copy = 0;9 M8 t* I% Q {* u4 N
1 \/ A- V+ V+ C! [5 k
/ K: \+ U& ^) k6 ^int main()% ~! e1 X$ c, Z* D ^6 x1 D9 C, M
{
1 z/ q( o: e: `( W6 v, ] pRX_MSG_PROTOCOL pshreRAM = NULL;
/ w1 Z4 t& R/ T2 `. J pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 C1 x7 M! P9 ~% f1 p
) [- M6 ?% i3 C& M while(1)
4 K0 v% J; X* i$ w4 B {
: |" i, K5 t7 G9 U( Q read_MSG_buffer(pshreRAM);. d" S8 \; x$ m$ g' y6 u2 h
}
& q& T+ A2 T( m; [}) J; @6 O( V* f1 q
L& M, G. O* H, H6 x$ x$ y; T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ A+ E( H$ \& M7 J8 J7 B
{6 q8 V! n8 |' |- \/ u
RX_MSG_PROTOCOL buf;
3 h/ V; _2 v9 t/ v7 I L! u! A a2 a0 `: E) r2 W' `
buf.a = pshreRAM->a;
* P. d" Q1 c' n, k+ b buf.b = pshreRAM->b;
1 \8 M# _2 j u* R buf.packet_cout = pshreRAM->packet_cout;
% \+ r: P/ @1 @) b + T* Q3 V/ W5 R+ \2 \+ m/ ^
if(buf.packet_cout != count_copy)
% L& }3 v+ B; w# J m! E {
* c( w! j9 P3 C( q6 I printf("a is %d\n", buf.a);, [+ a9 g) R% x0 ?
printf("b is %d\n", buf.b);
7 T1 U. g; G; J! i/ ~+ ~. ^ printf("count is %d\n", buf.packet_cout);
4 N! s/ T) q: [; G* q/ g% x& f' C count_copy = buf.packet_cout;
, y, U8 X- {0 D }4 V4 u2 p# S; |7 `$ `
else
7 p: e" j/ k# d {) [$ B/ l: ?+ c3 C
printf("No effective message!");
# [* l4 e5 c9 k3 X+ r% j }/ p4 K9 A, O3 D: z4 g
}/ W# u9 T5 R/ B
3 p# `* b* N- c1 q& O7 e1 Q& R
/ R# a3 G& |- o* z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 k( `. ~) r) o' u7 B8 E使用下面代码,对内存使用了mmap函数后:
# G) t$ h8 r& C: _' J# o- P1 G#include <stdio.h>" o: E# q# B* l) T2 h x
#include <unistd.h>
2 {& S2 Q# T1 I! y& y3 l% J#include <sys/mman.h>
0 j" e' q5 }4 s! d" J& a& o#include <sys/types.h>
2 ? D! r) d s) f) z6 `% A5 L }4 C, C#include <fcntl.h>" v* R8 r& O+ E
8 O" T8 H( r, h/ P% q/ j
#define SHAER_RAM_BASE_ADDR (0x80000000)! @( u8 U( J* B9 G& ]
#define SHAER_RAM_SIZE (0x20000) % i e8 x- h4 {+ n v
5 r9 ~; s6 W$ c- ]$ }; \typedef struct) f7 Q: K p0 b4 s' }. \+ z$ ]) c
{) A7 _% f( ?/ Z% \+ h# w; S
unsigned int a;
2 [" V( f+ _2 t) h) g unsigned int b;
1 ?5 N" ?& k! L$ f unsigned int packet_cout;
, [; Y- Z1 j% q' _: F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; f" }6 f0 o6 F' }5 |
1 c8 l* A! o. M4 J4 k1 M9 mvoid read_MSG_buffer(int *baseaddr);4 I, l( \5 s' S1 g- q
unsigned int count_copy = 0;7 M9 {# }" d9 Y6 ~
: y8 ~& @ L* c! _6 V* L
int main()% G9 X$ F( t% D& C K. `( o
{" @4 J- R, O7 F8 `2 y" e
int fd;
& ^6 F( ?" r; g6 s* s int *mem = NULL;
* Q0 }5 q+ q' `) f3 G- B. e- l( ?2 n9 b/ T* }/ {1 r( G
if((fd = open("/dev/mem", O_RDWR)) <0)6 o4 E5 m; A) ^) H- v
{; n9 v6 P- w+ W. C: E% W
perror("open error");
, m# M% ?8 p5 n% a# D return -1;
1 m* z4 E$ j' [& L }3 j' q/ U6 _- P0 }7 n( I
0 ]& d, D1 [: w) }" x/ C
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 W& @! c0 E9 e3 d' G4 ^* {
: W3 j9 y6 m' O L8 h% }
while(1)
6 I: ~* \1 M% b; u5 f {
! _& A- t v6 d read_MSG_buffer(mem);
* ^3 Z! H) l/ [' s& v% M) ? }
W+ u, U. l; Z! {/ l" |}# b$ i( C0 N; [" z# }. `' ?6 _; c
* y Q7 I: L+ C) b& b) ~void read_MSG_buffer(int *baseaddr)6 E! @6 b3 I' t* l$ @4 t
{! [0 _, r6 ?, G% ^
pRX_MSG_PROTOCOL pshreRAM = NULL;& l8 d) P; w6 h2 D$ C" i* H! |
" l; d" t, p1 D5 f7 y* a4 H pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; k3 u. }7 ~+ O' r. O: r
' v1 l2 l2 N) x
if(pshreRAM->packet_cout != count_copy), q0 D; y3 k* J7 r4 _, J+ r; _
{
; p( Q6 p. d* q) k! P printf("a is %d\n", pshreRAM->a);
1 Y* v9 s2 i% k2 I) g printf("b is %d\n", pshreRAM->b);# t! h/ G! L+ J5 Y5 v. D" E E
printf("count is %d\n", pshreRAM->packet_cout);& w4 R$ r- ]& t$ `& F v1 C, q
count_copy = pshreRAM->packet_cout;
- \+ {1 O* `+ P. q1 X }
2 P- }4 H+ D1 S, Q- q else$ B- W0 C; m* M
{* a2 C( D- W7 z- f. v1 F
printf("No effective message!\n");
- G% C, p. `& l; ?3 E; U }" C! {2 f' S) C# X$ s+ N
}) \4 h) r& _4 c7 Z2 [* g
- W! H. M T4 p7 ^; O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 o0 [0 F; F. q
* b; M' a0 M) D# U- E, t t- {- O- n" y9 N5 B- f/ Y6 n
' B n! o8 E `2 t/ J7 F/ ^
- Y- E9 h1 G- M: z& l; Q# `2 r |
|