|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . Y1 J+ R4 f7 q
$ Y' E4 a- k" W2 r. s* Y3 g6 }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% ]! t- q8 T' M$ p7 r
#include <unistd.h>
: ?, H) V+ R. }, }6 ]; l#include <sys/mman.h>2 M1 P! l: p8 ~0 x* o9 `
#include <sys/types.h>
Z# c! t9 e% k* x8 z# f#include <fcntl.h>& y0 V# g+ a7 C3 i; N- Q
J" J9 M6 o( M" n f8 {: ]#define SHAER_RAM_BASE_ADDR (0x80000000) 3 v* s# t" m! A' [
* f- b0 v* C: y# \ o! u. e
typedef struct
0 W& \* q7 S( P# e{
- F) n, N+ o! z2 U unsigned int a;! r& S% @9 E- I
unsigned int b;
3 [' G. ^+ L0 H5 C \( O unsigned int packet_cout;
( i9 J5 `& s+ r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) T( ~5 T' |0 ]$ U8 G6 a1 D
T) G4 d1 `. [& U5 P& P: c$ svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* T" \2 m8 L5 i% I& u5 [unsigned int count_copy = 0;% c% H, I3 _& A! T$ Y
, U P7 C# d+ l1 A; ?
8 m) r! u: E0 i" u2 [int main()
' f9 {' g* u1 X{
& K% n7 U. A3 P( D* ~! ?' | pRX_MSG_PROTOCOL pshreRAM = NULL;
$ s, d4 p" S* U% m pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' O$ o& H J- K4 U
$ x0 q, `3 I; f# Z) | while(1)
6 w& ~9 C2 n- X+ p5 N A4 j e {
! R8 B6 P( O* ^# {9 i# ~/ w read_MSG_buffer(pshreRAM);
1 F9 M6 u) y* p8 s3 Z; c" x6 J5 B1 k/ ~ } 5 I" j1 y4 w, h
}
" l9 H2 N5 ]* G' Y5 g7 V8 j
% g5 s7 ?+ } m0 R0 V7 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" h2 N; n: n1 }3 Q* ~4 I{0 P/ `0 ~& o9 e* L
RX_MSG_PROTOCOL buf;# G. b+ U6 I2 G4 L4 h
# G+ I9 f( G0 e3 L1 D
buf.a = pshreRAM->a;
4 T A# @2 d# B8 w" C, j' h" T buf.b = pshreRAM->b;9 l3 z5 ^' ]" P/ g0 d; F
buf.packet_cout = pshreRAM->packet_cout;
3 I+ c, R: d- [. q; G2 L # J" o: c# G5 R" m' O
if(buf.packet_cout != count_copy)
* E6 C1 k; M$ N0 s' J {0 ?6 {/ ?2 V! A' M
printf("a is %d\n", buf.a);$ @4 D1 U) g4 I
printf("b is %d\n", buf.b);7 x1 A' b& a3 u* {7 ?9 I; G Z; z/ @
printf("count is %d\n", buf.packet_cout);+ d/ z7 A* y# ? u& Y# q; @9 E4 ?6 ]
count_copy = buf.packet_cout;: ~# E3 i( j% [; M7 j3 D3 e
}
" k+ Q* i+ U6 D+ d/ L else
. z$ j6 t; R5 `+ w {
}# V8 G. F, P" o' u printf("No effective message!");7 M6 I* V7 W0 f
}
4 X. u7 j8 m4 O2 y- `}1 `9 c/ b1 _5 x7 H
. w! X5 c2 [9 J A( R$ ]/ t
, B+ T1 S5 s: z4 \5 w9 `3 |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; n/ U1 M4 o1 w0 Y% ]$ a+ [
使用下面代码,对内存使用了mmap函数后:* R/ ~" {/ J' ^, I) A( J
#include <stdio.h>6 K! b2 |) Y1 t
#include <unistd.h>7 ~4 N% I6 x1 f; A C/ W
#include <sys/mman.h>
/ Z# \7 L5 }1 B- e2 |' p#include <sys/types.h>
9 o! c" f J% J7 s#include <fcntl.h>* l+ l9 M l; Z) N! b
, c; r' d" e+ y. J f2 s
#define SHAER_RAM_BASE_ADDR (0x80000000), w+ L+ f# U0 N2 Y2 p* Z" m3 W! _2 ~
#define SHAER_RAM_SIZE (0x20000) 3 \' E1 ], V5 t! T+ D! N
$ p0 y9 \7 i Ftypedef struct. J' F& m4 G8 l. N, t: {
{ d* C8 r# M* R5 T
unsigned int a;+ ~8 U5 j0 e0 V2 z
unsigned int b;5 x! a+ x# ]+ q6 D2 Y" C( _+ T
unsigned int packet_cout;
9 Z1 Z: Z; I; Z4 g: Z8 k4 L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* m$ ~; b' B) A i
1 m" c/ K2 y% g) g( Nvoid read_MSG_buffer(int *baseaddr);# Z3 \- ?' b2 E' _
unsigned int count_copy = 0;
# N7 t$ v2 d* _/ w/ q7 j- T5 O/ K b$ d; m$ c
int main()$ f: p" K; Z( o a9 ?! E4 g& o
{ W9 J8 A( M1 |' @
int fd;
. v/ p$ ?0 @9 q; z3 U+ a( o+ Y int *mem = NULL;
- X6 C! c0 a# k, r2 ?
* O/ g, a3 ~" q; d! I o) L. r if((fd = open("/dev/mem", O_RDWR)) <0)( L) ~/ z5 [+ V+ y
{% ^+ ]( O) Q' ?# R. y
perror("open error");
) I% W2 ] e+ W( u9 _/ S/ l$ w$ B& S; z return -1;
% r, l' q2 P( M! _9 \- @/ Y }
* v0 T3 n* d; V: i* z" @ ( D" j" y# b# G8 p4 S o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% r! l' A2 f3 |( a
. c1 S5 E! [7 r/ Q; m) L2 V' n; T while(1)
' P$ n2 S. s; K {
! t, U/ e. K5 y7 t6 g7 S0 N read_MSG_buffer(mem);
( l9 ^7 }! g. Y* Y } ( c! M4 N: l, k. P2 n
}
m1 ~- q& B# v+ W; c S. C5 h! {1 E1 ~) ?2 ?7 ]! Y( |) F
void read_MSG_buffer(int *baseaddr)
; x- ?8 _4 T9 J* ?5 u A* Z2 n, R{
* m$ r% J' b! e8 R8 R1 y pRX_MSG_PROTOCOL pshreRAM = NULL;' N6 D+ p5 U- E1 `3 V( v* w
' d& g1 N$ [- o+ w+ m
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& y- Q& q( U' M( J
1 j- H# l! W( \: w! M5 M2 k if(pshreRAM->packet_cout != count_copy)( s7 K4 D# _$ v0 {1 N
{( F6 N* Y S& r
printf("a is %d\n", pshreRAM->a);3 y. W5 e5 Q0 K- m
printf("b is %d\n", pshreRAM->b);
, w" q6 @% |, }4 R: w" W; v printf("count is %d\n", pshreRAM->packet_cout);* B' L. h2 D9 N6 ^2 L
count_copy = pshreRAM->packet_cout;2 _; _' P5 ]) Y% t
}: ^/ o3 f% i: h4 Y) ^
else
( k$ P* Y: Z9 y- [3 @1 Y* r! F$ h {
4 z7 T' q# {1 h& h: g% _3 z$ Y printf("No effective message!\n");
, F: G2 z: H/ m; z }
" P& n: P! E W; j/ V8 N}
9 T, h$ [0 H$ f' V8 g0 ?; i0 S2 L0 l" E. n6 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" m2 c4 ~6 \$ m& E2 @6 S- ?% h! P8 c8 C$ g4 Y8 T/ J7 @3 F
/ a, y- Q' o8 ^
# }% w& X7 V8 v
; D/ A z1 g$ r |
|