|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( {+ v$ Z, D7 u! _0 Q4 z3 g; U
- f: H, q. N: a% |- rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 x, I: u5 g' Z% S( S* D4 @#include <unistd.h>
9 m R6 B& D% w) B#include <sys/mman.h>: O0 N q0 a- v2 F+ G9 L4 t
#include <sys/types.h>. v- i+ x, }$ Z) |0 T& J( _3 o
#include <fcntl.h>
8 h3 `, }- s5 B s o. {) q- J- N E- ~+ x; h! D* S
#define SHAER_RAM_BASE_ADDR (0x80000000)
( k, C& Z. X- V5 }4 D& w3 v `1 Z8 e
typedef struct
6 V/ R4 ^# _2 l& p{
* Q% |3 t6 F! O3 Y8 k unsigned int a;( r: X9 V" {: y) j
unsigned int b;
1 Z- j4 p% U$ r" F, I3 E+ V unsigned int packet_cout;
+ h& V9 H7 e) U- S' g0 m; P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) P+ f+ s }5 \1 u7 v) \( K w+ F. _5 R* I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 d4 `1 L; q. q& E5 H% Kunsigned int count_copy = 0;. ^& f6 p: Z3 T$ E/ i! J7 N! S" K6 k
, Y& `% B' Y$ _$ ? Q4 M2 w/ ^5 e9 x; v+ q& ?) Y2 ^5 u! z0 m
int main()
7 w$ j* o& {+ G+ A2 e3 n{$ M( D8 P1 x s' n
pRX_MSG_PROTOCOL pshreRAM = NULL;6 Y q3 ^/ V6 X( ~! d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 Y! V3 B) |2 C6 Q
$ t( s' d1 @) b' ~$ D while(1)
4 }: c. z6 u* q) D, A+ ? {( ?6 C9 l1 w7 w) T5 z* E! c
read_MSG_buffer(pshreRAM);6 p, u9 n+ ~. ?3 ~
} ) F5 j, v, v* i( c% P2 M7 U
}
/ o# i) I( F# L2 l3 ~
1 F0 [$ @. p. A, v( _ v0 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
Y& |6 M) c) [) r$ z{2 u4 F9 h0 V: @& S
RX_MSG_PROTOCOL buf;
, Y1 ~; ^8 T+ t: O$ ^+ X5 \
: w8 Z8 ]8 a! z+ Y; d! s4 S. x buf.a = pshreRAM->a;
0 B8 V" J* L3 Q buf.b = pshreRAM->b;" \ z7 ], @6 L
buf.packet_cout = pshreRAM->packet_cout;- M" N0 K7 ~1 \7 o# q0 I
) f! C0 l0 W8 |+ B
if(buf.packet_cout != count_copy)
9 P( i q9 L; F8 R$ [, {; u {
/ c4 l7 ~; \3 e+ f- g) u printf("a is %d\n", buf.a);
% s5 }( N2 X/ d- {5 u+ t1 s3 @( v printf("b is %d\n", buf.b);+ \1 N5 r8 l# r7 e; g
printf("count is %d\n", buf.packet_cout);
9 Z) p7 e5 J; X% `0 G count_copy = buf.packet_cout;' z) D$ k e$ l( A
}
. M& Z+ i" o& v+ C$ L" \) M, V else8 A3 s8 L; u5 g4 Z4 p& c3 ~
{
& A* s- F9 j! N7 }3 v; o+ j% y* m printf("No effective message!");9 |$ x- u3 @' g! ]* J
}% @: F3 x/ U% L; B/ ]) O
}
, G. K- c! k4 v+ n8 x1 X8 F% w+ G5 w* @" P/ E
0 k" @/ ?6 K3 _: B8 m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ |4 x6 q# `6 k$ c* I2 I* J
使用下面代码,对内存使用了mmap函数后:5 d N; m1 R' M- M$ S1 p: ~, P& m% f
#include <stdio.h>
# l3 u! r4 m) Y#include <unistd.h>
6 [9 @3 M1 f+ N7 Q#include <sys/mman.h>. [# Q. j0 S6 V% X. W
#include <sys/types.h>
, D( S3 G- S' p. q) U- D; v& O: B$ Z#include <fcntl.h>
# {# R/ c. b: ]1 k1 R
0 \5 y, @! Z6 h0 @8 q `#define SHAER_RAM_BASE_ADDR (0x80000000)
& Y2 W! b8 P( O& y#define SHAER_RAM_SIZE (0x20000)
7 o- P2 S. j2 w) ]* X1 D
, u: Z8 K! R7 b( m! mtypedef struct
& n c1 o; k9 ^" I4 j3 y$ @7 s{
T& H( q) ]/ E7 v6 ]' N unsigned int a;3 [* P& \1 D" n
unsigned int b;
# T: a, f6 ?( A, M1 H* @! b unsigned int packet_cout;0 z. Z/ K/ g; H% l; A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! ?2 x0 \2 h2 a$ e6 ?
1 s; }' `" \9 P# W1 y& l& xvoid read_MSG_buffer(int *baseaddr);
- g8 S b! d! Vunsigned int count_copy = 0;" K5 Y9 w. a! T b6 f7 l
! Y" |- w$ @" N0 g. \3 i/ ]6 |3 z
int main()
" D$ J- {2 y/ j{
0 \" s2 X w# F- j. r4 Y1 g int fd;$ s, c+ S1 L* a' Y* L2 q" w
int *mem = NULL;1 p+ U6 [) K" p6 \! u8 M
7 P/ n+ U8 R* D2 o( N% k* ?2 U
if((fd = open("/dev/mem", O_RDWR)) <0)
1 B1 T% ]5 E2 a* ?8 Z: x l* d$ E {7 F8 c/ t0 a" }# L
perror("open error");) `6 O$ U5 \- t, [+ |
return -1;& J0 ~6 `, I+ o( Z+ p! K# m
}
! H" J' }$ |3 \
! ]3 r* F' ]5 `( Q, K0 H0 e) Q mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* ?3 {2 Y2 Q% S' e5 S/ R L) S
2 G7 N" m* `$ {7 J while(1)7 f5 _# F# I$ N4 v. v
{# Q I. Z _1 [3 V. ~
read_MSG_buffer(mem);% W4 H$ z8 X: _6 ?5 {
}
) ]3 ^6 j' a# {}) T7 a( x+ `8 y" I- A
' ]4 `: w+ O2 t. A
void read_MSG_buffer(int *baseaddr)5 g u. M1 F+ b- f6 P: h; k
{8 Z+ ~7 I# }$ }6 R2 Q! @/ t; D
pRX_MSG_PROTOCOL pshreRAM = NULL;6 W* R2 U- w* N1 S
: @! ^. j3 e+ _* t$ M
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 E3 g0 m H3 f: D- Z9 ?& e" B* Y
- y& v3 J6 A* t+ ? if(pshreRAM->packet_cout != count_copy)
- J- [* o. Y' } {
1 M0 F/ X) E6 I printf("a is %d\n", pshreRAM->a);7 F5 l2 H; Q7 _8 O. M
printf("b is %d\n", pshreRAM->b);
1 h% T' r3 y8 {. @; P0 Y" t/ Y printf("count is %d\n", pshreRAM->packet_cout);
2 q8 Q8 V4 T0 }5 k% }% |% K count_copy = pshreRAM->packet_cout;( _8 I0 m; B: ]- ?0 o* \
}
6 J) V, ]$ o4 d- j6 {: ^ else
; [8 S# G7 B% ^3 n5 P) P# L {7 Q9 n9 Y; n+ K5 z) E/ ?5 v3 Q
printf("No effective message!\n");; ], c$ Y9 t0 T& B0 n5 a+ ~
}5 B$ {+ ?/ [/ S- E. Z, J
}$ ` f5 H% ?% f% O" P
% f5 L* y6 V" G8 w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, h- K% X& F" N. J* T" {% D
: m" `* }8 e# h w2 {, {1 s
( l, i: Z8 b0 E2 `( G. u" }" T" M5 z2 w; T9 L8 A9 s
7 c1 b8 v' A# C' h" F. O. N' Q5 x- o( k
|
|