嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 v: D+ v/ \8 T) Y" k
! I. m( ?/ Z* [$ c& P6 P5 v. X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- q& }8 s) v2 s4 ]9 d7 S
#include <unistd.h>
/ S4 N: z6 J) h8 S7 \: ~9 |$ J
#include <sys/mman.h>
7 l7 {4 e- O" G! K, E3 Y# b- o3 g
#include <sys/types.h>
+ t5 B# D6 x( h, l' Q
#include <fcntl.h>
* w5 N+ r+ }0 {& ]6 W, L" n
( [; } _7 ?/ {
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 x- q2 c& v L
8 B- _" z/ z4 R! |$ ~0 S& A
typedef struct
' f2 r5 n) y- |- ~) u0 i( ~( c$ R; S
{
3 }, ]8 [0 K( w8 i+ z3 W$ _
unsigned int a;
# x+ V* [5 ~" j, L
unsigned int b;
6 `& K) W/ M0 h- f0 U
unsigned int packet_cout;
- ~4 ?1 `- k6 b/ J& P# z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ A) Y' p0 s k
W2 \3 X1 K. l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 V5 y! Y4 ~: D
unsigned int count_copy = 0;
* U: Z7 `% U$ G# T( a+ U0 u
]+ d" _- l! F0 b1 h4 [' j
' O2 ?3 K, l3 _( G! x+ |7 J# g
int main()
& H/ J8 m* U( i1 p6 P
{
( u" K% f0 ?* s0 j6 u w1 P3 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
! c( R8 q3 R+ t t
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 e5 ]0 k6 E; y; @% A3 I( b
% G* O% c4 M3 S7 s6 E
while(1)
& m6 c2 M3 K3 X5 J( Q
{
, X0 w; g( M% Y7 F" R+ u
read_MSG_buffer(pshreRAM);
* S, p6 {1 f# [
}
4 m& [: R1 W8 j, ?, k
}
- R; d0 w7 P0 y" b! k \1 `
* \9 ?1 Z% j9 m- j4 n$ ]- I. ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" ?$ }# u5 o& g
{
6 Q+ f6 w6 Y0 m
RX_MSG_PROTOCOL buf;
8 o) Q7 ]3 Z2 I2 e# f$ P
' Y/ S1 m9 K5 C8 i" X
buf.a = pshreRAM->a;
+ E) i. `9 a# d1 p
buf.b = pshreRAM->b;
8 P$ _' o2 W- a
buf.packet_cout = pshreRAM->packet_cout;
- q* J& [3 v: g: A
; ^. J* d) `, D/ {0 a8 b, x8 L
if(buf.packet_cout != count_copy)
8 J1 p1 {+ v0 ^+ K* }# g
{
3 D- `) Z4 h3 x. m5 V, @
printf("a is %d\n", buf.a);
; [; }' S# L5 ~! D* r
printf("b is %d\n", buf.b);
' E$ H+ f6 R( X2 i
printf("count is %d\n", buf.packet_cout);
% F1 z4 \% D3 Y! n% c5 ]
count_copy = buf.packet_cout;
6 C7 ~ M6 N* k3 s8 b# }' x
}
; l% Q& a) U' _. w; f/ R k
else
' Q( ~9 `* ? h' @2 Y
{
5 e+ x& A) i- R/ Z+ ` D
printf("No effective message!");
7 P! L5 o( T/ N: c2 E( d
}
& V; k! S5 K* a6 k/ n9 q. e3 p' g
}
$ U4 L3 u3 \- Z' e1 b8 n
1 G0 k1 r7 }- {. b+ h( P$ P
/ | E Q0 @, {: M# h/ r, n( X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# T$ Z7 B8 g; f( Y1 t: g' P
使用下面代码,对内存使用了mmap函数后:
9 D" ]1 V# @" I$ X1 C3 W
#include <stdio.h>
" ^6 }6 e9 P. B6 s
#include <unistd.h>
" g" }, Y$ m& `; i; _5 G: Y
#include <sys/mman.h>
# l- }' p u! x% F
#include <sys/types.h>
) Y7 N6 o, C; x9 [: N. r: n9 j0 D
#include <fcntl.h>
) H4 w. ~: H- p, V
" _7 U y7 h8 f6 R$ C& L% Q1 C
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ z; n6 p1 {- G9 Y' Q, g9 l: z
#define SHAER_RAM_SIZE (0x20000)
- G3 C2 g: u, A; {# c4 c. Y% z9 C
# N# g" L* E& Q+ T Y
typedef struct
6 _) k; v1 t' V2 Y2 @# c% y' a
{
4 m. B/ s/ }% a- }" U) Y
unsigned int a;
4 k& }$ o9 d7 [+ g1 h
unsigned int b;
2 H. \% A6 Q: I3 z7 r, k
unsigned int packet_cout;
+ v" Q" z0 ]6 V, J+ s# L6 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! w3 b# c) \8 P
! a- m) [# x' r' e, C4 Z2 x8 w
void read_MSG_buffer(int *baseaddr);
+ n3 f4 f6 N# e/ b+ W' O% d
unsigned int count_copy = 0;
; m1 K/ e4 I" z7 s' E# w, R4 F: e
3 N; E! A# O/ [- C. G
int main()
( ?* f. s6 D4 d$ Z
{
: {# J2 e% o* h8 M! I% R
int fd;
, E/ F6 B. u9 [1 \+ R0 Y
int *mem = NULL;
7 ^6 m H p" I; I L9 j& ?9 V" X- L& T
& ?$ V) N. m v% o/ H( g" K
if((fd = open("/dev/mem", O_RDWR)) <0)
: i7 W5 k! B! G7 p$ E' A" K5 H
{
7 V$ W0 l9 g( b- u
perror("open error");
" c, _$ ] P0 z$ y4 l- d+ _6 l
return -1;
, d* M* M7 C X0 s$ k3 |$ f
}
$ \! L8 }7 v" r) K. E0 E; ^1 Q- ]
* j' P% \8 }7 O. N) q! A" c6 V
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 p5 u& b) y2 \# k
! n# h1 g1 s5 I5 T
while(1)
7 k' V9 k) H, M8 S9 D0 S% H4 ]
{
7 B, Z- J0 I# Z y
read_MSG_buffer(mem);
3 _- w( y, Z+ ^( t" i$ ^- Z2 w# m& _
}
2 C; `; Y* f' }) S& b: t
}
( ]* W1 G$ q k
! r$ Z. u }) Z W8 v' O) x
void read_MSG_buffer(int *baseaddr)
4 s, n1 D8 p ?1 B
{
2 v3 \4 ~9 [4 H1 ^) S9 { F* [
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 I+ |; ^% }1 ?
, x2 {. w, Y% T) |+ ^2 G9 Z2 V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 e( i- b$ {4 p$ [9 M1 [0 v
: h) \3 G% Y) N3 u5 ]
if(pshreRAM->packet_cout != count_copy)
9 v9 `! k- t8 @
{
7 y9 d& N4 f0 N- ~
printf("a is %d\n", pshreRAM->a);
& I7 l+ L2 p {& g$ `9 c
printf("b is %d\n", pshreRAM->b);
# h% {/ r' w4 S9 W
printf("count is %d\n", pshreRAM->packet_cout);
8 V o( C8 M9 f7 R6 A6 Y. D6 L4 P
count_copy = pshreRAM->packet_cout;
& Y) {) H8 p2 g5 w! T2 @4 W9 P
}
/ D0 Z F6 g3 r3 O* H/ m+ Z
else
! w& s6 D& K% M E
{
" ]0 \. O5 S' Z0 s; V! S, p
printf("No effective message!\n");
! v: u& }7 U$ E( ~' l7 }$ v i
}
% `7 c7 N1 U2 G) b3 L
}
9 V+ k4 A+ D5 ]+ T
7 Q+ o2 ?. e3 x) _/ Y* |4 y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& v" j9 S! p- d0 W6 P% H
H2 L! a: i3 ^& S" l
) g3 T! Y) g- z7 {; u
7 F7 Z5 M6 k& p$ P! z
0 J [4 l1 p6 U9 D' ?7 s5 Y/ J n
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4