|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 P- t9 a- R: N) A+ }* A* u! a4 c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
M, S4 }. ~$ u9 B#include <unistd.h>) O; J" [5 o6 m2 Q- T
#include <sys/mman.h>
' o6 E6 ]4 x- H/ I#include <sys/types.h> m) A' ~! Q/ x7 R
#include <fcntl.h>
4 c, \6 o! x& @# t
2 i; }- `/ q- L#define SHAER_RAM_BASE_ADDR (0x80000000) 8 K, {* G6 Z' M" t6 {2 q
" l, c! l* r5 d
typedef struct3 ~! t3 ^ [- x" d/ V- b" h
{' |4 _1 {# Z, A
unsigned int a;$ R8 W* P q$ X$ b: }6 c* r
unsigned int b;
1 X9 Y& K [1 ] u6 y8 x: ^0 F; n8 j unsigned int packet_cout;( c' }3 A& l8 }$ B% a! G, z0 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 M# F+ j$ ?' g1 l$ i- |, O
& q6 G* O! a4 g: `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 \ N4 ^# _7 y* k1 Munsigned int count_copy = 0;# ~3 Y" r3 F+ w0 V* `
4 A$ s6 ?2 p+ p" j
0 n( C: @- z7 t7 ^9 d0 k0 o8 sint main()& X2 i" o' `3 S; b+ s9 x
{
# v3 h% k. i; V; } pRX_MSG_PROTOCOL pshreRAM = NULL;
# e1 k$ z0 R4 [1 d pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' B8 ^6 D, @) Z: e/ G+ r
) _; J. C* U6 g while(1)1 A0 d/ E. w+ \' m
{0 I! C3 a& Q5 C% X; L6 n4 e
read_MSG_buffer(pshreRAM);$ `2 f1 @9 c& V, ?: X
}
( P! x" k% Q$ X$ d0 }}
$ r |+ g3 U( c: r( B$ v2 p* W0 c! y: a1 D x9 A. G4 g" m* Z! h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 `8 @6 l7 i( x6 M/ o- u{5 e, I$ N* b- ]+ x" s/ W+ y
RX_MSG_PROTOCOL buf;
3 D0 F% U9 H9 ] ( D6 \; q& W- k6 L' e- h, U
buf.a = pshreRAM->a;" ^, p; M+ G& m# s+ ^
buf.b = pshreRAM->b;
; Y }9 H5 O+ D4 h8 U5 c3 t buf.packet_cout = pshreRAM->packet_cout;
' ]0 m: z* m4 E: r7 k9 P" `, {
8 K0 z* T" u& a1 K5 M1 n% v if(buf.packet_cout != count_copy)5 b! ~ m. V( A: Z, N% O- A( E& s
{4 F5 h: Z% t( I: b. ]! C
printf("a is %d\n", buf.a);1 W. G/ ?+ z* C% w
printf("b is %d\n", buf.b); j h- N1 h4 w0 x' m- H8 R% d$ ?
printf("count is %d\n", buf.packet_cout);
6 P, T7 O8 s7 O2 E$ h count_copy = buf.packet_cout;
& ?/ D9 c' c) z1 S$ |1 X) ` }6 q( s( R5 j4 V E
else8 L& F' t' |$ z- C
{' D& Y+ w1 t& ~9 B
printf("No effective message!");1 q) V, l0 J& o
}
! @/ w, ]6 A' `- P+ z8 R, J) m( ]}' p3 r/ K- R/ `
9 a: |, m3 \" ~$ V: D9 i0 n; t
% e6 w& C, _5 N( h! K& S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! E0 L7 h& H1 u2 N" N. j3 {使用下面代码,对内存使用了mmap函数后:
+ \7 L! V1 A+ @, Y: @3 E( w2 B# P8 H, q#include <stdio.h>7 j! d, E1 E, r0 t( T z, N
#include <unistd.h>, P5 l) O" P6 Z
#include <sys/mman.h>
0 R0 P- t; F( H) @' M. |' n#include <sys/types.h>7 r# C7 m/ J- i% V" \
#include <fcntl.h>
1 Q- t6 _/ ~; n, X' [5 s: z6 ~3 q0 Y) M: P4 n& E( o
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 Q T" s; L2 s: i9 v$ Z' E#define SHAER_RAM_SIZE (0x20000) . g9 ^' M0 h4 V _2 j+ C6 g
" v, C, v& a, c2 X8 n
typedef struct K" \- V9 e, c, ~; z
{
2 g. J7 X# N9 I unsigned int a;
* z/ I. G9 h1 L2 e unsigned int b;
$ l% U7 c# K$ j% E5 i8 F, S8 u0 y unsigned int packet_cout;
" v/ o" b9 N1 ]' X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" r3 b! ~) S r) g* @6 X5 Y4 w8 I K
void read_MSG_buffer(int *baseaddr);: D6 T+ Y2 K* [# B6 N" x
unsigned int count_copy = 0;! D. r- |4 L& x9 r
: G) \" G. e* b/ N' n
int main()
$ @: }' n2 q% u& w7 ~{* p3 e! P9 s6 v0 G
int fd;2 `2 X: x, e6 R, |* O
int *mem = NULL;; I' d3 p' v. C; J) y
- g. U( E- |% ?0 P/ k+ ^ if((fd = open("/dev/mem", O_RDWR)) <0)* z6 \% Z% i E$ N
{9 `7 n) j, n+ l
perror("open error");
) u- i' f. k, {6 q" B: k' Q+ F4 U return -1; u) m; Y- z4 X D/ D$ P
}
4 w, r1 \' O: w* w! M, K7 h ( s9 {! ]7 z7 H" M9 r0 x; H: F1 R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" ^. p9 h: ^' f- e
3 v: e1 J6 c2 }) N O while(1)
4 }/ ]5 e* P/ ~* p2 O: J {
, I8 i' A- ?) Q" N- N( ~0 ? read_MSG_buffer(mem);3 c- V, m3 ]- ?1 j" p/ h
} ( h: E+ g4 A C$ U
}
- B6 N# m U+ K' r4 F
|* L3 s4 i& g; [ A( v* Mvoid read_MSG_buffer(int *baseaddr)' R. g& V8 e+ L7 M8 n
{$ |, s* I5 p/ U3 O
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ q' z8 z* G- r) k- b
) Y8 L4 q2 l3 {4 ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 M4 R5 y1 U& s4 y. k1 Q2 h
2 O( P: u: I: x7 u5 E( m0 ^" R
if(pshreRAM->packet_cout != count_copy)
# h* [5 i! A* f! w0 X6 T% v5 n {
8 u" D/ ]6 W6 J/ p5 s printf("a is %d\n", pshreRAM->a);
& L! `3 a5 |( S- B! c printf("b is %d\n", pshreRAM->b);% W% m1 Z5 d1 J# S5 K0 r1 ]) K
printf("count is %d\n", pshreRAM->packet_cout);
# `6 C4 h% `. E+ N4 O( n2 N0 _ count_copy = pshreRAM->packet_cout;, S# T6 F- T) y |5 E/ U
}
# `5 Y! R8 r2 ~5 ?5 S: c else X$ w8 W0 {" D, j! i: j7 f
{: J4 T5 W7 n! F- B4 T
printf("No effective message!\n");4 }/ m4 V4 ]8 k9 u
}
2 F4 y, Q) w) h. l) A}1 t6 o# R5 T$ n* s4 V" _
* |! [! c% ]! J' D) ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ u! e$ H P% L( r( z: n( |; _, U8 c A/ E2 f: c" D
" I8 O P; F6 d6 L3 V# ]% B# w0 z. K6 |1 M
" F- P- ]" {- o
|
|