嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 l4 P! V7 \, T: M( L$ h& }
2 F# o+ t0 _* z1 @7 ]! n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 {+ Y: b1 y+ i; G+ v) T* z
#include <unistd.h>
& Z+ A8 k, D# ^; b4 [
#include <sys/mman.h>
9 ?" F& N7 ^, n7 r) v P; Q7 W% c7 R
#include <sys/types.h>
# E0 M" _6 T4 N' I/ A8 j% j
#include <fcntl.h>
: r9 Q8 j! a2 |
# I, N7 T" z0 J% d# U
#define SHAER_RAM_BASE_ADDR (0x80000000)
?5 w, X8 Z$ g0 K4 L9 k5 }8 J
) T) ?" ]. c& K b, j8 K ~6 X
typedef struct
6 r$ X! L- u7 m( n* [
{
e" l- w! B# E$ V1 x f
unsigned int a;
# c& j+ |: @! A: I" I
unsigned int b;
: i' i* C' g) z4 }
unsigned int packet_cout;
- \% L. B( P+ F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( r: q" ~: J& f% e0 R
; Y: y# b- g* o! r! z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 U# a8 C7 e" y5 Z& G
unsigned int count_copy = 0;
9 X( `. s# X* d
: \7 N# B5 u. o
- `7 L5 K' V/ L$ `
int main()
' L6 H/ T8 y ?/ h- _
{
. ?$ T1 t$ a' s
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 i0 e/ N4 ]/ f5 t# t: Y0 m
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- t5 v" y B6 X: x: Q% C
% m# `9 f* z) G8 [7 `7 k
while(1)
* i& v4 j0 a7 {* e) Q/ L
{
0 n2 r0 z. f1 f4 ~! V" D2 o3 P$ f/ b
read_MSG_buffer(pshreRAM);
8 X, d0 v, U$ T
}
1 W! d2 t4 S0 D& L( f7 b' [
}
% G# R( e4 e9 a4 m8 R( ~( n8 `
1 g9 E# ]% J3 n, M+ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
Z- V# ? C& h
{
! W$ ]6 ]" ?7 K. Y
RX_MSG_PROTOCOL buf;
5 n d* a4 g+ R7 G; [6 i$ V, l0 ~
0 N. c/ Y, x! V* f$ g0 c
buf.a = pshreRAM->a;
. B Z/ \/ ?; Z2 y* `1 S
buf.b = pshreRAM->b;
5 ]( e% W- j% ]; b6 U
buf.packet_cout = pshreRAM->packet_cout;
6 W! r9 ?" _3 O- \/ j& c
+ o* X. D# J: U9 |: U
if(buf.packet_cout != count_copy)
2 p, J* ]) h; P
{
- W+ H* ?7 _5 E/ T0 s: ~3 ?
printf("a is %d\n", buf.a);
) d" A' Y2 Z9 G& L1 U! |' }
printf("b is %d\n", buf.b);
9 o9 u4 K9 f! w
printf("count is %d\n", buf.packet_cout);
1 O6 m" H" i6 ?4 k4 n( l( S, E
count_copy = buf.packet_cout;
! K; I# _4 z! J
}
8 n* n; }! h) X2 ^5 {
else
2 ~0 ^8 p0 x) L9 ^$ q8 f1 X( A7 ^
{
$ n0 I s% O: E/ \
printf("No effective message!");
, ~, S9 {9 ]' L* s& P) j
}
6 p3 Z8 g: }7 \, ]% j
}
7 }8 l" S% a2 s2 s# z8 `; x, b3 n
# O5 B, d1 O) e5 |6 L
) I5 K: J5 a, i3 {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: {2 u1 _) n: u; m' D
使用下面代码,对内存使用了mmap函数后:
% Y! T' u9 _. Z+ O n1 Q$ k% F9 R
#include <stdio.h>
; c3 G8 Z$ \7 d/ ]( I
#include <unistd.h>
+ N, A V* e, R5 t
#include <sys/mman.h>
1 o+ ?1 K' O; y: j0 j
#include <sys/types.h>
# Z9 J0 W8 k* V8 ?
#include <fcntl.h>
$ a5 h( k4 d8 i: `+ s0 _3 q1 x; f6 F
* Z/ w/ w b% G) x# d' i" M' O9 l
#define SHAER_RAM_BASE_ADDR (0x80000000)
, w; Z+ ~* f' W3 ?
#define SHAER_RAM_SIZE (0x20000)
6 l* A9 x K9 V6 Z" D) E3 j
" B* b+ n/ \0 m$ C8 S3 s! d
typedef struct
: n. ?2 g; K+ v7 u, q
{
2 m! O: t4 x7 _: a6 ]9 F
unsigned int a;
" y3 V i3 V' D [6 J* H' N: n
unsigned int b;
! ^( r% s8 U. C6 \- \% q
unsigned int packet_cout;
# Q+ m+ i* J0 o6 @1 T/ r# T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, n1 ]5 C5 ^) O& L! z2 Q3 ^' O: w; a
. g; `% k/ T2 }* g7 c
void read_MSG_buffer(int *baseaddr);
( V# i* G$ s8 {9 o
unsigned int count_copy = 0;
" h3 j* Q( K% `% B) Z8 ~/ Z1 d
& O9 W3 `' p0 G n" [& }
int main()
1 t8 @: {8 Y/ i: w! E6 r* a" w2 Q
{
7 ]3 q/ p8 i" v- p" h
int fd;
$ D0 t0 C- y7 G, z0 ^: S! l
int *mem = NULL;
8 }: i+ p3 o* H# v6 U1 G& B7 v
4 P2 b! j( y, z) p) M
if((fd = open("/dev/mem", O_RDWR)) <0)
( v) s1 h7 \) s: s* t4 U# F: t
{
5 t! m8 H' Y* G
perror("open error");
- J: J# ~, I0 P) W( \3 `
return -1;
6 C/ f, S+ k, I' T# k' h7 Z3 y
}
4 S( w2 p0 a# P, ^4 O* ] u/ X
0 }6 r2 i. m5 o4 O) P, F
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# M0 t e9 N/ g2 o6 I
6 H, ^7 [$ u8 t
while(1)
5 ?" |6 R0 |- E6 [7 n5 f
{
8 E/ H' c+ S1 P+ j Q. S
read_MSG_buffer(mem);
! z% o/ u% g7 f! X$ K4 B4 T
}
9 u9 X- g6 v# ]: Y! _# b( l ?
}
) I4 @+ V" x+ I k7 a9 t: p' {, B+ W
& G: {! D5 D- S( K# `5 ^* Y
void read_MSG_buffer(int *baseaddr)
9 ^1 G3 i' a. o( ?4 y
{
3 a5 `" T& {6 m/ i L. S5 P
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 R. N T$ B" h: j0 w& a0 j
- L% l5 c2 k* n& w/ F
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# p6 C6 q2 G8 M5 v& H( v2 j6 R
6 n9 n1 Y+ R$ r
if(pshreRAM->packet_cout != count_copy)
" d7 m3 Q8 a2 ~9 \/ a2 g" g8 W
{
0 t9 E! _+ o; u
printf("a is %d\n", pshreRAM->a);
5 x+ Q3 `0 r" Z2 \
printf("b is %d\n", pshreRAM->b);
0 b6 a/ o6 t; u$ o) t6 r
printf("count is %d\n", pshreRAM->packet_cout);
) }% C5 G! Z! ]% k4 P' A
count_copy = pshreRAM->packet_cout;
! K- d- E, d, n0 k
}
" q! X1 ^9 ^6 Q; n0 w6 P
else
" G; d# g" O/ j7 e7 ~3 x. B8 k
{
, r4 ^- [5 h, o# X
printf("No effective message!\n");
5 O% ^4 Z( f4 s, q
}
3 C; Y+ a$ L) ]+ u/ N7 p1 q9 {
}
8 `- T' F% W8 T# L! y; B
3 n# J. \: U1 m: h9 g; f; N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. X3 }; X/ q' P0 Q- E8 J j1 N9 j
( u+ w! D# E F6 T+ X, O
5 y( ^! f! B2 ^8 X
0 A# e. D! g4 D" M. K! r
4 A( g( V( Z& W: Z
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4