|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 t" i& U) _/ K# g9 t( L8 Q5 x
1 J0 n b6 U' R5 l* [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 ?% u2 C& Y- A$ w# `% B6 \/ v# y#include <unistd.h>; R/ X% T2 f: C y: Z
#include <sys/mman.h>
. G4 x! N' T) \% j3 c#include <sys/types.h>
7 v" y5 i) D8 z4 Q- r! O ?! z) w#include <fcntl.h>7 u9 ?3 N/ u' _- C( M) h
8 D1 i1 Q- ~* X! |* D% { i, _#define SHAER_RAM_BASE_ADDR (0x80000000) + v) ~% _( J* J
: f) G8 t$ E7 k1 b H$ x
typedef struct5 i5 |8 v% c: u$ n0 P& U9 d
{
: B1 \1 w# h7 q unsigned int a;% \5 A! X M1 K5 e/ k% u
unsigned int b;
6 [4 a0 R4 t9 o g, Z k unsigned int packet_cout;: ~& D' a4 J4 V# F! f( _- [5 K! I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; a) j) c4 \( W. q, ~
% y1 _% E% d; S* D* Q1 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); i& [$ C6 j$ Q% w0 F* t3 o
unsigned int count_copy = 0;& V+ q I, c( E' w
5 i, ~% i5 f+ Y' A8 E" D/ M4 ^1 k7 S' }9 y5 w( i. p
int main()1 Y0 @, b- H8 T( @) y# ]
{
9 I v3 |9 @$ @+ y; E pRX_MSG_PROTOCOL pshreRAM = NULL;
( V/ w5 h: E1 G pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 A6 m) |6 f! ~/ F. @. \" I% D; B0 r, U$ D4 ?$ n9 i$ q2 u
while(1)
6 Y! d Q+ Z; q& g- { {
! F. h5 ]* H$ F! W+ N" ~ read_MSG_buffer(pshreRAM);
# ]* k s! N0 b P# Q# w }
, W6 l) v7 X/ ~+ ?}
, S) ]5 R8 w! O# d) _
! J( H6 a+ X3 t6 ]' ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' m# O) e' l2 t: }
{
" k* o; ^, c. ?1 `% R2 i RX_MSG_PROTOCOL buf;! K/ j4 t% l8 Y- a0 @0 z
; w1 M" K; [7 T$ }+ E: ] buf.a = pshreRAM->a;- z" f t% V m3 X4 L
buf.b = pshreRAM->b;
3 G' H5 Y& `1 y buf.packet_cout = pshreRAM->packet_cout;
: V {: J8 }/ J! p# t
* y0 N5 C) d9 r% G5 ] if(buf.packet_cout != count_copy)) ^$ e e7 G( ~3 `0 \! O
{
# L# c x: H9 f/ m printf("a is %d\n", buf.a); ?& Z: O# K, _" o+ t
printf("b is %d\n", buf.b);
/ _+ ]* L" m P9 [6 D& w1 e printf("count is %d\n", buf.packet_cout);2 E1 T" P8 Z% L9 ]0 f6 s |* Y! c8 |
count_copy = buf.packet_cout;
6 Y; C3 K; W4 D, U }
. G9 n/ J+ n# ^- z% ]; ? else
) C# \: v, S& O8 m1 { {
5 w5 I9 t a' t printf("No effective message!");* v& X; _- {$ C7 j( g3 I
}
& }# [9 S' ?% v8 B: e" |6 W}! [8 X# t0 w3 t8 g
% h% y9 L) V2 ?, _: p9 D' h. x5 b, H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# G* k9 K8 ^3 Q* w* Z
使用下面代码,对内存使用了mmap函数后:8 ^3 r7 P( ^, ?0 v% Q0 p
#include <stdio.h>2 |' ^0 k1 N1 O: w2 ~
#include <unistd.h>
7 E" Q, Y3 T n) S, A/ I: V#include <sys/mman.h>7 E- H9 W) E# h5 Z* j
#include <sys/types.h>
& C* x" j2 @9 a& Q#include <fcntl.h>
$ A* @% z$ {8 v7 s& A/ y7 \: `( `& V/ O3 [
#define SHAER_RAM_BASE_ADDR (0x80000000)& T( a: i4 A! ~. ~* m- t
#define SHAER_RAM_SIZE (0x20000) 2 A# H+ M$ z: Z# M8 r
e( @! \! v* u2 P
typedef struct
' D6 Z/ S* c1 ]$ i4 u. T! \{
9 k+ H3 p( I; s X1 O( i+ ]7 z unsigned int a;$ U3 Q( S& s# V, y+ m {" ]
unsigned int b;" I2 ~4 y! n4 ]/ h; P: z8 A
unsigned int packet_cout;0 z$ C- b. {0 k' J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! b: J) }" p6 r5 O9 @4 O8 ?. B
/ v8 I& b) b8 N: wvoid read_MSG_buffer(int *baseaddr);. U' K$ e! j6 Y* n
unsigned int count_copy = 0;0 c& O5 N% ~. r
+ f# G7 _% w+ @; C7 \int main()/ _* F2 C' q; E5 S0 z) c
{
S5 Z9 w5 X4 _. l5 Q int fd;
9 r. u* f8 {, G: I3 e2 t- m A/ _ int *mem = NULL;
- g/ _) D( o' n8 I+ G1 L/ V! H! m% L& _- M% N
if((fd = open("/dev/mem", O_RDWR)) <0)
) u/ I- }+ n; t9 {+ p0 ^ {
9 z6 u6 w) {% I4 w, \ perror("open error");3 n* n: W3 y h
return -1;+ N+ `( o9 }) x9 U
}
( N+ B" d! c8 {; q3 L8 u6 ^ ! A0 v4 I4 c& b' G+ ~0 Q- l5 f$ S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ g* ]' ]7 }' P. o# O" N) ^$ @
' G7 q; O6 R% S w9 T9 J6 p6 I while(1)3 O/ g- G9 a& h& ^* ?% h$ k
{ |- t4 R7 x2 b; w* `* Q
read_MSG_buffer(mem);+ b. I" T) Q6 S
}
9 M; ^! |) r, G) g% @7 F0 b}1 e! |) F& w' H! K4 ?% ~4 x
. k/ V, |& z+ u/ ?void read_MSG_buffer(int *baseaddr)
4 D u! ~8 v' |: @% U+ v. b{: K1 _4 U! p- \8 l* r! S
pRX_MSG_PROTOCOL pshreRAM = NULL;7 d' L+ d% Z7 c) U5 b
0 ^; w2 N4 Y( j( U7 F+ ~+ A pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* T* N8 i/ r/ u5 d
- h; w; c2 e: s+ x6 N; F if(pshreRAM->packet_cout != count_copy)& ^" ~! J* a0 s$ m& U; \8 k, r" n: k* h
{
. N% o* @5 r: X J2 t& m printf("a is %d\n", pshreRAM->a);! l, {, u3 e2 u4 s5 d& M5 d7 v
printf("b is %d\n", pshreRAM->b);0 k A6 o1 Q' M! L( _2 V9 O1 k0 A
printf("count is %d\n", pshreRAM->packet_cout);
4 U( ^$ F. p) l0 Y1 z$ Q count_copy = pshreRAM->packet_cout;& S0 }9 Z3 y; ^# ]9 `% C
}
0 X- _! c9 B M, w0 F2 K2 c5 ?" I else- X* Z1 v$ s! A
{6 P% f6 v9 I9 E7 r: v4 g8 r- @
printf("No effective message!\n");( K; D* N! [4 w7 Z
}
* i( M: n4 W7 m7 |}: K$ l [2 V+ y+ S/ w
+ I9 U- `# O" V5 [. D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 p! g% O G' c1 t+ g h0 F) K- r& g1 }
" B. }% [1 @" a3 i+ h' |; i
/ j. P- o; [& `" @! P2 S- q6 i0 t. |8 V! h o+ N8 l) I
( x7 _$ R3 D8 H4 T
|
|