|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 A5 A" `$ _) l1 ~% W- q' @. U3 _8 ` R: B( C9 p2 X/ C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 Y6 Q* c9 G8 }
#include <unistd.h>1 v0 s& @! i2 w" j, ?, u( r
#include <sys/mman.h>
I7 N( F' f$ h, }#include <sys/types.h>+ I* V; i W# a# Z: d
#include <fcntl.h>: n' i2 A! M8 A: }0 ~
# Q5 ], I& H+ P7 t. U- V% K! h#define SHAER_RAM_BASE_ADDR (0x80000000)
4 H# e( S7 b7 h W2 B4 f m O+ Y
typedef struct- Y, j: J+ g3 {: ]
{% i! o% A- h+ l* ~3 T
unsigned int a;
' M' T3 K) u i; ^9 z7 }3 N unsigned int b;
' w- s- I5 Q* V7 g9 ], \" @ unsigned int packet_cout;
: h7 p% g( i# l: u" c$ D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ U/ c* [- K, U$ z& Q, C
. `: [* W. ?. x6 `( J8 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); c4 I s! s: C$ r0 R$ S5 D8 Q H
unsigned int count_copy = 0;
0 N* l3 D9 @+ b! | d3 W! u7 h8 t; n' |0 S
+ [; ^: \$ N8 t: m7 R
int main()! H1 p0 l7 p. J+ f& s
{, k& ?' U+ W$ I: h5 S
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 |3 y5 E1 u% Q$ x pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 J6 b# m( T0 N# S7 k, v3 `- Z
; G" b' J+ l! M5 @5 s7 H while(1)8 m M- Q! `7 H! T
{( \8 _. [+ }( l7 H" f& z3 m7 z" u
read_MSG_buffer(pshreRAM);( T; N2 O. [; c( ^- x0 C$ X
}
3 ~( _# Z, T5 H, m}1 O4 y2 {' i) k2 U3 C
8 [9 _* m6 T6 B: {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) s+ H$ r! P+ N1 C
{
: [ y2 @1 |$ S0 {/ H. B RX_MSG_PROTOCOL buf;
- ^3 r1 ` i3 p / S5 \; [0 H; w6 `; o( v6 G3 J# v- Y2 x
buf.a = pshreRAM->a;
: z0 r4 o: {+ f8 x! U buf.b = pshreRAM->b; T" o% Y6 P! k8 g" A
buf.packet_cout = pshreRAM->packet_cout;1 D o* Z# ?; q; g% o# X* [
& p7 v( R/ o2 W% @: y if(buf.packet_cout != count_copy)
/ t6 N5 \7 q+ _/ H, S& b {
" v* d4 K2 e! y! N5 ] printf("a is %d\n", buf.a);; K l' B0 u, a2 R: ?* g# a4 |* `
printf("b is %d\n", buf.b);6 ]" W5 n7 f9 o+ U' [
printf("count is %d\n", buf.packet_cout);5 N$ u8 n [0 Q( B( J
count_copy = buf.packet_cout;( Y8 }; b: ~ s+ ^* r! P
}
0 `, N |+ c4 [, H+ p8 W3 B else
4 ]5 P& p9 s! G4 s {0 q$ d5 ^) ^( H* ]" [( O
printf("No effective message!");
7 L4 ?' O" G, Z; v& i9 H9 z }* P7 D/ |" `. h+ \$ B! y; D! |( f
}
" e2 u2 B* O1 i- u! G2 v( C
- Q! v: P' B" k. \" P, \2 z5 \* k6 Q& p% ^; q7 I+ ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& y3 Y2 l& z) V9 g. K, X使用下面代码,对内存使用了mmap函数后:
" u& i7 K* o, W8 e# E9 R; y#include <stdio.h>. D" e! u" I/ c2 A( p$ x
#include <unistd.h>
$ e/ ?3 J, ?! X3 |3 X#include <sys/mman.h>
3 U2 I5 k; J/ A, G#include <sys/types.h>
) W5 R- }, D# Z& a1 \6 D#include <fcntl.h>
, N$ e& {" j8 G% ?6 |+ e' r* S9 P1 `4 L
#define SHAER_RAM_BASE_ADDR (0x80000000)
T) i; F% h( [% N8 C8 N* r#define SHAER_RAM_SIZE (0x20000)
A' @* h+ h5 I- [0 ]* R! p, Q7 g( [1 }) Y5 j Y* ^' ~
typedef struct' f% h$ b' ^$ i) N
{! P! {+ m+ ]0 S" z k
unsigned int a;
) I* f, g* i) Q) z3 x unsigned int b;. T0 p% e6 O4 T9 V8 ?! i
unsigned int packet_cout;* k1 J- e7 i- F+ ^' t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 M3 |' J% \& S& C! S, l1 I" m! L
& W8 y) h) T. V+ n$ w2 p
void read_MSG_buffer(int *baseaddr);
9 y- E) Y1 Z/ z" @3 P$ g! Funsigned int count_copy = 0;) ?* u% Q" H7 K% N: q( O( h& Q
|( o x+ K1 J$ x
int main()9 x$ d4 U6 }1 n9 o% o! l3 ~9 |; D# s
{( O1 `6 f6 l' X3 Z
int fd;* L/ y+ n2 A4 j( g
int *mem = NULL;" e; }0 }5 S1 V/ v- ^0 F9 G
7 M5 {& h' N+ D) l' |" ]/ E2 T; F6 k9 ^
if((fd = open("/dev/mem", O_RDWR)) <0)
! C/ W# z! t9 ^" G( `$ z {
. \: \+ A# X" P6 u2 K$ I8 F perror("open error");6 }4 P& N. N9 K: P6 w4 c
return -1;
8 \( {4 O& \) b7 y }: c' H6 T/ |- o! d( f
. F4 Y, v; i( d0 y9 R/ K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; v) t, c# `8 f4 J, P& G9 p1 N
* L1 ?8 K5 D0 k' d while(1), b9 W% f- @0 K. c7 q
{4 I1 R+ c% o1 p) a. V' u
read_MSG_buffer(mem);
- Z& G* ?7 X6 H& C+ S }
% k4 n! R8 Q4 r# k! Z" Z9 X/ Q4 R1 }}& Y! V; ` G4 K* g
& ?) v/ w: c) R% Q, r/ yvoid read_MSG_buffer(int *baseaddr). m/ T$ ]% A9 {9 I
{
`" O- U1 p% `/ `$ R+ s- [! z pRX_MSG_PROTOCOL pshreRAM = NULL;2 ?, x& y4 h# N& ~% S! E/ L6 g% c
9 e& \9 D1 s, [% E& m+ ^
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ x2 Y/ x) {! K. c& `, ~9 F
0 I% \# A6 [6 A9 }+ V* F1 | if(pshreRAM->packet_cout != count_copy)2 Z1 d8 t L3 ^1 ?
{6 I2 ^( U2 a3 `) A
printf("a is %d\n", pshreRAM->a);. T4 r! j* D2 G6 ]( c3 m
printf("b is %d\n", pshreRAM->b);0 R) a* `) B* M8 z$ V
printf("count is %d\n", pshreRAM->packet_cout);1 U; B6 x- y+ d3 }0 X
count_copy = pshreRAM->packet_cout;2 m* i, n {. k6 c/ h. K/ Q
}
. o c6 ~/ W1 _ T9 l" }- @ H' w! x else9 v9 S+ S7 \* r2 T# O: F( a
{
R+ y& L$ P0 h( x: K* O( _ P printf("No effective message!\n");
3 r9 w$ b3 K h/ c$ c# L( C6 f' F }
" c# ^& X' p0 h- H; E/ z' G$ z ^}
, j) o; [$ N( R6 ~( Y( O$ X( k; C/ ?( F; ^+ k- c: l1 V+ i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 s$ Y! ~! t+ K# z- T- R) Z# }6 h4 B
; |4 j$ }# D! `7 p
! M/ x1 N. O7 V7 l" C) R3 S& D5 s3 V
|
|