|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " ~! i) l8 E& x" {
3 ~; b. q! z/ f! M Q+ @/ p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 _4 d9 P: u: M0 G5 }; |: V
#include <unistd.h>1 x: o& E0 R6 `/ W8 P' i
#include <sys/mman.h>: H( w8 E9 h- O2 D) V( G/ d' M+ _
#include <sys/types.h> ^$ s" f; I$ b. t7 L6 c& Q/ G- B
#include <fcntl.h>
# w( P; d$ [6 G) _
; v$ G# B# |6 p U6 ^#define SHAER_RAM_BASE_ADDR (0x80000000)
, j3 a5 j. l! s" }4 ]5 P# `6 c7 f: d) _
typedef struct0 K, L: u5 y4 Q
{
6 `0 Y$ n8 }6 k! t) b. F unsigned int a;2 T! t4 z$ e; U: S+ c% ? s
unsigned int b;
/ V( l8 z# O8 ` }0 S9 i3 w k unsigned int packet_cout;5 b, M: t& [& z, Z: E; q$ G6 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 C' u6 P) }- b# I! [+ {
9 y# y7 x5 j9 ^& Z! J3 b# Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# F+ k. X1 x4 ounsigned int count_copy = 0;0 A! b8 K9 l: V6 E9 ~) t' D" c
4 B: C7 I* B; M
* J& C. n6 s. A( a/ }
int main() T: k+ D. v2 d" d5 s; P( g& S( S
{
4 }. B, R# W7 Y2 w2 C4 o7 d( C! M pRX_MSG_PROTOCOL pshreRAM = NULL;3 r3 s9 ?- y. G6 Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: u, q& G* v# f+ W5 ]* u
5 T) P% C( ]) A while(1)
7 [1 ?* k7 [% ]$ [) { {
8 X( h6 |4 ?( s, U& A" ], } read_MSG_buffer(pshreRAM);0 q2 F( H6 w( D1 F/ s6 U. e+ Z
} 4 m. R1 i; c$ @
}
2 c$ D) ?; p0 h8 C$ _, B/ _8 R1 p. r3 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# v7 B( z) ? G6 j{
( e* z' ]7 k# L4 I& d1 n) ]6 x8 c RX_MSG_PROTOCOL buf;$ C: t3 h4 s5 c( Q) O! b
1 x! H( |9 ]% m: K. Q5 |$ g+ C buf.a = pshreRAM->a;. {0 P$ V9 |- n! a6 U4 D
buf.b = pshreRAM->b;
3 t5 q9 M6 Q0 v$ Z9 {2 o9 J5 y buf.packet_cout = pshreRAM->packet_cout;; F" u r; q4 ]6 s
( s. K" H6 r" [
if(buf.packet_cout != count_copy)
1 ], g& K4 Y) a( p- j. e4 S {
7 s2 I. K$ s: i; T5 Q' S d2 z printf("a is %d\n", buf.a);
( S, V5 r. n" {/ z! q* o printf("b is %d\n", buf.b);
. L' C6 b2 q' T* p, M, E printf("count is %d\n", buf.packet_cout);
1 Z) O1 A) j- P4 M# N9 t2 B count_copy = buf.packet_cout;7 l) G) e0 a+ |. u, M3 s) Y
}
7 a; m0 D! a4 Q. H6 g4 V else
' r+ q C7 W6 w" ?! j. ^2 d {/ k# [$ ] K" F
printf("No effective message!");
& Z+ K5 R/ k( ]8 j+ ?9 C3 f }
) r% i: Y; o# \( h1 p; \}
. V7 l: f" Z4 v* Y, [4 `" E& S; o; L8 z( r9 X+ J, |- Z
6 l& L5 C, e m% o/ p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 a1 I2 u1 K) [7 t使用下面代码,对内存使用了mmap函数后:3 D3 e) m/ W- R; X
#include <stdio.h>9 x0 |) t$ R/ p5 i
#include <unistd.h>" H0 d- P. u9 J
#include <sys/mman.h>
7 `4 W# w$ O" A2 R+ T. I" t! l# f0 U#include <sys/types.h>' L% L; b0 d% h) K
#include <fcntl.h>% q4 S$ N& U2 [: p; z
! i4 Y2 O$ S) B- k- F
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 J* O% o" W: n#define SHAER_RAM_SIZE (0x20000)
( Y7 a# [ p* r+ q1 `+ L5 r* Y! z
1 n: _2 K" e' \+ D! E$ [7 ^typedef struct; e: p7 g* @6 n5 o+ c' u5 C
{
+ y3 X( y' ?/ X+ p) s0 e unsigned int a;, X) E4 d4 E w1 S( v1 N
unsigned int b;
" C2 \7 A& W) C1 b) x unsigned int packet_cout;4 `8 x: [0 F1 D; p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 x1 e+ H( G* \$ x/ ?
. y, m3 r9 h8 v. b1 p6 Kvoid read_MSG_buffer(int *baseaddr);
; Y. Q; {' c5 d: O. ]) ]! iunsigned int count_copy = 0;
" y" }& ?4 x' | M: K: v, o$ h! O2 y+ E `5 `
int main()
8 I* n5 O# u X; j; G4 T/ N{0 e' }8 ~# U7 O7 w8 [, T
int fd;5 @7 ` |' G+ n0 X( I0 ?6 |
int *mem = NULL;( G/ F3 E0 T" r/ a
( Y- z, w$ c7 R' ]6 [ if((fd = open("/dev/mem", O_RDWR)) <0)2 K R" o# h" @- E
{0 M1 F4 n) k) [. v8 k6 O8 ]
perror("open error");. _( E/ C% M! r* |7 L! E
return -1;- Y7 I' \4 _8 K. X7 Y0 o8 Q
}
$ Z' Q& v. F8 [8 X5 s
! o$ ]- P0 e3 ~9 h/ h$ l9 f+ y+ ~; G mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 {- I* Q- M7 t# A' {3 `! L
6 O* M8 u1 Z' A while(1)
0 P! @6 v4 Q1 x {7 G+ A2 z' z$ X1 F, Z# f
read_MSG_buffer(mem);( f6 H2 P. ^6 L7 ?- ~2 x9 Q
}
* `4 k+ L2 ~4 F) F* H3 L}% j) Z D. i& W6 ~1 x" f/ Y
2 C) Q7 l* Q1 _! Z2 vvoid read_MSG_buffer(int *baseaddr)2 I1 t0 v. {5 b
{
t0 p# f* C2 N) ]) V- k+ k6 @ pRX_MSG_PROTOCOL pshreRAM = NULL;6 H' g8 ~$ m8 w1 O! H0 [+ O: k L
N Y- y( E, B* h pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) T& z) ^- ~/ Z2 }8 L
, D5 |: m* S8 X% A# q/ |% { Y
if(pshreRAM->packet_cout != count_copy)
& G4 v6 u$ a& G8 Q) y/ J! f v* c5 Z$ V6 V {
' N' W1 s) z$ V. t printf("a is %d\n", pshreRAM->a);
' ~; w9 R9 e1 L$ l" l printf("b is %d\n", pshreRAM->b);
8 K2 ?8 O2 a. q. U3 q8 J2 |& F printf("count is %d\n", pshreRAM->packet_cout);
. M1 L2 A$ @9 s: D+ K0 o1 y count_copy = pshreRAM->packet_cout;+ O) q7 r* T ]- v! Y
}, Q& l$ ~/ a8 H
else; I+ x9 S/ O# e# y: |( K: g7 z
{
) q- H# b% f; o q: n/ K printf("No effective message!\n");
8 M# c( j9 o. _# @- p }
8 x; s) z! ]3 {/ Y% A" {2 [0 C6 B$ l}
1 T% i% A! ~2 o* G& X2 C2 L* @6 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; a( C2 S5 b. I, k5 x( ?+ t
5 r+ V7 }9 b8 Y/ Z7 R [/ N
/ r% g" u/ ~+ H
6 s& P* E0 m6 Z4 e% o
. f: f8 K2 U9 h4 @; b$ R |
|