|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % _ A' h4 V; T9 b: y; ]
( F2 \& X, B3 r9 S5 Z7 |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ b# R* p! P2 Z; C. {' g
#include <unistd.h>. n/ U# z4 h; o* X8 j* e
#include <sys/mman.h>" O" S5 d2 M, e: V. Y7 ]
#include <sys/types.h>! G3 I5 p: d0 x$ E. s, x
#include <fcntl.h>
) a! V. K% b) x5 X! E; V" ~: r
) ~- c) U2 ~( O+ f5 k0 N#define SHAER_RAM_BASE_ADDR (0x80000000)
$ z6 @3 O3 Z; V5 I( V3 a4 h# C: h8 y- W7 s; Z5 M$ e
typedef struct
; ?7 G1 X+ d I8 z# E+ k. P O{
, G5 `6 T% a3 n- `4 |$ z5 J2 t2 K) y unsigned int a;
& L$ g, ]1 c7 N, [9 Q; | unsigned int b;
. X3 t5 i' L' L! y7 n7 l unsigned int packet_cout;
8 B4 ~$ X# L/ g, z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 ?# O" o9 Y8 C0 E' c" U
1 p. }0 h |# C* R, N/ kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 ?9 c! X0 ^0 S2 _ I6 l
unsigned int count_copy = 0;; J; J, E7 H0 X' L- O( |, j
" q+ M" O9 n. J. G! L
~, Q' t/ A& I0 [0 U6 V
int main()' D* X, b3 o7 ?& U$ a& R; U
{
- B. J9 o4 G3 L9 j( b' l! c( x pRX_MSG_PROTOCOL pshreRAM = NULL;0 T; h# ]' e3 Y; H3 i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 ]% T7 p p" s% T* @/ z8 [1 j1 S0 v4 U0 J q" q8 w# N8 \2 ?: o
while(1)4 {. R& P) b/ w+ C! T
{
: `3 i7 }$ F+ M+ z4 ? read_MSG_buffer(pshreRAM);
6 o6 W, Z+ R9 N7 \: p9 b } 9 b$ y Y+ E$ g$ @# V+ |5 p) O
} K. v# K. D" M# X/ |6 y
8 t; i$ A* n8 q F* T! L- x9 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). c& |/ j1 _+ I$ W2 k8 a9 L
{
; G. n$ W5 B$ x$ J6 }! P& P RX_MSG_PROTOCOL buf;1 a: Z& K2 U9 x; A8 `) o: J3 ?
% z% {* w3 a& m. J/ F4 R! i3 a
buf.a = pshreRAM->a;
$ n0 @* w6 L- p% l buf.b = pshreRAM->b;" g, [+ e' e6 n. Q7 g e
buf.packet_cout = pshreRAM->packet_cout;
% |$ x$ `/ ^# `
- e0 f4 z& F8 r if(buf.packet_cout != count_copy)
9 A# R6 ?7 [! j# H: J: m+ G2 U {: w/ o9 X7 j+ G7 r% f" F/ a% H
printf("a is %d\n", buf.a);
4 T4 A, k" _: g: r printf("b is %d\n", buf.b);: I: _( J E/ z3 H
printf("count is %d\n", buf.packet_cout);9 i7 l& J$ B# C, s! D
count_copy = buf.packet_cout;
* z) C* {9 U8 h+ N }
. n3 e& v- v6 L, f) H% D6 w" H! f else
4 V, K; z0 ]7 q8 G7 s6 D) i {
! Y6 e: ]" d& b! B- F1 Y printf("No effective message!");# k3 G7 k' I1 f/ d" Y( \, ~7 B
}
( }& X* e; h3 T2 O. f. C}/ o) d: d' b; U: g$ E5 h5 k
3 M* z$ C1 \# G: Q3 o
# M& }# x* g% m6 y2 D- ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! q# X6 _& i" v% {' w$ h; \+ b使用下面代码,对内存使用了mmap函数后:, @8 Q f/ z9 c2 |
#include <stdio.h>& u( c- I4 C* D( ~- ^
#include <unistd.h>% y& a1 r* f7 b
#include <sys/mman.h>
/ }5 w8 G$ N8 |6 R0 u#include <sys/types.h>/ L7 i p4 M1 H8 t7 G
#include <fcntl.h>0 O9 z1 j; L, d1 |' X$ A9 j! p
2 c6 E" [/ i8 W7 L8 e! b, a! N5 ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
, X1 h% a, V4 N/ |- r- D#define SHAER_RAM_SIZE (0x20000) 8 F% n9 f: g0 D% _# `9 u) U, Y
% h/ Y& ~7 `* r3 X; V
typedef struct' r- Q# p" ~6 M7 w/ f
{
# S. T2 Z# {! f unsigned int a;
; j5 c1 g6 v" C2 k# `) M unsigned int b;' F1 o+ o- y, `
unsigned int packet_cout;( k& r. \- f6 i& H% L6 _) X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: N* q& t5 o; I m H1 C- q9 {9 H8 ?8 t4 N; R
void read_MSG_buffer(int *baseaddr);0 y2 o5 c3 M8 o. _+ N
unsigned int count_copy = 0;
5 w+ c8 j% n( S) a+ |0 u \0 s& E/ Y
int main()
: f* L" j( O# L' o5 ?4 w0 H{
7 `9 J }9 w# O2 K" q ?/ S- ~ int fd;
6 q% i' z6 d9 b) j/ t0 Q int *mem = NULL;
: T3 l- j) T8 {. y/ v9 }7 Y
) N) M( u3 e: [: E if((fd = open("/dev/mem", O_RDWR)) <0)
/ x! n; G( Q: R" `) M {
9 e. R. Q. _( ?% s) Q perror("open error");$ F C: f% m. U M) t
return -1;
4 j" @- o$ x% r# [5 g; B, [/ a }
& G4 k, h7 ]4 N; {: E# T6 S& ?" P & b; t* s# W5 P0 C; C+ n; k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( N, p! I. d0 }! t v* t! M d, d. u/ _" @! Q5 w9 q
while(1)2 l+ |! g0 U. b3 G7 y) r# O) O) t" ]
{& }6 C1 ^! f6 d8 T
read_MSG_buffer(mem);
- e/ A. X; e: F8 x' f: d }
! {# U7 \( K, H; X9 z}* a5 m, J* i. {. j6 j, V
/ w+ E" h! }- `0 u6 Mvoid read_MSG_buffer(int *baseaddr)
4 |0 e- n1 w1 i/ @6 D) H{
' v- r) q7 o! m6 c0 f6 t pRX_MSG_PROTOCOL pshreRAM = NULL;
5 C! f9 s( m! b7 v6 ?( y' [* ]4 k7 W; ]( U; P$ `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 E! f& l! O$ u4 l" H+ O
. ~: a: ~/ u5 A6 p* A# A, c if(pshreRAM->packet_cout != count_copy)
" a4 ^! y- V; a& K& ^7 X9 i# `% e {
; ^0 \ r* P- R) N% r printf("a is %d\n", pshreRAM->a);2 m. Q$ o8 V4 _5 J
printf("b is %d\n", pshreRAM->b);- p" ]1 Y2 z* k4 N0 o/ `* ~5 j
printf("count is %d\n", pshreRAM->packet_cout);
- Z: J* O' F) ~' }* w& z count_copy = pshreRAM->packet_cout;# h ]$ S# ^6 h% y, r) @+ L d
}
. y' I, I: {$ p% ^ else, X) U1 U. v$ y7 D; f R
{
# _. U2 l6 \% i1 P+ H2 [ printf("No effective message!\n");
. U9 U2 I% R1 a( F# J$ o }
3 _# m: ~3 b. P# K! o/ n* _1 K}7 R! Q3 ~& F$ W! M+ g
V( |% {! w" r* @" g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) d% ^! I6 Z, G9 O& s1 w$ V/ L* v& \% F, X+ f. X% u+ f
; f5 t' d* K7 \4 W9 m: f
4 _/ a; F' X7 j) G% H3 B# }- x. u1 f3 T0 Y
|
|