|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: P+ R. G. ~. w# E" P0 V# C% ~& I1 E: C3 e% o3 n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, E' l% U. ~# F' Y( X
#include <unistd.h>
* ] {9 `3 F J- ^' P. G: I#include <sys/mman.h>2 Q% Y4 Z6 I, R
#include <sys/types.h>
( \5 E5 H; H5 M0 w$ N3 r% x6 H#include <fcntl.h>
1 |) z. T0 `" t+ y% B- a% w, M# `, z* m8 o% h- c: B$ d
#define SHAER_RAM_BASE_ADDR (0x80000000)
% K; J; u4 W/ p6 |. ?
: O' W4 S; V3 j) a5 p0 p- |6 I! Ptypedef struct4 U' d- v4 p( v0 }! j
{! n0 I0 _% R, l: I) x( q) @0 G
unsigned int a;
6 Y9 i, A3 I" S! O- V# r unsigned int b;8 D2 r1 S! E+ k
unsigned int packet_cout;
- S8 v9 s% |; }5 L2 ?+ Z7 h) S+ x' O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( X% B) u0 B( G, J9 `
5 V9 _4 ~7 q3 [! m: y3 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. |6 k8 f+ A1 U* H. Uunsigned int count_copy = 0;0 C" |( L7 I3 q$ Y* @9 n
& E9 y) | L! h! K8 q
7 Q. x l M7 k- f+ c' L* Fint main()
6 v: [% s' X0 ]0 E{
7 r) c) \ x8 r+ P J B# M* S8 n pRX_MSG_PROTOCOL pshreRAM = NULL;
! W+ }# O6 d' s# [# r pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( Q- _4 p* A3 v3 ]! F6 x9 j3 g* U( A; g Y2 u
while(1)
2 b V4 a( @: r6 s {
1 h/ ]6 S+ m [) H% H read_MSG_buffer(pshreRAM);
& |# K% u/ \; J5 M } $ K) u, m8 E: i1 d
}4 k' d* R, c" H1 D) O7 t
; R, r# S8 F" Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 g3 i$ z! i4 n{
& \! w0 }9 d' h7 K$ r% s) ], B! i RX_MSG_PROTOCOL buf;
, X; f) T7 X) f. u3 |6 j# K
0 H# }- ?+ i J& L) m0 r- X buf.a = pshreRAM->a;1 c1 j* L3 x" f
buf.b = pshreRAM->b;
0 _) ] D; G+ B4 ] buf.packet_cout = pshreRAM->packet_cout;2 h, o" u( W5 o( R- W
7 E0 }5 { ~) a% k* ~& i; C
if(buf.packet_cout != count_copy)
+ Q% s0 o& U2 m( Z3 W0 R+ X% H; x, ]/ W {
) v# {1 w* @/ N/ m- l% Y/ X, @ printf("a is %d\n", buf.a);
5 \( ]3 `3 P' ?' V6 E+ X: h' Z: E3 K printf("b is %d\n", buf.b);4 @2 \5 {% c8 ~) @
printf("count is %d\n", buf.packet_cout);
) H/ i9 R3 m/ k: X/ u8 ^ count_copy = buf.packet_cout;" c1 [( a2 G0 x# @/ X% G
}) Y/ x% `8 ?. `" u0 R, }7 H" B
else/ w5 I9 U- M2 r
{3 v5 N2 T, n4 q8 |5 S
printf("No effective message!");. J ^3 I& r. N
}
: D% ?3 v9 G _6 B3 Y9 ?}( S4 c! J" ~* c1 `% Z
- J, a4 F4 f T( R) s
6 u( m, B+ Z( p# ]5 a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' W: q# P1 v: X. }3 W
使用下面代码,对内存使用了mmap函数后:
& P8 e" A' d, k#include <stdio.h>( P1 d6 V+ a+ I# L$ v
#include <unistd.h>
7 A- ]" O8 l/ @$ v- j#include <sys/mman.h>
- A$ l) U& ^) y1 V P' w. c9 y# M3 G#include <sys/types.h>& d/ ^+ F! F$ O2 n$ M) j2 g; u! ~
#include <fcntl.h>; q i4 L/ `6 y9 e6 @) O
, o8 c& m& [3 s. m#define SHAER_RAM_BASE_ADDR (0x80000000)
0 a# a# [0 m! s) K1 J2 s#define SHAER_RAM_SIZE (0x20000)
' z+ \4 f! q% |# [3 _$ G1 b( E
typedef struct
& C: }( N! Z5 [* z+ d# u8 h{
, v, g, a8 Z& E$ z- d unsigned int a;
; E7 f1 R _! \1 Y unsigned int b;' ]3 w R4 P( t: `4 ^2 z$ _, ~
unsigned int packet_cout;# _% O2 e# c( n' Z8 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* O0 q3 @& d* G4 X0 y' |1 |
9 t/ E- [! E# o) o! v# n9 I' i4 h, Z7 s
void read_MSG_buffer(int *baseaddr);2 W/ J2 E3 d) W% {2 s. x+ J
unsigned int count_copy = 0;
1 m! x: |6 A# d
E, q3 h( y& z6 P4 e( ]0 X0 gint main()( h: }0 z" F. U1 E" J' s7 s
{
% N0 M$ m; w& S+ x( K. q int fd; I. x/ g! v# {& k
int *mem = NULL;
9 ?' f7 {. P5 p8 K5 P0 \! f% Z; v3 r2 ]: e
if((fd = open("/dev/mem", O_RDWR)) <0)8 Y4 m) B: L5 a8 \
{; I2 A8 f% q% `' H1 j
perror("open error");
- F. d3 s- V3 {3 E) u/ W return -1;. U3 p* c4 O ^1 K* l
}
( ]5 l% C: V. X$ t6 j9 r" X- ] + Z2 Q1 S9 N9 [2 D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' y; L6 f/ T0 U/ Y
2 o- J! U+ U$ ~$ g4 h
while(1)
8 z: R1 Z# W, L2 \; m8 @3 m {
+ R0 _4 ?' ?9 v5 G" r7 s! m read_MSG_buffer(mem);. d u& ~, T1 G- H8 X
} . v" |+ o! _* M" p6 v- f
}1 [( A& c- k2 H. z, |
- p. ^4 ~. m1 s: Vvoid read_MSG_buffer(int *baseaddr)
S. m8 P D! R7 g( D, ]{
" ^) g Z$ g0 H* z! m1 C pRX_MSG_PROTOCOL pshreRAM = NULL;+ |5 N" A) b% T" k2 i
s# C% W& d0 w* T" l: D- |
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ n/ m8 B4 ?' Q5 j
+ S; v2 F- C4 Y8 Y: u, q8 k
if(pshreRAM->packet_cout != count_copy)
8 B( J2 c. d6 M% K0 V4 D- } {4 ^+ ^- [/ O% i9 J" @# K2 N- ^
printf("a is %d\n", pshreRAM->a);
1 p! X) |: d) h2 y6 s, D9 H printf("b is %d\n", pshreRAM->b);
4 l) A7 n9 Q2 M, x2 C N printf("count is %d\n", pshreRAM->packet_cout);: m& s1 j/ f F I" k1 @
count_copy = pshreRAM->packet_cout;/ e+ J' Y7 |2 F! o) H' `; U! M
}# G4 ?/ u( U" Y+ y
else0 s0 p% Z; @4 Q7 f) X
{
# d2 G6 l" c: L/ B$ H6 j/ r6 H printf("No effective message!\n");, e3 N$ F* g( `- x( E
}6 K+ @5 T5 e( H9 u$ E
}! Q' T7 s6 u" M$ N
) y$ C3 C6 D6 S M. N3 K4 S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) g4 {* Y# \ V9 Y6 } W1 V! y. _" u9 T2 ]) y
% W% ~! l* P, {* k8 C6 U0 [1 I
+ ]3 K; l7 p0 j3 }4 b$ Z; Z {2 Y( c
|
|