|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- f& K. v) M8 Z# p2 F- d- Z& a9 R9 ~& x! X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( Q1 g' T2 h1 o$ C#include <unistd.h>4 Y( Z0 g! C8 i$ O" [+ N
#include <sys/mman.h>
& S# Y" H0 O, X! H#include <sys/types.h>. r/ Y- ]( b( d# Q; G) L
#include <fcntl.h>
& d, s- ?8 p- j- [0 W
2 R+ ~7 s' Z# G+ s4 w- \#define SHAER_RAM_BASE_ADDR (0x80000000)
+ ]5 a: Q# u( s7 z% Y$ w2 @- O" H! \: t( o. x6 R
typedef struct
& N% u! U5 j; O5 V6 A{+ }6 ^# R3 m* h% F, ^
unsigned int a;
* |( \- F% Y. y. t unsigned int b;1 \. N, B6 ^* J+ s+ I9 C
unsigned int packet_cout;+ L& A' q% S! e$ d" R/ O% k4 l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% `1 J. R6 C$ {4 l7 _4 @# a: k! A ?( s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 u. J* O. I! {; Q! s7 L. `9 p7 `% Z
unsigned int count_copy = 0;
% R2 ~/ k* c( b: p% j, A
7 P1 S7 |# X$ B4 J; i: }; Z: g7 u( ]: X# Y/ K5 ]
int main()6 k- n4 n. F( ^2 s0 Y& |; e
{6 u# e! \+ w3 O9 T; ?
pRX_MSG_PROTOCOL pshreRAM = NULL;# G- u, i0 e+ [/ h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 L8 `5 `) Q. ?7 w
; U# ^0 H" f( V' @% }, S while(1)
% |6 q) `0 ]9 ?9 U2 @, C% G P) w1 K {
$ S$ I0 U# J5 { read_MSG_buffer(pshreRAM);
9 @) q W2 ], m% Q$ x, d } " f( P# R1 e3 w
}
) j/ Q6 e9 I3 Y6 l6 s. G+ Y
( L/ {* \0 L. N! h! J7 e0 L8 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; J; ^' R( e, [4 ~! o{
' K% n/ U: f2 j3 J" ` RX_MSG_PROTOCOL buf; V6 C9 s. m! G( Z
$ Q; t$ Z5 g9 d
buf.a = pshreRAM->a;+ x: _7 T9 A3 F) o
buf.b = pshreRAM->b;* Q9 U/ z# s5 r X
buf.packet_cout = pshreRAM->packet_cout;; y7 N' N& w$ _6 H6 ]
3 |& c. i7 {# C4 v6 i4 y# R
if(buf.packet_cout != count_copy)
1 A4 W1 c! F1 e8 C- V. B7 i {
: I F& J4 u0 s: J" _7 v8 A$ x9 o printf("a is %d\n", buf.a);* l: u8 X. Z3 o2 Z; A3 D! C# s3 _* ^# g
printf("b is %d\n", buf.b);
1 d9 l% E% m e) w printf("count is %d\n", buf.packet_cout);/ {/ \; |$ d5 l! C7 h
count_copy = buf.packet_cout;% D* c2 Z! g; M) A2 R, y
}& T4 _# |4 l% c9 R
else
# J/ W d1 n% d7 Q {; E/ c$ h& W) p; d; X7 m) w& W# O
printf("No effective message!");3 y/ R7 }# a. E3 }' q8 `0 v& x
}
i% p; J5 v+ N/ r, x$ a X& v" b}
* w5 o/ ^6 B6 i' U' @) f1 n& ?2 [& f; v) z7 q K0 ?8 v# f! X; D3 t7 V9 ?
+ j. h# F+ f! R* I: D6 {7 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; [( _6 H$ N! w" M1 _" ^2 E
使用下面代码,对内存使用了mmap函数后:
- ^& m% e% o1 |: [; | T2 d3 n% U# O4 \* w#include <stdio.h>& }2 Q7 R' F7 ]
#include <unistd.h>
+ a: f% `" o9 C/ N) Q+ y a. S0 Z#include <sys/mman.h>3 r6 r& r( p& r0 g; N; K# z
#include <sys/types.h>
, F8 c5 A( [1 g' W#include <fcntl.h>
0 h; [& [, P9 o" o# B
; ?1 l4 _( i% J2 K: P% F3 {#define SHAER_RAM_BASE_ADDR (0x80000000)
7 ]$ D1 E: C4 n& s5 A#define SHAER_RAM_SIZE (0x20000)
. @, W' @* \0 m5 j* I/ [
. C3 @+ h$ N+ z5 Otypedef struct
! ]4 W1 H! a$ d8 b4 L. h2 k! C; v% u{8 i# T1 V" ^+ O, _
unsigned int a;- [7 t: {+ `& t
unsigned int b;! ~& L# ^( F, ~
unsigned int packet_cout;
5 w1 ^! B" w' h0 o9 V; Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 q8 y8 h9 E1 V, k" p
2 a1 q; ^) b% G5 G& J
void read_MSG_buffer(int *baseaddr);
" s9 ]) Z6 `- E1 [1 n+ {/ yunsigned int count_copy = 0;, j6 k' @3 i& O+ E2 b; N+ `8 Q
$ l8 W8 x9 ?2 S# L2 q3 w! g* T! j
int main()
9 Z) L+ }8 V6 s' `3 @{
1 K' a2 d/ s6 M7 H+ ?6 {3 l' m int fd;
q8 ^3 M1 Q! ]$ [* v int *mem = NULL;
9 @4 l5 @! Y* [6 g+ S0 g8 L! G: F5 `/ i p; M6 x$ |
if((fd = open("/dev/mem", O_RDWR)) <0): W4 m6 @5 n) z0 }
{
; p+ a: z7 _* Z' G b: G perror("open error");* z$ ]2 I4 v9 i2 J
return -1;
5 b8 u2 n8 V2 `: F% E* l1 c0 V }, G4 Z" D1 V" L& p6 r; a
9 f: n- v. R( d2 {$ t: i mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% D6 z% J& z/ m% J( k7 d
8 h! o1 O. h& i( N, Z while(1)
( N: j7 b3 Q6 T! d2 T {! e' i6 i' I4 _& h" B
read_MSG_buffer(mem);4 q; o5 U) {( k, x- W. U
} . Y) n2 a- a+ M! z+ i5 k5 U: z
}7 @" c, ~" h) @/ N& v+ I* Z
5 m& n2 I [! l6 L2 m. Z
void read_MSG_buffer(int *baseaddr)4 E U; w3 e5 _
{! g" u8 w0 U. F% F4 u, H* p( ^; |
pRX_MSG_PROTOCOL pshreRAM = NULL;
" |) }" X: ~/ i& v1 X) L, Q7 @% X8 Y h7 J8 C; D7 l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 e- v2 X5 f, j' u+ Q$ l9 C( Z
( l% w( _0 e% J$ S& n if(pshreRAM->packet_cout != count_copy)2 y$ t9 t8 P0 |% E9 A* ^( T2 R
{
W3 X* M& c# n7 e9 q7 r printf("a is %d\n", pshreRAM->a);" R) n; |1 ]6 c% t
printf("b is %d\n", pshreRAM->b);
3 z, G0 M( ^* c Y7 r, n printf("count is %d\n", pshreRAM->packet_cout);7 Z+ A [0 Y1 l) b! N7 U+ n, C0 x
count_copy = pshreRAM->packet_cout;
1 g* n# c# ]7 M) j0 n5 B9 D }( W) o1 ?. G5 y8 u
else0 R" t/ C2 U+ s5 ^
{. R# C8 }* | v" v5 W/ H
printf("No effective message!\n");
! ^8 S# D0 a7 T' u }
1 d j5 p7 n1 n7 p( y4 m}0 H# ^$ z1 r5 s. J) g8 T7 j- S
/ l5 q9 r% o# J1 O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) f0 S! C% L( i( ]
2 }: p3 s k; k) T% S9 p3 t2 c# |. I* O' ]. Z. Z. }
4 g4 w/ k5 c% G! ]. X" q w$ ]: U
7 g* x( A9 q% C7 L$ e |
|