|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : J, N4 @5 Q9 g" Z8 R6 r
" i1 e/ N' I" \8 T; x: ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- J" m2 K3 p/ m6 o3 }
#include <unistd.h>
$ f+ w) L& W& u) ]6 L5 Z#include <sys/mman.h>' o0 B D8 R% K! z0 z
#include <sys/types.h>( V+ |+ l! Q* d5 I$ x, G
#include <fcntl.h>9 o; F' N( D# b2 w* [9 L+ i1 O
" b& L! X: |, g% V0 }6 {4 c5 r$ T
#define SHAER_RAM_BASE_ADDR (0x80000000) / j7 R) H4 b# L3 O# F3 T" Q
2 J T( v1 U6 |typedef struct
1 y; ?( f, B- C$ B( Y$ u{
* L. p! B3 b1 A+ @& W unsigned int a;1 c* `3 o1 r5 R" n7 a
unsigned int b;
- R( P5 D- Q i" _% Z1 q unsigned int packet_cout;0 R2 _. W5 ]" y) J, t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) W6 s2 y) _ S* l3 h1 V
7 {% y8 J% Q/ C- R; |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% R, N; |' |, B" i: ]unsigned int count_copy = 0;' I h. r7 m) B0 p) ?( j
- a& H: }& v5 F
- y0 [5 h$ b4 X( r8 a0 Pint main()& ^9 `% A* N& G. j/ h
{. }+ y& U4 _) W( q4 s% N
pRX_MSG_PROTOCOL pshreRAM = NULL;5 f' U4 f# \8 P' v# U/ e. u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' `1 x+ C: d# k5 ? M1 A: f5 l* a
/ M' k5 k* q( S1 f% t
while(1)
3 T6 w; B$ I! l/ i# f6 U {
, x* a: T$ s5 K$ [, G9 ?7 ] read_MSG_buffer(pshreRAM);8 Y7 i( s8 a6 K8 d% V
} 4 v% X9 }' u6 q4 U% T
}
1 q' j) ?1 I- x( ]7 N S0 u$ U; s% T" O# Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' c1 |( M2 G3 R, Z5 u
{
& B* U1 f8 x3 \+ g8 P) n0 h RX_MSG_PROTOCOL buf;
4 P( B2 Z0 o! y/ r/ W6 ^5 Y$ s
, X& U/ \0 X; _2 r) I buf.a = pshreRAM->a;# i) T- J1 ]1 w. ^+ G0 Z( M
buf.b = pshreRAM->b;+ D; F* {+ O+ e5 o9 d0 _" g
buf.packet_cout = pshreRAM->packet_cout;* w/ n" w: Q& ]7 ^% z9 U/ [
D+ n& n+ e( N# `6 J$ o6 ?4 z! F
if(buf.packet_cout != count_copy)) V! g4 U" W" \) m N
{
6 Y* z8 X4 p7 P! X printf("a is %d\n", buf.a);. M5 ^5 G1 ]5 l, ?
printf("b is %d\n", buf.b);3 R" t0 _! D5 Q4 X+ l! X
printf("count is %d\n", buf.packet_cout);
# Z* J* s" \& G. ]4 i4 U# B count_copy = buf.packet_cout;
2 G1 ]+ Y( V5 t9 Z/ Q }
0 v6 t$ ~6 v4 l4 H9 M else
8 |9 b3 ~" c9 e7 M8 t" S/ u {3 {- ]4 `. J# g
printf("No effective message!");
: i! \( p- R9 i9 \7 } }2 R) k# s/ z5 I
}
+ O2 B/ H) ~, f4 n/ {7 W5 i9 S; d$ @
1 f8 \* g) G; r! \6 [. d4 }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 k/ X4 x6 N- r2 A
使用下面代码,对内存使用了mmap函数后:
$ g8 \! s1 [& P7 u4 }" k' I- j#include <stdio.h>8 v. ~: Z j$ o( H- b. t5 q( I. e1 W
#include <unistd.h>
0 N+ {8 m+ R3 p: P3 a#include <sys/mman.h>2 T( d2 t. }" }# ]5 ?" f7 q3 B0 S
#include <sys/types.h>2 s5 D/ e, {/ h
#include <fcntl.h>4 @: q: s2 F5 X6 n8 j, z
. B. O4 e7 n4 U! w
#define SHAER_RAM_BASE_ADDR (0x80000000)# |, j; W1 a$ g, u) s; h
#define SHAER_RAM_SIZE (0x20000) ( u8 e8 q/ h! p+ |
9 s& U# p/ u$ d8 @typedef struct3 ? D5 y5 I! W
{
8 {% ?7 ?# \* h8 L+ D& y# q- \# e unsigned int a;, q* G3 ^9 H" o0 u* z8 V( N
unsigned int b;& ?) Y3 D) O0 ~
unsigned int packet_cout;
# N- ?. S% w1 s: \* L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 W+ N0 S+ A# k. w1 l1 G5 a" u, e
2 L- }; c/ T2 \% d) T
void read_MSG_buffer(int *baseaddr);- Q% V/ e: I6 T& B$ f/ o
unsigned int count_copy = 0;
, T5 B. g- _" e) \7 t
6 f+ F' H$ }5 ?% v+ p5 Mint main() E! f5 i' g2 K" @2 T# x
{
% N# b: r8 ?6 J" p- H int fd;% N& x3 ~* v1 S" l
int *mem = NULL;; W/ Y/ }' K4 U# b7 [ p
* Z' K/ Z8 s3 u3 s) j6 B. m if((fd = open("/dev/mem", O_RDWR)) <0)9 a: v/ x7 d: f& f% G
{4 _" J& [/ [8 g0 ~
perror("open error");3 j5 ?1 S; j! o$ H- E. I
return -1;/ G1 h+ x D2 s- X" y
}
* `- S) s: m+ @$ X, |, w - c8 F0 Q- _: ?2 i% \; v5 d( x3 |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; }) c/ Z# f. b- i7 |" z; E g6 R1 L: R) \2 a: U& X
while(1)
( }9 S7 Q7 F4 u; V6 w. c {
) s; @* l- A6 l! H/ ^, G read_MSG_buffer(mem);
" x. @- N# M$ d* A; e& x h& } }
; t$ [5 x4 E/ w}! Z% r4 u% @2 ]; N9 v
- ^& `& q5 q! N. L: g/ K- F# h
void read_MSG_buffer(int *baseaddr)
J! q6 P5 t E1 H{
0 E4 ~2 E+ r8 N) O& X pRX_MSG_PROTOCOL pshreRAM = NULL;
$ Z, H. j- l9 ~5 b
4 \( N* W3 [. |$ d8 I! |' H& ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 M" @8 F+ j, ?# q* m
% o5 ~7 Y% W# Q6 g# r; X if(pshreRAM->packet_cout != count_copy)
# ^( V( J6 s1 c7 [3 |0 Z5 U z/ q. q {# S0 W3 Y& A8 S- Z8 c
printf("a is %d\n", pshreRAM->a);
4 E1 ?/ A: g; v+ `% ^ printf("b is %d\n", pshreRAM->b);
! e+ S4 t0 g8 |2 C" J printf("count is %d\n", pshreRAM->packet_cout);" \$ Z2 w: f3 O2 U- N U
count_copy = pshreRAM->packet_cout;
$ @8 r# M/ v2 n/ H }
) q% k8 r$ T7 U7 n u" r else
: G9 N8 `5 i+ U' r1 w {
; C x, F/ U# e$ s) ] printf("No effective message!\n");
0 I9 i! f, x/ @' e/ L7 W } t$ e9 b; |5 u- x
}
8 y, ]' ?6 e" Z. H9 ~2 A4 f1 `3 \- i- {$ B5 h! a8 e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 S* ?3 j+ W0 e* {) ~% C. H
4 g+ b- G' V( n5 v! a
f; |/ j0 }: \% p; J5 L
3 Q; L, y3 W/ j
" R; ^4 y. I3 U% H1 v$ G |
|