|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ ?; P% E4 V* J4 N8 E3 r
4 g9 l- E& I8 FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) X' ^" b1 V" l% n! x* _% \" b#include <unistd.h>
7 c6 I3 e) Y3 }#include <sys/mman.h>
4 a! _9 s( M# l+ u9 _" `, V, N#include <sys/types.h>
0 c1 ~$ f4 T' i, F) r, C+ q#include <fcntl.h>
3 [7 w8 x! Z( ^8 x; a9 B0 D: L+ F9 k, r+ G- O }0 R7 R
#define SHAER_RAM_BASE_ADDR (0x80000000)
! h, K7 U" U: G7 S+ V# I& i
/ L5 @- G( V. R& h8 Ltypedef struct( c# t8 L6 C" s7 c4 k/ i
{
6 W; ]0 D/ M+ ^& y2 i% m/ D unsigned int a;
; Q* N! v* x& R' y) a. a unsigned int b;6 a i/ Y( o% H
unsigned int packet_cout;; t6 w/ q& ~5 {& \! R. X! t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* Z3 l7 Q5 k! \0 }8 H5 [2 V% {* @, k. I( G/ R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( G/ h! t3 x& v/ H g! L7 }7 @- \
unsigned int count_copy = 0;1 U: F; M Y& Z
' ^! |5 M6 j3 y! K8 Y) y
, I) G* o! D( R8 U( ]& uint main()
! V% t) w5 c: B+ q2 I{
0 G+ E8 o, \: m, R e. D, M: n' S pRX_MSG_PROTOCOL pshreRAM = NULL;
7 w8 M- [" H @" R0 ] pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' r0 a% R. L4 Z Y4 n
8 ^' E, I- F, N' i1 U5 _) B3 M
while(1)
/ r. r9 \ y6 k2 v. E$ I {) e# R4 P' I5 X+ w+ L( E5 Y0 Y
read_MSG_buffer(pshreRAM);$ o- Q6 I2 s D1 A1 o
} " t; r9 F4 B8 d/ V& k1 W( y
}
6 m+ |5 I( ~7 W: a1 `, M
1 Y- `# |9 @7 D# G; pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) q$ C/ N Y7 a% l% f/ a
{! L4 J4 [. A# Q& y
RX_MSG_PROTOCOL buf;
9 ?) E/ j5 p1 b/ G & _7 Z+ n# I& j$ r0 T7 H* Q/ ]# T# ?
buf.a = pshreRAM->a;
8 h) ?4 E3 T9 f) i G6 G buf.b = pshreRAM->b;
2 z$ z3 H/ }; l, `, d buf.packet_cout = pshreRAM->packet_cout;7 l R0 b7 B1 R8 j n# B
# U" C! a( B- c! z/ o if(buf.packet_cout != count_copy)
9 N* J( l* W( z1 |( _ {9 g9 b3 w' W$ N0 o; Q" O. R: S, M }7 J' L
printf("a is %d\n", buf.a);
4 e7 b" R% y0 k6 N+ d printf("b is %d\n", buf.b);' C/ i: ^! P) }; _# r
printf("count is %d\n", buf.packet_cout); |" I8 u7 S8 Z1 s$ U
count_copy = buf.packet_cout;! r, B# B5 V7 W/ V& I
}
7 O% q3 }. d0 O# S else5 ^1 L( Z. t/ G2 E# l# f
{+ m9 Z& E9 \1 r% W9 S
printf("No effective message!");
4 Q# `& g( i$ j8 Q# v& \ }
" V1 N) J% g3 e$ S" Y}' }$ D6 l. f5 x/ K
8 ^/ T% U+ @1 g2 A
/ R! ]3 G* J q2 f" N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 G+ V# |; u% l
使用下面代码,对内存使用了mmap函数后:
, z6 @' k! K* Y2 A#include <stdio.h>
5 v2 c4 m, s8 A! k; ^) T#include <unistd.h># | Z4 q9 a. a8 X% l6 {/ A& s, i
#include <sys/mman.h># i/ _% s0 w3 q. _3 w/ J, C
#include <sys/types.h>
( J- F9 t( S* u( b#include <fcntl.h>
! Z; p0 k K! A5 Y5 v( k% \; A% E; g' U
#define SHAER_RAM_BASE_ADDR (0x80000000)) @6 f% v5 H/ o
#define SHAER_RAM_SIZE (0x20000) 0 ]8 n: n+ E/ K$ f6 j7 C
& k/ S% R2 e$ y. @typedef struct
5 T1 X% s1 y! f+ W{/ A2 P. w( D' V. E9 s/ [
unsigned int a;, l, X$ Q$ c. G
unsigned int b;
) }7 k8 X+ |2 M, E9 k" |+ G unsigned int packet_cout;
, Z! b9 [6 I! h/ X. a% `. Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; U X6 m ^( f, [9 p
4 {) P. P9 Y+ _, gvoid read_MSG_buffer(int *baseaddr);
% e- n5 f: L. S2 c: \unsigned int count_copy = 0;
& t P. D* H4 I: F4 h6 ^" d# F# b; _; B$ L+ @
int main()
3 Z: u& Y5 w! r" u# i% F{
) |2 h# q3 W% Q5 ~! a% M' s- K1 J int fd;: b, p8 t J6 S+ L% B: o
int *mem = NULL;4 m2 m# A4 E! q% s: i% f3 Q8 z
( B% V {* E e+ U2 L: @8 T; l if((fd = open("/dev/mem", O_RDWR)) <0), M: X: r/ ?( m3 a9 s
{
9 ]% A. |( c+ B$ | perror("open error");! U1 Z3 x8 }4 |4 p
return -1;
+ I+ _$ B* K% _# U1 C' O' O" A7 w }
' W- |0 c' e6 G ( ^ ]" [, U& b( |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 P5 s2 U9 L; O; J7 A' P1 [9 X1 v2 b; h6 h; e, a" u# l
while(1)" `) v) A" i/ I/ [0 _' ` q, h
{
; f: X$ v; S7 S; ^$ Q) D$ o# [ read_MSG_buffer(mem);
+ n4 X2 F) f' L- u8 r% p }
( L' Q/ M+ |) i5 T' b5 q/ O}: ], R4 }# a' R. u
7 W# \* i/ Y t) F% q$ Nvoid read_MSG_buffer(int *baseaddr)+ `, i6 @) r" l% x& y8 m
{
9 ~9 z1 }# x$ V/ y K: r: f pRX_MSG_PROTOCOL pshreRAM = NULL;
- b/ |/ z7 F) J" ?2 q( Q, ?# h, T4 I3 i1 p9 b4 o: ?6 N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 M: [0 V* t9 h" ]1 H1 W+ T
/ V* I# o; e/ K, F) h0 r5 x if(pshreRAM->packet_cout != count_copy)
' p4 y" @: f0 [) w! U {6 H3 F2 e! s: a7 q1 w8 h
printf("a is %d\n", pshreRAM->a);1 U0 U: Q0 L+ i
printf("b is %d\n", pshreRAM->b);
" m" C8 n: f( e& f J) s% I printf("count is %d\n", pshreRAM->packet_cout);
9 l- R0 o/ _" D$ ?# L6 a* | count_copy = pshreRAM->packet_cout;
' `$ e$ t0 B4 Z. p' f4 h% }/ ~ }6 S% w8 v2 j3 r' a, I: v' o
else( E9 j: |- ~8 m2 V2 }2 b2 F6 F; u' M$ J
{
$ v& ~6 h3 G' ] printf("No effective message!\n");+ n$ [8 T" u: Z$ n. b/ k
}3 B3 H2 k4 F7 ]( q
}
! _2 T3 s1 X) o$ ~" e2 }, t- u* o. K) {/ g: ~6 Z! K" Q3 J3 ?0 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& J; F# F, k# a7 i$ z/ I- F% ]. N: u2 o0 p
7 E+ e( t3 D% ]
8 V% t9 v, I0 |3 F* l3 m* V/ s8 ` D: t- ?; p
|
|