|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 y9 ^* C8 K g: n3 w2 Q
6 g3 L/ S% @! N& }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 H0 p# j- }, V
#include <unistd.h>
! f' V }: P4 F: o: I- r#include <sys/mman.h>1 T ] n; u; P2 b) e# C
#include <sys/types.h>2 U) n4 \4 A4 Z D
#include <fcntl.h>
: K: u% P: |" M: h' }8 B. h; M
#define SHAER_RAM_BASE_ADDR (0x80000000) 5 P/ o n# y' g
, ~, P# V% c" j! c9 \. utypedef struct
% X. A4 w( O+ |# k% m4 s{
2 W. z& B# B/ s9 |3 `9 r. o unsigned int a;
* ~" f d s& S. t5 x4 Q unsigned int b;. @( U, t" J/ a8 h. O% F( ]. w
unsigned int packet_cout;2 B6 v( |; n* O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- }" J. T, B( @4 V: y8 K9 e. s9 k3 A. M3 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' s# W6 @0 O& b9 G2 \1 M( @unsigned int count_copy = 0;# o/ U) Q& \! w- y& a
! `/ v* O/ n% h! J& ] @
4 y( R' d) C8 bint main()
1 x% T7 T' b* c/ W/ d( N% ~" D# {3 `) K{
; f+ m2 G# g3 E$ h. d1 c {2 v9 I pRX_MSG_PROTOCOL pshreRAM = NULL;" E* V8 d9 M( h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. ~7 x5 ^# ~/ F$ m8 }* S$ n% `+ I7 P
while(1)/ ^0 f/ ~' W6 D4 h' C
{2 K2 s/ z* h/ n/ S X
read_MSG_buffer(pshreRAM);
7 ]/ \& [6 L _4 P% f0 P, z } / g, Y: t: @& R& A, P% }8 L
}$ z+ V9 z" s; ~/ g8 w, {1 R
" Z8 l( ^* a0 F! D% jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): k9 c! T, j+ W5 E, R2 X. J
{
3 r+ Q4 \# Y0 V2 w, q1 X7 @; `( z& ~ RX_MSG_PROTOCOL buf;5 d% \+ V4 f; W t
, Z5 h- Z4 \/ p. w2 i
buf.a = pshreRAM->a;1 X& Q* e# x! `& K B
buf.b = pshreRAM->b;
$ P9 Z8 T: }8 s* n0 Z0 j buf.packet_cout = pshreRAM->packet_cout;
- N0 J. E" g: E$ C8 C$ G ( J8 v: s- E+ c9 n
if(buf.packet_cout != count_copy)
' }" c( Y/ t" a! T+ S# L& M2 I {9 p* d8 ? I# H% B+ g9 z
printf("a is %d\n", buf.a);1 ?3 y( b4 A+ P' z/ R# A
printf("b is %d\n", buf.b);' ]: g( q- t1 V
printf("count is %d\n", buf.packet_cout);
" Q: ]* W4 b0 Q9 o count_copy = buf.packet_cout;
( c; U4 m7 h8 b, L$ ]. G# x }# U& B7 {% L4 _# i3 @1 u; A, X% ?
else1 |9 f; C" n) I8 `4 ]/ e
{
" Q5 r+ R0 N1 a5 i9 s" A: N printf("No effective message!");
0 a* A& I- p$ G1 h }; g# Y* f! h- U' O- R1 t
}
: ? e& i9 c5 V: i# I+ s" } x
' u9 U2 A& m# Y" q* h% ?+ [4 ^( J2 f* x8 \( y& o, K& ?8 w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 V, S. U1 P2 ~
使用下面代码,对内存使用了mmap函数后: b3 A5 d. l( v7 A1 N2 m
#include <stdio.h>
- s- Z+ s6 S. `7 A#include <unistd.h>) H5 V% g( n& W# ?; ]# s
#include <sys/mman.h>
) F$ m) D- J; I6 _$ k s) m#include <sys/types.h>; b8 S- I% p# z- C% D
#include <fcntl.h>
3 I4 f$ T4 m. @. h4 e7 N7 o; [" a: l$ d/ `6 N
#define SHAER_RAM_BASE_ADDR (0x80000000)
! l y; t1 [) ~- o0 w#define SHAER_RAM_SIZE (0x20000) ' X6 g' \/ r6 @6 p" J; a
0 l2 e7 B# |: ?0 x: l- Btypedef struct9 n. W$ y% [+ y* B6 ^9 ]
{: K, _" K c' w7 h6 s% W
unsigned int a;/ q* R9 l4 J/ E; X- k
unsigned int b;) }9 r; y4 @1 L9 A
unsigned int packet_cout;
% B9 h. E% {6 ~' x9 N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, i9 u# g+ n- F
, d( S* k' e; Q O$ ?' m2 u# Q; `
void read_MSG_buffer(int *baseaddr);6 d5 i8 D- i, }' Y6 K* U1 @' ~
unsigned int count_copy = 0;( `" p4 Z' {" Z- ~9 x) a. c
( L& S3 q8 I4 j! s4 f8 \* F
int main()
; {5 }9 y! {: ^. D& m0 u{
- P( B3 [4 {! j! a& s: T0 K( h- k int fd;
& `& w: d3 ^% b. a$ P1 o; [& z int *mem = NULL;$ x5 ^; v) h1 \2 N- D
* H, e3 `& r- @/ a% _/ t4 R _ if((fd = open("/dev/mem", O_RDWR)) <0)" J& Q" w; i- k+ L) ?) Y6 m* c5 ?
{. b+ _, u6 v2 w2 k9 h4 A( k6 ?
perror("open error");
, b9 \$ B( k% I' N: K+ Z/ r return -1;& g" Z7 m( O! [0 `. p
}$ _9 Z9 @# y1 e* l5 g
4 E" N+ o: M; P mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. |" g! A* [( J% E9 A' I; L
! j5 ~8 P/ N. B& H* g while(1)3 j* m0 |8 p0 b% _. s" J: o
{
, x) g6 q4 j2 V1 ~ read_MSG_buffer(mem);
2 ]) P8 I' K" I" o& M! Y+ m } ' f1 ^' V2 U( q9 p
}+ o% X. T' N" c6 w7 M
9 W$ B1 x& Q7 @8 K1 i3 d: }5 ?+ Vvoid read_MSG_buffer(int *baseaddr)
2 }0 y, y; o& Y( k# X* M7 K$ V{
& w. H6 z' W( A& I4 _' L, W pRX_MSG_PROTOCOL pshreRAM = NULL;4 v9 X3 |" C! H Y# Q$ G
$ i0 f; Y% e! y" X) z2 m pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 `1 p2 O4 i& @; t) j
. e6 R% G2 e) ?2 I if(pshreRAM->packet_cout != count_copy)4 q0 v" C |( i2 ~" b( g% f8 S
{2 Z2 w3 Z* e( b1 e* d
printf("a is %d\n", pshreRAM->a);* Q& }; v* |# S. N
printf("b is %d\n", pshreRAM->b);
! O. g& A7 y, U- Q* M printf("count is %d\n", pshreRAM->packet_cout);
8 E) t, R3 v) X, W count_copy = pshreRAM->packet_cout;" p1 \6 C' N! t6 v5 ~3 t1 b
}
2 V1 v" B. T# v0 ^ else9 w6 Z- I( ~, p$ K6 c
{
, |1 U- V! I0 X. ` printf("No effective message!\n");
$ ?) ]% C: _4 M }
' Z9 F& }* o5 `# O3 S. ^( o, A}
) O3 T( }3 E$ o1 a& g) `! |2 O$ t F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& G- n0 R. q& m* E# a2 H( ~
9 d& [# d/ Z; u' I0 i. b0 y
: x3 P% ^& @3 Z( R+ U
9 x8 R8 B5 ~8 e% P; O" w$ D2 L5 ]( A
1 w: c/ J6 A5 n% K |
|