|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : ]: o3 C t) S% \3 k
& }$ S: k9 r+ g+ r( n$ q. `) @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 r* s# ]5 P# T; {: V#include <unistd.h>+ R% @, k3 z; j1 S% ?
#include <sys/mman.h>; M: A4 f k0 b# R) k+ b/ m
#include <sys/types.h>
* \# A4 e/ v; @, U. V# j% J#include <fcntl.h>
# l& R# m4 n, e. \7 E6 W
( ~5 N/ _1 k4 c [( ^# O#define SHAER_RAM_BASE_ADDR (0x80000000)
% n5 z! n/ X6 D; c+ X$ b. ?$ I6 P2 G; d0 O% g4 _
typedef struct3 S; |0 f$ A* [ x
{
& e7 ?7 S+ c3 x& T unsigned int a;
% |; H; S" C, W4 D- J P2 f: Y3 b6 K unsigned int b;- w6 f4 @ M# R+ j$ [9 D/ D
unsigned int packet_cout;
6 x i: C( @+ g# c$ m: A- U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 r/ a: R% R& ^- I; u% t
+ b1 [/ V* M& ^$ ^+ K H' O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( e9 o0 v9 S% N9 F
unsigned int count_copy = 0;9 Z4 C, i! F) L+ a; v2 }6 X* W
9 Y7 }8 Y) ~8 Z9 N# J- S" l" I3 a! ?0 s+ J2 |# ]! d
int main()
! d$ b5 C1 x1 P% n+ g) f% P{ P& ~4 k0 ]' R& j
pRX_MSG_PROTOCOL pshreRAM = NULL;( N z) F& j" q v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 {7 u( \1 m! ]& E& z$ |6 x
* i' S- m$ z2 C; I0 A6 D: ] while(1)) c8 V8 ~( H: q; w
{
: z6 m: | |2 x; O read_MSG_buffer(pshreRAM);. ~7 H3 l6 ]* i* C/ x) R
}
+ o0 u' Q# S6 M. `6 A; t}- X' B& e% _" f7 {
% T7 N' g5 [, q7 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 m3 @5 i9 c0 o' s5 d) T/ x; u{
. D- X( u" }2 {' v8 t: E RX_MSG_PROTOCOL buf;
/ M, S j2 F8 j3 O7 h" S ( ]7 U ?4 F: Y
buf.a = pshreRAM->a;
% `4 T* t0 h) q2 j! G! d$ M8 v buf.b = pshreRAM->b;
+ u9 g# u# |2 }" |. e buf.packet_cout = pshreRAM->packet_cout;# Q9 \0 U/ O# A ^/ ?" r5 l
* i( Q! h% W& C, K9 y/ ^9 A! s! \
if(buf.packet_cout != count_copy)
" w, }- U& n, O9 s# m) N {" {/ M6 D4 \, R& \: V! @9 k
printf("a is %d\n", buf.a);+ o& R& H+ S" C. w5 \% z( X8 ~$ W
printf("b is %d\n", buf.b);
5 L. U$ ?* y, C7 k) g2 ^ printf("count is %d\n", buf.packet_cout);
( U# O$ L/ X4 ^ q, `1 }/ |6 Z count_copy = buf.packet_cout;' R, W7 H. \; P% _: a
}3 Z( i9 z4 Y8 j( v( [
else
8 z) A, a% N0 |0 K; q- W; ~7 A {) n6 C# }/ g0 d+ V6 ]/ F
printf("No effective message!");
3 {# U3 n* W0 B$ u9 W2 j8 D7 n }, }9 G9 `: o% X6 v8 H7 l
}
b9 W) I! S3 C5 [& L9 n* f4 Y3 C" x: O, @; A
5 X% N6 ? l" F- C4 s7 I' D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" ], Y. L' Q5 x* x9 l使用下面代码,对内存使用了mmap函数后:
' Y( z3 j8 j- K#include <stdio.h>
# M, ?4 P1 w+ P9 o8 V3 X#include <unistd.h>
$ u( T" o' \) B" |#include <sys/mman.h>
4 n$ V' A8 j2 v* w' o#include <sys/types.h>& s5 ^* g7 d# j s$ ~9 `
#include <fcntl.h>& ? Z$ x3 L$ c) E, t9 R: @
! ]3 R& x/ r# T2 u) u. j
#define SHAER_RAM_BASE_ADDR (0x80000000)( N* c/ s* \' k) m+ R: F2 D; l; e
#define SHAER_RAM_SIZE (0x20000)
0 e# @# {$ F# V* X- |* X2 Q
3 m" f0 p" m3 H0 R" u# Ftypedef struct* A8 Z3 d# P2 X- r( I8 G* L2 ~9 V
{4 I$ f" {$ t& f* h& L
unsigned int a;+ @! R9 b' q, P1 T" G
unsigned int b;
6 ~ m! `: B& m unsigned int packet_cout;) Z. P2 q2 |( S0 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) l G ^$ A3 G- L; L4 B
9 t" I2 N# f1 u( _( ~* e! rvoid read_MSG_buffer(int *baseaddr);
/ [4 X3 B2 Q" e& c5 u5 t% eunsigned int count_copy = 0;
" M, W' U) V! `- S. ]& G
' S a6 \8 V. R+ ~ i' O3 R) Zint main()6 ^" d, p9 N; f! [2 C
{
* P5 u' K1 T* y% G/ v! f2 z5 O int fd;+ o: z5 o" m0 r' F! l) X4 S
int *mem = NULL;
( u2 ^3 y. ~ s+ }9 u% {0 j! z6 `* w; t, \5 a8 c. u
if((fd = open("/dev/mem", O_RDWR)) <0)# m4 ?7 i e( W9 _) M8 a! J
{" X0 |; @3 Z: G8 Y* X$ l% i- n
perror("open error");
& |. N' N N/ q+ c8 b1 e return -1;
- ]8 a6 f- @" \* n }
- j* k# s( H \
* y% w) M( j& y' F mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 B2 J& X- V4 \: L
2 q8 \* Y* H5 E+ g9 b6 i while(1); k: W% d# t3 }1 m! }5 {
{
! ]! y( q6 y7 | read_MSG_buffer(mem);+ l- c# \9 \) b& ?# l7 a- X
}
9 x; k5 i+ ]/ @- Y}
$ g. ?, Y2 s$ b. x. k3 J6 E9 Z) z. F. B6 ]( j9 ?% g' L
void read_MSG_buffer(int *baseaddr)
) S" w- S) q K{
2 X7 A& B# q: |+ l) o( f% A6 P pRX_MSG_PROTOCOL pshreRAM = NULL;
' {% ~6 ?9 U4 q1 z. z* }- Z' [# T9 f2 `# @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& v' D0 D# v5 G
0 C. t* R1 X; O4 N% Y+ x) Q if(pshreRAM->packet_cout != count_copy)5 G5 } E/ H( O7 S* K, N0 B4 ~0 z
{: [. {3 Y! @; t! e/ `
printf("a is %d\n", pshreRAM->a);8 f. i( w9 c# Y* m0 Z# _, a& T4 w
printf("b is %d\n", pshreRAM->b);
( G, O0 K: [, i0 l9 N7 q& j printf("count is %d\n", pshreRAM->packet_cout);2 s) h! `# R2 C" l, P# K( Q
count_copy = pshreRAM->packet_cout;4 Y2 q" m K6 F& v
}
- T9 Z H5 X! ?( ]4 g, O else; p, T1 I2 F. `! I" j. ^. h
{
7 I4 i0 {4 ~3 v9 V7 o printf("No effective message!\n");" V, R& f# O2 ~, }4 I- k- R
}8 h2 `' N# G. ~
}
% k" k6 ]+ }2 B+ e4 Y2 c* O2 f. }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. d- b" e2 ?7 |: e0 z3 ?+ d O+ L* m2 }, A% g, [0 V
% i) F( o' `8 {1 _; Q
4 {- J$ W3 a- c5 y9 Y1 x9 h- }0 w- b: H9 i# m
|
|