|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : T2 T9 T% [5 H7 W9 G' ~- O
7 Q1 L: R5 e. H+ D HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% [5 \- y, M( l8 C& c: l4 B
#include <unistd.h>
+ P) v8 I2 T4 y( l. i' K#include <sys/mman.h>" V+ }3 ~* T' z9 U5 o9 [8 f2 M$ ~
#include <sys/types.h>
9 o% W# T" D8 T9 Y2 _#include <fcntl.h>' a3 T8 F( m; `& }1 q" s
! m, y D4 ^; F* l#define SHAER_RAM_BASE_ADDR (0x80000000)
% a) U2 T* H7 @6 i# h- z! q
0 Q( Q0 @# g {: h% p! itypedef struct4 X" ]- |: S$ S# i# A& i
{
, Y' X( R2 m- J$ B3 j, N unsigned int a;6 ?0 Q4 e8 ]% j" X9 e
unsigned int b;! u, R% m M7 B: D
unsigned int packet_cout;# A) f. F: A0 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ y6 n3 A1 I% \3 q
% H* g( E8 \6 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. Q3 g$ o, o! L9 ~4 A( G
unsigned int count_copy = 0;1 G9 g, s0 ^: R/ @
8 n+ i4 U% U0 [/ ~# k2 p. c: B9 q
% W" d# {" D3 o" rint main()6 g. |4 a6 b0 Y
{
8 g, F( a/ N6 P9 } pRX_MSG_PROTOCOL pshreRAM = NULL;9 V1 C3 N0 v* t$ ^% f1 H3 M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) x( D4 @1 i% p; K/ J( K7 l7 X |- s
! C: `1 b t3 k( _& i
while(1)) `, Z$ F2 ? r& Z
{! p- S$ a, D- j, ?+ q: j1 i0 T5 F
read_MSG_buffer(pshreRAM);
/ T2 g7 L) F: a: P# Y8 h% ?% w' ?5 G } 8 o# S c% y4 I" W% j# ~
}
: I4 S3 s9 Q4 W% s- [& S6 ?7 |9 m) e/ V7 k0 x8 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- E1 r& S' K# e{3 Q' n7 B2 B; B( I4 q# k/ s
RX_MSG_PROTOCOL buf;
$ i" O- b0 H% A2 Z" `5 i9 W5 h
1 j. S4 ~; J. t- U! Z4 g1 I8 U buf.a = pshreRAM->a;
/ i" {: N" R: K2 k' Y buf.b = pshreRAM->b;1 ~) o' i& C4 E3 R/ b0 ~) n1 t. s
buf.packet_cout = pshreRAM->packet_cout;; Y1 W* P) n) `* I4 v
$ Q5 a; [# d5 @: v: W% f if(buf.packet_cout != count_copy)
0 K. x L1 y7 V( W {% d/ O6 A0 G8 _7 A$ }1 X; w
printf("a is %d\n", buf.a);% r# u7 c/ I4 F' c3 m; Y# ?
printf("b is %d\n", buf.b);
& M. y6 S: e& A+ h printf("count is %d\n", buf.packet_cout);
! A" M' w9 X, \; h' g count_copy = buf.packet_cout;
5 s# w' ~3 b( A }: K( ?* c7 n0 G: ~# s& ]+ A
else
, L# m* A. i. g {
% a; }/ }3 P5 A! e printf("No effective message!");
0 i9 C% N7 e$ ^ }
; Q5 d. y+ C4 d}# n# q/ D$ u: N
% P$ G1 N8 X- _* D% h0 l. u. D# T6 n {# i& Q" G& v' [. c4 ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! a/ O5 G: q* S2 Y. L使用下面代码,对内存使用了mmap函数后:- K* c" |$ T/ A$ p; d2 y0 f0 X
#include <stdio.h>: |, m: C9 u& u% E
#include <unistd.h>. u8 Z1 S3 Q: Q4 b
#include <sys/mman.h>
4 R) u# F/ L% s, _' ^# p* `#include <sys/types.h>
8 B& I+ u6 u& Q( B+ ^8 L8 c#include <fcntl.h>: x6 M5 b; G; y8 w
# X5 o+ Q! s# a& k U8 U#define SHAER_RAM_BASE_ADDR (0x80000000)
- i6 @* Z- t# J9 w" \* I* w#define SHAER_RAM_SIZE (0x20000)
) D" W* z i. n8 T% u( u
3 g c' n1 ^ a% j- a$ `& xtypedef struct0 u% L% z ^- y% V0 g0 D6 A
{) v! n+ s7 ?+ i0 N' K
unsigned int a;6 x, D0 y6 \1 b5 s0 y( t y( s* [
unsigned int b;+ h1 g* r# o x2 W3 o# @; Q1 T
unsigned int packet_cout;+ B; m1 G6 B9 p4 \; g f9 ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 ]/ \$ c4 O8 b6 V
8 ]0 w+ m$ L6 D9 o! n8 o% y/ qvoid read_MSG_buffer(int *baseaddr);8 w$ r/ b5 Z( W# t" g# {6 \8 x
unsigned int count_copy = 0;7 Z+ a* P" O; M! _( J
: @7 x" `- X9 {! a0 m. o
int main()
3 o8 ]4 _( Q, w1 w- ?) ^{8 g3 I$ W& N X/ |0 l; M
int fd;( N! W) R! E9 O8 X/ `3 V
int *mem = NULL;1 m1 |8 j+ }5 K4 B5 o; S
, j( C8 n3 _5 M" j9 O; L" |1 S2 E if((fd = open("/dev/mem", O_RDWR)) <0)
! m% P- y- e" W) e0 \ {4 U- L$ q& `1 Z! R. c' [
perror("open error");
9 X0 V5 I4 }) x; F return -1;7 q9 Y/ [" H. j! \
}
, u6 N8 }3 y! g, e* L
$ `: H# b+ }" L- k) ~ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 p8 s0 O5 Y: ]2 @, a5 N
& Q: g p h% {9 e) J# J while(1)
3 x. J$ U$ m0 F+ Q/ E" ^ {
$ u. S4 X3 Y# @4 E read_MSG_buffer(mem);/ A, |* Y3 X: d+ E
}
: N' g% {8 I6 @7 u4 ^% F* S/ ~2 Q}
4 f0 \+ a+ t3 j0 W- V6 k
% G5 R' A% ^* |* W; O1 `7 @void read_MSG_buffer(int *baseaddr)1 L/ K3 K; m3 l% d5 Y9 H0 ? f
{
\2 w+ { {1 r( r1 T pRX_MSG_PROTOCOL pshreRAM = NULL;2 t) W/ W; ^& R N( |' m
' b/ ^& Z6 Z# @$ A7 V' a$ F pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, d! `7 S7 u! u! _/ V" d& [5 c s& c' N$ `
if(pshreRAM->packet_cout != count_copy)
% ?5 r6 Q* \0 z) |0 |( O {% i9 J$ U0 [; o/ T
printf("a is %d\n", pshreRAM->a);
s2 x! X: P3 O' `/ d: W( h printf("b is %d\n", pshreRAM->b);9 C2 m# x. R+ v, K; p4 K* |
printf("count is %d\n", pshreRAM->packet_cout);5 @1 Y: n. t `7 ]9 x' l
count_copy = pshreRAM->packet_cout;
9 H. e& k) j2 j# c3 ?: v }% z' h; g B o8 o- [
else R8 g6 j( V1 \2 S. q
{0 Q4 S4 f5 c! v
printf("No effective message!\n");
' h0 W/ r# w s. G }
& j, P* d/ k; Y" a1 \* n* K) u$ G}
) d. b" c6 g9 [; {; d/ e: S7 _4 `# c8 I% t6 B ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 V2 `$ O- p; h
. x- T& f" o( D" b. ^( T+ {
* X0 ~- h, ^& m# `( @$ ] Y8 w$ W3 F
5 E* R8 a, W! e9 F5 R |
|