嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 w( f2 j" l* G% D& L9 z. w
( ^- g. N' D0 Y2 D, k+ A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! i3 n6 Q$ o f' W4 m, D
#include <unistd.h>
; Y9 a. c' T; {
#include <sys/mman.h>
7 u7 ?, R% F$ o: c* C# ]8 b
#include <sys/types.h>
8 Z6 ]0 V1 I. a3 ?( B7 T
#include <fcntl.h>
5 ?5 h% ]9 T# F1 H( n g7 q
5 ]% T8 ^) t" { H7 t k, V+ ^
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 Z& H/ n, u% W& z
% G A; \1 o& `, v6 Z. J5 z
typedef struct
" m" o# U7 w4 a$ e" c
{
! S) U& v x8 g
unsigned int a;
3 f' }7 W8 g9 q: Y
unsigned int b;
2 ?: n. D/ }) \& C4 e
unsigned int packet_cout;
+ I( Y$ d' t2 N) Z: H( h6 M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 N' O+ S |+ _4 B! W) G2 M
( l. t( M( R' W- M4 a/ o; E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 m/ o' F" V; l3 T( m9 r4 E( E
unsigned int count_copy = 0;
0 s1 O; y1 q' L7 [# I! J
1 x5 b3 \1 t0 B4 U
2 C. C, w4 {$ c" @2 n
int main()
/ a1 Z* S+ r. Q9 K* A9 g) Q4 F
{
5 o: i% I8 `* G9 X
pRX_MSG_PROTOCOL pshreRAM = NULL;
# }; t! K- _$ ?! \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, h5 g) C! h+ y4 u! G3 c9 E9 e
, m- S" S* W4 d/ s
while(1)
9 G' P% C2 V$ E5 n; F+ r% j' \- m
{
/ g3 t& V, `6 D5 P) {
read_MSG_buffer(pshreRAM);
& O9 {3 F# i$ Y8 W' U
}
" c8 ?' y2 z9 l( p
}
5 `# x* e9 i% W
8 J: ]; g. y3 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- s: n" P9 t& ~
{
% P7 @8 S# v& @, P7 v# P8 [
RX_MSG_PROTOCOL buf;
9 a" P b% A" n6 s
5 |2 Y4 x T& `8 @1 G: v
buf.a = pshreRAM->a;
h0 L: K0 _) B& X. k7 ]4 n
buf.b = pshreRAM->b;
& R6 P* \" I8 |6 {; ^. a8 r
buf.packet_cout = pshreRAM->packet_cout;
3 d% t2 k! k1 W0 ?! w! @; r
2 w9 c4 q9 O+ A: Y' [
if(buf.packet_cout != count_copy)
7 Y% t- m$ B+ B. l7 q( L% _
{
( J. y. x7 S& H8 q
printf("a is %d\n", buf.a);
; c6 u2 \2 E. b. z
printf("b is %d\n", buf.b);
) H" q$ |1 T# v4 x
printf("count is %d\n", buf.packet_cout);
3 ?: Z8 y0 o* H& m9 _1 @0 I; _. h
count_copy = buf.packet_cout;
5 x: T# L) \7 w
}
" V* J8 d3 @1 L0 K/ H# E4 [1 U% }. A
else
* `7 ]; f# Q( g& ?1 R9 o" }+ ^
{
! g6 @) q0 ^+ _- P; s- g
printf("No effective message!");
5 t- a9 j ?' n/ N
}
- u! w. p: f( H# y* N
}
# I9 [* Z% \( G E! p: ^
4 r" A9 \' p! \. s I4 k
1 M1 h; S1 ?. S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) ~3 U9 H3 t! A5 b" y$ s: q
使用下面代码,对内存使用了mmap函数后:
3 f5 [+ ?1 y- ^
#include <stdio.h>
/ Q# V2 R% `1 p- p
#include <unistd.h>
! s% ]8 Q/ ^. b8 b
#include <sys/mman.h>
( x1 c8 D3 a% K1 W
#include <sys/types.h>
+ G2 }* R2 p! e9 N! }6 l+ Y6 J( ~
#include <fcntl.h>
Z1 K% w1 M$ e3 X
. t: W6 s2 J" p' k: F
#define SHAER_RAM_BASE_ADDR (0x80000000)
l; ~1 N; T) [2 p
#define SHAER_RAM_SIZE (0x20000)
3 ?9 v$ I9 i8 w" Z: Q
+ X! i7 P+ g0 Q4 w
typedef struct
, m. Q# ?- B. D# }( ?
{
- Q! v+ U, u, T* I6 ^8 c8 B/ K2 z3 ?
unsigned int a;
# M) f3 w1 |$ t% @7 `
unsigned int b;
3 I) w8 v; h# _" S! ~
unsigned int packet_cout;
6 d y9 j1 f- T; @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ I& E: Y, ~% Y+ p! W$ K. R
- n o. J2 k; M
void read_MSG_buffer(int *baseaddr);
, `. [, e* n7 V3 W. m5 w" x! g# M
unsigned int count_copy = 0;
! M6 h1 _7 J! O; m7 ]6 L
8 R; c- `- I. f; v+ z/ q# p N
int main()
6 L) u# s1 t1 ?# m9 K9 t
{
; O( o: u+ Z$ p# W) D! d {
int fd;
* g, L; d: P, o- x5 }" t: k
int *mem = NULL;
* R' y) J+ b# |1 f
) d" x. t% I1 ~' i! M
if((fd = open("/dev/mem", O_RDWR)) <0)
: u4 V- P4 M8 b
{
* `$ Q, L' a# ?5 B; M/ K* B
perror("open error");
! P2 x# }* C4 A' O/ ]6 p
return -1;
0 O( `4 p8 z c
}
$ }: c5 |/ B4 R! Y
& C( Q' X4 c' ~1 @# S4 m
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; ]' `7 Z( Q5 g
/ ] y+ @. S- z; i$ C+ v
while(1)
1 {1 j p0 z7 T% o( z& u
{
& _8 J( a* B- Y+ i9 k3 i# r
read_MSG_buffer(mem);
# @( _" O8 _. _% o0 [% m
}
C: g; l+ z2 D% ]& w; \0 v: J
}
2 r9 _! U ]4 H( g. T
7 [+ A" @( d( [4 F8 u# l
void read_MSG_buffer(int *baseaddr)
$ ?2 T+ \* [2 \9 F
{
# P+ y% Q1 T% L. l
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 G; @+ \4 c7 R- F- G% S/ B
, O+ v) L5 x& F$ Z& r) |
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- G; x. P: I3 H1 k/ r% l9 m/ _
- U* S. L4 S; j( j; x: B
if(pshreRAM->packet_cout != count_copy)
3 k @6 {9 A- N: T
{
: \9 ?7 k1 M7 E* J. l5 Y4 S* R2 H
printf("a is %d\n", pshreRAM->a);
0 _; [6 P# a+ q" U
printf("b is %d\n", pshreRAM->b);
$ a4 ^5 n5 F" j) F* S
printf("count is %d\n", pshreRAM->packet_cout);
$ m, \" W. W1 b8 Z3 r( F
count_copy = pshreRAM->packet_cout;
+ C! c3 e( K5 k5 L) M
}
0 d" p& H: g0 V; W1 I: f7 d/ O* w6 B
else
/ j0 f9 [! g9 e; X+ K2 I+ N2 u. S" q2 S
{
, a$ y% U9 K. R8 w9 T0 z
printf("No effective message!\n");
" k" ?1 C8 G% B
}
* ]' n. m+ t$ E
}
5 b6 Z; B+ f- P( T5 v' E+ j" x( H
+ B) o4 c6 W9 v7 A; v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, ]9 @5 v. F! O- r- a% ]% a% U
$ j5 ^; `2 a9 [9 f7 `6 T8 _
1 G$ M) A, \5 ^6 P# `0 i4 \
; A5 A. |& j# @) @
9 y, }) ^2 j" B# T9 e6 h B0 D; l
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4