|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" |# y F, p- Z3 ~
, y, d5 D( V+ w! h4 U( H8 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 u/ v: q2 }5 }2 B2 }' K: b#include <unistd.h>
9 b0 X% Q3 p$ l. I0 [6 d#include <sys/mman.h>: l/ G$ y7 ]( r, H! U( r8 u
#include <sys/types.h>8 [0 ]+ x) v! s9 ]5 G3 Z
#include <fcntl.h>7 e. s2 C3 p- y9 `0 I4 M' a
- y% S# F7 e' T7 N
#define SHAER_RAM_BASE_ADDR (0x80000000)
; g z; Z0 E1 ]0 c, ~( ?( j* c- ^" o: r" n
typedef struct6 d% U# _* t5 l( ^* f
{6 \; z- ]1 t/ S4 ?; @! G% L
unsigned int a;
, K+ e& |( R5 R- e2 d* l7 x- a4 e unsigned int b;
" Z2 |% `! L1 c unsigned int packet_cout;% W) D8 T- U5 H/ X# g4 x* S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ Z4 y) O. `) E1 F% ~8 ~% n
8 Z( a/ p& t0 X' Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 E3 V) L2 @, v6 \8 o. q" ]" @! L
unsigned int count_copy = 0;
2 V; l7 ~8 E5 b( v
: B% t; _$ C) S9 K8 I! i
$ \- l' T) M/ U- {; {, n0 ? h% Rint main()" H1 T$ D8 x3 B0 k' i _
{
7 h' m, d, _; s. D pRX_MSG_PROTOCOL pshreRAM = NULL;7 X8 D+ M- r. ~/ S N7 I; x* \0 e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 a% { K7 b. }0 G" w8 K
K. ]6 \6 z4 D while(1)
$ _% o4 @7 a1 f- C3 q3 k* Q {+ h1 `0 m6 o5 F; z
read_MSG_buffer(pshreRAM);' Z0 |, u4 w0 X4 U
} 1 j+ ~' g9 x/ @' j
}
4 j, M, @# p4 o9 P7 K: R7 I
8 u/ m3 A |' B4 k+ L3 }4 k2 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& L2 q8 b. P' j
{8 I6 g6 G' M- y3 F
RX_MSG_PROTOCOL buf;
; f4 g2 A) a' v. ]+ N: P+ f7 y# w
2 H. F; X- J+ l$ t, }3 w buf.a = pshreRAM->a;5 i: M' N( K6 J
buf.b = pshreRAM->b;
8 S" W+ Y# q1 S8 { buf.packet_cout = pshreRAM->packet_cout;' f; U3 O: K! ~ S* l: |& g
9 k* g- q5 y1 M) P0 ~. F0 }* G& h if(buf.packet_cout != count_copy)# n) i/ z% w1 S% Q g) P4 D
{
2 N; A' q) `* m printf("a is %d\n", buf.a);
$ ?4 h* z8 p M+ h4 e& L printf("b is %d\n", buf.b);
5 F. }- n7 z" ]. Z6 N% F printf("count is %d\n", buf.packet_cout);+ [0 E7 \) M9 k, ?# j
count_copy = buf.packet_cout;
3 l) r$ ?& o' L8 f4 d }; \1 e- A2 w6 x' w* a6 n
else1 y% G/ i, J. N8 {4 N/ l
{
3 X2 Z" K7 a) F# Y' a printf("No effective message!");
9 `, q+ n6 y: t( v# V }* j2 _" u" D0 C$ {
}
' z" I/ z y3 z- c3 I& E" C
* ~) a2 d0 g2 F' \, ~
; X" _5 P: T3 ]4 n. r8 ~, c! F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! \9 U/ W/ o% X. v/ |; U: n, g }2 V使用下面代码,对内存使用了mmap函数后:6 d# L$ r7 m$ s
#include <stdio.h>
& q% ]% f- t3 s3 v. j$ h& [#include <unistd.h>
. U; ]! n6 F8 e#include <sys/mman.h>! z3 c: [4 Z' f! b) p2 S/ s
#include <sys/types.h>
9 u# x: V) I. h# B) x$ S% v" `/ U#include <fcntl.h>
; |% v$ Z! q- r8 X1 s6 H N0 ~# b/ \
( U& U5 a3 _' w Q& b. h7 O! I#define SHAER_RAM_BASE_ADDR (0x80000000)6 ~7 m; W% ?, Z8 z
#define SHAER_RAM_SIZE (0x20000) : @* V. I6 t& a9 B" a6 b( i
' L$ {. |$ @' R- P: w+ ]) {4 f
typedef struct+ T6 b2 \! h, g5 n* d
{
& V( q- H* T; F! ~) D& S. H unsigned int a;
6 M, w/ N' G7 r unsigned int b;
5 g) @8 |9 w B$ t. F3 t unsigned int packet_cout;, S+ }. m/ M9 i4 Y0 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
m' \* u4 O+ v
6 k: k' {; f; q- i( e. Xvoid read_MSG_buffer(int *baseaddr);
0 C3 T) l# b$ L; X' U# c: aunsigned int count_copy = 0;
7 z5 A6 F9 O+ d8 t# w8 E+ ^, m4 s% ~+ x4 p6 |/ t/ K$ G
int main()0 `( y1 R" E3 g# w5 F3 Z
{
! C1 v$ G3 j9 G5 }$ ~! _$ b( @# V, l int fd;
+ q% l' e1 |) l5 B K! a- j; E int *mem = NULL;, n9 P( y# ~( x, z* S' J1 n; J, J1 v" U
, Y7 i0 {0 l8 j. a) e+ Z( c$ ^$ p
if((fd = open("/dev/mem", O_RDWR)) <0)
# d8 q7 ?9 f# ~+ t, H# F {3 @/ @) o; k9 ?' I; ]
perror("open error");
3 N! X9 H/ ]8 X. c& O v" u- } return -1;
- r, v# p7 S5 `# [+ F3 X! S7 g0 D }
, s$ A2 C7 m7 B' P0 D 3 _' b& S' c4 [- n
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# @, b" C5 W; s# n5 L
0 p9 J+ K$ g8 T, n1 S, W' K while(1)
& ?+ l7 g" Q8 ~ l& }; r5 T' G! H$ W {
2 R5 K$ |/ p# X f read_MSG_buffer(mem);! L2 d" w% `3 I- P/ w: s9 T" R
}
4 P+ ]% p4 f7 B! c; p$ r}
1 @6 M8 O, _$ k- c
) t: L8 X3 N* i. Ovoid read_MSG_buffer(int *baseaddr)) ~0 X& ?3 ]! O4 \% t5 A
{2 P6 \0 z m+ p p
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 ^6 b2 Q9 J1 X6 j& G: i$ X0 R/ c- D3 J3 r/ J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
O ~3 }$ U# Z6 }( _$ T. f% C! F+ U2 ?1 |! h3 U! M P. m
if(pshreRAM->packet_cout != count_copy)2 l+ x! C3 M6 q/ q, ?& h) _! a
{
3 D; r( m& [; |0 ~( @6 W printf("a is %d\n", pshreRAM->a);
2 h6 v: Z. X B( b- U# o! h! q printf("b is %d\n", pshreRAM->b);
4 s& C0 D7 H, V8 J: s printf("count is %d\n", pshreRAM->packet_cout);
# a o/ U/ m0 R. `$ Z count_copy = pshreRAM->packet_cout;' V2 ^1 m& k6 @; w
}
% {% j/ z8 [8 z- e9 U* H else. l& q) ^4 r; K+ o7 @' p
{
! W' Z2 S: y3 P9 I# E$ S6 r, b printf("No effective message!\n");
/ k5 G: ^! p6 h v+ o1 d% V }
; M3 i$ B) g6 s+ w7 U4 O" g}, f) H7 A/ l% r5 o/ w
. g6 y" x) p- |& S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 P- i' `7 o z( W* l# t" {8 B9 H* k
7 ?7 t: N/ }* ?1 K9 w# I6 G
0 t8 x; t$ p' {% @6 `4 _: T' L
' f: k# w# g# n* k
8 Y+ B) j9 a5 j$ _. O |
|