|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - ~( n8 @7 S: V6 t& B6 E( U
- T7 G& z7 L z" H2 [& i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" a4 O5 s/ ` P) E#include <unistd.h>
) q# p7 M* B0 o! T; i1 s' A1 Y#include <sys/mman.h>3 j! }3 }( Q7 T/ l8 Y
#include <sys/types.h>' T% a! s6 m6 ], f- |1 s0 j' }
#include <fcntl.h>( O/ Z& {& P+ x: d' \
% ?8 ?) j1 F+ K4 s4 Z* E
#define SHAER_RAM_BASE_ADDR (0x80000000) 0 w6 ]# d1 Z6 m; l; G( Y
( ^) |- ^ Q' w/ z+ htypedef struct& f* v+ o0 |2 y% l
{1 S& @1 J4 a2 H3 e0 ]- s
unsigned int a;0 e6 f( f- U& Y8 m
unsigned int b;
" v3 T+ s, U; | unsigned int packet_cout;
% W5 ^, D8 m7 a5 q7 d S9 N& o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' [9 M5 W/ D) p. x+ d1 O4 R+ n m3 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 y% i5 q# X: ^8 c
unsigned int count_copy = 0;
1 Z9 S9 D# G* J5 k9 P' P
- K) e; I; d' ?: s, P& S" R8 F
" a' D6 O. y8 p' T2 _ Hint main()
! V" ]) n# m' G/ w S{; o2 a" [3 t% u6 P* b
pRX_MSG_PROTOCOL pshreRAM = NULL;2 L% c3 z3 Y# J! u) R
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" X3 R3 h+ @3 h, i- H8 m U; q
: J: h+ w: [/ j while(1)
" d5 ]) |+ Y9 \ a {5 H+ ~3 ?3 X8 A
read_MSG_buffer(pshreRAM);
1 s3 d, K B* w2 z }
9 z1 \0 `! C# J& k}% r7 ]% U1 [. `1 |
: N" m j- M8 r3 u7 n3 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 l) P4 y( ^8 d1 e5 O/ V$ q, p/ d k{7 _8 Q4 z, h a1 _- U' U
RX_MSG_PROTOCOL buf;
& _ \0 K" }9 q" G" o6 \! Y7 e4 p
1 @# L1 O5 e6 w" j% a6 Z4 \0 P buf.a = pshreRAM->a;/ R7 n( M* l! x% Q$ R/ u
buf.b = pshreRAM->b;; x9 s% b; Z. j9 r& z; K
buf.packet_cout = pshreRAM->packet_cout;) z1 e2 C+ P3 Q5 E$ c
\% J+ Y0 S; V9 {+ @3 m if(buf.packet_cout != count_copy)
% s) X" r0 c1 j6 I4 f {( E- z& f$ Q0 ?) |. I6 ^
printf("a is %d\n", buf.a);" @7 Z1 H6 Q( w- \( S
printf("b is %d\n", buf.b);
2 R1 J1 h# I6 X2 ?& { printf("count is %d\n", buf.packet_cout);
6 p' m C1 T T& q9 x, ]: w7 j count_copy = buf.packet_cout;3 g, U: a& U3 j7 r- x% H
}
2 r0 x) E5 \6 ~# ] else
1 r# J. U( P5 T1 @" m) S8 l, ~ {
, ~$ H2 ?/ Z/ O4 Y& l) }6 d) n printf("No effective message!"); s- r- o& _; {" o6 b- n
}
. L/ C! P: O5 |! b3 s/ g* \! J4 O}+ }9 v5 P4 h4 W
. U8 h; O6 W, _4 {# Z, s1 i4 h: t' G4 ?! I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 A4 g3 W$ ~ M) Y! E6 t
使用下面代码,对内存使用了mmap函数后:
8 ], m% v% `' d/ l/ J#include <stdio.h>
1 v/ f# ~7 G% W3 y/ m. [- U) `#include <unistd.h>3 U* k8 t$ @, g* s" ~% U
#include <sys/mman.h>' N& H8 G- p/ g. P+ S I. `3 |: q
#include <sys/types.h>, P4 O2 M- O4 z y2 h
#include <fcntl.h>+ @' A. ?7 P0 M) N
% d3 Z$ x; i9 X' Z
#define SHAER_RAM_BASE_ADDR (0x80000000)0 u# z8 [4 ^" z3 s' F
#define SHAER_RAM_SIZE (0x20000) y" L) {( i g+ u: G
' b" s) d' o) [7 qtypedef struct7 |2 T6 K3 [1 X& A
{) a: }8 k$ b) l* A0 c
unsigned int a;/ L F* B7 \" D: h) {
unsigned int b;
6 U/ S* W4 R- E. I% \ unsigned int packet_cout;
% V D8 [' m# W+ w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ a3 t# O6 o* P3 l" ?" p) j2 }1 p
6 W, j+ R' U( `- u) d. L# e: n% Evoid read_MSG_buffer(int *baseaddr);
) Z- X9 h: E2 U: j, Y6 z( W* funsigned int count_copy = 0;
& {& B: U- T8 Y+ F) ]5 T" h" Y
int main()6 s8 ]1 R7 i! z
{' T* g3 |0 d' {; _! a+ I" Z% `
int fd;: G! N; u6 s( O/ o0 n) ]
int *mem = NULL;& E( T# G1 G2 s2 e2 J2 s7 M
U% u f3 u2 i; P9 A5 z; \# r; T5 I if((fd = open("/dev/mem", O_RDWR)) <0)
3 k) v* g- i, M f7 ] {4 p- t/ g e# t; F2 f% w- `9 Z3 |0 Y
perror("open error");3 @! P/ x5 s; j. q! U x
return -1;
0 S% E/ k9 V4 I9 [/ b }
. }9 H3 J9 J( U, v! | 8 B+ X! e5 @7 f. h% H
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! ^, i! a6 I$ H o6 O0 i; c5 j! O4 z" e2 ]( R+ i
while(1)' {: M* X+ u( l' T0 Q+ d. ^) K
{+ {( l' C/ g) y* M1 N* |6 @) B0 `
read_MSG_buffer(mem);( e! W7 ]+ e4 j' M7 K9 [/ x; M
}
: o( U0 _/ b3 i. \- v- Q' O}
* t, t( v# T% a8 L5 V7 @4 h& g X, g4 F. i7 |0 y. [
void read_MSG_buffer(int *baseaddr)2 J9 j& m: ], L# W `: ^9 `
{
8 [, i+ j$ }) B+ _ pRX_MSG_PROTOCOL pshreRAM = NULL;
/ H' o7 g; F) ^$ x
/ ~( D4 z; h- ~8 l( M pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& I: K2 M& E+ P) d( Q; E8 U* ~9 L
8 u8 Z. x; t, p/ m1 m. u H* ~2 i
if(pshreRAM->packet_cout != count_copy). \& M3 X8 j; w
{
+ m7 A4 O0 V" s& c printf("a is %d\n", pshreRAM->a);
~' e0 w, r0 p" w9 B0 k* E printf("b is %d\n", pshreRAM->b);+ W! T9 H% f& @9 B
printf("count is %d\n", pshreRAM->packet_cout);* E9 P; B# p# T+ |( A
count_copy = pshreRAM->packet_cout;0 m: I0 }# j+ r" L) M7 s
}. `8 Y& O6 i3 y
else
0 x" S7 i5 n: X+ x( E {$ {+ W: I: Q9 j5 N" x
printf("No effective message!\n");
& A5 p* M3 Q# o( }! E: u; K/ m }
- y5 W% d$ Q v# \! L( M1 r5 ^}' T |2 f3 a% b" ~$ K& E1 l
. C7 v4 f& a0 a. c3 r- Y, C G, j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 ?' U" W$ N5 A
4 y u: d$ e7 X" S, A l) c" r$ P& c! k% o5 h# Y
2 t; Z$ O# k! i) f$ {6 R
% e4 _$ T9 m! ?1 H$ @' Z |
|