|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 t5 S0 Q% f, K: l+ Y" H
) H; u7 I# P& x0 QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 x% y, v; F* {. W
#include <unistd.h>/ M0 A3 m6 K* N, }2 Y
#include <sys/mman.h>7 e- z$ P6 Z9 K% j6 y
#include <sys/types.h>7 b L( q( _# I. c* Q u) V
#include <fcntl.h># i8 y, f* [2 m9 u$ @& \
' W/ y0 i) L+ t: A#define SHAER_RAM_BASE_ADDR (0x80000000)
7 ]% ~5 F% t( e O# R0 s& e
5 l+ ]0 C4 P4 N# t5 b( Ttypedef struct
( ~. }* E9 g' Y1 T W{
- O' K* E( m$ d; X4 n. p unsigned int a;+ J6 k K: ]! ~: d8 i+ [
unsigned int b;
4 ? P( [+ G) H8 Q4 W1 N5 C* A unsigned int packet_cout;& V: E) K# E4 L% z+ ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 j3 j' \# z2 }$ D! h7 U7 K1 W/ @9 ?, T* \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, x7 p' x$ I5 R- S. B5 }0 |unsigned int count_copy = 0;
9 v0 j9 f0 X/ V. f5 J [% y C* a3 J. S* q
# O: I# E! ]; ~int main()
: I/ D( {6 J: r. N, `{8 U6 k9 W5 \2 h/ ]9 _
pRX_MSG_PROTOCOL pshreRAM = NULL;
* o- w/ h! c: G1 J. R a pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. C/ _3 Y) M$ S0 I. h
) C2 }, e) B; {+ r/ ^$ G) [
while(1)
! f5 y2 F. F! L5 Y {
. p" ]- X3 l5 o/ X" S8 K read_MSG_buffer(pshreRAM);
# z; ? b* g( I9 g7 x }
( B9 N9 l! l, N; N2 D1 i}
# L+ s- @; Y- F9 ]7 ]. c; U( w- d
+ F; v/ p. A0 B+ qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 t! N! U1 T' A' b# O! X
{
0 s/ x s2 F8 P$ Y1 ]' }- k2 P Q5 w1 n RX_MSG_PROTOCOL buf;
4 u6 ~6 j% u. U V, D0 Z5 }3 Q
# ?0 b# ^0 P4 D( M4 ?& P buf.a = pshreRAM->a;
0 w7 t. ~! M/ S3 e' B, N0 q buf.b = pshreRAM->b;
" u6 @ r9 k8 i8 _3 W' l0 Q A( @2 K buf.packet_cout = pshreRAM->packet_cout;, |, K4 U; t9 C
0 n7 J: o/ d% G( R9 w; T1 i
if(buf.packet_cout != count_copy)% w8 `" K1 G8 l; @/ o
{: K, W" p6 q, T' n4 n8 }1 L9 i
printf("a is %d\n", buf.a);
' s( m% h; W3 z; X# H# F printf("b is %d\n", buf.b);- [& X0 ]' g3 D; d) J5 U/ t+ l
printf("count is %d\n", buf.packet_cout);# ?8 A, ~( Y+ Y" R# U" ~+ A
count_copy = buf.packet_cout;3 m3 X+ |' ]6 g/ Q) f- F* s
}- m" {$ R. A( z, R8 X+ s
else
/ G, z8 |/ E( j0 Y3 ?" G( v8 u7 B {
9 d& M* l, C( R+ u printf("No effective message!");
: X/ p% e! _2 d }& }( O/ [! h" w _8 S+ r
}
3 l5 S: ~, g& a$ Y8 O
9 B2 P$ X- H! F1 d3 i. [1 Z; |, q) L- |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 B, T8 r7 r. y! ^3 n7 ^( X5 H$ X& w7 C
使用下面代码,对内存使用了mmap函数后:: W, P2 q/ G' C* s
#include <stdio.h>+ |- E3 X: h& j7 u: l. z: ^' d
#include <unistd.h> v* C8 ?9 Q# U8 P8 v
#include <sys/mman.h>
9 ^* m: `0 _) U" q. O6 [#include <sys/types.h>
7 z* ?% ?5 p( L/ l; B8 |#include <fcntl.h>
5 |$ B+ q9 J4 _; a( k! e* ~* v2 K) H7 w9 {
#define SHAER_RAM_BASE_ADDR (0x80000000)8 t( [/ y: W3 A! ~$ G8 L; w
#define SHAER_RAM_SIZE (0x20000) . U8 S% L, T' i/ ]$ ] I% t* w7 t) X
! F6 |0 [1 |& m1 |9 v1 \( utypedef struct
; E" H( I6 O+ E( z% r{3 g8 M1 K: a. J" i+ S% J" ?/ p
unsigned int a;5 A; Z2 w5 S9 v
unsigned int b;0 G- r& W0 }/ a
unsigned int packet_cout;! l( p5 Q) s: y% A4 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 t% O# w' ~! X3 L; ?. F
8 r+ z" S3 \. b8 a* j, p+ s5 p1 ~* _void read_MSG_buffer(int *baseaddr);! k( O2 u9 \9 [
unsigned int count_copy = 0;& r6 n S0 {) N
6 S W/ q+ I4 e4 s g1 {/ ]6 h4 B
int main()" X' s8 O& W- T8 w. c. a W
{( M8 `3 f% K* ^, v3 X. Z$ u1 A' ~
int fd;
) A6 c5 o# ^& n' f/ U) p5 f int *mem = NULL;3 j! B7 \# g+ Z2 t; p' p2 \, o
* J) r' N n. v$ h3 F
if((fd = open("/dev/mem", O_RDWR)) <0)' S0 ?0 ^2 [" v' a
{! q) u6 O; _7 W3 C4 z, x
perror("open error");
3 C/ a' x& _" u- K. C& O# ` return -1;
+ U( b1 Z+ J) X0 q0 u }
5 z1 F6 u; m, F7 h% `& y/ {' @( T
' s* G0 \3 X6 c( K* C; w& G4 M2 _ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* \8 x9 f7 M- C
: s- x: R9 J+ K$ p1 ^
while(1)
" e" j$ m) q8 V; o# C {
# D) P! R6 ]" u( [- z read_MSG_buffer(mem);3 I0 E7 y/ Q! J* h% z
}
8 M/ V+ \8 K; S: O}9 m3 O; _) K7 O6 S; H* _
4 ~; s$ q2 y' }6 U+ M/ lvoid read_MSG_buffer(int *baseaddr)- b1 r0 ?, ]/ Q9 d9 r1 t/ C4 k
{
0 f3 }5 J) M6 `8 B. ?( g- s pRX_MSG_PROTOCOL pshreRAM = NULL;
6 R2 n6 V# ], o* j
5 V! o* S7 Q' R pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- z8 n7 x# R, I, @- ]! ~# v- Z; }
5 z! H" E( V* ]2 J0 y" B! K
if(pshreRAM->packet_cout != count_copy)
6 b1 G/ P7 A( y% ^& G: G {
# d! x; }/ a2 g( o- u8 Y9 \ printf("a is %d\n", pshreRAM->a);+ f) i" p) F& M k( R# d0 _ u4 q
printf("b is %d\n", pshreRAM->b);) U" u- s$ X' | h' x1 L
printf("count is %d\n", pshreRAM->packet_cout);6 E1 T! M4 m$ N: ^9 F/ a
count_copy = pshreRAM->packet_cout;! N1 M4 u$ G) v1 P p. W2 H
}4 D9 ^' }- ?3 v& Q* |9 w% `. l
else7 j7 _3 n( r' y, e/ g {
{
( H5 m9 l+ R) d8 G/ A. y printf("No effective message!\n");3 e; Y/ R. d# a7 o5 S3 Y0 \0 R t
}: G' p. [; v. p$ g; _! [/ f. A
}" q7 M9 r6 \% l( F( O. x+ m9 k
: ]4 N1 E' P6 ^8 D4 o' T( s1 Q* ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! o4 M1 y$ k; G7 o+ X
4 X8 ^: d& D# p( P6 B% q$ X. C. R8 W# V
- u/ a$ v6 A0 C
' |- \8 H4 x/ e
2 h9 a% F, W; c$ x |
|