|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : A' ^1 |: V! i- v, \, F
* d Q7 I/ w: p( @' n7 k( K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ Q! |- h3 m# q7 k
#include <unistd.h>, y1 @. |: L! p8 ^2 m# K3 t0 Z
#include <sys/mman.h>
9 y m# ]) x: C3 Y/ Y6 `& r" u7 n#include <sys/types.h>! [. c8 n$ e2 x. H% |; k* x
#include <fcntl.h>& w. F5 E0 q" g1 R7 f
( |' O I4 L# S3 j8 N
#define SHAER_RAM_BASE_ADDR (0x80000000)
, q4 K. O- o: I5 u
2 M1 v" G! n3 C4 ~ K( Otypedef struct# f$ d# U+ j( F
{
! X# ?: x: l$ L9 y! E% p+ `) s% { unsigned int a;
( Z% a2 `* W) `- i: |0 J, I unsigned int b;0 A# m3 }- ?( W( h) p8 E( u
unsigned int packet_cout;+ H8 Z3 R0 ^: A( Y0 ^4 h) D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 |* l$ v. Y; s. [- U5 [ ^. `2 H7 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 k3 z& g4 M Vunsigned int count_copy = 0;
+ V$ Q3 g+ S$ X" Y4 V+ j+ [3 \/ n7 s
I" _% U7 E0 j1 D9 V$ W8 N- ?6 w
! J# f4 \. I, {, U" Sint main()
2 p3 s3 \6 }0 u1 s{
- ~$ i! g6 }( O+ A1 u3 S, g pRX_MSG_PROTOCOL pshreRAM = NULL;& y/ P E, G# p. W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 T* B, r3 Y+ \; q- m
" g8 Z( c$ T3 B4 T1 o% P( L while(1)2 K; U1 m1 u; R
{
/ H& ?3 r8 v" E7 f0 H read_MSG_buffer(pshreRAM);' q6 D3 c Q+ o3 A" F+ `# h
}
8 [- d+ F( f4 Z5 Z1 z}
9 o; o8 [9 o! P0 y j7 U/ l6 p$ O# U7 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) S( X& B9 _" m& f. T
{
3 R0 Q9 n5 J- ~( t2 `( b& N) e+ E2 p RX_MSG_PROTOCOL buf;
) A( W5 j& m" d: Y9 | 8 o. S3 C, g1 q" u) O7 x6 Y7 M
buf.a = pshreRAM->a;
4 u: g2 t& \0 [* G) r" {8 Z buf.b = pshreRAM->b;
" @2 H. Y. U4 L8 o buf.packet_cout = pshreRAM->packet_cout;. M! q' G d( Q/ t
% H$ K0 j6 }- P, r+ }6 [1 W
if(buf.packet_cout != count_copy)
# |( p$ G! Z$ c5 d {
8 o" t0 |$ |0 h/ ~( n) b* E printf("a is %d\n", buf.a);5 k3 R/ `: l; B0 ~4 F# r8 H
printf("b is %d\n", buf.b);
2 v6 q0 q, B! C( `+ p ] printf("count is %d\n", buf.packet_cout);) |% j8 v9 A. [/ C- q D2 F) D+ g
count_copy = buf.packet_cout;
; t+ f6 g' Z2 r) y( v- ` }
2 M& P8 l7 y+ U4 a' | else
% Y* q7 b0 X; W9 O2 f1 j {
; O6 R" r1 L4 g printf("No effective message!");& s8 d: R! B: a7 R( ^& o
}
- X& ~5 H4 E9 L6 j: k}/ U8 @8 n1 W* O6 J5 ~( f# ]1 z
5 r/ y4 C( | o7 p0 }' P$ u7 e. Q( i& y% n( c2 M, ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 w8 t, c- T" X- w2 b
使用下面代码,对内存使用了mmap函数后:5 m6 W" ~( x: ^9 j$ h1 U4 Y; ~
#include <stdio.h>2 J& S7 l* r. X' p4 U/ s$ e. H
#include <unistd.h>1 o [' {! q8 b. ~% {7 I2 r
#include <sys/mman.h>2 H* C! W( r8 a2 W& ~
#include <sys/types.h># j( _0 }: {% d( B
#include <fcntl.h>& Y7 I+ ]& @6 G. U$ d! }
( h1 A% _2 s1 Z* w, X, s! v/ E
#define SHAER_RAM_BASE_ADDR (0x80000000)
- l0 R" K6 X4 U: Z: K#define SHAER_RAM_SIZE (0x20000)
% V0 I) [2 G& P& V2 a
% _/ M8 i9 t" g1 T' Otypedef struct
! o2 t7 F" a$ Z{
% Y. h- ^; T R, N, e; F4 T0 Z unsigned int a;, z, \ c2 d7 E: b! _
unsigned int b;
( J; k0 L- f3 @' n! i. c- f unsigned int packet_cout;% T) V' K$ N& g' J' p! s" C. W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& p( Q) o3 o: m% l
/ T$ R% s8 q, }3 S1 X/ e7 x! T
void read_MSG_buffer(int *baseaddr);, M3 A {: j" S5 g$ y3 [
unsigned int count_copy = 0;8 C+ d( M/ i+ {3 j
3 l" |; @% r% ]; C: C: \1 z' Y( P
int main()* L5 f8 K" {) s6 K3 z
{ [0 i- L& a% W" N# u9 @, h
int fd;
; p5 I) x; [- U4 P8 f0 D int *mem = NULL;1 J( c- S5 u5 U1 {+ Y' [7 C
0 \) U. l/ j/ l- P+ o1 b; H
if((fd = open("/dev/mem", O_RDWR)) <0)4 j8 Y+ M2 \$ V% P$ D
{
& I: W' t# p% _! @+ D( J perror("open error");
8 c$ J* d' w: Y# S. A return -1;7 ]( f" }8 L! E2 Y
}
7 r. O" ?! o8 j$ W: |5 ~ # D4 u' G5 ^# `. D0 ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* z/ r0 E; L8 w" J% I( @0 W6 R$ l6 m! v, k& G) _4 g2 Y
while(1)6 I+ a( G. v% F Z" D* E# k% ^( `$ c
{
. X8 v" b: f5 f% ]9 S read_MSG_buffer(mem);
9 F) ~5 ~# Q3 Y } " b6 z7 ]: j4 t! m7 L1 p! g$ O
}8 L) E/ K# [, ]8 b
6 Y( u# y" p& ^; E- c" ? u; Q3 Qvoid read_MSG_buffer(int *baseaddr)
2 f) q) ^) Z2 j4 H# y) g+ U{
% ~5 J/ x3 J& B. n1 M% G: Z pRX_MSG_PROTOCOL pshreRAM = NULL;# S, b" J- E( p7 Z
" U# p, _6 t& R* | pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ y; a0 w; H) j. g3 p
- F5 N1 R2 e1 p5 u' j
if(pshreRAM->packet_cout != count_copy)6 U+ ]4 @$ T$ B$ V8 `% u* c
{: b- G: ~ {7 K4 v/ [9 \
printf("a is %d\n", pshreRAM->a);
5 \) D6 i& K+ W printf("b is %d\n", pshreRAM->b);
5 f0 v, @9 T/ j; K6 t8 { printf("count is %d\n", pshreRAM->packet_cout);
) Q3 J! j3 q' ]+ s0 J. Q! A count_copy = pshreRAM->packet_cout;$ o( D: z, l" s6 ?; j& }2 d& [. q( b
}
4 E& H7 y: ` a/ s3 o ^ else
# Z( ~& S! s. W- u7 F4 X" s {
B0 z& y5 x, ~$ E/ F printf("No effective message!\n");
6 `5 n2 w. S) f }
9 D# ]' [1 P# c9 q3 N9 T}6 p2 t! i5 V3 z
) _, T0 K! W! {' I: R% V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. o" z/ |3 e# ?6 `" q/ G* r2 o
( r" O, h0 s, h6 _
: R0 {: q$ f% j) C# f" n
( i D0 d+ w' P
' w- ~5 t4 Z% e/ W2 ~4 b% i |
|