|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" @/ N( A3 f7 M* z3 v/ A' i8 `, l* B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! P/ l6 x7 ~# x#include <unistd.h>0 b! u1 [% S8 o" e2 R @
#include <sys/mman.h>: d2 a/ m3 j5 l0 t( z' w1 M1 K7 {, L
#include <sys/types.h>( k% K" E9 z) N* q
#include <fcntl.h>
5 C) q/ k9 t5 G1 o/ x; ` y8 k J% P( l/ B6 f; o8 M$ ?; e6 H
#define SHAER_RAM_BASE_ADDR (0x80000000) ' `8 c& W0 V2 @' f" S. N& C
5 L, v1 L n; @7 g& H! C& _- P1 s
typedef struct% A$ Z4 Z' P9 |5 \0 D4 n
{/ K: q' m4 r) e8 V; u% p+ L
unsigned int a;
Q+ e; Y4 U, B$ L9 @ unsigned int b; K. I3 v7 l1 M9 n$ K
unsigned int packet_cout;
" T( ?2 Q6 }1 `( V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: R$ _7 K- l/ ^9 I
/ _9 |- B% D* y9 J0 ^2 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 K1 `* X' J1 D* H+ k! \" Funsigned int count_copy = 0;
7 {5 J. [4 c9 Y. z) _4 O4 T# R: _ w1 s
# [8 T3 l5 v& K- W6 ~) m5 p/ eint main()
& P; a2 ]3 Q8 A; a{; f7 _% |7 q6 O3 d# [0 {5 @5 ?" H
pRX_MSG_PROTOCOL pshreRAM = NULL;7 W: Z. r4 C" x; p
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 z7 x. _( H7 ]& v7 P* M9 r
3 p/ M: ^" m A& ^; r# L' v; v2 u7 m while(1)
e: v% L* N9 i/ F Y {
7 ?" Y4 X* C) \0 E) @4 U% X read_MSG_buffer(pshreRAM);7 c& y; c5 F }3 K& @
}
2 j, I: |& e4 p m* R) R% H}9 W3 K0 R! l n6 D$ i3 i: f
" _- ^- S# v* uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
]+ ^: [& P, T! g8 {: R# t{9 A2 G3 N" d) Z) E2 Q2 J9 w4 q
RX_MSG_PROTOCOL buf;3 }" z0 W: o R3 q/ o
& @; e% e: ^! x8 Y9 g' M buf.a = pshreRAM->a;& y& E" \: r: T: k L d
buf.b = pshreRAM->b;" L! t9 v8 t. i; x% A' \
buf.packet_cout = pshreRAM->packet_cout;
$ K6 v3 L5 w/ N( ^/ Q/ U
I& I$ F7 [8 z. C if(buf.packet_cout != count_copy)! d4 R" b- ] G5 Y7 z4 G' Y
{
% ^! N1 b1 G$ r printf("a is %d\n", buf.a);
) A, M5 d3 P# K8 r6 F4 O, t printf("b is %d\n", buf.b);
! f+ G% S4 {& F/ Q9 g* {7 Q printf("count is %d\n", buf.packet_cout);& ]* [3 R/ `# M1 ^5 B( b
count_copy = buf.packet_cout;
$ i5 C2 N5 w3 X& h, K7 P4 v }9 m$ |( ^+ m, [7 `4 A2 N) G* P
else
( T2 V) A" A* }: b4 ` {
" H* H# H) ]9 O printf("No effective message!");+ B. q- ~6 P* h/ E7 p: |% ^# ?
}7 w" L+ v! a; t7 ^6 v, B: b
}
7 t6 ~0 F# R; A9 x5 V( ?/ p s6 N
J' d7 f+ [' { z) p; }. @& |& I. c2 [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# W' q9 a) u# _. n使用下面代码,对内存使用了mmap函数后:1 {% o$ S" d S5 [" i
#include <stdio.h>2 z9 b7 b I( y; H
#include <unistd.h>
6 w: @% b% z9 p, F, M( W! M#include <sys/mman.h>0 { `* A) a! }8 P2 _, F8 C/ i
#include <sys/types.h>
0 ^9 \" T4 Z4 \! U' Y! ?#include <fcntl.h>6 w9 g6 ~4 l' a3 ]! S) ] A
3 S: u$ C! y! |
#define SHAER_RAM_BASE_ADDR (0x80000000)! t( S9 H# O& {6 |* v' E( Z
#define SHAER_RAM_SIZE (0x20000) : a4 ?' Y' T. G1 X* \
5 x: c R' G$ x0 H4 t! k
typedef struct4 |! [* j# U: C9 j: T
{/ X! n. o( k! x# l3 h
unsigned int a;6 d+ P) ?! Q) l" Y9 T
unsigned int b;
" g1 z+ j. {! ]+ w+ A ?! |" C unsigned int packet_cout;4 M+ ]5 T# J5 W& i& D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, g3 u, u* D+ U9 m6 Z' F( i8 P
/ P- d* j! P ?* k* jvoid read_MSG_buffer(int *baseaddr);6 m/ W; Y, v% M: X; H1 F, ?
unsigned int count_copy = 0;8 g2 J* n9 i4 g* V
% p3 D/ G3 ?0 B4 V4 s" ^+ O8 Vint main()
, Z A4 w3 g; B8 h1 A3 u1 }{: s! z1 r* O6 Y* M' b. g* Q
int fd;% s; N" K% `6 \0 v
int *mem = NULL;
9 y0 q+ ~/ s& N4 o4 M' P$ `0 G4 S/ U
if((fd = open("/dev/mem", O_RDWR)) <0)) ]& S, z) }0 \! F# X% L# U
{" e) m5 k) x5 l0 A/ x- m
perror("open error");
/ R& g7 o: M' L/ W5 O( x return -1;+ ?; g7 e( v. W5 V
}
2 H1 {' M! h0 T1 j. t. S. f/ f
- j& h% q! ~: N5 _# { mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 n/ ]& a6 D# ]3 y- I8 ?
. M; `* e1 n( d; b* V while(1)) ^/ m" E9 G* u' R: {
{/ G4 m0 _8 s: P5 {2 }. z/ E/ m
read_MSG_buffer(mem);
3 s* ~. s5 x4 q4 h4 e } W8 ]! H" z& B' F
}
1 m) j9 s+ [: u) \7 y2 Y7 m. N- V3 s# X3 _4 q1 F
void read_MSG_buffer(int *baseaddr)
0 E' I% n. ~) y3 m4 t5 e& e{0 `2 V% N4 U: r/ Q8 p* T0 D
pRX_MSG_PROTOCOL pshreRAM = NULL;
! ~3 V8 a! n/ N6 O" L" d3 f: H |& z( R
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ I# }/ j/ \( J# T; @ o
2 w/ i, N* _2 x5 V
if(pshreRAM->packet_cout != count_copy)
$ H3 x4 d3 A( V0 e/ q1 ^9 h {8 v, M9 H' h; T M! G
printf("a is %d\n", pshreRAM->a);( ?; \: b) i) g" b6 x& z: o% S( |; P, y
printf("b is %d\n", pshreRAM->b);
8 D; ^2 }. g0 o- m$ j7 d* X printf("count is %d\n", pshreRAM->packet_cout);
" @6 b' }% _7 } count_copy = pshreRAM->packet_cout;0 Q2 `8 [. \# Q8 g& U1 p
}
( E( e$ U2 t, J5 X( w1 c$ q else
% O, q5 \' D: P0 ^# r/ }5 Q4 ]# e {
2 D4 P& E, \* Z5 B% x printf("No effective message!\n");
' y3 d1 P, M* G- \0 T1 E9 l/ k. U }
& X* B" {7 ~& p) ~3 f9 V3 \5 i}- s+ y, O, R# V! m4 q# p
* A, A1 S- L* F2 }没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ U) j; E& q8 ~- r/ _# g& }6 X7 \3 N
. L( _" k+ P. P' z
4 U& o5 W# m3 P0 _) i% b4 q
' I0 d U% e+ q( B2 {, u( P
6 w0 G9 d. V% D* `( Y6 [
|
|