|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% b. s" z; y8 s: O# W
+ v! x# O6 W! I* N9 J: rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! q, E: }; ~$ M, i' ], s# \#include <unistd.h>
5 Z( Q8 W: L1 V1 } w/ R9 i#include <sys/mman.h>
, j' ?! ^& m, [( I#include <sys/types.h>5 h8 {% j' d( o3 U2 v1 F3 U2 {
#include <fcntl.h>
( ^- x+ ^* I" l' L6 z4 L3 l
3 B. D/ K5 v4 C6 G#define SHAER_RAM_BASE_ADDR (0x80000000) , |4 O0 i* N. ?- S! U, d
. }7 G: S' N7 ^6 O! ^
typedef struct% m% K8 E* ~- r3 S+ o+ Z0 G
{( s F) R; O+ }* T. s) k1 \4 n
unsigned int a;
8 j& m! y# C6 ?' s4 o D" t unsigned int b;4 ?3 K- K/ y- b1 t3 O7 J& P
unsigned int packet_cout;
- p/ C* O; ?% N3 d; T! a" R/ u1 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- u2 c$ d' q# w4 M. z& E* `
, Q k. F. B& I' P% L8 o1 ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" h1 \5 w9 ~1 P
unsigned int count_copy = 0;
; L0 P, H( F' f' S: M" J
0 `7 ^! {5 v, A7 F8 e% B6 d( U
2 Q/ [! {, i( [, S/ ` mint main()
2 M* t6 `- L) S. G{2 Y; }; U9 R6 P) t) P
pRX_MSG_PROTOCOL pshreRAM = NULL;7 J( r( h- p4 Z% K1 b# R7 K
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 u- e: |( v9 N6 v+ u7 Y
1 R1 F7 J) c! m3 G6 s" Q" t while(1)
* @# x- L% t! U( Z6 x7 A9 y {6 a' J0 h! s. x/ \3 U: p9 b
read_MSG_buffer(pshreRAM);
! g. r9 |/ [( O. V4 j2 f } , N+ m4 m- @. M: S5 t% h$ n
}
: i( d5 }+ q0 n$ h- o! z$ }5 k9 `1 C; w, q' q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 Y9 H3 T% j7 R8 K
{
9 U2 J8 D; L. {8 o RX_MSG_PROTOCOL buf;' E. C8 v: j/ ^ s- `
; g q! V! @1 g. D7 P, ^" x7 S
buf.a = pshreRAM->a;# W: ^ _# q2 Z) O0 E
buf.b = pshreRAM->b;; P$ p' @- j, h u* R: Z; ^( J4 M* h
buf.packet_cout = pshreRAM->packet_cout;3 l: Y" x+ Q( C4 z& u5 h/ z5 J- U
% D) p! R+ X# N6 j7 }: G* T
if(buf.packet_cout != count_copy)
9 Q; b/ V X8 a$ Z L {
/ q& w0 A6 D2 Q printf("a is %d\n", buf.a);8 }3 X) w% x& p4 H
printf("b is %d\n", buf.b);
2 Y/ H' A& x' s) A# p printf("count is %d\n", buf.packet_cout);
1 u+ ~1 h8 z T6 }4 { count_copy = buf.packet_cout;
4 t' p3 p* Z/ i: A: a- f }
* K ^8 b6 |. ^. r. U3 h else9 F1 k, }/ l- l6 A/ z0 A
{9 v4 s3 R$ ?& V0 f" q
printf("No effective message!");8 u% O2 s) m+ b' Q
}
% r# f& u8 U6 a; G: N0 m+ M" B7 Y6 j}4 m( O+ o3 G2 \- i/ }
9 N: B8 P5 ^% Q' h; n, N1 T
5 N4 S! q* o+ s# j* x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 g0 b5 B! |( M+ ~: ~ E
使用下面代码,对内存使用了mmap函数后:- b7 p/ i* O6 P3 m% ^8 a2 m) M9 ~6 W
#include <stdio.h>) y l% y6 H: \( k; N: d
#include <unistd.h>
; f4 A" V4 ~+ J- y2 B#include <sys/mman.h>
( ^) d' g/ q3 O#include <sys/types.h>
2 C# J4 B5 C2 f. E% f#include <fcntl.h>
8 I0 E1 ]6 o+ D0 h8 E% _* |# N7 Q" P$ ]% e8 U
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 e& b- W! Q2 K" q# ^#define SHAER_RAM_SIZE (0x20000)
& v; W7 D1 Q- ?# k! V6 F) Y5 e( u- e% i; d) }& H" N( d& ?
typedef struct
* s- Q% i9 c) v8 }! ]3 d' a4 x{$ E/ L! P2 Z2 u2 v: K0 A
unsigned int a;& m2 V8 l8 J; V2 E! }
unsigned int b;9 p5 a! K& s' D) J8 n+ U
unsigned int packet_cout;
) |/ J# T# q$ @; l/ u7 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" `0 b+ l5 o" u% j; h* `5 {, m8 w5 p! H g& I' ~& B- p
void read_MSG_buffer(int *baseaddr);
: W& b$ f P: A2 X' k, g8 gunsigned int count_copy = 0;/ E# |: ~: v0 t6 h+ ] ^
' C% h5 a4 f8 O3 \0 G4 P+ Nint main(); I' F; Y' Q$ X( i5 j& w
{3 a* I' L4 s$ Q9 ?* u) l' n8 u
int fd;+ ~. U- C F/ o+ T& C
int *mem = NULL;
# o! V. A6 Q+ O4 h! ~ b+ x( E8 E* N
; E* w2 d: G& [) R, u; ]" \2 U if((fd = open("/dev/mem", O_RDWR)) <0)2 M) p' K" E7 t
{7 V+ L3 _, v) u& @2 A6 |! W7 S& E# X
perror("open error");. n4 i. V# S7 m5 l, U
return -1;( \' x; ^7 m3 O* g. I3 R" |
}
4 e5 u- h# K9 A ) `& ?$ o/ a# p
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 k6 h4 F6 Q& l% h' |0 X" Y" {' Z( G3 A" M8 z
while(1)
9 e' a" w, x- S3 W$ W& o- f1 W# { {3 K4 Y! K8 J% }/ b# T* n2 M
read_MSG_buffer(mem);# E! l4 ]% _0 a& R8 Y5 E8 m
} 3 D2 v* m0 K# {0 x j
}3 G0 T9 w. f, a, J" N3 p P# R) F$ L
5 Z& v4 |. w! i1 R5 G
void read_MSG_buffer(int *baseaddr)0 M) G. s% P4 j R' f8 ~7 a% [; m
{
- g# Y5 o+ { z3 x- P pRX_MSG_PROTOCOL pshreRAM = NULL;
' _3 f: @; ?2 g/ h3 s7 ? n% M8 c; v4 C N- p# c
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% a1 u% L- e& a, P- ^0 J2 e" r9 w( |6 _9 Q0 ?) W6 C
if(pshreRAM->packet_cout != count_copy)8 G0 X1 ?1 m9 _$ h& h
{
& M/ w, } F1 z. `3 R4 f. u3 r" B printf("a is %d\n", pshreRAM->a);3 T; w0 w9 Q$ q. l5 ], K
printf("b is %d\n", pshreRAM->b);
: G& e8 d* _ {: @4 t7 \ printf("count is %d\n", pshreRAM->packet_cout);$ T2 A. O0 X8 D+ f
count_copy = pshreRAM->packet_cout;
/ S( f' w' j8 l! N$ }; J& ? }8 Z9 ]. k% w5 B0 T' \8 `. z, ?
else- p/ b; x% M f
{
* R4 s2 F7 b# s- _ printf("No effective message!\n");
; j* o3 m% i' C( _# C& q }
( w3 H1 N" H4 H0 \) v}
0 c5 D- d9 {5 I2 O. i
) m4 K2 I: Q% y, q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 x3 ]8 c$ s- H) W
4 R2 N3 A6 n7 d5 P& _7 q( a" _0 U
( s/ `4 Z, H% F. N3 P; @$ Y7 I
1 t5 a e; e' L' R T |
|