|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 U8 h$ i0 {# i- p
/ S; {$ @( T# Z- a) n2 Y( ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 Z3 A0 P( N- O' f; ?
#include <unistd.h> E1 o6 \! J; v- _
#include <sys/mman.h>
. p2 ~( @% ? p#include <sys/types.h>
. \, x" k) R8 u) I#include <fcntl.h>
+ q6 F. x5 h! e T$ w" @
) a3 J' g; U& N5 ^6 f, {: r' N! ^#define SHAER_RAM_BASE_ADDR (0x80000000)
, B$ D- z4 Y" Y( P0 O
) b, I& W" k% p! N; Z' Z! b$ ytypedef struct
' R/ U6 t7 }! A r7 K/ I0 N{
: r: [; D+ g9 G% Y9 Q: i4 }* N unsigned int a;
( t3 D9 c; h3 v0 Z- @ unsigned int b;
4 j8 x9 W' i- m* g2 p unsigned int packet_cout;9 I! r0 ?* r8 h) j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 E8 I+ U1 G6 N B# \# @: u$ Y+ y7 I) w8 h0 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 V4 l n0 B1 l+ J% ?7 O5 Munsigned int count_copy = 0;
' y/ @) t6 U, h& d/ v1 |
! C3 f; l* q- n& n) {6 E
6 a! m, }. I! B5 b2 N$ nint main()
5 R6 n+ T0 O" @$ x/ G& n{7 k" i% s( x5 x- s5 J6 j
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 k X* C: N; ?( ]: V5 Z, h pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. M' r0 s; h$ }- G$ N
4 C2 a. u3 {1 n, z) {3 ~& G while(1)$ R+ T$ V0 m# o
{) l5 @$ A4 b. a+ z
read_MSG_buffer(pshreRAM);
3 k- B9 a7 n$ J3 s- j) `5 P6 j0 ]& \ }
$ k3 ~7 h5 d5 U) C4 t ^}$ q* W- C+ }0 `! c' T
$ J* ]( r" c$ \0 V0 b9 a" R5 M# J9 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ N0 t0 p- }! t$ e" X
{
2 G; U2 o8 Z8 e. Z RX_MSG_PROTOCOL buf;
# l2 \ |5 I# h) P0 d2 X- [; R
~* y- p% m: u# \ buf.a = pshreRAM->a;# x7 X1 P( q; L; C; n7 F
buf.b = pshreRAM->b;4 U* h: X+ u+ ?5 S2 a
buf.packet_cout = pshreRAM->packet_cout;) S% `0 S+ w$ M1 [! b5 \# ~0 b" O
: E' t s2 T! Z# n- f( H ?3 X" O
if(buf.packet_cout != count_copy)
0 L8 s) @( V; I0 g {0 T. ~ p. \$ t2 C9 C0 A
printf("a is %d\n", buf.a);
/ O6 S5 h/ [* m7 i8 S printf("b is %d\n", buf.b);9 P& x- Z F/ B/ n: u
printf("count is %d\n", buf.packet_cout);
) f0 _% G7 y7 ^* _+ a) E) @: d/ y7 i count_copy = buf.packet_cout;
( b( Q r6 E1 _ r& d1 R- E }9 x2 t, W' a+ _9 M1 F
else; k" g) b6 b8 I/ T& _
{9 ~0 h3 t, g% t! L
printf("No effective message!");: o1 d# ^. r$ i1 R
}
2 s7 m9 E0 F) L9 z}4 Q) [; U1 c; k$ R
9 @' w G& H6 |. x/ K4 V/ L
3 T) }5 n. X+ L- v/ x1 j0 i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# D" ~. U9 I2 @8 w; | S- }使用下面代码,对内存使用了mmap函数后:
- L& V5 m& b) x# G0 R& f' o; Y#include <stdio.h>- d$ [) K" p; X6 M& O6 \+ G
#include <unistd.h>& A$ Z" w z' k; t, j; v6 v
#include <sys/mman.h>
! u7 o5 ^) n6 V$ I/ C5 `#include <sys/types.h>+ W2 U" t$ o/ x/ i% m5 P
#include <fcntl.h>
/ R* ^- M1 g6 ^. I- \. W U% {- c1 K' A2 v# w/ E9 g) E
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 \' ?2 m7 Q0 u: `#define SHAER_RAM_SIZE (0x20000)
% k) k! [1 o& \3 m6 u
0 @- Q4 H) n( R! r/ qtypedef struct
- M! {' t9 J" J2 J, y2 C{
3 ]0 ^' P$ h i# Q unsigned int a;" {5 ~; ^* v+ `
unsigned int b;6 C' E; z# I# s$ H4 A4 {
unsigned int packet_cout;
/ g" k$ E& T) j p" v$ {' m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 G; Y# M! A- x8 w/ v
3 B: w# I+ k5 X1 B* {void read_MSG_buffer(int *baseaddr);
* Z" }" k/ ^, e- vunsigned int count_copy = 0;
) t& L) x4 w6 [$ [1 u& z T! k- Z+ }5 Q ?2 e9 w( S# A6 g8 H
int main()7 b7 \( _0 {7 t& z" h6 ]+ ~
{
% r8 I$ s$ J, I) Z# b int fd;
3 v7 {+ y( D; n* t9 L$ J int *mem = NULL;" P& L: V4 {- `5 T! S( Y/ }5 n7 m
3 t& n# y- x# j* `& y+ ^- d+ X
if((fd = open("/dev/mem", O_RDWR)) <0)
7 [' C' ?0 |( }1 F0 e1 B' r& G( p) V {
2 l6 }) V; j, v& n5 b/ X$ ` perror("open error");2 D, l/ R& |! J$ l
return -1;. }# _( B3 A2 H; c
}" }4 \0 i- B6 [9 {( y _, o
. e8 F" H4 t9 h
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 ~# X/ H% F7 x9 I. M' i; o4 \0 v: k3 q. A+ y/ K
while(1)
' S, V: Y" w6 ]# o5 ? {/ N5 }$ t8 {3 K4 b+ a
read_MSG_buffer(mem);
4 P" ~2 u1 f: T }
5 P5 W& V e+ C6 k}4 A( R1 [- E6 x! n9 L' s
1 M/ t& P: b) lvoid read_MSG_buffer(int *baseaddr)0 w7 S0 e) n- F8 z
{8 ?2 u$ s" k A
pRX_MSG_PROTOCOL pshreRAM = NULL;) R2 J4 ?) k4 \$ g/ H/ y
8 W$ \3 Y( a! T1 U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ l! v3 x9 a W; V
, q9 v7 e2 n% L" G8 [+ S if(pshreRAM->packet_cout != count_copy)
( h- @: G$ E9 ?9 ]8 z2 k {$ \; a5 Y# ~. Z D+ X/ r7 g; \
printf("a is %d\n", pshreRAM->a);) ?' m5 f% j8 | x
printf("b is %d\n", pshreRAM->b);
; X: A! ]! R2 I, q printf("count is %d\n", pshreRAM->packet_cout);
$ Q! p- V# p. ?' ^! I count_copy = pshreRAM->packet_cout;
) L6 ?/ u0 e. J$ I4 j }
5 d+ t# A) V* `& M o Y9 S" O& b else! x, q) C6 Y; @( D( ^$ I3 r
{% _7 T3 O+ K. I
printf("No effective message!\n");
9 F& N0 }! k% K* P( e5 J1 L }
6 R6 w- Z4 c" K. ?5 s}
- _$ W& w2 ^& t" q) L! g) Q
" A$ p' @# ]# C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" x; N( e. S! m
6 Q- c0 J: n9 z$ \6 _
; P: K- K2 z- ~7 u9 m: P3 ]- [( z
1 z) L8 F( `1 s! V |
|