|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 X1 U' S5 Y. R/ j) P
& \5 O( V) b$ `& K! b* T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 x8 ~$ h" K7 `" q, x
#include <unistd.h># S) B5 e9 P# Q% W; b) S# r/ K
#include <sys/mman.h>
, k8 S2 c- ^2 Q' N N5 I3 I#include <sys/types.h>
+ K& L2 [; U) V1 ]1 q0 R#include <fcntl.h>
/ t! E3 E/ Z0 s- A
1 j1 S' n: c( a/ W" }#define SHAER_RAM_BASE_ADDR (0x80000000)
" R/ e1 k2 |+ |. t: ]5 S7 q1 |5 \& e+ L* _. D7 n& n
typedef struct- w8 ]% x3 S3 E
{
% O# ?1 g C$ f) E& s8 D$ B3 s& @% ~ unsigned int a;
F7 d* t, s/ e; E) F unsigned int b;4 u t+ ~* l5 \6 R
unsigned int packet_cout;
/ \ b) K; U! z. c6 a$ Y5 _# b. b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: p( P, z. f2 L7 L& a6 T* `9 H
, X5 z" P% U2 o) pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; Z& I; z6 x0 l; f7 [
unsigned int count_copy = 0;9 U' X# V* S/ D& k! t
7 d( b) H% @8 X+ |5 h
% _$ Z$ C4 w' v) M+ S f
int main()
8 V# f1 [& n s, h- h1 }8 L% B3 W{
8 j- T9 K* p( ? pRX_MSG_PROTOCOL pshreRAM = NULL;: ^" o! E; A7 {
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 m; H$ v8 Y$ b; m. a
2 z( x, d. |7 a& o
while(1)
% S% g, Z! {7 w {# R2 |: w- J5 K
read_MSG_buffer(pshreRAM);$ C+ j2 Y( j" }/ N
}
" i& x% W$ K2 E# ~) G/ j$ x: D}6 i9 K$ W/ j) x/ w3 n( [: S8 j
! L7 \/ R: l7 F8 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ l0 \$ W2 B( f* M4 c' C
{
- m/ c! c3 f% q9 Y% @$ H* V$ s RX_MSG_PROTOCOL buf;
% @ o; P+ o5 Q8 ~1 q
8 s8 t& V6 a9 ~' G/ y3 W7 u* z buf.a = pshreRAM->a;
2 M; h! P" C0 {4 _3 g$ F! v7 U: [: Y buf.b = pshreRAM->b;" `8 Z6 d. W# y% G8 u
buf.packet_cout = pshreRAM->packet_cout;
( B2 M! i3 t* W: X& w! g/ k) I* u4 T
1 O$ b9 w w( E( Y& [4 A2 O if(buf.packet_cout != count_copy)) U; d$ R" q, r: |- z" e7 D; a; \
{
0 o% }5 p7 K4 w }1 \ printf("a is %d\n", buf.a);
/ c0 J- ]: s4 ^9 W5 ~6 _3 I printf("b is %d\n", buf.b);: F& M9 D: Q( w( [ J$ w0 j
printf("count is %d\n", buf.packet_cout);& i5 X1 \: V. \6 E
count_copy = buf.packet_cout;1 y& B& E- i" T$ r5 d
}
% A B0 w6 Z7 |# n( Y. U2 B) { else8 z; G8 G" h# \, ^2 n! p9 N/ V
{* _! X1 D$ w" i6 G
printf("No effective message!");8 R7 t3 p' ?; h3 K/ m
}- {' V7 M, M7 I4 [+ |* t/ m: u
}
: f& F- B1 i, }* p' Z/ {# z7 B6 Q6 {* y* @) {) j4 u8 y0 R: l( y
U; | H# P$ O/ P5 C; m% [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& O# l O; \# Q/ z4 S& y! ]使用下面代码,对内存使用了mmap函数后:- }4 [$ H" S/ r1 s' u% h3 {
#include <stdio.h>5 \1 ^8 ?# {4 y3 F( E, R+ W+ E
#include <unistd.h>
" f3 D! e8 I2 T) A#include <sys/mman.h>
: N; ^9 j6 v- h0 g6 o) N#include <sys/types.h>6 g# s* P0 Z; R5 H9 F4 y
#include <fcntl.h>
2 [; c5 D) q; Q7 d) _
0 Y& c6 q& ^4 B' p: Z, G#define SHAER_RAM_BASE_ADDR (0x80000000)- e2 F+ G( j _. }6 j5 D
#define SHAER_RAM_SIZE (0x20000)
9 y( b: ]8 f. p* D5 X- i g1 f
1 U. h# K P4 w& h! O9 Ntypedef struct
, x3 U+ v9 k7 w, \% ?' d{9 z) o: m4 i' n. e! x
unsigned int a;: ^6 W( O H F' x5 L
unsigned int b;
$ g$ G u4 Y6 m2 l unsigned int packet_cout;/ B* S) ~, ~0 M8 l+ h4 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 e# v, s" Y- \) I0 {& M
+ q1 T i; f$ G# J7 S
void read_MSG_buffer(int *baseaddr);
# y1 J' U8 ?: P0 Q+ o. m: {unsigned int count_copy = 0;2 _- U/ T) ?9 q9 a, z
/ x t2 {0 ]+ X* ?
int main()
& e, Z8 f, K; B* H4 u+ K{
r I: _. S* o- w& D( _ int fd;
: h. a. [ j- J! L% y) j int *mem = NULL;
8 S9 Y4 C& m% \2 T3 v5 l9 f4 B4 o5 Q7 a6 D& r% o; j! ~3 g; \( r( A
if((fd = open("/dev/mem", O_RDWR)) <0)
1 Z, C1 ?; i! z! u8 v2 b {+ g( N$ \& |! N( t8 X2 q
perror("open error");. [" U& H6 S/ Z. x8 W/ T
return -1;
6 F: t- y: u8 A; b$ [; c6 u6 W }, M6 y2 [2 M0 @$ Y+ [$ Y
' U5 z% J( S6 g2 z2 ` mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 |1 P: x( L2 N- k% \+ O( J( Z. k: c# O7 H9 v
while(1)/ F$ O! ]4 j5 J- m/ u
{
4 G7 f8 R, C4 J+ r' j' c% V read_MSG_buffer(mem);
6 w" r, O" `+ `2 N9 Z" L } % c; f: ~. }8 m p* F, [
}
o. N+ L7 @ o" i+ q) y+ ] {0 l( ^1 N8 Z' O1 t y
void read_MSG_buffer(int *baseaddr)$ a+ o+ Y2 ?+ k
{; F# I& o/ X/ y& m. X
pRX_MSG_PROTOCOL pshreRAM = NULL;
: ~. ^# H# N* C8 c4 M1 n N- g( i r. _/ G' Q+ @& N7 {, Q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& g/ n7 [8 E; R7 ~. e
: H% a, i u9 k1 G1 c+ P4 ~ if(pshreRAM->packet_cout != count_copy)
2 q9 M) o7 Q; }$ K- q2 ~5 U {" [; ?7 q8 k4 u$ ?
printf("a is %d\n", pshreRAM->a);( x- j/ q6 J1 C, {
printf("b is %d\n", pshreRAM->b);
; F6 X+ s, s B) m; }6 a1 Z printf("count is %d\n", pshreRAM->packet_cout);$ `. a4 U' t% o! L6 @) f( p( [
count_copy = pshreRAM->packet_cout;% I! [& R, ], {( D, g
}
- h1 ~/ S8 P" Q; v else* p: h% P' U; P' F
{" v% d* F7 n1 R* v# N- P W8 O8 c
printf("No effective message!\n");
. {& `0 I9 m! @: B( F }
0 B0 s& X$ D$ _2 J9 K4 S E}+ f4 Z; X8 R M8 e& \2 G
' @; [! c" @) L0 w/ U没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( D" G- C% H2 T& h
7 }5 |- ~; ~- m( ]
- v9 U. e* C2 f- R5 S' K+ u6 f4 S' H' P
5 }% ^' d$ r/ o' O6 I |
|