|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * d+ N* Q2 ]' x2 q
/ t# ?: z4 w3 [0 i* R( H: ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( R+ C$ d F* Y5 j
#include <unistd.h>2 ~! a1 n- M6 x; k2 i. E( E2 u
#include <sys/mman.h>
" h9 t7 T/ C* N) X2 c6 r#include <sys/types.h>6 O R! C0 d( N: t# V* C/ X
#include <fcntl.h>2 v: s1 ?% c" u% V! D2 q' P
! T: w! i9 `- P2 c* p# | j
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ g! \ J# F$ ~7 f, ^2 j5 e
9 W5 n M; J+ Q- F0 P, \0 ]typedef struct
S$ e3 h3 |2 M% A9 D$ ^/ R{- Y- t7 w- u+ E+ X
unsigned int a;
) g1 M2 n5 l ?: J& C unsigned int b;
$ [+ V# J' ]5 H; g( ] unsigned int packet_cout;" Z+ ~# N/ Y4 a+ Y, ^8 c( p- l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! F; |+ h! D& F
" m* Y( }" F# @+ y7 j* H) X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! c2 z; N- N& ]2 t# punsigned int count_copy = 0; S6 ^8 p1 l6 g# t8 f' |
* d2 t3 s2 @3 V1 \& [0 n
% R2 I4 R" K: Cint main()' X; W% |. t2 s: m) s% m' E9 l
{
# ^5 M; j' E1 _9 N: o pRX_MSG_PROTOCOL pshreRAM = NULL;% {* O7 b& A( K. V$ ]4 `- o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 d4 J" ], @1 [; f- D; `, U8 e
1 Z, [4 `+ G4 [! n while(1); m9 G E0 m3 V5 Z6 T
{
) P0 F7 P, m" z; F- X! [/ O read_MSG_buffer(pshreRAM);% _+ f/ {0 U' f# @
}
, {1 B& I' \8 T% ?# `}
$ w* L; x# m; n6 P7 G3 w
5 B( K* w [5 L9 W7 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 v, \# H# e7 e5 O' v
{. E) I7 H( d k. M: \
RX_MSG_PROTOCOL buf;5 B' ^& {7 a8 A" N, ^! {" w! [
& T( G C% g. l
buf.a = pshreRAM->a;4 @- ~9 L6 a4 I2 S, h9 b) |
buf.b = pshreRAM->b;
# Y# s0 m, l6 b; a+ Y. n# T buf.packet_cout = pshreRAM->packet_cout;
1 ^5 F( C6 H4 L9 Z ' R! a" `+ F, V4 A/ L }! z
if(buf.packet_cout != count_copy)
' w" O+ U" V5 N- U& Z" K* [" }. U- m {
: o9 g8 h; w) x$ _8 x( Y/ d printf("a is %d\n", buf.a);2 ^% F' {6 x; [: S Z
printf("b is %d\n", buf.b);
z N; B" p# } @6 p( f6 E2 X printf("count is %d\n", buf.packet_cout);
5 _- v0 S" P& r count_copy = buf.packet_cout;
$ U S) A! ~6 P4 m# _2 V }7 _# F: _* C# U; d2 g& Z
else; j: |( b( g9 L9 [1 x
{6 W: k$ Z& `' G! @
printf("No effective message!");4 ]2 E, Y, B+ G& M/ [+ W' k# L; Z& M
}
: A9 j: a2 I7 c( R |/ r}. D6 ~: t' I- i `- `) [. x6 O
- Q4 W+ Z0 x3 O$ m: q" K4 Q( a
( p$ P% I* c( T0 t# r N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 W; c' H/ ], k使用下面代码,对内存使用了mmap函数后:0 Y7 i0 i, Z; g/ j
#include <stdio.h>" f Z$ F, v) \8 Y2 G# x4 a1 S" l
#include <unistd.h>
* Q" E, Y; J3 G- n; C#include <sys/mman.h>
; Z& t8 M( ^; s: U6 k) p#include <sys/types.h>; ?6 T$ `. Z8 B. r& K5 z- q, C
#include <fcntl.h># c, c" f5 m, I7 F, b
9 D g" ]5 O; v% V0 d#define SHAER_RAM_BASE_ADDR (0x80000000)
3 J8 H0 d0 W, S0 M; V#define SHAER_RAM_SIZE (0x20000) & }+ P3 z" t0 q o
$ t: A" C8 N$ L" h8 i, k) q
typedef struct, n3 A: k7 y3 f* g
{: T, P: o% K' v
unsigned int a;2 z& a5 Y4 y- s, R9 D5 F+ K7 z
unsigned int b;
9 z! y% \. w0 F. N" B! T0 J8 w unsigned int packet_cout;
) E( S, A6 {! M6 y! T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 ^/ E7 N$ H+ R2 V2 z" T6 R( U3 R' y- @+ |0 {$ r H0 Q! k+ g
void read_MSG_buffer(int *baseaddr);: ^( v7 ]3 c- \1 p$ _
unsigned int count_copy = 0;9 Z( T! q' j! h: M; |
4 `8 j& Q: e* W3 u' `& s; ?' N
int main()
; V5 T8 z& _! C( H{0 ~0 h+ Y$ H+ @' Y
int fd;; Y! w* c: A) c/ j( e
int *mem = NULL;$ m# Y% D; O! }5 o9 V0 Z& q0 f" s; |
6 k, h: J$ |: E6 ~# ?8 ]
if((fd = open("/dev/mem", O_RDWR)) <0)* O; S; O. J+ z7 b
{
: _1 O H' `9 @ perror("open error");
0 y* V5 a F: { return -1;/ r3 A# ]; e" N0 E) j
}
1 `: |7 k+ T: p, T$ F + ?7 S5 v0 p- f9 x: d
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( X$ I; w# o G' M2 Z$ @
* j: I4 z) X0 K5 V( u0 D
while(1)
& ]4 m: q I8 R' m {8 A: X, Q) O5 w1 Y) K9 E
read_MSG_buffer(mem);
t! P2 J X& k3 ]: o }
' ^2 ]8 h8 c8 f. W; W) g$ K}
' W: R3 L2 w2 T4 y6 h& _" k' i$ m8 a: J7 A! d/ C
void read_MSG_buffer(int *baseaddr)
6 M9 b7 r. ^9 k' \# T* o{ N) c8 \; ]) ]0 F c; G
pRX_MSG_PROTOCOL pshreRAM = NULL;) m& L% W# \! U# u
6 _6 X' {* ^" m+ D# a pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 ^9 @9 T, K5 t8 n$ L+ r( L' f( u/ a7 ?( S6 I
if(pshreRAM->packet_cout != count_copy)7 @/ w; D# `& H" H+ t
{
k8 Z! s+ C( k# ]! m, O/ m printf("a is %d\n", pshreRAM->a);
. R. z+ t V# j) A printf("b is %d\n", pshreRAM->b);
" ]) T7 L `: C9 P; p printf("count is %d\n", pshreRAM->packet_cout);/ b. w# e% p+ w! U: o2 r$ W) M
count_copy = pshreRAM->packet_cout;
4 @7 D3 D4 M# V0 B: X: E- _3 g3 C- C }
6 h4 ]" b- X* X. t* b& e else |9 \! {- r- l* m
{* n0 n/ O: J4 b- b
printf("No effective message!\n");
0 j5 ^. N2 p9 m3 e }
) r @; M; X$ t- |2 b}
7 E- y% ?; _9 M0 W& E7 i& |) ]' \3 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ F+ U8 s W: W4 e" h. t3 h1 n+ y; G3 ?: c/ f' i
! }) p5 v: x0 s/ q; }# F6 b4 W& M. @% f) k4 V g. h! r Q7 W
& G# s; E$ F6 k" Z2 I |
|