|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / z" U, z2 a5 S3 P5 g
' w1 f8 w6 G; w2 {+ ^2 w+ H4 m
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: E \- ~$ D+ K. V5 Y3 }) E# v' V#include <unistd.h>/ b% }6 E6 C& b5 W2 ?8 M% R
#include <sys/mman.h>3 f; t' `0 L P7 ~9 m7 M
#include <sys/types.h>
* |2 v1 t" \. p/ v0 f1 q8 n#include <fcntl.h>- {) q- T# ? Q3 g
$ K' q6 N4 f% N5 c' g# \! B$ M3 P) S
#define SHAER_RAM_BASE_ADDR (0x80000000)
- E6 }! C( w& g4 `
& G+ w* q2 T4 |! t; G0 E9 d/ Gtypedef struct" s* D& g0 H& p! z3 A+ K z
{; f+ P; S7 {& e/ ^: {
unsigned int a;
2 b: t' |% }5 H unsigned int b;& P6 Y' V# _2 }, e' X4 z
unsigned int packet_cout;
. N3 ~: t6 ?" Z1 f4 S% [: [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- v m6 ~4 }/ p& V6 M8 P! C! y& X0 Q5 c! S0 I. [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' ~6 T; @7 ]0 }* h$ Sunsigned int count_copy = 0;+ q4 T3 Z& q. Z& X0 W" V1 `: h8 g
1 y9 j5 f8 p' t) g5 _
; F! M- e; h& K/ K0 a* Yint main()9 C) y9 M7 ^" D! s9 Z6 B5 p
{
9 H; s5 q: f* ^: d4 F0 t pRX_MSG_PROTOCOL pshreRAM = NULL;
' m3 ?* A# M: f. d( } x! b pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 b1 M z3 J/ O* c% [7 f
9 p8 U6 j) V9 }% F% u7 I- A' T while(1)" e0 c5 ^: P9 _- g! i
{
0 n! {0 F* c9 N" x/ b2 `; ~% C read_MSG_buffer(pshreRAM);) ]& ?: K! Q) | P7 J) L' k! T. i
} 0 R0 ]$ C9 p, [' A5 P
}+ r" I8 Q0 q- m# N3 h
/ _7 H. B/ f# F7 ~% \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 Q0 s9 R, I0 o" I- t; g
{8 D, D s! P% C* f
RX_MSG_PROTOCOL buf;
+ t, T) ]$ }3 N: G* ~3 Z 1 \, H& Q7 b& j% o, }: y
buf.a = pshreRAM->a;, f4 N# B2 g# Z7 f( P
buf.b = pshreRAM->b;0 Q$ D- e) h- ]8 j
buf.packet_cout = pshreRAM->packet_cout;; E: b7 `& V8 O m6 h$ n9 j
7 V8 j% m# {9 |, x$ n
if(buf.packet_cout != count_copy)
5 H, a) P. s: X$ j' N {& x b9 j; Y5 w. Z0 e
printf("a is %d\n", buf.a);! z/ I( p% V2 a8 `5 h, C' {
printf("b is %d\n", buf.b);
8 r7 ^9 ~3 f( s4 e3 D w printf("count is %d\n", buf.packet_cout);
7 w: W ^4 D4 q, K count_copy = buf.packet_cout;6 n5 u, z% k, H& k3 d
}! X* @9 Q' j. v) B3 @
else
& t3 _9 K$ T! } a* q s {
/ m& J! {9 X% y/ g0 H printf("No effective message!");
7 Y& E1 R. {/ h/ [, C5 f j- I9 i }$ |' f% [7 h, X' y$ Y: ]; }+ e
}; N' p7 N$ Y3 r9 R; H' {* v
) i) g( |: \7 e O5 w; K) t% a
+ u+ d( J* u3 a: F1 h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. }6 x7 C0 p `8 ]" }% F
使用下面代码,对内存使用了mmap函数后:
& m% I9 f. R; b1 H8 ]/ @: c#include <stdio.h>& u$ E. q0 T5 Y( y
#include <unistd.h>
3 H, E8 {: ?5 S$ Q2 W3 e#include <sys/mman.h>, O( V C" e; x
#include <sys/types.h>
. g0 K7 W h- l! ~#include <fcntl.h>
. g% g+ @2 F! D5 M; v- L
% I4 r- r& _: Y) ~8 G# W- }3 g/ _#define SHAER_RAM_BASE_ADDR (0x80000000)
& a; x* e1 k0 ]8 I& F. a4 C, O2 _0 |1 a#define SHAER_RAM_SIZE (0x20000)
. i& H: w' i8 s4 a( B p9 X
/ b% |1 x2 ?2 W+ Z: _% f3 O5 ttypedef struct7 ~4 F% ~( C+ G% C1 l5 E! ^$ w# J: E
{
$ O6 x+ G8 O$ _% G' m# u unsigned int a;3 \: c8 e; P3 a9 {8 g
unsigned int b;
8 Q5 `( Z3 Z' E unsigned int packet_cout;6 `" a9 L) N# y" h: K8 V5 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! @: W" G# U$ w# t: n7 N7 n, z5 I* D @4 u
void read_MSG_buffer(int *baseaddr);
0 e, C/ H# r9 ?" A4 X" `; L/ Vunsigned int count_copy = 0;
$ S0 x+ E( S$ u9 M7 z! g6 h4 `8 j; Y* @& @
int main()
0 t9 f A) }9 t* z* X9 d5 B{4 H$ e( z7 _. M5 s7 B A
int fd;
/ b( |8 J* t8 S int *mem = NULL;8 R4 c. E3 r( j3 i. G5 j
* `, b" a3 ~# n" d& K1 ^3 C9 @% v
if((fd = open("/dev/mem", O_RDWR)) <0)9 X5 b1 B$ n1 Y5 O( \! p# Z8 J2 y
{
# c& D" K- B) H9 F* T perror("open error");% Q9 J% R4 p3 @- h* y: u( @: c9 C
return -1;3 l: }% E* c4 ]# }7 o
}
! U D c1 z; B6 Q7 i- K
+ G$ P* x% |: F9 T+ S+ H; W mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% ]. u+ E' E3 Y" j( Y9 c, G
4 w1 Y7 d' _& V- `" c( b# \
while(1)
5 A% { w; n! L6 ]- E7 F* { {) O, j' Q6 \- [/ J1 Q& V
read_MSG_buffer(mem);
. d% m) z$ G3 T3 R } % V( r/ I1 O8 o" v
}
' @9 P9 ?+ {8 I9 I4 B" |
1 |) D# K# [ [6 N4 nvoid read_MSG_buffer(int *baseaddr)* D. G0 @& A1 g1 m" `
{8 U/ ~0 N# p3 ~5 t$ V
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 B3 Z- y7 E1 R Q ^& r
- p$ u( P3 ^5 w0 n( b6 L/ ]1 O7 o5 } pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. O! m: t2 m# _) l% u \# p) v; i' U; K* y
if(pshreRAM->packet_cout != count_copy)! v5 m' k7 G7 q: E/ |- n% {2 j, e
{, F2 ]! f6 H! g. W+ p
printf("a is %d\n", pshreRAM->a);# e2 i7 C8 N) A8 O+ P
printf("b is %d\n", pshreRAM->b); P" z" F; K8 ?" H0 i
printf("count is %d\n", pshreRAM->packet_cout);
3 _4 a8 R2 }+ L* U; f5 B count_copy = pshreRAM->packet_cout;8 B( k' E- |, ]# X
}
, D9 C3 x; j) {$ P% u. z else
& l# G, L7 i8 _- b! ^* B {
' @) L% [0 r9 n9 u printf("No effective message!\n");
; K0 O- t, _( u* _ }6 D! p7 X5 ^( `
}
/ l0 b9 m5 k+ \. `9 R3 W& ]. |9 r2 X- A. ]2 i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! L* R) g# q# c
& F2 K% X2 Q9 w0 ?( @
1 j8 U4 v2 Y4 Y5 Y3 E- _6 t' E
# `- r v+ v2 f) ^& r0 a9 `5 }
" W1 j) }7 _8 M/ Q4 L |
|