嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! L5 |9 H5 v) Z# T+ i* S# E
0 T7 [5 y: {1 L: u. e H" v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 z' i; ~! P+ D% u) U" s# g
#include <unistd.h>
$ D2 f9 q7 @* b$ j3 A
#include <sys/mman.h>
" Y9 M. s3 A4 z
#include <sys/types.h>
6 _9 j6 n5 D! P* y8 `5 d3 c
#include <fcntl.h>
$ L6 D/ K5 s0 ` t8 C1 G# x6 [* u
9 l/ f, O7 _$ ]. ^4 M5 t
#define SHAER_RAM_BASE_ADDR (0x80000000)
% ^+ A+ w; g x P; {- C
T8 K- B+ ^, \, J0 @# m1 Q, r
typedef struct
( c3 s5 p" [" _0 ~: z
{
/ L5 `$ _6 M" ~: W' k8 e) @7 L# E
unsigned int a;
- n" j( i4 i1 e7 G, H0 B# v
unsigned int b;
T1 Y9 Z) `$ `( V1 C! j% `& L
unsigned int packet_cout;
; A6 R# P( t# ~, F- V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ]3 d& X R" Q0 i
, v2 a& L6 C% o6 d' [4 H. d4 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# P( M; T) V8 u6 y
unsigned int count_copy = 0;
9 c5 R8 J! k7 v% u7 J* {# `; g
$ D/ f" ~, t3 B/ Q, j/ |* Q
% }9 O/ j' P U$ [* l6 ?. k
int main()
% c( E5 o7 j# ]! F S5 o7 b8 f; N3 Q
{
4 x" h( J4 {2 q+ ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 @8 w, _1 d" ?8 Z5 ^2 P6 Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) n( H5 p$ b Z+ n6 f- r+ P2 B
2 X ?2 z0 s2 k! k: m/ Z p
while(1)
3 R3 w3 p" N5 y2 C) Q7 h, O
{
7 M8 U; {- j) \( x
read_MSG_buffer(pshreRAM);
9 `" K/ B# o& k, [/ ?
}
: M" L: r0 ]* c
}
- p2 r% H) ~1 T3 p& S7 d6 T
6 ?9 ~! \2 B) t8 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 D/ y8 K( w V: ^8 i7 L
{
/ b7 x$ I6 S$ r: [6 ]+ a1 _
RX_MSG_PROTOCOL buf;
. {# C' X* n- c' b/ I4 i' N
9 Z4 H# @: y4 h4 A
buf.a = pshreRAM->a;
( @6 ^" n: b+ i# F" F
buf.b = pshreRAM->b;
5 v% E5 F9 ]" |! I. U% y" S: n
buf.packet_cout = pshreRAM->packet_cout;
5 Q9 G" _6 m- X v( w2 T
' i6 R' a9 p2 l6 M# ^# M
if(buf.packet_cout != count_copy)
% p% w, m. I+ n6 D6 j, A' _$ o E6 z
{
6 s9 R5 J( x% U/ E. T* J
printf("a is %d\n", buf.a);
: t2 e$ \! {$ J: u
printf("b is %d\n", buf.b);
" R* T% m, Q, m8 F
printf("count is %d\n", buf.packet_cout);
" Z( R c. x: U% W
count_copy = buf.packet_cout;
& F# t4 ]: m* J3 m7 @8 k5 s
}
3 Y1 j% B& I0 l0 k
else
) h2 h$ G5 S8 G& t" n) `- L& L
{
. h& b g1 |. x; o
printf("No effective message!");
, d( |( t' `# `4 c
}
4 V. [6 a/ q0 D2 d7 S# p% p
}
# I) G5 S/ j: y' u; f9 {0 q Y
4 Q. {! }4 _' c4 P% U5 w
, G( `: ^5 G: F6 O5 d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, A/ n, M0 T" n. H8 t, a' p
使用下面代码,对内存使用了mmap函数后:
' ?4 l0 v3 O% `7 T! [, B( D; b
#include <stdio.h>
# l4 i1 H) {& k3 ]: B
#include <unistd.h>
2 B$ @" \, M; f. H m- x
#include <sys/mman.h>
/ F: k1 O- n7 n( j
#include <sys/types.h>
' C: C% w- u- E8 {! Y9 A
#include <fcntl.h>
2 K( L5 o+ z: m) d4 E% I9 u n
+ C, j$ P+ }6 E6 G
#define SHAER_RAM_BASE_ADDR (0x80000000)
% l, E0 a6 ^/ E" G3 {
#define SHAER_RAM_SIZE (0x20000)
% @+ K% a1 h! q1 V: z# R0 d+ Z
8 S% |5 r1 L: S- u" @! I4 l
typedef struct
' z" @- ~% P' R; I1 K
{
. A9 O; T4 x5 y- M. c* ~# S( k% Z
unsigned int a;
' |9 e1 [9 D1 B! {
unsigned int b;
% w" n. x0 M4 n0 v1 l5 ^6 x
unsigned int packet_cout;
2 H! Q& @! l$ w" [3 m- {! }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 n1 w$ X' F5 [0 G+ k
/ A' Q& L8 ~6 I& s s/ ]+ \
void read_MSG_buffer(int *baseaddr);
/ o" d2 b4 R! k# o5 T3 b8 J
unsigned int count_copy = 0;
: U4 a7 V Y" A+ I( \
& H- ?* S* m0 R2 C- G" [2 |# `; U: a
int main()
5 U8 ~' _+ R$ M7 f0 Q, l
{
1 r% g" T$ Z- {, W) j
int fd;
$ |3 D' f6 ?; D: Z+ W# y% A
int *mem = NULL;
# w& ?7 l0 k6 g0 Z
t$ d3 J6 v- r- B+ o3 U) k4 ]
if((fd = open("/dev/mem", O_RDWR)) <0)
6 g5 V8 P3 _. s a+ D: t- n
{
6 w/ l$ Q: |1 u2 u" ~
perror("open error");
! }5 Z& z" N0 q; F0 D
return -1;
1 i c/ ~. Q5 u3 f5 p) @* m
}
+ n6 B" ~/ B0 K$ c6 x
9 R) V9 |" w% @3 x5 ]4 F) G" z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. @$ c, R! t2 {3 T. |6 B
" W& j8 r6 n7 z/ L
while(1)
- O1 l$ K" O4 X* ~9 g
{
4 j- a! E+ G( k% o
read_MSG_buffer(mem);
8 I8 `6 s8 O$ u) H) W8 K: `, [
}
h2 O9 ]$ U3 q6 W. f' }* o
}
8 l3 G! ?0 N( c6 }
: ]' G* q9 i- C1 ]7 s* }
void read_MSG_buffer(int *baseaddr)
) p9 T4 O# Y/ ?' f0 U2 C) \
{
$ ?9 u; ~: k# k+ ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
, I# |; L5 J# Q: G0 H8 c4 E( E$ U- T
: y; n5 L* ?$ T1 [) x$ V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- ]' t& a3 K" v7 S- c" l
2 `( a2 D+ X# J m$ o$ l) E
if(pshreRAM->packet_cout != count_copy)
d: S& l- @1 v6 G0 \8 b+ h
{
. r* \6 O# \& {% K3 y( p
printf("a is %d\n", pshreRAM->a);
' j: w/ P6 I/ L' e
printf("b is %d\n", pshreRAM->b);
4 Q" Z/ }* E1 m! Q8 q% D& ?8 \
printf("count is %d\n", pshreRAM->packet_cout);
# [% f; H+ D( U# j/ f
count_copy = pshreRAM->packet_cout;
' N' _) A t& @5 V; ^
}
8 `$ l. _6 N+ w) \2 ]' J% I; x
else
: l& g# |, X# ?
{
3 T( E) s6 r, U- @+ ?
printf("No effective message!\n");
) J2 T7 w) z" X8 r" M2 R
}
) p; l7 |9 D7 Q
}
! E% z/ x, [3 j, Z7 Y
8 C- n; S) }( v! P* |4 `# R! v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 x1 d- e7 z' b1 n, i( p5 q+ B
. o% f! K" L6 f! J
6 d1 N p" ]7 ~: r
# N8 a* p. b6 p! ~) I3 z+ |
, h' ^- L6 ~2 x' o
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4