|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 m/ l+ B0 j7 k/ U, k' U
+ l4 ]# p3 K' Y" o6 O3 B h0 qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, y1 p6 \- i* [- ?; \
#include <unistd.h>, w; U, N2 m+ f# H
#include <sys/mman.h>- F% }3 M2 q( `. M0 Z
#include <sys/types.h>' }- w4 Z! Y( M) {" ~5 \5 P m
#include <fcntl.h> X; Y) L4 y+ l% @' P
! [9 p* `2 U7 N# R#define SHAER_RAM_BASE_ADDR (0x80000000) * m T7 O$ V6 R" k: j
" Q! I7 C g- `" htypedef struct- _, @5 [5 O E7 }
{# e4 u) o+ n8 M3 v" _! e
unsigned int a;
" `. ?8 v1 N" X2 D: _0 [ unsigned int b;! u- d0 T" t* t( [4 ^/ d
unsigned int packet_cout;
6 E. d6 @+ g: V0 {0 E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ W+ ?5 `* E, U- s% u* F
) r I W& g1 j+ b+ Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
e( X4 ]' w/ _1 y" g9 f# Dunsigned int count_copy = 0;
0 B0 a V8 ~) u* B7 y9 B$ S6 Z
4 T3 e% c0 D8 I3 [; J" {$ C- R- `: G" ?8 h( M
int main()( z- a$ B% J; v0 n
{* V# M8 q' S" a5 Z( H$ N1 B( O% v
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 Y" |' `+ J x* m2 c( P, M pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 L3 [: j+ s: f9 y1 J5 l9 v
p; }% A% P5 l while(1)1 ]# ^. x2 H9 X" [% [
{- I! x* C: T1 |& P( G1 w
read_MSG_buffer(pshreRAM);
R' M5 j! ?' G' [ }
1 ? @' x9 c* ?5 F}
+ f( }8 r8 X. f& S6 B- h$ B* o) U* @3 p! F7 |2 x! C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' g- h( }/ c2 n7 U5 x* O{
$ l! Y* z+ k& S3 a, p) A RX_MSG_PROTOCOL buf;; B' h# t8 w1 I: r6 l
c% t# O) @3 f% b0 \( ?3 ] buf.a = pshreRAM->a;
( U8 Q" N( W' l. Q buf.b = pshreRAM->b;
. K* @) r$ K v) Q- T. |! b" P buf.packet_cout = pshreRAM->packet_cout;
5 t5 x: s: Y; g2 V8 T
2 v8 L& `. y& K9 f if(buf.packet_cout != count_copy); Q. v6 r- o: g
{/ _9 P) F6 R& R# N& s. f
printf("a is %d\n", buf.a);
8 C# Y% X- O# l8 R- o. T2 H" A9 `/ E printf("b is %d\n", buf.b);4 |0 O' i% [( u; w! Q
printf("count is %d\n", buf.packet_cout);
; G% T) a( U! j$ x( n/ W0 ]; t count_copy = buf.packet_cout;
( w' C1 j6 R; A7 T }3 u' L1 H% P7 v& k6 n: r4 R$ x
else5 ], M2 X0 Z: Y# H4 C- ^
{# t) a. j7 F" H. T
printf("No effective message!");! ^* E" i8 S: }/ l" u7 R
}- w3 j% {, |; C% \9 u' r$ e" D
}
) v# l( ~- w5 q$ N- |5 X7 q; Z' b- b1 o3 F% O% X
( h- A$ q& U" |8 |* }5 z- Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" k6 A5 S4 U8 r
使用下面代码,对内存使用了mmap函数后:
, U3 I$ w0 O: a4 A#include <stdio.h>0 J% Y5 N9 ~, l( D |
#include <unistd.h>
% A2 m. d2 j8 a# [ p#include <sys/mman.h>9 H8 V5 D8 j" ~$ e
#include <sys/types.h>& t W/ b" ~% Z9 j( }/ k+ \
#include <fcntl.h>2 W, l- c. @# e8 @4 G
$ P3 v! r, C1 r8 d" W$ x5 ]/ ^1 y
#define SHAER_RAM_BASE_ADDR (0x80000000)
) ?3 M8 B) \2 i5 f- r7 l#define SHAER_RAM_SIZE (0x20000)
! K" S& ]' S& z5 Z9 C6 { E' e* m7 a' {8 }7 W
typedef struct5 G- X: K* `8 v; e- U. k& W
{
2 \7 `9 A6 c4 g unsigned int a;
1 w5 J, ?7 z$ U unsigned int b;
' o! ]& ?# ^4 {' \. @ unsigned int packet_cout;
4 b8 W4 k1 P7 [$ P' t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! k- d+ j/ X% A3 j4 d+ S" H& J: C( X
0 v7 m- |" t4 U
void read_MSG_buffer(int *baseaddr);+ X/ r! l! l3 T) f
unsigned int count_copy = 0;
; M# d1 z4 g6 {5 |. P+ [$ i3 W" W- j2 B+ `
int main()6 ~$ Y/ \$ H/ L& B& s c
{. |; z. \5 n; F$ _$ j1 K- Q
int fd;, b' e; K T. k" W; d2 E J
int *mem = NULL;$ J9 E% f5 U& W6 _1 N. r. k
1 W$ b! Y) o" J8 o
if((fd = open("/dev/mem", O_RDWR)) <0) L3 s2 Z# d1 |
{
- O2 c% T& R7 Z" c$ F3 \6 O6 n perror("open error");
( ]8 W, [ Q& I- @' j return -1;
* o% T. L# K( o; g }1 [6 H' h' l7 E8 F; v+ g) r+ z1 f t& K
1 \* p6 }5 a1 T0 d4 E/ W! J0 t' r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* G+ e2 `( k( s0 U2 _
+ _* K. L+ Z( u' C+ o2 K( @
while(1)
; G& ]( F: s, G- j6 [ {4 l- v+ o- r3 S% g R0 @
read_MSG_buffer(mem);: v, q4 E6 j: x# p
}
1 ~, M5 v1 C+ A/ O1 \}
" A: S$ _$ Y- I
9 J7 N9 M- I7 ]+ Y( e) H" Y9 Dvoid read_MSG_buffer(int *baseaddr)1 M) ^/ i) B; v( Q* {
{+ w6 V6 p' X7 C
pRX_MSG_PROTOCOL pshreRAM = NULL;
; G- e& m+ a5 C3 y+ I# W, s/ _% }/ c4 S$ F q. N& @2 {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' l. m) z# @1 Z, f9 Z, {
8 E! B9 n- y: h$ ?! ?& S, U if(pshreRAM->packet_cout != count_copy)( u- h4 ]8 m0 a+ {
{ @8 ]8 G+ Z3 t3 f; r) m
printf("a is %d\n", pshreRAM->a);% `9 a/ Z1 t5 f( p
printf("b is %d\n", pshreRAM->b);
9 K9 k, p0 _* y printf("count is %d\n", pshreRAM->packet_cout);, E) N" c5 }' l5 Z! Y0 o
count_copy = pshreRAM->packet_cout;
( K" M7 _/ U, m$ V3 e& u& [, w: y }& F* m. d& U: Y8 i6 w) p
else# ^1 M6 Z6 F3 j$ _) g9 T, j _! h
{ g0 k, s! g9 _- m2 c
printf("No effective message!\n");
8 y4 U8 @' i7 s }4 x# i" l2 B2 s( L
}+ q/ }/ w! d! l9 n6 w# S
3 {! K. u) g, M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 K) B; ]" ~& Z- w5 e- O% D8 c3 Y
3 ~! C* O; S3 t* j' g1 a7 L
1 i( @' h4 m, p% r' R/ r
! M% X! U( ?5 k u* _# y5 m+ a4 K. c |
|