|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & o/ }% x1 T' n) G ?& m
5 o/ ~- L- o' R# V1 w$ o) `% U4 P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 T7 a+ X+ }1 F3 H& Y/ g9 Y
#include <unistd.h>
; o! x/ P# s( i0 {; Z- k#include <sys/mman.h>
. Z4 p: b( ?* J. ~#include <sys/types.h>
: C+ i1 z& f( @7 ^& h* v# j P#include <fcntl.h>% i& o8 K. U y: m- S. o
" g" N1 ?: E; a* I! \) b: p
#define SHAER_RAM_BASE_ADDR (0x80000000) ?8 T, I3 q% x! B! |6 k' G7 H/ H! J
. v% X$ ]& \7 S J* _
typedef struct4 L4 j3 T- V8 c$ F
{
; e* o x$ \/ b. @6 Q: Z+ X% A1 N. o unsigned int a;& j) {# ^# }5 {+ E. q
unsigned int b;9 k0 J3 U6 S0 e% ]% V7 L# T" B9 Y
unsigned int packet_cout;
( x2 K) i; {" D* @ g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 ]' K" ?% F2 ]3 X
& I2 s% N' {6 J3 @- o \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ L3 v1 u/ u3 a
unsigned int count_copy = 0;" h J6 V3 N! C% K9 T
6 ]( N% G1 A6 H' x2 F( R Z X
4 X' \ F1 s: E- x- M/ xint main()
9 w( e/ ~$ r$ C; A{
( ?# ]0 e' V% K- y- a" } pRX_MSG_PROTOCOL pshreRAM = NULL;
' e# _4 O" C& o pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* E3 C- j7 w9 Q6 ?
+ f2 w! O/ p5 d: l# V7 [# K: n/ x! X while(1). b4 k5 [* c" C, H3 E! |
{3 U* j3 C; ?1 K% }
read_MSG_buffer(pshreRAM);
; w* r- [" i' r } # a% g4 D. y7 r' G: u/ [, b
}3 L3 f; e/ Q5 r* C. p
7 U+ J: m# z4 I* K4 P# ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ Q' R- o7 l, \' u' p# m{3 K+ d7 L Z4 h7 x! F9 j4 r
RX_MSG_PROTOCOL buf;' `8 x0 r1 t7 M" ~0 A/ [' L
6 i' L& W5 @0 K2 Y1 r: X9 n buf.a = pshreRAM->a;8 w. x" e$ f I: Q
buf.b = pshreRAM->b;$ Q" Y0 l- S0 S& ^
buf.packet_cout = pshreRAM->packet_cout;4 X" R6 R2 w0 G' `1 A$ r
6 D+ c* s; {& y2 l' Z( S, W6 ~7 p' H
if(buf.packet_cout != count_copy)
! k8 w5 ~' F D3 m; e7 w0 E2 d {! Y' m" k$ ~: [3 b
printf("a is %d\n", buf.a);/ `0 E4 S. i" L- s: y
printf("b is %d\n", buf.b);
0 J6 c: _: i; Q printf("count is %d\n", buf.packet_cout);6 L- i, _3 @- w9 H, Q; G3 C
count_copy = buf.packet_cout;" N6 g/ t7 a" C/ e9 Y
}+ L# j5 |( H1 [. S# S- g6 s6 J
else" l& S7 ]0 [ q Z2 }2 P4 q1 S& c
{* m0 G: e& u2 {0 ]
printf("No effective message!");
3 e6 w. F, b' P+ M- ` }4 l6 y# M2 R; W' d8 L5 w0 f4 ^ l' s7 S6 r
}1 Z$ k# d1 a& ~( U0 X( V
& D/ ]0 U6 o7 _9 G7 b( L1 B, y8 i+ p1 K/ n. j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 P/ A0 w% q3 h( l
使用下面代码,对内存使用了mmap函数后:& g6 K% r; v3 ^
#include <stdio.h>
6 |+ [. a8 b3 t! S$ L#include <unistd.h>
$ B: D# q9 G3 m) j/ h q#include <sys/mman.h>
m8 u( D1 j: {1 U2 X! r#include <sys/types.h>, y Z6 v5 c8 A$ V1 W0 \8 A
#include <fcntl.h>
. A7 v7 h5 i0 F: v6 Z; v! Q v2 X8 g) ?, k" c
#define SHAER_RAM_BASE_ADDR (0x80000000)8 H/ w& Z: F* T. l+ H, j* W+ V" E( q, K
#define SHAER_RAM_SIZE (0x20000) 7 t0 D1 Y0 w+ Y" i0 }& \5 e
$ B4 |$ Z7 y" z+ k
typedef struct
" t; [# N" s* g) ~{1 G1 R9 E' N% Z" H$ o* ^* {; X
unsigned int a;
9 E9 d1 A5 O2 w- ^! Y unsigned int b;# p6 ?& }% O" v3 D# m& ^$ H# _
unsigned int packet_cout;
/ |" B+ L; D: A5 W/ ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 h& Y7 U( S4 M# J! A7 i
$ b' W) Y! g/ x. X1 @6 s& pvoid read_MSG_buffer(int *baseaddr);- H7 Y6 Z. S$ t3 N% h1 I: x6 F' r1 O3 O
unsigned int count_copy = 0;
( u( _& b6 P5 A) X6 _$ b" R6 O
; z0 x( j3 l% gint main()9 h) d0 ]- p0 ?6 R+ ?' i
{. I' G, V! x- q8 k' k
int fd;
+ i7 V( S+ [6 A# |& |: g- R2 T int *mem = NULL; V7 L% z) ?9 {. {; f
& T' v f& l4 \7 Q1 T! y: H
if((fd = open("/dev/mem", O_RDWR)) <0)3 u1 S( E. y) _0 B% {
{
1 y% w% w5 {, d) W! I5 F Y, `9 G: F perror("open error");
1 G: z# |; {. R; K9 G- T% g return -1;) y+ b9 @: T* d( C5 J. t
}: @2 z) p0 T1 {
7 P& J. j9 W) w! [( J2 w; x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 y2 t* `# C" d2 v0 z
" N6 p, ]+ ]7 _6 A0 \; Q
while(1)! k0 O6 ^- {/ z" a1 Q
{/ Q9 J" x# C6 E: O9 _+ ]
read_MSG_buffer(mem);
+ B: @2 m' U7 ^, i }
m9 l" K/ k' u}9 M9 c6 N% c9 g: y) K2 A
- R# }& i" f( U3 Svoid read_MSG_buffer(int *baseaddr)
# x& Y8 c |) W( o4 X( o* a{
6 @) q- b7 `& y, l( c, k! B8 E pRX_MSG_PROTOCOL pshreRAM = NULL;
+ d- s+ a, {9 F% j+ V8 ~+ p1 i& V/ K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 z/ R. Y0 T3 W8 j) n) w: H( W6 C0 w. X- u4 j5 t
if(pshreRAM->packet_cout != count_copy)4 S, U! W/ ]; v/ t/ F
{
z# E& E, `( n6 _5 I: R printf("a is %d\n", pshreRAM->a);
* {1 Y- _4 N/ S; R8 ? printf("b is %d\n", pshreRAM->b);; l2 G) s# w5 V
printf("count is %d\n", pshreRAM->packet_cout);+ G# k! `# T& u$ H9 y
count_copy = pshreRAM->packet_cout;
5 u/ d4 [- d: L( V& \ }
2 C" J" o- V, i* c8 h9 A4 ~, ` else
E6 W9 ^- i' l9 T$ T, ?: u {
/ \6 i' Y, b2 w( M" m K printf("No effective message!\n");9 h6 Q8 o5 M5 d2 f# n
}( w8 I. ~5 R4 h9 b! X8 W
}' n9 C2 l7 I# H6 V5 U! k% Y
: j0 V# ]6 V0 p. n" b; }$ U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- n) T5 Q v3 m
- [7 W$ W9 M) k3 I& d$ Y
: {; G, E& M( j3 p, K- v8 ?" D: J8 v
/ o* H* G& ?) ?8 b) P8 c P; Q) H) Q
! D5 f% Y; W' l |
|