|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! ]6 v Z5 h7 {( n/ V) F: N" [+ v9 J
N( Z) e: r$ x$ S6 V6 Y, POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* h! J. w" y6 \, ~1 L
#include <unistd.h>
, s7 h3 q: A" U# a+ K#include <sys/mman.h>/ |% T) N* T+ O! W
#include <sys/types.h>
0 p: K2 S: ^; K- U7 S#include <fcntl.h>
) X: o5 s, D! ]$ i, b/ c0 `2 `1 v& p2 p4 j
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 L5 u' T- Q$ p3 @, y4 w: t4 F! @/ |0 b/ v$ l1 O
typedef struct0 G$ h3 H, e, S! h9 e- `
{* ^/ H9 ], v' o- f/ \; g" E9 J
unsigned int a;9 D' u6 `9 ~. N" W2 Z7 E: J7 n" b
unsigned int b;
! p$ }- E+ J$ A; v, { unsigned int packet_cout;
, n$ }+ d! T" W {! P' w l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. s2 i3 B i# b2 S6 Y
/ _2 V4 Q% d5 p9 R( G! p0 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" E( k6 c9 q eunsigned int count_copy = 0;6 q- j& h! U& {# z- y! n0 j
4 ]9 z( t- u0 D. W
/ ^9 Q" J6 \, b
int main()( v- n" p/ E0 |/ T4 n; C- A! r
{
; w! g7 p0 m" d" ~) _- k pRX_MSG_PROTOCOL pshreRAM = NULL;3 [' z+ q+ s4 d6 l3 I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 a( ~3 [5 ^; Z5 T1 a @4 u
1 M. x* C) c: f9 w while(1)
8 Z6 d4 \- b' \* D# K: G( A {
3 `/ G& K2 R7 V' N# R& @- d( K read_MSG_buffer(pshreRAM);1 e+ {9 t$ e* J+ r6 w
} 8 B; }$ x5 q4 c, z
}1 n/ r. e; p5 x# A/ a
% O9 V& `7 Q5 P' Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! L8 H' A3 _% A2 `0 i. Y{5 t7 s7 R: k I* d0 Y) M5 L) Y! p5 U# b
RX_MSG_PROTOCOL buf;! j7 w" F7 G, m1 F% a' {2 E
# u% n' y% g# C: ^3 B
buf.a = pshreRAM->a;
1 i0 A- Z1 s/ n. N9 H+ x& M buf.b = pshreRAM->b;% p* o+ J' K4 E& M1 M8 W+ C
buf.packet_cout = pshreRAM->packet_cout;8 H( k2 k, c; ~7 c+ D( K& I: y
8 O- m9 G9 O7 m3 d- F+ {2 a4 W- g" {, L
if(buf.packet_cout != count_copy)2 j* |6 e+ }" J4 B
{
% I% g3 g/ U, [) p! U; Y0 K) {/ \- v/ K printf("a is %d\n", buf.a);4 i0 G+ @4 l G3 j F7 {
printf("b is %d\n", buf.b);
6 ?# g* x1 C0 Y) b9 N, [5 v printf("count is %d\n", buf.packet_cout);' `7 b; l# `) S1 {0 w, K* y; T9 X7 b9 p
count_copy = buf.packet_cout;
- v/ E7 C; |* Z$ q" P }
! ?6 g+ F J2 K7 Q else
' }3 T3 m& [' I3 l3 Q8 L) _ {7 N2 A1 v+ D4 A: B
printf("No effective message!");
7 b/ X" m( w+ d4 P$ i }
1 |5 P6 G3 [% g4 C( i9 x}
- N/ Q6 V% J# T- @( J# b; `/ n5 B3 w- ^1 q; _' a
9 ?& K& L/ B# X; d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 ~0 Y4 d) }/ @
使用下面代码,对内存使用了mmap函数后:. j9 B$ A0 d( G
#include <stdio.h>6 J+ i* @1 H! Q
#include <unistd.h>. H6 q* n, M7 w; B1 r9 a
#include <sys/mman.h>5 E3 h- \" E" K
#include <sys/types.h>
% i' `: E1 T/ }5 t Q5 T8 h#include <fcntl.h>
/ \% d8 m7 o( f9 y2 ~/ B
+ c7 e* i1 B3 K- i, ?#define SHAER_RAM_BASE_ADDR (0x80000000)
/ ?9 k$ r; {4 ^8 y+ Q8 Q, z: ~0 \2 o#define SHAER_RAM_SIZE (0x20000)
) n2 Z, ~7 {7 S! F- _, m) T: @* Q6 m4 R5 K! T2 e7 c* d
typedef struct
$ R- c6 P# t" g1 H- \{
- m/ l: \. f! H) f unsigned int a;. N0 ?0 o, h/ v
unsigned int b;
! N3 A) r- F; o+ d8 q% G/ G9 _ unsigned int packet_cout;+ a1 O. {* g. v! t. E, A2 F. H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 [' }8 [, N( P# N! Y. V
% n9 j2 ] c" N4 B+ z& ~; p0 gvoid read_MSG_buffer(int *baseaddr);
' J8 s# c( C% ~2 `& _unsigned int count_copy = 0;
% [+ J$ o" l; S1 p+ u7 w+ {- G' G0 |6 b2 f, W: e5 B
int main()
* `. i3 r/ S3 ]' M& D$ L{: I, i; |+ b2 C# F9 ]+ ?" P
int fd;/ y. f) }- d2 G$ \
int *mem = NULL;7 k% J# `$ ?$ \' b$ e: |* N& R! c
3 z! a3 p: `3 \, ]" \ if((fd = open("/dev/mem", O_RDWR)) <0)" Q+ H1 U$ `0 L
{) |: E: o! p- k
perror("open error");
) d8 x1 T% _+ O' O6 Y return -1;
_7 z% ~! y+ `2 j+ j( ]. M }1 D1 e) W7 O8 `+ p
: J/ F7 G9 ~7 A h mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' a' Y' G( \# K: B8 ^ D% k0 ?2 Z; V: h) N, |
while(1)/ Y0 a v1 f5 T/ {" O. v
{* x3 N& E2 w' s0 n8 C: W- T4 W
read_MSG_buffer(mem);! e8 V; X+ B' J0 ]2 o
} : }# O8 Y$ S5 u, j# b# {1 t/ |
}
+ @$ W, g; E+ ~3 l" A) U% i2 F$ o" e- e9 o2 J, d* ~
void read_MSG_buffer(int *baseaddr)% P) X& B8 Y# a( E3 j) H
{
Z5 [4 V0 D( W/ c& j: U pRX_MSG_PROTOCOL pshreRAM = NULL;* ]/ S6 e; k" N4 Q
f" D9 @2 h8 i* ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ X% K$ S z5 M a
7 A$ W1 \: h1 x: W0 H% [ P- n( R
if(pshreRAM->packet_cout != count_copy)
5 a8 w/ S/ u1 m5 k3 y' K; ? {
6 V6 T: i- ^8 X' s5 H printf("a is %d\n", pshreRAM->a);
* c; c/ {/ ~5 z. H; g+ H4 R6 A printf("b is %d\n", pshreRAM->b);
. u+ W* \+ P x# J, f, H% z printf("count is %d\n", pshreRAM->packet_cout);
1 y0 q* s6 W+ k% g count_copy = pshreRAM->packet_cout;
6 `/ a& r0 U7 ^$ m }
( N4 J) P2 _7 y- c9 X: l else
7 }) v, t8 q) i* J9 Y7 @- Y! B {7 c% V, c9 N/ r: Y6 o' w
printf("No effective message!\n");
- m, l8 S) g0 Y$ X1 i% S) i, @ } A/ T/ m- c% ]" R) R+ x
}
2 D$ F3 c6 y+ p) D6 F w6 J4 U9 K' [; C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# t( C6 r$ J& B( d$ v
" m. [, W1 o7 v' `: {# f; `; V D1 b
* p) z9 E) R6 z7 |7 r/ ^% A
! {- p6 h# l. s( a: j5 f" q3 L |
|