|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( I. T4 k+ K. h8 B
, _/ f6 s/ V8 l D' f+ ]8 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ V& b) }4 c6 P q; C
#include <unistd.h>7 }6 J. v- J v: A+ g. P3 s& Y- r, O
#include <sys/mman.h>
2 B% \! T, y" t3 Z#include <sys/types.h>
\" u* P% V! s0 w#include <fcntl.h>, s% j: t- J* [
$ o: v9 C+ ], Q0 m
#define SHAER_RAM_BASE_ADDR (0x80000000) * O6 ` {" ]( J2 p
' d! c- l/ I, P8 @5 s' F! c, f
typedef struct
! J/ \8 z: n# W8 B{
* {! ^- d8 `% m, _8 q: P9 n unsigned int a;
# ~! @: F8 K$ Z unsigned int b;
/ s* { W O r$ K unsigned int packet_cout;
$ @. m1 S! `* [; b6 M: p7 g/ W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( r/ X! V; |6 o( O! ]
: k: f1 O# z' ^8 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- b2 F+ ?9 v( C* ]4 runsigned int count_copy = 0;
z' @6 M! ~9 A- Z. i
3 _7 P4 j2 D w! S0 i& I A; t4 }+ f0 f. B E7 S7 a7 d& @
int main()4 `$ E4 u: ^, T6 Z Q: ^! j
{
" O& c5 f c$ j pRX_MSG_PROTOCOL pshreRAM = NULL;
$ D1 v! [4 z/ p! n# m& X pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ I( k( P! u- T9 h' L& d+ p: @, d& U& e* b1 }
while(1)
K4 i& Z2 t q) o {
8 j" T G+ ^8 u. R- N% m3 S$ p* y read_MSG_buffer(pshreRAM);
/ X: I7 o( t. k; C1 D }
) D- }; q# f0 U2 J, g& M8 F}4 t2 s6 U- a# {; f- _
4 }6 h( t0 |* d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). ?, m G+ O- }2 t% v
{- D; {9 T( L1 ^% j* b
RX_MSG_PROTOCOL buf;8 B5 r7 C# O8 Q$ a
) F7 B" t' k, K& w' ]# i5 { buf.a = pshreRAM->a;
1 D e' S7 Q3 B, E0 |# }3 o: j buf.b = pshreRAM->b;" v: a& Y5 { O
buf.packet_cout = pshreRAM->packet_cout;
- ^# q6 t) `" ^0 y
/ D7 Y! e3 [! ~6 c5 C9 p2 g if(buf.packet_cout != count_copy)7 [# ` [. d% N. E( G8 f- j" D6 |$ Y
{; [# R4 M, Y9 j! \7 Q6 S/ V' D; A
printf("a is %d\n", buf.a);. K" }' R& K8 ~* k+ G( r% Y
printf("b is %d\n", buf.b);
2 Y& s# x, U) D6 q printf("count is %d\n", buf.packet_cout);
. x% u# m; p3 b" |" D e4 A count_copy = buf.packet_cout;
9 C( b" R, _) ?( A7 ~+ u8 M }# U1 p8 J5 }6 r+ }
else, h5 Q7 K5 h( g/ u8 f5 V8 M
{
- u/ m2 |4 t% c7 T) c8 \ printf("No effective message!");
) o% j! y! g9 M, ~, o' m, { }
, {3 [$ E1 [) ?6 B N6 y% ?}- j0 M0 Q$ O0 A" W5 ~& \( t. p( O
3 _. U! U8 k% J2 v0 }
* k& Y. F4 g+ r9 J2 v! d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 @2 e' Y1 k7 ]- D
使用下面代码,对内存使用了mmap函数后:* o) d1 d+ t) [7 Y/ z( ^/ q+ M
#include <stdio.h>* E- \, v' t0 c
#include <unistd.h>
+ W" ] {! X$ U x5 R#include <sys/mman.h>% a% J- A0 h* l$ v
#include <sys/types.h>0 Q9 A$ z" @' k8 S! D
#include <fcntl.h>4 P* p, c0 M* X4 x: D
$ \/ Q4 x. k2 z4 Z2 O
#define SHAER_RAM_BASE_ADDR (0x80000000)% _% j3 n! Z9 \ a9 I
#define SHAER_RAM_SIZE (0x20000)
" _& p! C8 y; g7 n- K7 Y& t" w, o! ~- J' z4 N+ U
typedef struct8 Y: A4 c$ K8 ]5 c" g! R
{ L) H$ B6 w) z* W ^
unsigned int a;
; }) f% t; T; @6 z* e/ x$ V4 s unsigned int b;
. q; b! ^- Z% r unsigned int packet_cout;
% s4 ^. p6 v5 U; c: L( {- v9 h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 I4 T7 z: u N9 b6 M8 |* }8 \: t2 B' `6 G5 x; x6 M5 d
void read_MSG_buffer(int *baseaddr);
& _8 s; P- M* [& [unsigned int count_copy = 0;
, b3 y& a1 v/ O# h+ P1 j
& }1 c3 }9 a, `1 C9 z0 K( pint main()% Z$ a& |0 B' ?, m' N! n5 e2 I
{- l) E" }! u, P3 L
int fd;- k* T3 L2 V1 n3 M5 G
int *mem = NULL;
+ d1 z8 [( r! ~3 r$ }1 b) I5 G; N- `0 E3 ~, q& ?( n# y
if((fd = open("/dev/mem", O_RDWR)) <0)
% L1 i$ k* q$ C0 S3 ~ {
2 V* Z4 \, S+ x2 S perror("open error");
y) i6 Z! M% G7 l9 p9 j* L return -1;2 }/ n8 Z8 w" t
}
! u( e3 o, S+ X2 G% R, U: r ' q4 C$ o; i3 v+ }1 p
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ A" ~1 d f' h# c4 l
% s9 z0 P0 W4 k" S0 `
while(1)
' |7 l) F% v; ?8 J7 R5 L8 d {
6 D. F0 h: b% H z- r, |, ]+ j5 ~ read_MSG_buffer(mem);
6 W* I; [% P$ b+ h }
1 |4 D! a, k. q}
8 q# M3 [" i; b5 X# j& B! Q8 T# F% I
+ P/ q0 [4 t* ?- l5 } \6 Mvoid read_MSG_buffer(int *baseaddr)
/ D$ F9 a" J: l) Y& y5 B3 U8 P% J' d{) {2 u1 f8 N7 Z; k% |
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 m7 d; F8 e2 z, d, t# K2 a0 j8 d" _2 `- t# K _) F$ R1 z8 c
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' {) Z/ ~: r }2 d
+ T. v) B" m7 M2 y0 `* L) t if(pshreRAM->packet_cout != count_copy)
' g$ R2 t3 m* {. ` {
4 |6 @- [5 Z/ W# z# m$ S% F; Y printf("a is %d\n", pshreRAM->a);5 F/ @# K; b e
printf("b is %d\n", pshreRAM->b);
+ S. ]" F. o: H printf("count is %d\n", pshreRAM->packet_cout);7 X5 T0 V: j, T/ ]' s( S* j6 z
count_copy = pshreRAM->packet_cout;: {8 X/ E5 f6 B
}
( W* d% \0 P8 z, L; j3 [ else
0 }8 p0 P( |2 B9 H+ N$ O {3 @1 f1 u/ Y. W
printf("No effective message!\n");
9 S1 r& b. o" ]' P* ^9 P }! ^4 E/ V# @) w4 o( ]$ X
}
3 p- I- S$ ~0 H! Q+ n& ]+ ~! _5 I4 ~. R$ p) m B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- v r# D Z! v2 ?
! d/ M$ F# s5 s! G; K
u: `; B# |1 h$ J9 V
1 Z2 b( E2 ?* f( H; C6 w4 @; b4 t! J) I# h3 W- e" N; V
|
|