|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) ^1 x5 v# {3 e5 ~; |
* ^9 U$ o7 }! G ?) OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* N5 T7 f9 i5 L* Q
#include <unistd.h>& }, u" e9 n' B9 j9 s; K
#include <sys/mman.h>
$ i3 c+ n% }1 B. e. r! O; S3 p2 u#include <sys/types.h>
; j8 h8 y( X* J#include <fcntl.h>- N! ]/ e/ X8 ~5 u" @0 k* `5 ^' O
8 n3 D- Z- T3 }; T+ U9 C* b; L6 x
#define SHAER_RAM_BASE_ADDR (0x80000000) : j1 o" D" W* { b" F+ S
7 [5 P! m7 g1 k) S: ^1 ]typedef struct
7 q4 @/ R: A$ D. ^ d{8 v5 x1 t8 g& Q' E/ U1 v$ c
unsigned int a;
* Z" n1 C; V% e3 v4 D' y$ N unsigned int b;. t* K5 a& S$ d% C$ _. M
unsigned int packet_cout;
8 B7 k% Q* o0 _* Z7 f( b4 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# k1 E( @' l0 j' S9 D/ A: s! o5 ]- f0 p7 G+ X" C) ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) N, ^2 e5 m S0 |( k( X' A* `
unsigned int count_copy = 0;/ S( _/ D7 E) J8 n, p$ P/ r
( p% Q$ Q: A; ~* B# |4 V" L
8 P. f% m2 |! G1 ~int main()8 y- p/ j* K& Y
{, H/ |! E; V' [' _
pRX_MSG_PROTOCOL pshreRAM = NULL;, P7 u/ R6 g' o) k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! C* r9 a7 }; d' o& g0 X$ G( {! M9 o0 ~: g
while(1)
2 h8 [) D ~: u) j& A# R {
0 L4 R9 E' _2 o read_MSG_buffer(pshreRAM);
5 y0 |% q* C4 Y6 M# A, G } + x, G4 p1 U e) }# R! n7 s
}
5 X$ V3 e+ ^0 ?2 t9 w/ P- d8 b; M" t) [* }0 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 T" X1 |6 y' f8 y( T{2 Y$ C$ g7 {9 }$ ?% E2 {1 \1 o
RX_MSG_PROTOCOL buf;7 V: g: _- y/ U. g5 G0 o
( \6 u3 `5 o1 ~
buf.a = pshreRAM->a;7 f' Y/ Q/ ]! w$ w3 q6 W8 @3 I
buf.b = pshreRAM->b;8 i! j2 d7 C& T$ Z5 T' K6 Q) `
buf.packet_cout = pshreRAM->packet_cout;6 Y, G5 b& X' {' v, q6 R1 Z
4 E6 M* E9 f4 b+ b K- S* O* |
if(buf.packet_cout != count_copy)
; ]4 f- ]$ e$ [9 D& i4 o: ~ {
: F8 ^) O' F3 { printf("a is %d\n", buf.a);
9 a7 |( G- d8 l. J! K printf("b is %d\n", buf.b);2 |! H1 W6 w2 N! k. V
printf("count is %d\n", buf.packet_cout);( B; s% B% I( |$ j; v% {2 r
count_copy = buf.packet_cout;4 y6 \9 Z+ C5 S% f# C
}0 a7 \& _- [# v% x: |/ q- `
else5 u. ` G$ L3 H+ r
{
' v5 `" Y) \$ w2 s6 H+ g printf("No effective message!");8 X) b8 Y0 [+ B; x6 m
}/ G E3 z. S2 s' b. q _; M& ?& v
}. h: V0 x5 b! [/ W1 o
+ c- U9 N- Y6 x# E% q4 X6 }0 u$ Q6 e# U# y0 [5 ] B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; I R8 j, y: I6 K3 @使用下面代码,对内存使用了mmap函数后:
, F) `/ X5 z: E& v# h#include <stdio.h>) S; g) i, [$ N' U4 R, z/ Q
#include <unistd.h>2 s% a, a0 F6 C: ~9 w
#include <sys/mman.h>
* c4 I4 [3 P9 S/ \#include <sys/types.h>
* G9 ?; [3 q' d0 z! x#include <fcntl.h> {# C1 J2 \0 j; h2 h
" G1 l; N3 b) S#define SHAER_RAM_BASE_ADDR (0x80000000)
3 L( D' p- u3 a2 C9 m#define SHAER_RAM_SIZE (0x20000) ; U+ L8 c+ }8 a; |: x& x
6 J4 ]9 z" e# k6 e3 btypedef struct
) w, c4 B" ^% V/ P( D8 {{
7 s$ W! E) d; L' G2 @6 Q5 N: x unsigned int a;
8 {# m4 Q' J3 Z! M8 c# |" R unsigned int b;
- s" q5 a% N- C+ ` V$ N unsigned int packet_cout;
3 R, P4 K6 f5 E" w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& q. t% g% Q3 i" H- H b
9 N5 \# X7 H6 o0 ` qvoid read_MSG_buffer(int *baseaddr);- V, |2 l: o1 i8 A6 [+ c* x& O7 J
unsigned int count_copy = 0;" {; Z" Q- ^7 W3 q* a- e* ~) \1 R$ A7 j
# o! I% g* A$ c# C9 Z0 Y6 l3 [' pint main()
" Z, F8 M0 | l# z M1 c{
5 S8 o* {4 `! R4 j8 k: H% v int fd;
8 ]6 S% P* S/ d int *mem = NULL;4 S, K8 F y, ^6 a1 x; X
3 }; o* n- E5 C, } h, j/ v if((fd = open("/dev/mem", O_RDWR)) <0)6 n* r! d' E# l7 O' j
{1 i4 `8 }/ X' C. @! x
perror("open error");2 M+ t8 s: _% j5 h7 X5 S
return -1;) G5 w7 X( [( s! m% o
}
: p- g2 o1 ^: [. b# g$ D / t- I. C: t9 u0 F! O" S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 p$ O9 S r" n" T9 L) L. y
( W5 W3 H6 F4 v! k: i( _ while(1)5 p& w8 L) M. |, n9 N
{, z2 e# h: l N. x$ W# e0 L
read_MSG_buffer(mem);7 Z$ O1 \! L" I9 c' h7 D7 o
} - a9 {. p T- h$ n( e* |6 a' j
}7 G( L7 q0 B8 f$ `2 c) C6 U- X, U' h
/ |9 m3 `1 v* L* m: n6 t# V" R
void read_MSG_buffer(int *baseaddr)
0 E- d5 g5 t$ R& Z( O. F{
0 X8 m2 R7 q& E8 I/ C pRX_MSG_PROTOCOL pshreRAM = NULL;9 T9 s/ L4 F0 M) \4 l" i
: D! _* V2 t* e+ B4 I' m pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! v0 K- f" d. b1 @7 k5 m
& m- E( _0 j# F if(pshreRAM->packet_cout != count_copy)3 W' \8 j' ^) V& A3 [
{
1 E! z5 `" X% O6 c printf("a is %d\n", pshreRAM->a);
- ?; G& N0 H! Q printf("b is %d\n", pshreRAM->b);
8 x. G q- a4 h. l! q printf("count is %d\n", pshreRAM->packet_cout);7 ]8 X& O6 W. \# ?2 ~ [
count_copy = pshreRAM->packet_cout;
- A3 f2 X+ P8 A, d: T+ x1 \ }; `( g+ [* R3 @' S
else
/ @# E! n6 [% Z {
" y4 f/ U8 _/ h) H: Y' s9 D1 \ printf("No effective message!\n");
4 t# d+ r1 s* W }- M& I2 R/ P1 D' R* P: v
}
1 u$ L. P& R( i
, i- D, V3 @# u; C% {1 G/ L1 P# h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
v. \' E+ B' j, q' I
# x& q8 I+ I% q9 a( q3 ~) B8 I; h7 B+ p7 R, `( ?8 C K2 b: V& V
5 ?4 b+ s" b/ r
4 \) C* [+ }/ [' C* P! u
|
|