嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 K, |, _7 \2 {2 o- n
. h$ b% o3 M) e+ r4 {, @8 a7 v3 P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. Q: q: H+ W h5 t) X
#include <unistd.h>
0 D$ ]" a/ z n! G" r+ @' I
#include <sys/mman.h>
- f6 n# O8 [/ t7 {; q
#include <sys/types.h>
4 ?6 I( |, w- }+ P# Q/ E; C
#include <fcntl.h>
' t& j+ A+ h# P k! A( f/ x: z' r8 J( {
. i: z4 a& T8 Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
& b) B3 e! Y' `6 T) F9 |4 ?
7 h0 t! F& @" T% \9 A2 t
typedef struct
4 J G* ~9 I' m7 ?" n( \/ L5 V3 K7 j
{
; E) x0 A6 s; \* ?
unsigned int a;
. m! X8 P2 k+ \7 c% t) j9 B
unsigned int b;
% J' J, S! ]1 w3 d
unsigned int packet_cout;
+ H2 U& m7 D: _4 q) }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 H% m) Z7 g( _8 l
" Z6 B G1 a) U9 w0 n1 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! P: k3 k$ R8 J4 Z
unsigned int count_copy = 0;
" a6 J! g S' Q3 A; F
! Z' X; z- f8 J* C: W6 n4 l$ O0 v: \
4 ?( X y3 d Q. y6 I3 P
int main()
" Q# ^4 M5 z. S* K6 m+ e
{
9 p7 r0 e% E2 p3 O& ~7 L
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 v W1 Z' W$ f* }! [' T( i. y; P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* v4 u: |8 O! h4 u; J2 n7 n
* ^" Q7 ]9 B& `7 @2 v' `
while(1)
2 [5 h* y/ d% K6 I3 b
{
" _$ I+ c1 |$ ~5 W& Z/ ~
read_MSG_buffer(pshreRAM);
* Y- P! X5 j# t
}
: C" b, p8 l6 b% H' v7 d. k6 a1 Z0 d
}
, l" I3 S" v& }# e
7 x2 s% s8 D! p) ~& Z5 }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ F0 F3 E2 O" n1 ^ A& H* a
{
6 H! f+ k2 y# s! u# ]! T
RX_MSG_PROTOCOL buf;
- K+ O0 N+ ^% r9 j& E& w* u8 V
2 S* W0 v3 f3 ]! D. D
buf.a = pshreRAM->a;
9 L& `9 u% h' K# v6 a
buf.b = pshreRAM->b;
. j$ _9 S4 [6 l) h* O4 O
buf.packet_cout = pshreRAM->packet_cout;
+ K$ b% a- {3 e/ U- s8 Q( V
; s8 F. E' G/ a c% y- X5 s* G% U
if(buf.packet_cout != count_copy)
- l& o; j& o* f% y1 T
{
8 t1 l* C5 a( R* s5 T1 m9 X
printf("a is %d\n", buf.a);
; r/ O Y& H) p
printf("b is %d\n", buf.b);
$ w8 W% @8 `4 S3 }: @2 Q& p
printf("count is %d\n", buf.packet_cout);
{1 ?9 h0 } W8 o6 L+ a/ Z" s1 C7 |3 q
count_copy = buf.packet_cout;
$ g1 M' I. |6 C
}
# |: `+ F' w3 z& I. z% O
else
b8 H7 i# s$ s( G" G
{
6 M* m! Z7 r% \0 |: O5 x* Y
printf("No effective message!");
5 f2 B+ t* f5 J& V5 T
}
! e% N- m$ s% w: t. w8 N0 a* R: I
}
( r% y/ Q) w: ` @; j, \# I
) ^) A* I5 I# x p F
; Q: l5 O: }" T, w. V3 k# P, f4 W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! i g4 |( A# i; c5 F {- s
使用下面代码,对内存使用了mmap函数后:
) R' ?6 ^& o0 g9 \0 r, p
#include <stdio.h>
W j) r, W9 V' k
#include <unistd.h>
2 M6 W$ j5 o' Q" D2 X1 k) V" v, L
#include <sys/mman.h>
( I7 T9 S! M0 R5 @9 \5 I ?" M
#include <sys/types.h>
7 Q8 X+ i$ @2 s; X3 @
#include <fcntl.h>
( {; `' |. k+ \, n. X
: {" |* @4 y- e3 S' g4 r7 w
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 w: {# E, t6 N
#define SHAER_RAM_SIZE (0x20000)
|1 |( e. s- _( _
" ^6 a5 H/ l. J# t8 S
typedef struct
4 }" I" i) a* C+ \, J" V
{
% p. S$ y) r: P7 d( G
unsigned int a;
* w1 _ p2 X/ j& _6 F t6 D& O
unsigned int b;
' f9 d5 x7 I: P' q' G8 u* h
unsigned int packet_cout;
9 Z9 L S/ O0 {5 ]; m* j( b0 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 I- l; ^0 q" \; R' q5 N2 e" O
1 K/ |! k I- }7 \5 y
void read_MSG_buffer(int *baseaddr);
7 X D5 @! I% ^
unsigned int count_copy = 0;
/ U+ k3 P4 \% U1 R3 [0 y
! ^: F) U9 {0 q S* S
int main()
8 d1 r/ x& g: d* a
{
$ `4 y S5 E; ^) d2 @1 r
int fd;
; x' m, y. f8 i/ Q( B. ?
int *mem = NULL;
& G$ g1 J0 `! B4 u* ]5 U; |
8 v8 `7 d$ k5 E* i
if((fd = open("/dev/mem", O_RDWR)) <0)
( S0 |7 Z8 q4 q3 R$ E% G
{
- H$ y: p' a$ k8 ^
perror("open error");
2 w5 s5 W; o x% Y
return -1;
( {8 T! `4 m/ I* M7 I# m0 X5 m+ f
}
! c: I6 ~* R' A, K1 t$ h
2 A) A/ a: j7 ~" \9 f8 ~, r/ i
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 I$ B3 T% t9 _5 Q+ F* z% V5 x
. p7 M, Y' z- _$ T( Y
while(1)
( S& r( c( e, U6 L) r
{
' |# h* F' W6 P9 D+ Z- g& m
read_MSG_buffer(mem);
8 s2 O( \4 j' P3 L& M# `$ r1 L
}
5 q7 R- x. x n8 V, O- a& P
}
( ]' N6 s- c- H* }1 I* j4 u/ ~3 ^7 x9 _
: |; N0 a5 x. x, _9 C N9 z0 o, m4 q
void read_MSG_buffer(int *baseaddr)
1 F& K% J; C7 v" Q- o$ H" G
{
' G) n( m# x" s Q. a
pRX_MSG_PROTOCOL pshreRAM = NULL;
; R2 a% i5 l; S7 h7 Z! ]5 ?
+ e6 x5 n6 i( H p; h6 |
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' v* r) e5 \& |: } r! h7 V( s
; x8 J* @% M% Q* O* R. Y
if(pshreRAM->packet_cout != count_copy)
6 A. z! W+ K( Z" w9 i4 G$ [
{
- \- _) X' N# A1 J2 r$ U, C
printf("a is %d\n", pshreRAM->a);
* Z2 P% b3 y9 K8 I6 h
printf("b is %d\n", pshreRAM->b);
+ g0 K' v x/ {' O( }# I9 O
printf("count is %d\n", pshreRAM->packet_cout);
& e1 l5 @0 Y: V. M
count_copy = pshreRAM->packet_cout;
- n0 a3 a. o( I+ x) a2 q
}
$ s" X" A! m: Q% U; G9 ?: |
else
$ @9 t/ t8 r8 d4 P
{
9 Y2 Y7 r& c" L$ P% |& Q: j) `
printf("No effective message!\n");
& R5 i7 s4 x2 f
}
# c; }5 q. P% t4 Y. ]4 K
}
1 U, g2 b; _3 Q: P% i1 W
% u* S+ u" [. a' Q4 H t( @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 }& l- m, j1 v; J0 F; g
; H; L7 Y+ S6 I/ \9 Y
0 B) p7 N0 y1 |0 R( M# s8 T! q& n
5 m/ F- N9 H: m& c5 \1 n3 G& W" K8 k" r# ?
7 l4 O) n1 ]" K+ d W6 C6 G. d
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4