|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 a* e/ r- R M# n
1 e6 _ y: j8 v, O- U: F' B3 m, X s9 rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( p5 K5 j' a4 p" F/ y
#include <unistd.h>& F) w Y0 E: t9 N
#include <sys/mman.h>
% u! R( v, B9 i; V( y#include <sys/types.h>
( t3 `% x/ H, p6 e3 D6 ?#include <fcntl.h>' y, V& ^9 d v, g: J, K z
$ V& e& u& w& f9 e3 ^# N6 a _#define SHAER_RAM_BASE_ADDR (0x80000000) ; P! Y, m5 ?8 i4 E
% X. p1 w" A; ]' S& Z1 v/ A" P
typedef struct
6 |% d5 O9 t [% S{
: n' M) y, k3 H7 q5 s5 V* _6 H6 e unsigned int a;
2 g) f& C) |3 E* ?! c$ U, m unsigned int b;2 c& O4 s3 `. X' J( l* r
unsigned int packet_cout;
% O& j% f, F" p* I" c& @2 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) p% h( a8 Y$ ~" p5 ]" n' v
. @8 P8 s" r1 {# ~4 @4 p3 P& dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( v- H2 ?- u5 W! b0 N1 D. Q% q3 V1 k
unsigned int count_copy = 0;
/ e0 ^+ n: n6 A* p1 h
# Z5 x [6 g, L! X5 m# c
. M) |9 j9 d$ mint main()
9 l% M" e2 |3 ~; @/ A( Q: P{9 B6 @* m1 Q3 @
pRX_MSG_PROTOCOL pshreRAM = NULL;
) ?! l5 ^ K2 I pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ K$ O# s% b: c# M1 x- k( i7 [+ g
- l# R6 f5 t+ e" p. E5 P while(1)7 U1 }) {! U, `/ r
{
! W6 D3 X5 b' V% j read_MSG_buffer(pshreRAM);
. e2 r7 v" D% _ }
J& u8 p6 N& j2 _; i# P, |/ ]; j* F) d}4 u! v# _8 x' ?5 J5 {: m5 }
& ~2 f8 m' c3 c+ z7 ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. B& [- o6 R' _- \# n7 M! L/ ~4 }6 U{1 x! t$ ?, I: |9 p9 P g
RX_MSG_PROTOCOL buf;
$ X3 |& ]$ F0 K0 m" ^ : L: Y) }, z- P6 s0 `
buf.a = pshreRAM->a;& f0 n. b, I4 k4 `
buf.b = pshreRAM->b; P, U- X3 l7 ^1 {0 z& E
buf.packet_cout = pshreRAM->packet_cout;4 ]/ f/ S4 ~% i) ~: W8 P
0 m X, b! \ ^# S: O
if(buf.packet_cout != count_copy)
: b9 m$ Q& {+ b3 i {7 }0 f5 T- O, ]5 S
printf("a is %d\n", buf.a);
; x" k: f: A5 l3 g% c2 L, a9 ]( N printf("b is %d\n", buf.b);; X7 i4 d) F3 J' W& j7 W7 r/ {
printf("count is %d\n", buf.packet_cout);! g9 B1 @/ V! n5 r
count_copy = buf.packet_cout;! w# _2 f: [# l7 s1 t+ O& `
}
7 r( H- f' w" W; C else
( l- @. z& l$ E/ P8 _ {
! T8 F! p1 @3 }" { printf("No effective message!");3 f& a* g" q- N& R0 ?( ~8 e
}
3 h$ G" I; _2 V}
5 k9 o( i" L; c( w3 \- N# m7 X D( H" d' g# Q
+ |1 c( _( f8 g( b7 R) u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ `8 m: g& D { x7 X& o' W使用下面代码,对内存使用了mmap函数后:
- a0 M W* K( }2 I% b#include <stdio.h>/ h* E; b2 N: \5 @- R m
#include <unistd.h>/ p7 p9 o( u& N) h! b3 r; W
#include <sys/mman.h>
" @/ h" x* k9 m2 K' o" m' G9 q#include <sys/types.h>+ c( S7 {1 j/ g" Q' l8 M3 ^- K
#include <fcntl.h>
& m- x4 t" ]7 j e0 k8 T: u; \' R: H) u) K
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 g; p# e: Y# e m6 O, j! [#define SHAER_RAM_SIZE (0x20000)
( S1 t6 x/ o' R+ r
$ x2 k# k. b5 y" c3 k# ltypedef struct
6 r! m. z# O) W3 G/ H; d{
. n6 [9 I" @$ {# h4 j unsigned int a;( k$ E+ u0 b' G8 J* L: A. T
unsigned int b;
2 K* x% V* k8 o unsigned int packet_cout;7 e5 B$ s9 W# U$ N/ M+ F5 Q% G9 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
l1 Z3 \! S- Q
A& b6 O1 Z( g3 Kvoid read_MSG_buffer(int *baseaddr);
$ s, l+ e6 r+ K2 N) n0 nunsigned int count_copy = 0;
4 l& B9 C6 L0 l) Y1 {9 c
5 H* {0 P4 G+ m# K" _int main()
6 d$ W! Y2 x4 w: b{8 i1 ?" |4 W2 ]) @2 g( L' ]
int fd;" x8 G/ `9 l3 @3 @4 d
int *mem = NULL;
' m1 {, u2 j3 z" [3 _% c; D: h) z- H* F r- ^! \. @
if((fd = open("/dev/mem", O_RDWR)) <0): p0 Z2 d1 x, \- E" _& |
{" B8 J: o4 N, o$ f
perror("open error");
~$ o& y5 o2 Q return -1;( T9 @; o( z6 _8 {, @: \
}
2 ^& A5 [) o2 Q* L2 \' W# ~$ Y8 B! j
; |/ f0 c$ i# L9 z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, q) z7 j/ p. e5 Z. ]$ e; x, {+ W8 G" j; C4 M8 {( l
while(1) V0 o1 H7 }9 `4 ]+ Q# l) F
{
4 ?3 N, P" N% V read_MSG_buffer(mem);
! ?2 m$ \5 B4 Y0 h+ N7 s w. U } ' Q' b* r) B4 K* w! l* I" j: r# H
}
/ x' A9 b5 [" H1 O0 ^2 l# r6 H- q0 V. K! C& {% l
void read_MSG_buffer(int *baseaddr)3 x: x9 t- N5 q3 B8 M. B2 q0 Y, _
{
' @8 X- [0 X. ?1 f pRX_MSG_PROTOCOL pshreRAM = NULL;
% W5 P- _4 o* E( u4 T/ l$ @6 e/ S9 T: U5 \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! ^) r5 n- Z2 K. m! C1 x' F! l. _- M; W; ~
if(pshreRAM->packet_cout != count_copy)5 I% l( z5 K0 M* l$ _9 `6 |
{
1 e9 M6 y3 K E/ Z7 V. Q printf("a is %d\n", pshreRAM->a);
, J: ^ P- m8 k% k7 {, l0 q printf("b is %d\n", pshreRAM->b);
. _3 Z7 }" x+ s, x printf("count is %d\n", pshreRAM->packet_cout);
; j4 b' m0 j" ]3 ]& c% l( k count_copy = pshreRAM->packet_cout;
0 d7 G( v K7 ]# i1 V. U5 R }
5 t5 ^$ V' ~% \ u1 H5 P else
' V, c# `7 ^1 j, A& u$ D" T {4 {" Q% d) w0 f, E0 Z7 g7 T
printf("No effective message!\n");: J; M1 }, h% ^- n2 |/ a
}
; e1 ]' A2 }! V}3 C4 F" a2 k3 }* ?4 H& k& K D
( |) U" b" V8 q3 e) b* U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. A2 |+ w5 @/ h1 \
# h4 j/ i* |- N& l w; z4 O3 B4 y% X9 V6 j# l, a) A8 i! M5 J5 A
% o( M; Q% }6 ?, f
) H: E# u. M7 w |
|