|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 |: U5 S7 Y+ G/ N% [, N
( a# f) f+ l: E4 s- f: X- D: I+ {OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ f' M7 Y0 }; n0 M; \
#include <unistd.h>
' O* L$ x+ p# q8 ~: i- ~# W#include <sys/mman.h>
8 [& h! D5 b" l! Q#include <sys/types.h>
) Z, o# Z7 E# H* t) H#include <fcntl.h>4 ^$ L; l+ a. c
x! I3 s+ s( Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 L3 w, J) s# W# Z) A9 d' ?
1 b7 @8 G! `* qtypedef struct
" L: u( _! K" U{
; ?+ f1 u6 z& ]: K unsigned int a;
+ P4 j2 M/ W" n2 f0 w$ w unsigned int b;
' M7 g% ?" P4 G: N4 S unsigned int packet_cout;% F( R8 C- ]6 m) l" {) @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: e' P; G& }6 b) X% I& w
: r; W W5 p4 Y5 @3 h Y9 \: vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% b& H4 |" r, t5 V$ b4 a/ eunsigned int count_copy = 0;
4 K4 \1 t% W: |: [
, Y% |* N# J* F+ b- i- b' z D, A0 f+ S, p0 B$ j9 \4 `
int main()5 m8 ?% A9 i; Z$ z
{# o# y6 s/ X- B0 Q+ W
pRX_MSG_PROTOCOL pshreRAM = NULL;) |8 r9 i) D8 R6 F) r, f0 W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ s8 e$ L; y1 @6 E
* U! L/ b$ u( {/ G* }: |1 P" j
while(1)
8 K3 R" C/ c+ ]7 R/ T" P {
$ o/ }6 l% w8 t+ f read_MSG_buffer(pshreRAM);
* I( K& B9 r W9 `0 U$ F- v }
: X- d) i) m- a* e7 J) Y}
; i2 ^% U. i6 }( N8 s
; e D5 V+ f% ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 O8 I# r1 E+ m3 H{. ]+ m9 z0 m. a! O
RX_MSG_PROTOCOL buf;
4 Q8 B1 Q# N* S2 J; t
; z9 B1 M8 W I, V; ~ buf.a = pshreRAM->a;. d- e% n- }0 P6 Z! v( f
buf.b = pshreRAM->b;6 N3 ^6 [# i8 c6 c* B0 h9 L4 T
buf.packet_cout = pshreRAM->packet_cout;
/ s1 F! b' ] ]- N * V2 O$ Z' E6 J' [+ k3 s: U
if(buf.packet_cout != count_copy)4 [7 q Q0 M( J" k% f
{
: T% ^6 P+ }1 R8 ]* W printf("a is %d\n", buf.a);
9 R+ ~8 \" k6 K1 H2 q printf("b is %d\n", buf.b);% J7 [! u! E3 G `! e" \* i
printf("count is %d\n", buf.packet_cout);
$ ]4 W# V5 k% ]4 r' E& g Y0 L count_copy = buf.packet_cout;
( t2 D9 g! |& o% `6 {! O }8 b; i a8 n( ?
else2 v* k5 f( M* \) f# k; _: i
{
9 \6 S6 u# ^7 y3 K" P, Q printf("No effective message!");. l+ W5 R$ J0 ]: T4 ~3 T' j
}
( k0 B% |, E9 e. }}
+ J& d& D; @1 `$ x
1 ]; Z4 l* Y8 @* m7 N- l4 T! y( ~+ F* r' h9 h* g; o" C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& [- @" @! @7 Q3 R/ M# H
使用下面代码,对内存使用了mmap函数后:
" V: w6 y6 R' f1 P" ]) u: c#include <stdio.h>! p& l4 A7 i" k3 ~0 h
#include <unistd.h>
: h2 _5 `! z- F8 k7 V: a) {#include <sys/mman.h># V w" O" F3 X' w, Y {4 ^/ s5 w; D
#include <sys/types.h>2 x2 R* m% D9 D
#include <fcntl.h>
- I. H) S) m9 l8 N, @3 W. h! z
/ r+ t0 ], a3 x6 Y, G#define SHAER_RAM_BASE_ADDR (0x80000000)/ s7 _. J+ i; L6 K# p) \/ @2 x" C7 c
#define SHAER_RAM_SIZE (0x20000) : }, K8 F; T# O* Y* y
; {& P: {" m/ k) A- m9 X- Y! {+ J& g# p
typedef struct' w+ z; V! s- s7 u0 j. @( ?- e
{
, _9 M6 e3 F+ H H8 U2 j' d8 d: W, P unsigned int a;; K3 I! @) D1 k
unsigned int b;
2 w* s9 q3 b1 T5 s0 t unsigned int packet_cout;
8 E# H6 a) c+ F* ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* } A" Y$ I* V8 _, \
* j, d8 v D1 i4 X. H0 G
void read_MSG_buffer(int *baseaddr);! p0 I+ z$ v- E, i9 l: Z ]. n
unsigned int count_copy = 0;! x2 V5 }2 B; ~
: ^9 a7 z* L5 B2 |4 q8 f8 V
int main()7 }7 `6 p. o% A8 a8 o1 R
{4 M' M) }' O( Z5 j1 p3 A
int fd;8 L! R( b0 r3 a
int *mem = NULL;
. n+ b3 p( F/ @/ f6 Y% \. H
. n `9 a8 Y2 J( }/ b if((fd = open("/dev/mem", O_RDWR)) <0)
4 s5 Y. x3 E$ d {$ P$ y e) U, C5 f" G* F
perror("open error");
3 g% Y3 h8 J# ?. a$ I! g! Y return -1;
8 \ T! q3 p2 N# K }' z4 ^ n0 Y3 I4 ^5 b
) j& _+ Q; \7 i6 ~- x9 I4 i O mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% x* ^0 R2 ^1 U$ L. c& J9 c, b. o
0 s; N. n0 }) T while(1)
3 O2 H' h! @/ r) { {
, _1 T( Q* G5 `! B. U read_MSG_buffer(mem);
: ^$ g2 w" o2 w) B+ O4 S+ r }
! V' b# s' P8 n* e7 }}
! M: Q( H" {# o) d) k2 H: j, W
0 T9 q. V9 i0 [6 Rvoid read_MSG_buffer(int *baseaddr)0 V" u/ f9 ]# [7 H
{
) Y m3 x a7 T pRX_MSG_PROTOCOL pshreRAM = NULL;4 b7 w5 P' D& C! p; c
9 Q0 u/ `, V% Z1 x( u( |/ ?) U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 W- [- Y: a4 X5 l# d: z8 T- ~4 J* C# P
if(pshreRAM->packet_cout != count_copy)( p2 i* Q5 e0 ]+ j
{5 N6 p, ?9 ^/ `4 d
printf("a is %d\n", pshreRAM->a);
9 \/ }/ {. f( z, h; a printf("b is %d\n", pshreRAM->b);
# e+ o0 \! `/ O1 ?4 D/ b printf("count is %d\n", pshreRAM->packet_cout);
# I* B+ l2 I: k. a9 P count_copy = pshreRAM->packet_cout;- ~' k! x4 ?/ f
}
; |3 A I1 s- e; _ else
4 U# X7 n% Y1 P7 ?" [, \1 d {# \0 X! X5 @, h
printf("No effective message!\n");
; e2 v. X# E* E% ~/ h }0 [; E T6 s: k! l9 |; F
}
! ]* L! q% V0 {3 Z: t( Y4 ]' }0 Y% I7 H! q* B0 O* t; R# C; g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! [8 e' C1 G/ T! ?* f8 q2 _5 S- T; ?# i# G0 g4 U0 m
$ {0 b& q+ l7 c: f$ u
: c' F# \$ x/ z" i6 _* v, m
J0 k; @: F. ]0 i& k
|
|