|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, W% O5 A+ i5 n& ^- q) E. b1 o! W8 J# }8 M4 m) |+ v% b* \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! B# K' R, [# C5 S* U
#include <unistd.h>
- d7 s& K/ Y1 _- ~8 \( C#include <sys/mman.h>9 i$ r/ j7 h. R/ E7 X- O
#include <sys/types.h>
! G4 t4 D( \% E#include <fcntl.h>: k/ [, ]/ C0 Z* Y2 G+ Y
( w1 n* A4 Q& ]; {3 d! r#define SHAER_RAM_BASE_ADDR (0x80000000) I* D7 N: u+ L6 P, I! ^
2 Y0 g0 L0 l1 H) p5 u. c# k( ]5 d
typedef struct
6 G6 N+ L9 w. T. a! s{
0 t: K5 b* G6 W1 T- M: W unsigned int a;
- l; g! `$ M4 O7 b5 a unsigned int b;
1 ^, L( [( V8 {- A7 C$ O7 Y unsigned int packet_cout;2 n$ i1 r5 C; X2 k( c a9 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; U" |4 ~4 C9 B& ~: A: ]7 X
$ k4 n+ \7 k4 S- @/ X1 s8 ^. M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: o5 `4 w% S kunsigned int count_copy = 0;
- v7 U2 {- X! E, H
8 J. `" [( ^0 F8 N s; k% v
8 g0 n* r* }4 b( ]int main()7 z$ S; a, C+ o% k. z* _
{
$ f c" U( L4 l9 n6 F0 x pRX_MSG_PROTOCOL pshreRAM = NULL;4 J ]) U% ^/ {- F
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 c' H9 p1 L# S& [' Z7 i- {
8 `5 P% ^8 i# y$ n( p4 x2 A% ~' k3 m while(1)
( i0 H' S* G- u9 U: U4 F5 I {
" M# A1 `4 a8 {$ C' q" b! w read_MSG_buffer(pshreRAM);
& _$ K6 c. c- f& f5 n- U } 5 {% u1 q# ]8 T8 n. e i
}
7 }) j( ]2 Y5 ~: d) n& m" Q5 B* E, C S K0 u; b6 k A3 b* ]4 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) M4 ] e% ^% A
{
8 }8 r8 F% Q" [9 |) M RX_MSG_PROTOCOL buf;
1 g* ^9 A9 B( n; S. X; g
7 g- }# f8 ]) @* c; k9 w1 ?$ X buf.a = pshreRAM->a;
) S2 \5 ~2 H1 r" ~2 w2 E+ J buf.b = pshreRAM->b;
, N7 G: ?' }) \ buf.packet_cout = pshreRAM->packet_cout;( O% z+ R* o; u/ t) o
7 z6 Y$ i6 N3 i2 V" j
if(buf.packet_cout != count_copy)6 x( V0 z# |8 X+ k4 U, q2 F
{
5 K9 L! _8 l& s2 h2 K printf("a is %d\n", buf.a);
/ N6 q) h9 H/ V; o& n. R- H printf("b is %d\n", buf.b);
/ m2 y# F% S! [1 ~1 q/ R printf("count is %d\n", buf.packet_cout);: R1 e0 u2 Q+ E, o- Y& ]
count_copy = buf.packet_cout;' z, {$ s( | d, b
}
" X* w: M" z" u# F; w5 Y else4 g9 k/ a1 [/ b( O1 g, q( v
{, a9 f6 K4 L. Y
printf("No effective message!");7 `0 Z1 }3 S9 D: I2 O1 t& F8 ^0 N
}2 D- ~5 V4 f0 e8 r! y$ i
}, K O g5 U5 K4 X( _+ e
7 G5 J; n, S& f5 x) r" ^; e: n4 l9 _0 D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 W4 p A5 ?7 H, B使用下面代码,对内存使用了mmap函数后:1 [. L' \$ P& a. B6 T0 |8 L1 h
#include <stdio.h>
' o% t. z" Z; ~3 c" G+ S#include <unistd.h>2 j" f J) @) }
#include <sys/mman.h>: p5 a O: ?. ~8 ]8 ]* X( Z5 @
#include <sys/types.h>4 c: m( @ q- T! T1 ~% f: Y
#include <fcntl.h>
) |/ h: [% h' F& S$ |( R% ], i& l# |
) {6 w$ o1 |" ^4 H- P% H7 r% @ M$ C#define SHAER_RAM_BASE_ADDR (0x80000000)
) F; v3 |" F: y/ u#define SHAER_RAM_SIZE (0x20000) 5 b9 @3 s0 q( v, P$ T/ |3 ?
2 Z3 g8 _6 [' p. M$ X% N' itypedef struct* R% @. B& S M. D% ?) D( \
{
9 u& W% L- D" q0 ~ unsigned int a;3 Q* j1 h: ^$ c
unsigned int b;; r% r) {( M$ N. ?! a
unsigned int packet_cout; j0 a: P+ E5 J: `+ v( C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 v1 t+ [1 b2 Z% }
& C3 ^& i- A) ? Wvoid read_MSG_buffer(int *baseaddr);# ] I" o5 v {) H. T
unsigned int count_copy = 0;1 h w& H& N. K3 _" L0 e
" z* p6 W# @3 S" z* w+ d! e
int main()
L( y9 ?& `' J t4 ]7 x{& D1 ^$ q3 }" W
int fd;1 Z" B! Z1 r& v" o
int *mem = NULL;+ \% w D1 y3 ]' \7 p
! g% E9 \5 n; W$ q if((fd = open("/dev/mem", O_RDWR)) <0)
! H) h) w* ]# J: S* B7 t$ G8 f {
1 R& h, S% I! N perror("open error");
' a8 K2 A2 ?/ L7 G( d return -1;
; T# V! e9 c3 N L8 C }
/ i9 \/ {4 B* M ^6 P- |/ _, z3 k 0 y& p1 H& S: V5 k% N; Z4 n
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" u0 u9 w8 @( w7 P
9 S5 i9 a! C& M# |; @ while(1)
! c) a; P4 H9 h( E2 K' G; ^ {
* k/ n$ j* A' p" u' V" Y9 _1 D! W read_MSG_buffer(mem);) J" s0 }6 }6 m: o: Q; l# \; y- D
} " }% N! z% ^4 U" }
}
% c8 ?$ q2 ~4 m! m, b' y1 t4 T/ h& S7 A5 B* E
void read_MSG_buffer(int *baseaddr)
( }' E5 ]/ s7 O% R) N9 Z5 i{
: D% q {5 ]) i0 ?! v1 \) v pRX_MSG_PROTOCOL pshreRAM = NULL;
8 V( K8 A. n+ K: u7 ^* h+ ~; p+ w' X0 e5 r4 l1 j
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 L- Q! t4 K2 V- @
/ X! G! `% t# |" J0 K# A if(pshreRAM->packet_cout != count_copy)
9 n' t$ x3 [! S# O {2 Z A. M; t6 h8 m; [6 B
printf("a is %d\n", pshreRAM->a);
7 J5 E) g+ `3 Y4 k4 U- t printf("b is %d\n", pshreRAM->b);
2 t4 V e( N+ D+ v+ X printf("count is %d\n", pshreRAM->packet_cout);; p# u/ k: Y1 u- S1 I0 b$ u
count_copy = pshreRAM->packet_cout;
) y* p% o4 i# z( Y5 @$ X }$ K' \# B7 P1 P& R+ D1 R
else
4 w8 a4 X7 m8 j% ]% H: _# @) M+ O {
: u7 m) k" {$ B) q$ p9 r+ n+ }7 O printf("No effective message!\n");% v2 a% A4 g) H8 |+ H6 C
}
8 \- m* l. m4 p" G9 |8 {}9 W2 b. c+ b I! ^9 q* Q! ?
/ z) x7 I( [- f [1 m2 n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; r9 s5 O+ B: g6 |
# ^% z. d* l/ n/ u' l9 P$ Q& M7 o) ^8 _' C2 I. g# C
4 e7 ?5 l- e! h. {6 K5 J! S A4 M/ v& g* ]5 y
|
|