|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! |2 V) n2 C8 K, C! d# F
& ~. n7 H9 s; E' ^; c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- Q3 v; S& f" x! J#include <unistd.h>" t& ^7 N1 Z7 C3 Q
#include <sys/mman.h>6 }% g% K/ d ^
#include <sys/types.h>
4 P" U) f- Z, O& S0 K6 @9 }5 L+ N#include <fcntl.h>
9 S4 Y1 v4 e; h j& Y
& r1 N: _1 E" c) p4 K#define SHAER_RAM_BASE_ADDR (0x80000000)
* j4 N2 j) Z% ^1 \
/ D6 [$ b8 B: I. ?5 ltypedef struct
$ J& H" P2 k; h" I; q$ y- L{
( m: K6 P2 q: {/ f+ b6 C+ S unsigned int a;
5 y7 i) K/ B S unsigned int b;
" ]8 v0 G7 i1 \6 j4 B! S unsigned int packet_cout;
% t- B. {! t# Z! l0 m r3 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. v2 T' J- K) D9 J1 K: |1 `
+ A2 ? h6 A. y9 @% F, m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) y7 A/ }. B N2 p' q$ r% T$ S+ O, Sunsigned int count_copy = 0;# S9 w& R% C! i9 F8 E, j
8 J0 I4 Q9 } g/ n- n
; {/ x# J }% } V" c) ~
int main()
2 H. q/ _1 y6 _5 J* G' q& P3 D{8 s- X* [7 Q; l- i6 D1 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;5 H( Z" e: B' y2 V# N2 Y; V n
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( K* `8 W# t1 _5 C- T! Q' v# Y
/ @1 y1 Z5 y. N! G while(1)
' k6 i0 T& ~) b8 e Y {
9 f+ j3 B$ {: W read_MSG_buffer(pshreRAM);
( ^% a; N" v; B" A }
+ e( C; _! ?1 Z& }6 [- {}$ Y* e& q6 M( O
* \% _4 c' a& r. Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& ^' o& b4 c o+ c/ @6 `7 K{5 u6 ^4 @: o8 e! j
RX_MSG_PROTOCOL buf;- b4 F' n0 r. {9 ?) ^3 g$ `2 ?+ u' s
0 _; {+ o/ q, T" [( T
buf.a = pshreRAM->a;
% d3 G0 S8 ~( D buf.b = pshreRAM->b;
# p/ [) K6 K T buf.packet_cout = pshreRAM->packet_cout; D# k/ x1 F/ F W
: R6 S: c3 X/ u( R" H( J if(buf.packet_cout != count_copy)
4 G( u7 `) V! u5 d7 O+ b6 ~9 W {
$ i9 e2 a8 f) s) |2 e6 T: L( C6 g printf("a is %d\n", buf.a);
) u" V' i" W" ~% t0 h3 G) w printf("b is %d\n", buf.b);
% V# m: g4 A+ _8 \7 Q printf("count is %d\n", buf.packet_cout);
' i5 t( g. c' n; Z. m# T count_copy = buf.packet_cout;) a$ Y% t: I g* S3 D6 I! F4 O
}
. h5 j# t, L8 L6 c- M- M else0 x8 \2 v- T/ Z$ X \& S& [5 G* R* Z
{
1 a# T5 ?$ c* Z# y' X! N( R printf("No effective message!");
- Z, u) b" G, |: ^$ m6 j }5 o4 q2 l) j( ~$ n" J/ X( C' T( ^
}6 d( T" U0 _/ u, |- C+ [! @! t
" g( B1 t" y- [/ {: ?% R0 u5 z' V) S Z0 A+ w6 N8 ]- t7 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: M) o- X3 B/ b+ f! }1 a$ L# }
使用下面代码,对内存使用了mmap函数后:
6 o b( l" t4 R$ k. [1 p& w9 y#include <stdio.h>
" M3 L: O; L/ Q7 m/ i9 q( M6 P#include <unistd.h>
i4 H" t7 y& {8 h( V( o/ a#include <sys/mman.h>! @& L2 E4 p/ ]
#include <sys/types.h>/ C+ Q1 }4 M! }' P+ u8 b
#include <fcntl.h>0 V. Z5 |* b. J( u9 R2 p
6 Y, d. _+ w4 V/ S' k6 G, B
#define SHAER_RAM_BASE_ADDR (0x80000000)
* L1 X- p$ l. F8 }2 t- `. |1 ?4 F#define SHAER_RAM_SIZE (0x20000) * \' P# v* R* i+ Z+ P4 ], O. y
; }6 ^9 E6 j3 o! L. B: V8 z
typedef struct
7 v; Q ?4 V3 d$ P' P* O6 l/ v' W% G{. b2 B7 K5 k' @
unsigned int a;% Y; G A9 {9 f( t
unsigned int b;
3 _! i* ?- A. m! ^- R* N unsigned int packet_cout;
" U4 ?1 j2 m( {% ?. m/ I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
~% `: R# |% g' V: D9 P5 s: h/ T) I- O6 P1 p( _' Z/ M& i
void read_MSG_buffer(int *baseaddr);: I) h& E9 E9 e0 [% K$ n' F
unsigned int count_copy = 0;: b0 f0 }6 A, P( U
2 s3 R/ J, X" v# r* b' J' x
int main()0 v7 a' L6 }' m
{
2 A F5 i% v1 V1 l( N1 ] int fd;; x% L4 o2 z' C6 i' [
int *mem = NULL;
' B4 P. y; }- t. Y; g. u- j: Q+ w) _7 g/ m7 \
if((fd = open("/dev/mem", O_RDWR)) <0)" Y1 S* K; n1 |8 q' @0 ~
{
( O, E7 c' q7 | perror("open error");
4 Y# a( ?1 ^ Q! k. s9 W return -1;
0 F5 x) e: w: v' s }. |2 {! s; M6 m% _
6 S" J# B' R, P% ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. K% c2 A& ~- r$ N+ t5 `: I$ N0 ?9 H) m4 d) D3 @
while(1)& l$ [+ {/ R1 |7 n0 ?7 F# e
{9 B/ x( e& B/ y3 F1 h& U
read_MSG_buffer(mem);7 H( w) {( ] E3 a$ T: v
}
" q) x) y8 o9 d' g/ j}- ]9 ?, \( w* M6 M
. e: C! Y: B% b+ D6 q; I1 cvoid read_MSG_buffer(int *baseaddr)
) N4 I, N& H; Q& T# R, F& [{/ H3 b% S7 Q9 A1 y( M6 B
pRX_MSG_PROTOCOL pshreRAM = NULL;7 x/ e- k7 O* }& j( S
7 i0 p, @7 n# o4 W pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 w( X Q/ F" h" X6 E3 s' s
" s1 V0 U; \$ P! s; y. z if(pshreRAM->packet_cout != count_copy)3 k0 j* M$ s9 W. c2 ~9 v
{
' |# P# N/ ~# V7 } printf("a is %d\n", pshreRAM->a);
# ^" a, k( e7 q. ` printf("b is %d\n", pshreRAM->b);# @ [- ?, t% w
printf("count is %d\n", pshreRAM->packet_cout);
5 b/ b. Z/ H" _) j# P8 u8 d | count_copy = pshreRAM->packet_cout;7 {: ~# j9 Z6 W$ D: \* y O
}
. i1 Y! M( Q5 P) c else e2 Y+ r }# _) k! L( l
{# {, P' E; Y+ ^) N0 k
printf("No effective message!\n");* h! E; p5 `- {; |
}" L6 @9 |, t9 |( L# d/ G- S3 J
}
F% J$ j8 Y: m5 n4 j
: _8 t3 O2 y1 D/ e D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; D+ h# x& r6 c( T' ?6 }7 k/ N
' d @0 @/ A8 g2 |# e. j8 t( h
/ e8 P, h* e6 P: C
2 Y- _* O) M! Q8 A; o/ M8 L
% M6 U% O m9 {* J |
|