嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 k( g7 p4 @0 A7 O0 V* a0 u! M! g
- A; _; P4 q1 J% q. L) }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" y0 @5 q" x0 \6 |7 T
#include <unistd.h>
' _9 ]* A/ ^$ B# v9 ^: J" x
#include <sys/mman.h>
; z# ^1 S. [# m e/ ]! d4 M/ a
#include <sys/types.h>
: X3 E- l# o4 ^7 `$ {
#include <fcntl.h>
1 j- x/ S, |) r: g! ` K
& x3 G; I+ s. I* `0 i
#define SHAER_RAM_BASE_ADDR (0x80000000)
% U& ]& ^. g! Z
T2 c5 `5 `* l% l, Z
typedef struct
) U! r% U( K5 d, f! [0 B2 V
{
~2 ~* K+ ?7 j' c
unsigned int a;
! `5 S; C) b8 K1 ^& S1 d* r, v- M
unsigned int b;
" N5 _) ~. T2 X
unsigned int packet_cout;
0 B: W) t/ _6 [* a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
K* r, O% i, I1 Y. I+ E0 L
- S5 Z; A0 k9 h0 k A! w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" M' Z& c3 ?: Q- o$ Y3 ?
unsigned int count_copy = 0;
/ U8 Y# \" }. e3 y% ] D3 N/ {8 I
3 v& l: Z" n' q9 F
! `7 `1 t! J4 J; E6 h4 _4 S
int main()
: s) b- j7 g% i; N6 _+ _
{
" L. [* X7 ]9 \3 g: i
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 E3 `9 J1 ^8 [9 t% _
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, p* G- K& g1 x5 U3 x7 ]& I
* c! @# ]5 ~- c; Y/ w3 z
while(1)
; i! N. F* k# z8 E4 J+ e! ]; i6 G
{
, I+ D: u( q( V8 s. A7 m
read_MSG_buffer(pshreRAM);
8 ]6 J9 b: B- W: l% J
}
" K ^ Y: |% Y: w$ O
}
/ ^6 |- s- @' L
6 C- ? E! X- v2 f8 O0 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( W2 W. ^6 Y7 P' ]! w$ W
{
. ]' ^# f9 C0 h& V5 u
RX_MSG_PROTOCOL buf;
: h: k4 H9 o6 q6 x/ G( s/ b( M! p6 z
0 N; x* r; ~1 z4 D! ?9 E" @
buf.a = pshreRAM->a;
, M7 e- c8 P$ i; U7 M v% h( A6 t3 w
buf.b = pshreRAM->b;
3 o% M# r1 G: c. |; t
buf.packet_cout = pshreRAM->packet_cout;
1 q$ @7 g+ ^) e$ ^; R' g" c
2 r# J, R2 T' s; U1 L8 L
if(buf.packet_cout != count_copy)
5 ^6 V8 P, U5 [, `
{
4 ]: F1 P. Z9 `6 R' k* N7 W
printf("a is %d\n", buf.a);
* Q7 {) ~! l0 y
printf("b is %d\n", buf.b);
e; j, X0 h$ R7 {
printf("count is %d\n", buf.packet_cout);
: Z6 X0 f2 W# q5 E1 [8 o1 B+ J% P
count_copy = buf.packet_cout;
$ t- Q: b1 U6 v7 q8 n
}
+ d1 A' o: l! G: B9 I
else
& f; b# s7 C |6 v2 t6 V
{
& L" D# m2 M- s6 I' Z2 Z
printf("No effective message!");
8 Y' ^( `5 J* S* W6 F* J) @. w) g4 h
}
: n5 z! c- h# c q% k1 F7 O1 V; o
}
* q9 F- Y% l/ Y/ x
9 Y. z) E: M7 m. M% h
) N! g7 [5 Q0 H/ a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 k: S- p. A7 R
使用下面代码,对内存使用了mmap函数后:
. K" I7 D5 o! Q4 J* t. n" I
#include <stdio.h>
& T" k% R2 V0 O5 i4 m# @
#include <unistd.h>
, r- ?4 `! A% E2 L" o
#include <sys/mman.h>
. w2 t5 {* n3 `* m
#include <sys/types.h>
/ U) y2 l7 t6 A" i, {9 N
#include <fcntl.h>
% J1 d! F* V3 B6 V1 ~* e
+ } c- ]# G+ w# q) I. u; t
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 @7 u! Y& O) e1 t( z+ c
#define SHAER_RAM_SIZE (0x20000)
! r: {4 n9 r: G7 w+ O
, Z" j9 Q+ Y' g5 h* p/ z
typedef struct
~1 C7 F: J; w0 e; g
{
^* h. ~5 ?, P" M3 Z- I
unsigned int a;
3 c& R0 l+ J6 e n i
unsigned int b;
; m* t8 m$ X- U# \; A$ K) f+ b- R
unsigned int packet_cout;
* J: h9 H0 u' n2 ]; V* ~0 e, r' E& `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% ^# O* X0 }9 [' I( {1 y
/ T# S2 U" ~ s( ]- L8 O
void read_MSG_buffer(int *baseaddr);
9 {* Z# P h8 C/ s+ Z
unsigned int count_copy = 0;
7 r) S @( T) {2 w# J) K; h
" E+ Q' D Y4 i3 k- c
int main()
p( ^6 H3 d' n3 A, V0 a
{
. ~9 N8 N6 u8 V) |% V% y
int fd;
$ _$ V5 b( V) w: \$ X
int *mem = NULL;
b$ Q& K6 d! c0 S
9 w3 k2 \! l1 Z% R. D' q
if((fd = open("/dev/mem", O_RDWR)) <0)
, j2 d$ \; k" T1 q- z, {. v! R) T
{
4 ~4 a& z2 u* T8 v; e0 w# ~
perror("open error");
' x) J+ U. W& i. z
return -1;
* H; v1 X' _4 K2 `
}
* l, T- L/ A5 ]; N; p6 ~
- v0 M9 H6 E1 K/ l. A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% Y1 h( R3 Y' f. T
+ g" U) o0 F3 U6 Z5 P, W& Q9 R
while(1)
# ^! s. B: ~! z/ x2 B! E( ^5 f# T' j6 K$ g
{
& ^$ ?1 g/ C! U, |7 C( K
read_MSG_buffer(mem);
# M& B9 p$ E3 z; \, t3 C- f9 }! }
}
% R4 c8 M2 K4 L7 S
}
$ x8 T: Y6 n, g) A+ I3 ~& }
5 K4 y) c# ~( D5 n+ {/ u
void read_MSG_buffer(int *baseaddr)
$ L; a/ v4 ?( I: n: \
{
; S$ z; `4 e7 o8 W, B
pRX_MSG_PROTOCOL pshreRAM = NULL;
) r1 I7 ~7 m$ q/ }$ q
7 q+ F/ E3 e3 E) T, P
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ G M8 d5 |4 Z4 {7 P% H& r
( F5 ~ M- e' \# |5 j/ F) R
if(pshreRAM->packet_cout != count_copy)
: G+ i1 R$ \6 ]% E8 J" [
{
4 {& v& @+ x. w3 A; L
printf("a is %d\n", pshreRAM->a);
. @# \7 L9 \( h* e7 `" m& s
printf("b is %d\n", pshreRAM->b);
3 R( H# s5 E: C( ]7 |9 n2 I9 x
printf("count is %d\n", pshreRAM->packet_cout);
# ]+ H& b# Z) P
count_copy = pshreRAM->packet_cout;
$ {2 T, Y$ n h! S; i
}
: K/ n# ^7 @: f9 K# H" x
else
7 y1 k3 W) g( w G1 q
{
8 O. z O" ]# X
printf("No effective message!\n");
# u: F! p7 \! b) k C6 i1 o, b
}
& c/ `% E' Q8 h" {& {) W
}
2 ?0 J7 l' g" H
' u5 c( k0 I, T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 G# g3 a0 H+ l0 b6 U( g! p
! `. F' u' ~3 }# T4 O- L0 a& W
( L( f4 d) Y- b, C2 o7 l
8 q3 L' J- }/ O! U$ U" ~
! j9 ^! n$ T' x
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4