|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , Y/ k- F @- A, U3 o4 ~+ C( A" i! H
* K f4 ~1 g1 @- IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 l9 v' l k6 e! O2 v; Z
#include <unistd.h>7 Q: ]7 o: T5 p A2 C% ~
#include <sys/mman.h>- Y, P. g# r- O6 v
#include <sys/types.h>6 K* [8 R6 i; G* z8 D. ?
#include <fcntl.h># n# Y" q3 w1 A; Z. d
; J% D3 n8 C' e4 @5 V* M5 h
#define SHAER_RAM_BASE_ADDR (0x80000000) 1 [ O% N2 S ^! f0 T) E0 H& p
) H' B$ B; }8 ]3 e8 L
typedef struct
0 ?3 ]/ Y0 I" x6 m0 J6 B8 i{4 J0 j2 e* _* M
unsigned int a;0 }) r6 F. h5 Q# C/ u( n/ m( T6 \
unsigned int b;
1 S( n0 c. P3 J7 G) ~% X unsigned int packet_cout;
' M( Y+ F# I& T; N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* G/ L k7 B% u# r
2 U& a" |8 a- V8 z- H6 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& X( x) E% W% H" A
unsigned int count_copy = 0;
! E4 T% a) k; W( u9 z: ~# w. l" X- [
/ g' [ [; B. ^- o3 wint main()8 ?; U- ~9 T. E& f& R8 C. r* V
{
1 U4 ?( c* F1 {+ b% b2 i2 V pRX_MSG_PROTOCOL pshreRAM = NULL;; j7 p" e1 K) R5 g7 q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 k$ e' N, H$ e, R
' B1 s. E6 P* b& R+ I- k
while(1)2 F8 `4 W* g3 x r. G v
{0 r: @) U- Q) b
read_MSG_buffer(pshreRAM);
+ O; U) P0 i4 Z; ]" e# y3 S+ a } : j1 I5 D1 W, ]4 r+ U$ J, H. a
}
y: B* v- e8 V) s) w; u3 S3 h& D) y9 o* s' y0 K0 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( `& S, @! B4 E{
7 y% W6 |/ H$ p RX_MSG_PROTOCOL buf;
4 X4 \: A3 y" i0 a1 i ?: d
- Y9 U- I. S5 I4 x L9 [. m5 n buf.a = pshreRAM->a;
6 Q0 a" Q( j7 ^6 w2 N4 o buf.b = pshreRAM->b;1 U3 H' S7 [) Q% v" H
buf.packet_cout = pshreRAM->packet_cout;- ?$ z) F% c4 A, T- X% w
; z9 \3 {3 H) u- }2 o7 \0 D
if(buf.packet_cout != count_copy)- q0 d- W2 q) D8 S2 V
{
9 P3 ^" @$ e. b& `# @ printf("a is %d\n", buf.a);+ A1 n! U# G J3 M5 a; U
printf("b is %d\n", buf.b);
, G! E4 q z% I" z printf("count is %d\n", buf.packet_cout);5 n+ t: e. H9 K$ N/ f" Q
count_copy = buf.packet_cout;/ @! q" c+ l n0 H* }
}
, Z1 h& ]. X9 \! w else
5 ]" T& ~6 w9 O v& o$ x {
) Y" {1 @6 V' G X" H" o5 d5 w printf("No effective message!");
' _& P% P- \' k9 X }! L2 {# w B* h) }
}2 p) H3 _ Y: l: i( S# w- F
: i1 T0 G- g( q% ]$ o$ {0 n0 m. E
# r: B5 ~: L+ j( Z2 s5 U/ D3 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 ^0 }, F+ x: b3 F. W7 G/ A使用下面代码,对内存使用了mmap函数后:
& q d+ @3 ~8 g0 @#include <stdio.h>
' J* w/ r3 Z5 g* N& B& o* c3 E#include <unistd.h>8 o1 w. g( V8 c; a& K, I
#include <sys/mman.h>
) K1 o4 N7 s& L' b+ p$ I#include <sys/types.h>
9 l0 d2 R& ~' E2 I; a6 v/ Y#include <fcntl.h>, ~3 y6 H8 Z( m7 T
5 J4 V: U |) c7 k5 s, M7 X
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 l- `8 S# O$ m% p% u1 g5 l#define SHAER_RAM_SIZE (0x20000)
$ w8 L8 i. M( Z- j3 ^+ C% E1 W$ x
typedef struct# R$ s0 D, ?" k; P- f9 v3 s
{
3 D$ r0 P7 o7 @5 k6 q3 D unsigned int a;
4 t" W0 R$ G F, R6 O( f- b unsigned int b;) w* M$ B) J! P) k1 _* d- h
unsigned int packet_cout;
! k" m2 i% q. W h: y' I, e. i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ w" N- \. l# `; M
# A) s$ A- [% \5 H+ p9 @) G/ M8 wvoid read_MSG_buffer(int *baseaddr);6 C; ]# ~. |! G
unsigned int count_copy = 0;
( ~! F2 W ~3 i8 V6 l/ p
; B% d7 k% b- S/ zint main()( Z6 c' l2 B+ O6 u A- Y
{% I, U' A9 }. {
int fd;
" K' e& s/ Q5 D/ T" A int *mem = NULL;, D. _! Z7 G. R) Y$ t# x4 R) X+ F
3 W0 b: l8 J! b$ Y; k
if((fd = open("/dev/mem", O_RDWR)) <0)
3 N8 R4 W% H, e/ ? {
6 q! O8 ?: j$ s7 p1 q* d- k% j/ j perror("open error");7 b) x( T% j) U, B6 q3 @: Q
return -1;
8 N! o2 m# l- x1 K! s# @7 w7 x4 ?- ~ }! a8 P* ~5 v. A: f& w
/ K' q, D+ g- I6 Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ f" Z2 e& Z* A" k2 |; v
) R- k# v3 ]1 \! T while(1)" N4 P6 Z6 x* J7 T, U& A
{' u* E m# e: V- _5 f
read_MSG_buffer(mem);
, F: h4 Y: J# c0 l8 |) h }
1 g# ^6 T5 j& y4 g, f2 a, s}
2 D4 w4 P/ } D3 T& z% ? x: {. q6 Q
void read_MSG_buffer(int *baseaddr)
' l, V0 `. J* a) B{
# u J1 g- q/ D8 o pRX_MSG_PROTOCOL pshreRAM = NULL;
2 |% d! f" v5 l% z) o4 s* J. ]$ d* c6 P$ _9 E7 {8 B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 e! O6 D" v; E( z* y3 ^! F
' g+ I7 v- w7 \* y; I+ m! V
if(pshreRAM->packet_cout != count_copy)
- c p3 W4 \, @) K) m {
: P5 k0 \- ~+ @5 D printf("a is %d\n", pshreRAM->a);. s1 R3 t8 S. n# ^
printf("b is %d\n", pshreRAM->b);% M( n q: G% t5 ^$ q& f
printf("count is %d\n", pshreRAM->packet_cout);: l' I5 { o; e2 W/ e2 ]0 A# r
count_copy = pshreRAM->packet_cout;6 u$ ]$ n% u2 f7 y) |# v
}
3 Z7 v H1 R/ M7 k0 I8 K else
) S8 `9 l$ Z7 }. ?3 b1 Y {
8 N: G* F5 e5 |& a; s printf("No effective message!\n");
% W: n% g# G3 S8 D( F: D7 p4 V- R }/ O6 @5 S4 M g& i
}
8 \1 }& n$ P) S0 U( a& m
7 U: V4 m' v. L6 c$ y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) R6 X$ @+ h! E g# K3 |
$ S6 O8 M% z k- e) a/ G, r
! s: ?( F) n& U9 j* Q* |2 ^
" _! M0 W. k8 H: h* g5 U( X- P: }( `! |- ~4 i2 G+ l
|
|