|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * D. }, g7 k9 S( g: S2 g
. Z1 H1 m$ C. P0 |* t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ r0 _3 E/ I& x0 M, |2 Y
#include <unistd.h> J0 j* G: K' N9 X$ ]' [
#include <sys/mman.h>
& w* |" @7 }$ L9 _#include <sys/types.h>
$ z5 \/ W1 {" e1 \. H3 I$ j( L#include <fcntl.h>5 j8 e/ {4 |4 X7 D. {% S- S
9 g) E: C5 L1 s+ f2 v& M$ j#define SHAER_RAM_BASE_ADDR (0x80000000) & |+ c2 c2 t, b+ M x
6 w f/ \- B8 E9 F t8 Rtypedef struct
: r- f' g* U1 e! w{
- p- _; J: E# O" k! M* B unsigned int a;
9 Q6 s P/ e: r j" b1 ^ unsigned int b;6 C+ E3 ^0 E9 b8 l& m) N( U
unsigned int packet_cout;/ U8 ], y3 ]" N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 I8 N/ w4 g9 l) u% _9 F
- H' {# s: Q1 | z; O7 uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- s# i: f: n# e$ P0 u4 ]
unsigned int count_copy = 0;1 l* m3 C. L# L4 f- M* H/ H \+ a
0 D: b: p( t! Z
. b: {: R9 ?. c/ ^int main()
: X" T9 S( b0 K8 p{
' X) T' f- u2 q" ^6 p |4 P) x pRX_MSG_PROTOCOL pshreRAM = NULL;
* h% O9 B4 }6 e2 d9 `. ` pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; m4 K. {" B) }7 I
7 B. F9 d& b0 R' G; \3 u2 t while(1)% v' I# S( i5 K- R, k" y4 a
{+ C" |4 R8 L. J5 z- W) b
read_MSG_buffer(pshreRAM);
J: Z4 D2 `2 N }
4 J2 _* I7 N( Q}
9 f3 L7 g# o+ U) O, g. j0 c
) O: s1 L3 S5 e' B3 ~/ E1 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- K% X* Z1 Z1 e+ ~( o{/ w# q; \; L* J/ p3 A
RX_MSG_PROTOCOL buf;. f7 }: B4 ~) d- e* J
( Z X/ ]% i5 R& q buf.a = pshreRAM->a;
+ l# A2 @, z7 X buf.b = pshreRAM->b;$ T1 t" E' m) h
buf.packet_cout = pshreRAM->packet_cout;
0 Z+ s/ f/ `$ ?1 ]# \$ Q6 [/ o7 T) H* |
; G. c [! c- e" @4 v+ P3 f/ c z) P if(buf.packet_cout != count_copy)
1 |$ y s* w' ~# z( g {+ w8 ]( a# I3 e- w$ y3 X) Q
printf("a is %d\n", buf.a);
. f l# ?! @8 C2 N. V" ^) x; ^ printf("b is %d\n", buf.b);
I- f0 j8 N. X. [5 {( k& Q: j, ~ printf("count is %d\n", buf.packet_cout);
* l( @+ q* q4 X3 k1 W! P6 p) s0 r count_copy = buf.packet_cout;
" ?2 L* w* X# i$ [# ?" w& }0 ^ }
& q3 {$ I4 `+ F0 }; S8 O else
- Z8 e! E0 C1 p- A {
- k$ O6 r2 f6 P0 F printf("No effective message!");1 j/ z( ~7 @2 V* q( c! E0 J* s9 m
}3 h. E4 u" I: B" Q) c2 s# t
}
$ n. f8 S+ ^# Z' r: V5 W( E& j
, L* Z: J6 R ?) D. P8 c: f, y- M: Y5 ^4 g) H4 v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
N j, p( |5 v* Q4 E使用下面代码,对内存使用了mmap函数后:; I4 E/ H- G, ^* k6 x
#include <stdio.h>: V- f" `2 g3 w" [
#include <unistd.h>
9 X- s0 |" f- h* [9 h#include <sys/mman.h>
$ ~. a: }- h4 d; C& U1 B#include <sys/types.h>3 I8 A. E$ K1 _" u! L! r4 |, o3 k
#include <fcntl.h>
4 I1 v3 j0 x% _4 o$ o' w# ~$ Y! K
#define SHAER_RAM_BASE_ADDR (0x80000000). F% e0 w" [ b( y
#define SHAER_RAM_SIZE (0x20000) # l0 X, D: V$ R8 j: e7 c
- U/ X B: H. \2 J( T+ \, Z
typedef struct; ~8 h p9 Q1 ?
{
: {# r7 `( [0 ?: l4 E unsigned int a;
2 R" i+ ^: ~9 @/ n1 \( ] unsigned int b;
- o! m& ^' ^1 f! o, Y& U unsigned int packet_cout;
" C, @# C6 `: A% c( @5 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 N8 y( D" H4 ]0 M# n
/ V+ ?# G; Q, I; g7 l T' zvoid read_MSG_buffer(int *baseaddr);
0 K* p) Y2 `0 Tunsigned int count_copy = 0;
; ~3 c; g( B3 p( t" t" _$ ?; B8 } p4 i2 K
int main()& w# d$ G: W; Y! [! t( q
{
+ W# I% o3 n o: a, M8 ^- u int fd;
. A6 N* Y! S% W9 v H) z$ ~8 z int *mem = NULL;/ y! l+ a8 S- q- o& L* P! Q
* B% X+ v2 D8 c% r& _8 `, u5 Y
if((fd = open("/dev/mem", O_RDWR)) <0)6 n9 n- ~: @: S* r) } ]* e9 e
{: v+ [9 L4 H& ?) l2 {1 i
perror("open error");( ]# ]7 _% R& B) A1 M1 J
return -1;% K' Y" {8 x: j
}
, D, A) b. P3 D3 j1 W3 A
" m4 |9 o' n$ M( `- _) |; p7 ] mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, r$ Q ?2 ]! A4 W! S8 Z Z9 p$ S
- d- i4 a9 j, L: { while(1)
7 g3 U4 l0 u) F% @, c1 N; r& \ {
# U1 C w2 d0 D( m read_MSG_buffer(mem);
/ [' I0 c0 e7 a$ Z }
! y. [3 x3 Y& A8 k2 ~7 s. w}7 H0 ]/ Z( b) h+ H- v( S/ y
: d: D! z- d' S9 c( c1 [( J2 U, x
void read_MSG_buffer(int *baseaddr)$ e9 m6 _; N# [; H
{, s6 k# ? ~3 k; W* q
pRX_MSG_PROTOCOL pshreRAM = NULL;4 ^2 D8 _) t2 b: f d5 h
( o6 _4 P3 y# m# K/ z4 V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 I8 i( \8 p" k4 O
6 d6 Q' R: S7 v( D if(pshreRAM->packet_cout != count_copy)
: N( E: y2 {4 O& g: ^& T {( O9 n& a$ q6 s. K/ n9 A, F0 t
printf("a is %d\n", pshreRAM->a);
: d$ H" s7 V }, U* Q printf("b is %d\n", pshreRAM->b);8 f+ M: N' c" ^
printf("count is %d\n", pshreRAM->packet_cout);* j g% N% D* N# v9 N; c9 C+ [
count_copy = pshreRAM->packet_cout;: Z( p3 Z4 k* N' N
}; q9 e$ H& f: K% J- Y0 o0 B
else: D0 ~7 N4 v `+ ]( r6 a
{
' Y' s1 f2 }: E( Q4 A+ [% u' S printf("No effective message!\n");' Q/ K( f/ n* e. `
}
8 b/ d# r# E0 ^! H9 U! L}6 B" V( v' D7 S7 ~, j+ Y9 P
6 x, K8 N6 Q9 n e# A$ y1 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) z4 ^6 c+ {5 X& I( n# W
O5 a6 d7 L% D2 i1 x
$ V1 B6 M! @! b" T: l
/ s0 r& s- m6 B: \ T( C$ g
! O+ M/ t# D0 Q5 _0 V+ { |
|