|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ w& F+ S- t! V
, U/ `; |4 w4 W) N! zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& l2 \6 ~: z' h$ f- I8 ?
#include <unistd.h>
2 y- t, P/ N% c#include <sys/mman.h>$ J# b8 Z( T3 q- u
#include <sys/types.h>
8 O& h, l9 e5 @. N# Q7 k#include <fcntl.h>
4 k$ z& q* O4 J8 s& i% F% m
3 E9 U$ C9 P6 d#define SHAER_RAM_BASE_ADDR (0x80000000) 3 m5 k& F& o9 |
) d+ P& U$ U, ~; M ptypedef struct, h& v1 d3 ~$ R' f5 d
{
! @8 b0 f, O- e/ }. u# i unsigned int a;! U* L2 ~' P$ l
unsigned int b;
9 x2 l E8 d0 x unsigned int packet_cout;
U: u0 B( j9 R$ O7 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 Y- `3 M3 O- P9 N4 ]
% I6 D+ ~5 {# _) @ |) o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 ?, }: T/ y( J: ~9 P
unsigned int count_copy = 0;7 _2 E+ n: W. a! Q0 s. [
" j2 y, |( G# p
6 t) `, h% L7 ~1 [+ bint main()9 c$ ~; l. _5 M& r% [
{* E" A: L0 J9 q
pRX_MSG_PROTOCOL pshreRAM = NULL;
: I) b/ r! u0 H) t9 l, @0 \- { pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( E2 u6 Y# A( i
7 A9 l% W9 D# Z8 f# W' N! F2 z while(1)$ E2 ^' Z3 m# u# S0 a# `; p: l
{( E' Y& Y. H% S, ?" {# a0 y2 y
read_MSG_buffer(pshreRAM);; V$ V4 [+ o+ K) D% ~
} ' G; _& ~, `! C6 @8 ]( t
}3 f4 i. s' u* u/ i" B$ k
" P" J9 s* C) V* g4 _) }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* x* P: U: c0 X. H* ]{+ l' f- D$ |1 V0 T3 O7 Y/ O
RX_MSG_PROTOCOL buf;
5 ^" J+ s+ `/ Q a" U5 M - `. n' ^: J/ J$ G' ~/ ^0 J
buf.a = pshreRAM->a;
& c3 R; j, g' L* {4 ^5 q: r2 E buf.b = pshreRAM->b;
a5 e1 E) h m6 F! M4 L buf.packet_cout = pshreRAM->packet_cout;
; ? [6 _: v. `/ { 1 R9 m# J: ]" V$ g8 q) n5 v3 J
if(buf.packet_cout != count_copy)6 n1 x( j+ w2 X) t. U5 C- Q/ W
{
; v8 y' a# O Q: {1 z printf("a is %d\n", buf.a);
3 W3 A) m. G1 f- L. O. g printf("b is %d\n", buf.b);+ w8 F6 k+ m8 u8 p R$ o A7 Q
printf("count is %d\n", buf.packet_cout);! \: P0 J$ d5 h* ?, l0 F
count_copy = buf.packet_cout;: P+ w3 F8 Y$ l, q$ m
}$ ?1 j9 B" H# w
else, C% R% }1 q- F0 U) J
{9 _6 h2 E1 f* o. O$ D5 V3 d
printf("No effective message!");: e/ t9 {" }; T( s5 F z
}7 }0 S; ?! Z! s4 ~5 ]8 [7 W: B8 e
}3 b/ b! U# w; ?- l2 V1 C
- [8 j: k4 y. ~" \ m" l# A' g2 d$ b/ I) C. d2 ]+ s( w) g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ `. P9 Q) {) k" }/ M2 L
使用下面代码,对内存使用了mmap函数后:5 r# `$ v; ~7 J- i! x
#include <stdio.h>
+ {2 @" c4 Y4 Y6 N! W4 T# C#include <unistd.h>
5 w& N6 c ]% R0 d( I. K#include <sys/mman.h>
) k. _& O4 b" A! N#include <sys/types.h>4 `/ y; ^' H( N* v) Y* J5 M
#include <fcntl.h>2 b- U j9 y5 d, _) i
1 z& V3 g1 R: n1 U a
#define SHAER_RAM_BASE_ADDR (0x80000000)
. e+ P3 J4 e l& A8 f, u#define SHAER_RAM_SIZE (0x20000)
6 f: a9 a: _; u9 U8 G
1 H* \4 a3 x3 Utypedef struct
4 x9 s% W) ^/ v" Y( m& R' m9 ?{
5 z3 @& b0 s% K/ N2 ` unsigned int a;& }' _6 Z, _: ~
unsigned int b;( o. v+ ~1 z V0 w) X
unsigned int packet_cout;
; B" h* T: ~; ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 m( a8 \1 H, H) u1 X
, K7 l+ L+ {. b1 T; svoid read_MSG_buffer(int *baseaddr);) w7 Z1 X) ^1 V+ A8 `7 g6 _
unsigned int count_copy = 0;
" u) V' e6 F0 v5 w9 U0 }, }4 O. Z( N6 s [1 q
int main()
4 L5 ]' d3 K# g{" N$ S( W8 r0 b3 ]; F
int fd;# ]9 d5 M; n( @% J
int *mem = NULL;
m! |% J+ r1 _6 O6 E Z( Z/ m- c1 e" ~# H3 H. K3 X2 u
if((fd = open("/dev/mem", O_RDWR)) <0), F# _! I" l, u1 z
{
. v1 t( {6 q. M/ k perror("open error");
* h7 r/ W& B# z. U return -1;- g7 e. c. U2 g( L9 P
}
# H4 X8 Q" _& N# S / T1 t# d% E. h! s& T, T q3 u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 \: K$ I2 I9 \9 w, ]" {- @2 A
- u6 k1 X4 T+ ]$ D7 o, R
while(1)
( ~( ?" E w5 W+ k1 L {
, j7 W9 T* ]( A) {# c% u( H read_MSG_buffer(mem);
8 x3 ~0 W6 T( L9 E; n' L* j }
9 r3 ? [0 u# s+ [+ Q}
1 |9 a: F8 ?) ~. r% |
; h6 Q2 t, ^& y. j9 ^ ?# V, gvoid read_MSG_buffer(int *baseaddr); X- z5 v$ q4 q+ M
{# l3 ~8 {; H5 u" d K4 x
pRX_MSG_PROTOCOL pshreRAM = NULL;. X3 g1 k9 S) N8 M4 j
7 V. s, m; q, j6 w# M0 r' |8 g8 q! O pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' U3 F0 p0 w7 R( U* m4 h! U
' a& ^1 R. f9 ~( ^2 b0 W
if(pshreRAM->packet_cout != count_copy); d! Q; _- c q
{: H5 D# S0 S( v9 T; y2 T$ @3 ?/ {
printf("a is %d\n", pshreRAM->a);; P# n# f; m+ I8 ]
printf("b is %d\n", pshreRAM->b);9 g8 C. J. T2 k/ F/ }
printf("count is %d\n", pshreRAM->packet_cout);
$ j) E. g0 e7 e. F% L count_copy = pshreRAM->packet_cout;. a2 L& r7 v7 V* `7 q& m T4 Y
}
; n0 S1 J& w$ E U5 K6 }7 { else
' a" ]) M- q5 X {" d7 Z+ m4 ^1 x; X
printf("No effective message!\n");
. Z; e, a1 n7 E- g3 e4 v+ U1 M: j }; M( S( }0 t) M9 `5 K% m
}2 M1 ]3 ^1 h( E: f& P1 h% d
' W" K2 [9 i- Q1 T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& C. H' R# P( @' K3 J {6 I0 p
" h- R; u; ?" S# |
9 V* U- j8 |7 x- R: i- \4 L
9 A$ t5 C+ B, T. c0 T* s
$ e% B F) u" h/ q8 u0 D" D' G9 z- R
|
|