|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( _7 q8 k% j5 Y7 D* ^7 g! \! U, `3 u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ d9 \$ D- R1 i) L
#include <unistd.h>8 }: k8 [* d- M) ~6 O
#include <sys/mman.h>
' ~. v$ v0 b# v* r# P#include <sys/types.h>1 ~. ?2 S; T5 y' g ]" \/ d* y+ C# Q
#include <fcntl.h>1 x2 w2 u" s, x8 B( r: h+ {, N
- @! J6 v/ N7 j0 S# p#define SHAER_RAM_BASE_ADDR (0x80000000) 9 i5 M7 Q' {- k, ?' Z
- L7 t# H( H" L2 a/ D5 A
typedef struct
& g$ y8 V! q1 U. w{& ~* g* v; F1 ]
unsigned int a;
+ A( Q) q6 f9 C& N8 O unsigned int b;8 H' s! z" A' t0 [+ y
unsigned int packet_cout;
7 ~7 G3 o! P1 B$ B% B: T" p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 B# G. o3 V/ Y2 x3 N9 a# ?3 U2 N9 R6 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# \$ t& n2 e6 o% X ~$ T
unsigned int count_copy = 0;2 y+ ~1 |. r6 ^: o# n
: O& J) l# S& ?4 [$ @/ e
2 e, \. ?3 H; _4 b* `8 ?int main()1 x3 F, r5 s" ^! y* A5 P
{
" S' \& H# ]! }9 Y9 C* G pRX_MSG_PROTOCOL pshreRAM = NULL;, `& \$ T5 P* Y. e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, U& [. ^ @" Z# E5 j3 E
# h. A% f1 D# y; g* o while(1)# x+ d! A% ^. B' F* L+ \
{
9 B* u$ x* ^. {7 [4 | read_MSG_buffer(pshreRAM);
; @4 d+ d/ L7 Z/ F9 A- r9 ~# ^8 \ }
$ z- W% F" b$ I0 I% l}
% \: `2 M( [8 v N6 F( ]0 w; S3 B, a2 f( H0 R" r; Z0 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 a7 d* ]! U; m% r! d# U/ h{6 b& A& l w) ^2 N
RX_MSG_PROTOCOL buf;+ l. Z( `' b( n# U
5 H" S3 O# S1 P; t5 M- k buf.a = pshreRAM->a;
5 v, k" b; s5 C6 V! Z9 V7 [/ } buf.b = pshreRAM->b;3 ?# `! p9 e& D3 F
buf.packet_cout = pshreRAM->packet_cout;% ]4 v' k2 |& i9 N. o
/ i' L: t5 H- |8 u5 R if(buf.packet_cout != count_copy)
3 ~% o5 V8 |, z' |. V' V4 p {
3 ?. F0 j4 h& O8 T. s9 n! ] printf("a is %d\n", buf.a);
+ u% C) N% J) O0 |- u1 y printf("b is %d\n", buf.b);
I# S2 W' `0 v' v3 p printf("count is %d\n", buf.packet_cout);" E A7 r1 a( z# A' [% U
count_copy = buf.packet_cout;5 n9 b7 i4 v& D- n: F9 }* d* O
}
" x0 Z4 s, ]& r. l else0 Y6 S, F6 t" f0 B. m5 D
{) M2 n E& {: P4 l B- P
printf("No effective message!");
! a- B- G9 g' A4 B2 ]4 x; D# f }- L6 m. b) u/ ~
} r3 B6 @, `3 q5 D6 V0 S) ?
]! d* V% e5 I$ T5 J
}# D( Q) W$ C9 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
y0 E' t& v& v/ m2 O# B' d9 H使用下面代码,对内存使用了mmap函数后:8 o% E s, q& l' K% U( H
#include <stdio.h>
( G s; z/ ]& f4 O# q8 K/ c2 y- z#include <unistd.h>
8 k' S+ M% k8 }#include <sys/mman.h>
$ B8 E! c" }. n6 p) ^5 z- z6 V4 L#include <sys/types.h>
8 [% e5 ^& M4 n6 j( H/ H#include <fcntl.h>+ T) s) o9 e7 ^2 b I
6 O+ N$ t2 {+ s8 s4 R#define SHAER_RAM_BASE_ADDR (0x80000000)
2 p; {- _8 }" r% }+ v" p9 N#define SHAER_RAM_SIZE (0x20000) 8 l) v/ ~, j7 j8 N/ R6 x z* n2 X
E2 J' a7 P, k" F( K( ^typedef struct
) [; S4 C$ U( e) Z* E1 e/ C1 n{+ L/ ~# B/ D. K+ r5 x
unsigned int a;% z- X, q1 u$ ^% f" X
unsigned int b;$ P" T8 J& N! p
unsigned int packet_cout;: b0 g. E& a5 I/ w# g$ s6 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 @6 A* \% {, ~+ K s7 \ \2 h6 y8 f% Y3 M( a
void read_MSG_buffer(int *baseaddr);
( j3 ~( D" l8 G& f" _1 \unsigned int count_copy = 0;7 Q. w8 r# n6 ]$ m
: h" r& I8 C8 d9 |2 wint main()( X2 d8 b( {9 K) a5 U2 {% V7 Q
{
# X/ ^% U; B$ j" h6 j) b* V int fd;9 f6 p8 o% Z0 S1 h1 D# w
int *mem = NULL;
# @4 V! p0 W( B1 ]* x" R. ]3 T# Y' d. x6 X" d
if((fd = open("/dev/mem", O_RDWR)) <0)' A3 [1 l" o0 i
{# e4 @0 @5 ]' H) @+ D7 I! p
perror("open error");
6 i' Y7 L3 C4 R1 f1 Q W return -1;% W0 _) W4 o! B* I) i* ~
}
9 o8 } j$ I$ k
8 {, u% Z5 r; B) w# H mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ i( N5 ^0 y3 b
1 W! b* b7 e2 |7 \ while(1), X' F! o* s( m+ c2 n9 T8 L
{
9 h( }! _& B% t% U- L read_MSG_buffer(mem);# d2 n( Z9 ^: K6 D
}
# ~$ ]0 r' y% |8 E}
P' W9 U1 D6 f6 u3 t$ A) {' K- e' I# p6 `" J. E( d4 i
void read_MSG_buffer(int *baseaddr) u- I q$ F# `, b, k/ w
{1 E' D* a/ h2 s E5 v: o# q5 ^
pRX_MSG_PROTOCOL pshreRAM = NULL;6 [1 \" W9 s* n
8 J4 P9 e9 Q5 {7 t! b: ^( y' L& _
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ f1 J/ }/ L$ u- L1 ]' _
6 L) b# q' g& U if(pshreRAM->packet_cout != count_copy)
, e3 L i& x+ H# H2 B {5 F& s3 V6 u y
printf("a is %d\n", pshreRAM->a);
# X. [/ V% S5 N' r2 o: v a, X1 P, l printf("b is %d\n", pshreRAM->b);
+ q) w( g& s; f8 J- W4 J printf("count is %d\n", pshreRAM->packet_cout);: h* E/ W6 ]( K/ p' b( F+ R( O
count_copy = pshreRAM->packet_cout; C; D7 A/ t7 w* f7 F
}
+ [8 a% B% _0 w else
% k% x9 @+ B7 S2 h. s) Z3 ~5 k/ N" j {
5 y: o" T8 s* o7 z( D( ` printf("No effective message!\n");
1 e. n9 `+ X* j3 R }% _3 j! i. l. {( D
}
7 u! ~3 Q* d$ Z; e. D
7 X( m+ S) J7 \* q* \没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& N! ^, {; n6 B3 t( Y# ]3 ]/ p' Q- R) Y8 \/ i
0 m# f( @5 {5 d
' u3 Y2 N- s3 v$ a+ y
' F; g5 h; D) p& u' m7 I! a9 C |
|