|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 `7 i, a3 G" L w8 F
" _, z' H& F7 H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 Y( u) \. r2 D& N9 ?) u+ ^7 i#include <unistd.h>* S2 C- C) c( u$ A. {3 u
#include <sys/mman.h>
0 \, A) \ M/ o/ ]; j( }#include <sys/types.h>
5 _% w% l- O# {$ ~; C, F+ z#include <fcntl.h>& }. P7 A9 h# S( b& J. [: d
8 j2 S1 o) a8 \( u( K: L
#define SHAER_RAM_BASE_ADDR (0x80000000) * m) G+ F6 S7 x
7 W7 U# P; E3 ~% h- K9 `+ p1 Ntypedef struct( I/ _0 }) l: T( ^5 y: Q" @
{
9 J+ Z" _' z/ @* u, ` unsigned int a;
; ]* E* t' o) E4 d/ Y3 [ unsigned int b;9 | X, K. u( y3 M, ^% d/ X
unsigned int packet_cout;
: J$ g' ]( y* @5 R% R3 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ u6 w. @) B v( H- V5 E
/ B; W. L4 k1 B d6 H. z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ G; x$ {8 u" h+ vunsigned int count_copy = 0;* m2 Z3 n& x, b6 X$ ]- w
" v# K( A# {1 X! R, v) L1 ~8 I# z& f: N- B: u* q) {9 @
int main()
0 S. P8 k( F8 h$ j% ?9 b{% ~ \# _* ?; t, O2 Q/ c0 v
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ N% |. c2 f) \ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
u: F) J* F n% Z& Y3 Q
# E5 y' `6 ~3 S+ M0 S while(1)
, R u5 R- j1 ^2 z/ M+ q) t4 l {
% n/ H1 {$ U! F1 K, F0 b! J5 n read_MSG_buffer(pshreRAM);+ V6 \5 S; w7 ~1 Y/ y6 k8 S9 ]( n% k
}
5 n2 Z( y1 J6 ^# C# w}" z* u# C5 F% l# n U% |
: Z! W& ~/ Y" R0 q' q- a2 d" f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 k7 ^' `, ~3 Z, \* ~: |
{
1 ^) d) L/ Q" a$ v& f' G8 K3 w% v2 H# H RX_MSG_PROTOCOL buf;
# v1 j1 T2 K$ _: n
& ^% Z. M& o0 a& W" v, J" x( K# K buf.a = pshreRAM->a;
* G$ R L4 s2 R( C" A buf.b = pshreRAM->b;
1 |( F8 o8 y: y* c+ d buf.packet_cout = pshreRAM->packet_cout;$ H* \0 e4 M9 H1 E* g, s, e6 D7 Z
, J8 N& A; n: \( i1 H if(buf.packet_cout != count_copy)! C: W, C/ L6 q' D# B- \: {
{
5 E+ T# x% }) W9 L; M# W: ] printf("a is %d\n", buf.a);
/ x$ ^8 Z& P! ?6 W printf("b is %d\n", buf.b);
* g; |& T2 x" f% V8 [& J& { printf("count is %d\n", buf.packet_cout);+ i4 X z" Z) n! u
count_copy = buf.packet_cout;$ P k6 F5 b: Q' }: V
}& w4 Z( k6 C2 t- y" a) G( D
else
- i4 E! R" V- B {2 h0 l0 H- g- \
printf("No effective message!");
1 [ C! @+ {7 i4 Q; C2 Z( C4 ` }
" p! B/ {$ B( f}$ J0 Z9 E, N P* y+ H: Y
# ~! N$ S3 i6 J
( q( u( ^5 A+ I+ Z3 @* i1 X/ e s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, z1 \ g3 E: F5 e" z使用下面代码,对内存使用了mmap函数后:
, K {/ V% f3 _6 N% u8 V+ j3 G( [% c#include <stdio.h>* G* C+ p) K: b" ^- a! R' S+ R
#include <unistd.h>
/ ^% b( `: ~2 w1 O* o5 P+ N#include <sys/mman.h>
& H( r4 f. x2 M& R#include <sys/types.h>' i" q* @: q- [
#include <fcntl.h>. r/ V3 r, ?3 X8 U. w' S
, Z' G8 _/ V. a5 k8 i
#define SHAER_RAM_BASE_ADDR (0x80000000)# ^( p6 _" i3 ?3 C n
#define SHAER_RAM_SIZE (0x20000)
! S% Y' |1 U1 i$ k% \) u, N
1 t# \: F; m) Qtypedef struct- z' ]% N# F d
{5 h7 N* b/ P2 f( f7 B H$ z
unsigned int a;
3 `2 h5 k5 b& w( S( J( k unsigned int b;* p3 l8 P, x& ]- e1 {2 D+ L
unsigned int packet_cout;
+ l, L3 q( H& p7 ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ k7 q, Y2 R- z$ l5 D0 C
9 m- K) ^8 _8 O8 z& c, l+ Z) h
void read_MSG_buffer(int *baseaddr);
' y, X) j% Y5 C% z; Punsigned int count_copy = 0;
* H2 X' r1 R8 A! s& y
A3 ?' C# E j0 X/ \9 rint main()5 e3 @, _ K3 x6 c
{
3 W. H# h+ W% U1 l$ G* r0 ` int fd;
( D! d4 V" }) H \/ D( Y3 \ int *mem = NULL;" ^+ ]5 Q. P3 a. `5 M1 |
5 ^+ E& J% |4 X$ B: i Y" Y, Q- C if((fd = open("/dev/mem", O_RDWR)) <0)4 ~! o8 {* D( M2 t2 N) ^
{2 K7 _6 x2 ?0 L: j3 g& K1 K* N" C
perror("open error");0 C" g7 U9 @9 ~+ `( b! g+ N8 W
return -1;
. j/ V" R/ A, V' `( \, O8 b. @ }7 u+ a7 |0 L& w. U
k' p2 X% b9 x$ L, {% E
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; i2 d/ {' Q8 k: G& F. e* b$ r
! C _) b! j$ U) ^$ U' a* j1 \$ v( V
while(1)9 g" w6 U2 O( w2 a% {. G
{) {2 ]$ E# b4 c }+ `; f& G6 M
read_MSG_buffer(mem);; c- l) L' X# `. ?
}
9 X- x; `1 U0 a2 s+ o}6 n( L9 Y9 C; o
) ]8 M) M/ d( d: `8 Tvoid read_MSG_buffer(int *baseaddr)
6 O- Q! T' G. h ^2 m& V{- d8 m, `8 [& D$ \+ _, ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ e7 B" ]6 ?, {) u0 i
( |) }5 X( P; ^- t pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; n5 F; x4 Z# b9 M. O3 e
; ~# L2 ^* }7 h+ S$ o+ @9 X if(pshreRAM->packet_cout != count_copy)
6 j( N W U0 B: [1 F {* B; |8 y' ]! S& D, b
printf("a is %d\n", pshreRAM->a);
L. {. W! j) ?; ]7 m, {1 r printf("b is %d\n", pshreRAM->b);
0 n' ^4 u2 y- G6 ~ printf("count is %d\n", pshreRAM->packet_cout);! w1 Z8 y9 e0 K7 E) U5 T4 O7 W
count_copy = pshreRAM->packet_cout;
6 T! z3 ^5 v2 J: I }! a1 V2 u" X: a9 m
else
' E! Y9 g* `% C+ X$ I- } {
% b: k8 V3 k; O0 W O) z0 g1 r) T k printf("No effective message!\n");
# S8 Q+ d8 @' T/ S }
& Q V+ j9 Y; F( Y( g, i3 u}
# I2 g- ?& B4 N9 {% s4 {; R. K! K9 x: j: A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 C" I$ C8 G$ G7 u+ ~% X
$ O7 e6 |, H: }4 y$ t0 \( E
8 P- b. |4 i- q
8 o! y7 s& {6 j' W6 j4 {) f- b/ \+ ]0 A* D
|
|