|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # B) C8 r$ r5 {4 I3 h8 P
6 W% `$ K& }! O9 ?( A. [1 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: t8 o k, ?1 k2 J3 \2 |#include <unistd.h>- I; F, _3 f$ @; y
#include <sys/mman.h>
7 @' B( j& @, U4 f! k- |#include <sys/types.h>
* p8 W% I6 b) |' W#include <fcntl.h>
4 y. c9 B' u- {( `* B4 p8 r* K6 z, F g; D6 O
#define SHAER_RAM_BASE_ADDR (0x80000000) ! M6 d, ~9 f# {& }' M
7 b' `9 d, z! O9 Z8 ` N0 S
typedef struct2 C M; Z# t; J2 w; o
{" {% a$ K1 n! F- Y" O- Q
unsigned int a;% J) i0 [) R% ?* s
unsigned int b;: g( l: T) v- K$ f
unsigned int packet_cout;, _" j# |$ t0 C9 ~# J% u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* c2 i( Q, \$ K# y/ t& Z
! ~0 Y) M4 I" ]6 H; d: R* G$ f& }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# L; ?3 ^6 z9 t; Aunsigned int count_copy = 0;% C$ H. q- f2 ]& R4 b1 H
+ S* A' T0 ]/ K6 b# f! A, w4 ], }4 n. w1 S: K* r2 H6 f! |
int main()
6 Z- R# m3 L! m{
, T5 h* V( \/ Y, g pRX_MSG_PROTOCOL pshreRAM = NULL;, K. A4 R; V4 \- O# c2 {/ c* \2 k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* G/ I+ O! l5 R
1 \/ J" x, p; A5 p( D; e7 N
while(1)
1 e6 l8 C1 i( K& g {( O( P* R* s* S% `+ M3 w
read_MSG_buffer(pshreRAM);- e5 \, }$ t5 i2 \0 O2 s$ d
} 6 r9 ?3 u% Y7 \
}5 }( H8 Z$ ]2 |' ]/ R
3 O: Y4 _8 M% E z" a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* K) H: J' \$ k" p, _8 n{$ s- J' q# W! Y9 Z4 e: `
RX_MSG_PROTOCOL buf;
5 T+ O9 W( I. h( Y
- k9 D) W$ D" ~" { buf.a = pshreRAM->a;
# W9 y2 S- X6 T! y- G4 U6 M buf.b = pshreRAM->b;
4 N n/ T/ C% v) g3 t6 s8 c+ B0 J buf.packet_cout = pshreRAM->packet_cout;4 J% r; W$ N/ ]3 a' \; ]& \
4 u4 c, m& a/ X# s% _; y if(buf.packet_cout != count_copy). @* w0 i1 Z+ E1 O
{
4 }" P' s' s2 r* k printf("a is %d\n", buf.a); g6 I+ j5 m' y8 ^- r- X
printf("b is %d\n", buf.b);
; b$ {* W# p; Y! y% K0 l4 R printf("count is %d\n", buf.packet_cout);
3 f; H- L# l3 p9 ~3 n7 x count_copy = buf.packet_cout;' I1 ?' s( B ]; S9 o$ |
}
& I3 B! g( W% R else
5 t( C2 f- I+ r {
; \" H0 V" p# H& I4 c7 m4 j* y, Z, A: i+ T printf("No effective message!");
2 D5 }; }5 [) a z }
* X# d r0 A/ r. [}; M% q2 ]6 H' R3 |6 P
_6 n0 y1 Q* e2 ?0 p" @! y/ v$ H3 ^4 y) r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) B8 U9 M4 v, y! g( g
使用下面代码,对内存使用了mmap函数后: x4 L, R% d* ]9 J
#include <stdio.h>
0 ~4 W" K2 L) c4 D3 W) @7 \#include <unistd.h>
, d/ U: D# S, _: a" i#include <sys/mman.h>
: ~6 H. N" k4 q5 ?* A#include <sys/types.h>
" a, V: i, { b0 N#include <fcntl.h># m U4 b3 p, V5 y
8 `5 z; r6 N4 ]4 g+ ^1 h T( ]$ E
#define SHAER_RAM_BASE_ADDR (0x80000000)' k8 t* g- z- p P9 {
#define SHAER_RAM_SIZE (0x20000) 2 I5 a! l: b2 l: y: ?9 f0 S
' Y% Q& n; P7 C* Ctypedef struct9 k' d4 u* p# G+ ?# v/ f
{
1 u% L z% `, Y2 Y& U L" u unsigned int a;
, g8 j4 e$ e5 [8 r& a. Y. z unsigned int b;" d) [+ k* y9 {7 v- K
unsigned int packet_cout;) R0 k# D4 L! U' w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" a. O, B2 D: c8 o2 p1 R
% T/ |6 P: x6 r4 o/ T$ i( ?
void read_MSG_buffer(int *baseaddr);; S1 G E8 d5 E, z
unsigned int count_copy = 0;! W' I. \# Y5 J$ j. |
* V3 y6 x, V& C& a: K! D
int main()
2 T ?5 k+ N( p* o: L{
, \1 q0 |+ }6 }+ D; n/ g int fd;
! \& i. t) Y! s7 y int *mem = NULL;2 q1 G6 `, Y' K6 g" ^
' G: F- V2 ?3 G& {
if((fd = open("/dev/mem", O_RDWR)) <0)
6 c4 x( V1 l) N* B4 G+ I* ] {/ X. T+ P: l, C) g" m, [& p& I
perror("open error");
' y7 `/ N5 P* P/ b2 [8 Q- z# S return -1;
) c; ^, G9 N4 R8 A }9 }& o$ ]" v" Y) N; m
2 o, `+ k5 H# u5 b1 M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! q& Z0 g, }" [- s- c) F
: m6 Y3 ]" J$ M r( H8 g; W while(1)( O5 L4 A& Q4 _" n6 ?9 v
{, @) d8 c$ \# W P7 ~' H& m
read_MSG_buffer(mem);1 S! [4 e0 L1 `& s, T* [
} " v" E6 Y$ {, r% {3 D
}
( z& K- @$ I' ?) U( }) h( h4 p6 Y5 K, ^: |
void read_MSG_buffer(int *baseaddr)
6 z$ ]! T. z: d3 n# L, S, x) s{
- C# \; A, n/ A1 o m- P) e; E pRX_MSG_PROTOCOL pshreRAM = NULL;% W$ S' v! f* ?, i) ?3 w* s' u% Y
! i8 H! D# \3 @ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 Z5 R/ Z5 x# K/ Y
, K: Z" r) z3 I- l9 [7 @
if(pshreRAM->packet_cout != count_copy)! P) ]) C& s6 A1 \
{' F2 _$ B3 t9 q( n6 S
printf("a is %d\n", pshreRAM->a);
~( {: ^( b+ L1 O/ @ printf("b is %d\n", pshreRAM->b);3 n d/ g8 ~; _' H, q- O) c
printf("count is %d\n", pshreRAM->packet_cout);
9 K4 ?/ @. `1 W count_copy = pshreRAM->packet_cout;
' l$ o3 y" X' e- o }
3 N3 b, ]; k' k+ ^5 |" c# r else
6 Y: }' o m& a {6 R4 _2 Z9 R% R/ z& ]+ l) |
printf("No effective message!\n");' b. H) r1 _2 C- w
}/ Y9 {5 m6 `$ [6 X. R
}0 {2 [3 e2 u1 w6 n0 A
/ p0 Q' o. U. [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- I+ Q. F+ @" p& P+ P$ L% A9 Y6 R' s
$ M$ u, J* E$ I6 m' |9 u* u: c
+ t& O- D/ s. ~$ M& a/ y1 D- U. `/ G: O$ D' D
|
|