|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- p+ d4 t* ^6 V, P$ N
5 J+ g& |0 a( f6 S. y. K4 BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( |: u/ I; Y1 w$ N6 k: D#include <unistd.h>
9 b0 L4 b" W6 {( L, Y& [# |#include <sys/mman.h>* U4 |& u; H; i& w X0 r+ T7 l/ ~
#include <sys/types.h>& q% Q/ J" W3 m+ w
#include <fcntl.h>
5 x; j. O ?8 b9 `8 F! a# A
* U7 ?1 W3 N0 o/ R1 O* k% W3 \#define SHAER_RAM_BASE_ADDR (0x80000000)
+ {# g, x- }" R; t' G% a% w
* [9 T4 ` @7 R1 V8 u1 L- Dtypedef struct, t- Y( e( \; e, S2 k; g' V
{
8 m( E s4 P& G' h0 ` unsigned int a;
, [, ~" ~5 h. L7 l* a) c unsigned int b;
* p5 \* V4 k4 U) V4 n1 s) T unsigned int packet_cout;
1 E* l; R# g+ D* n- Z- g# j$ a' v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 u2 \0 b. a2 d! v$ I6 P2 }% { |
4 ^- _9 e7 |3 S# O) |! h [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 ^; f( M7 ^- Eunsigned int count_copy = 0;
! X4 j0 C7 U4 v0 L( e% L; |8 H# N5 Q9 n
1 |4 g' v; D2 Z H0 l( m
int main()
1 H0 j4 \1 j9 r( \; y0 ~{
7 y: U( x' z& i' R' C# c9 J0 T pRX_MSG_PROTOCOL pshreRAM = NULL;; p9 k6 {/ B9 m. }* E+ P6 e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 _$ p7 j6 u3 c) `% f \5 |$ P
8 p% F0 k8 ?+ X$ }4 ^8 t. U
while(1)0 u9 U' p. a3 W+ E+ A. K, K7 Y" @
{
! V" w( I& Q( N* H8 u( ~8 P4 x read_MSG_buffer(pshreRAM);" P' o6 f/ Q$ g
}
, t( L5 O" G6 R+ b, I}
* P. ~1 V% F% ?7 X/ S
) E7 `9 l$ R/ L0 b) k9 S' W" Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* q. T! ~* v/ H& n6 \{" Z1 J x) j+ ^) f9 ?# ~+ @% Z
RX_MSG_PROTOCOL buf;, m4 v/ Y" Z0 w, v
9 S+ m+ d3 Q9 W6 j' D
buf.a = pshreRAM->a;$ d$ T/ e' s- f2 L8 y; i$ Q
buf.b = pshreRAM->b;
" Y& k3 M7 o- o! I% T' C buf.packet_cout = pshreRAM->packet_cout;
7 S9 X8 a% D3 y" ?* V# U F( C
. E+ R. @7 Z! V& S& ?4 }1 J if(buf.packet_cout != count_copy)) x$ {) N" a9 I* ~4 s
{
W& x' k4 t( r$ E# m2 _; R printf("a is %d\n", buf.a);& |! m( A. R& o
printf("b is %d\n", buf.b);
* ?1 |2 v3 k! x0 J printf("count is %d\n", buf.packet_cout);2 [% x( i+ Y8 n. C* N7 [
count_copy = buf.packet_cout;: s4 e# S" E9 [1 C
}
& ~* ~9 i$ r9 j: J2 q else
?% |, D. c: h {
: t4 M! |" e5 M8 |5 Y+ m& D printf("No effective message!");1 W) {! c& U% G) |; m7 P% F1 ~
}5 k0 Y7 E# e' q( [! p) I1 v
}. O9 n1 H& |8 a, x4 M/ `2 `
# l) T4 y3 D2 V/ g) K/ ` i+ j! b0 m2 V( D$ t1 x4 x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ K% {0 i- w0 e2 H; ~
使用下面代码,对内存使用了mmap函数后:) u( ?, ?- I# U3 B, w
#include <stdio.h>
: O4 Q! t5 [* _" G#include <unistd.h>* M$ e" L! I% W3 `" s' f
#include <sys/mman.h># {; M/ z9 a, k& v2 Z$ A1 @6 O
#include <sys/types.h>
% k) Z( e0 R+ @+ A" b#include <fcntl.h>
( ~0 ] P+ g7 K( i
2 R( Q! h* h. {) p2 B0 J- ~#define SHAER_RAM_BASE_ADDR (0x80000000)
9 Q9 p1 `5 T$ E9 X( C1 \#define SHAER_RAM_SIZE (0x20000) ; ^; e: e' x; c( j: ~
* G2 v% J" s+ F, T v
typedef struct
, q: Y9 ~$ U2 s0 }{) z$ d# E: [( u% Q( p
unsigned int a;0 F) R- y0 v2 B9 T
unsigned int b;: Q7 n2 f$ r. B/ s$ ?( {( v
unsigned int packet_cout;
' Q l2 ?8 n5 \" f8 L# J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ k/ s7 ~! I: Y) x$ J, s) ]! X" V3 E" V. h
void read_MSG_buffer(int *baseaddr);, z1 J' |2 d; t, d) W9 @+ P w
unsigned int count_copy = 0;4 `8 E9 Q9 t- M ?* X
* Z2 j# T$ C: ^4 r: E) c( dint main()
* ?2 ]: J7 q+ H: i( v{3 ~4 N3 ]9 n0 _( {/ D
int fd;
3 z; \' ~" P/ u( |% L" U int *mem = NULL;
& g S: L' j% l6 z i c# R! }8 {% Y6 [1 m3 u
if((fd = open("/dev/mem", O_RDWR)) <0) H% O; {) @2 U4 s" m3 I
{" y$ c: N6 V" ~: {. C+ U
perror("open error");
6 @0 L( K( J8 | return -1;
2 C4 N$ z! E3 u* W2 z }
2 }* Y b' T0 T+ e8 h Y5 }
3 ~* i8 k1 S: S! C$ N mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) e H! h; C. j# r$ N/ E$ }! C+ K0 Y& R+ V& r+ P2 y5 G
while(1). E- d9 a! R% Z c; V
{
$ ~! t, W. T3 V) W1 c" W read_MSG_buffer(mem);
' l7 ^& j( t/ F, y7 O0 D }
l% ~5 \4 a4 {$ Z# L8 b0 q}" ]# R8 E: @, k
7 \, J, x1 D7 K8 j- H1 H8 \6 {
void read_MSG_buffer(int *baseaddr)
9 b( ]$ L$ E% h6 M3 q{% a" ?% D2 [4 |8 s6 m6 x
pRX_MSG_PROTOCOL pshreRAM = NULL;
& u% }6 T& M$ B7 C" ~; {2 m6 d5 a( ^ O7 H
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* P& j' u D7 n8 v& x H: W
6 u) E! X8 z" d+ V2 B if(pshreRAM->packet_cout != count_copy)
: K/ T% S3 K: F9 e {1 l$ Y4 M% v1 D6 d
printf("a is %d\n", pshreRAM->a);
; n" t+ I: N k& q# Y7 c printf("b is %d\n", pshreRAM->b);
( V" @( G3 c! Y+ q' ? printf("count is %d\n", pshreRAM->packet_cout);
7 W; _6 J7 U2 E9 U& [7 d, J, R count_copy = pshreRAM->packet_cout;$ G8 D# B4 n1 M4 U' M2 L
}) C; [1 |& V0 z; w% ~6 j4 L; K
else: `) c& U- g: A6 h% D
{+ ^. L+ l& o* u# `5 T
printf("No effective message!\n");
; s1 [ g/ Q, ]( L8 B }
$ ~3 o; ?8 y1 C B5 {4 J" {}( b z, C, W+ x7 ?1 B. r5 l
" ~ j1 H1 S" j( G/ t6 Q/ k. z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" f" f7 v9 c. Z+ W
1 R/ ] F2 V ?6 i; N
% w" f5 n% |/ x. |. X9 r
8 E _# M$ H5 W' U
% Z6 ^2 o/ [2 y' U& u* c |
|