嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 s5 g9 q# T5 q/ x6 \
) u' P, c( P. w5 z, |0 [0 ]' _9 Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' K* y' Y5 V7 C) k
#include <unistd.h>
5 ]% k- u1 r+ B- u: j% i! V
#include <sys/mman.h>
5 I1 K; Q! K1 ] P
#include <sys/types.h>
5 p9 B0 P) n! y* l9 V
#include <fcntl.h>
: S5 R; I2 w! e u7 N* k
; p6 t( v: m8 H
#define SHAER_RAM_BASE_ADDR (0x80000000)
# g$ v* F% F5 H8 K: A4 B* ~. ~
v: T! n0 Z3 U7 z, w
typedef struct
1 n$ i9 O( Y0 F. @
{
% C$ l: N* [/ C" X7 J4 Y
unsigned int a;
0 K$ f+ `) }; S( [# b" e
unsigned int b;
7 m, ^( y7 ]# ]+ i- R- H9 [: d* p
unsigned int packet_cout;
$ N. P' b w% N/ f+ F& e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) Z9 ?1 b) Q+ |* y* h7 L
, w0 [ n; J* p! f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 L; t3 l2 N" o( t7 v/ I0 S2 @
unsigned int count_copy = 0;
# i$ e- F( Z' {0 M
" @4 y% L6 W) e" x# m
( s. q: z% `+ k" X, R- T# a ?
int main()
) I6 G! n2 K* D& J9 k* ]: [
{
# y+ O$ Z: p1 v, C& u/ c
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ {; P$ x* H" r; H
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; K' _3 S3 q# }) E6 h
( x# N+ H, m! y$ P$ U
while(1)
2 a& [0 d' Z3 G9 y
{
7 o* n8 Y1 w Z; `+ S7 d( a
read_MSG_buffer(pshreRAM);
8 X; N3 E S8 f# L/ d
}
* F7 ]) ~ q' |
}
4 e+ K8 n5 }7 S$ R2 E% V
- z' s4 U' A* ]/ s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! C* w- i$ u f/ W* ` k
{
& A4 O0 N3 a/ E3 `" s8 H, G
RX_MSG_PROTOCOL buf;
( Y9 M8 E1 v* W Y' R, W7 B
( |' K1 S5 R# j! N5 { g
buf.a = pshreRAM->a;
4 y x8 f F8 t3 T
buf.b = pshreRAM->b;
# L* j( u/ R; J1 G+ b5 j
buf.packet_cout = pshreRAM->packet_cout;
0 P4 p4 `+ v3 r* A# ~
% q0 W& O: r7 N [! p. e. j6 \
if(buf.packet_cout != count_copy)
- u1 R( ]7 N( z$ X4 Z8 O
{
. } x3 f; Q- ^) I
printf("a is %d\n", buf.a);
5 ` {: F% B! D# o8 w4 ~8 E6 x) @
printf("b is %d\n", buf.b);
5 N+ e+ }3 z: p% G2 F4 O4 z `
printf("count is %d\n", buf.packet_cout);
& d& ~9 F1 w* v; K9 {
count_copy = buf.packet_cout;
( l9 G6 |$ i7 I- s9 \; `
}
' I4 s8 l, m9 G
else
: o/ d$ X/ n# F
{
8 E5 Q0 T+ F" @) d2 W
printf("No effective message!");
; d) D# u# L% H
}
B% S- h8 q1 f
}
) l! }1 S$ ~& i3 H& Z+ i
! l Q0 }4 R5 z1 f( y- N; `. b
5 A. j9 N" C$ U, L- `! [# x( Z8 C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 R8 D/ k% }% @' i H5 \4 j& l
使用下面代码,对内存使用了mmap函数后:
2 M$ a- M; `$ Q
#include <stdio.h>
: j1 @' ~+ _$ \
#include <unistd.h>
+ Z( H' s# z; y r7 h8 b/ s& d
#include <sys/mman.h>
) F4 t5 M+ g2 X7 c
#include <sys/types.h>
5 z8 I5 R+ Z+ Q$ j
#include <fcntl.h>
% B$ |3 V( u% O: y( n* U% m
$ B9 f [8 r% i" C
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 q& R5 V& k7 i
#define SHAER_RAM_SIZE (0x20000)
* T$ p$ e' l9 E8 z$ D
, y4 ]) I: X% j+ j9 c( B9 @2 S
typedef struct
/ D% _! |* E; s1 k. k$ `( `
{
5 i) n+ n* v, p, \
unsigned int a;
" f# {5 m) B8 s1 z
unsigned int b;
h: Y) V( p4 j/ i% A$ q: q1 b0 p
unsigned int packet_cout;
& L4 F& H) g" B) B8 Q- \1 @% e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 A7 x$ s, ~1 A: X
3 l7 V$ j& d) ?0 P. U
void read_MSG_buffer(int *baseaddr);
Y# P# g- s( ]% J
unsigned int count_copy = 0;
( s) Y0 H' G2 Y# S0 L3 m/ H
( S W) I6 _) v; `7 A
int main()
: x' v' b; i1 @. {! a
{
, z D: d$ R- P9 X$ Z
int fd;
: h. K' D6 g' a9 _
int *mem = NULL;
4 M6 H4 ?6 @* ^. b" A
$ ]5 R8 N" F% Q' p/ p6 W7 a
if((fd = open("/dev/mem", O_RDWR)) <0)
2 ]6 _; H( h) N* @$ Q$ _8 u$ l
{
e0 A" L- |- U
perror("open error");
$ `+ a8 E' ?2 H0 u; m1 W1 i
return -1;
/ Z) v/ K6 I/ D
}
3 j. S/ d4 k+ B: _0 x
" Y$ v$ J) W9 N. T7 Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) @6 S5 o0 W6 {: O0 j/ t0 T6 z
9 k- N. @6 X7 x# F0 E- o8 p
while(1)
3 C+ ~7 c& a$ B
{
# D! [" j# S* ?# I: [% L- U
read_MSG_buffer(mem);
) b! j3 n5 P# _
}
& g' y8 b* E8 i6 j- Z3 a% g) \% i
}
' z6 V" Z) j* e0 J0 g) f
8 o$ U: T0 o6 ~- O7 O
void read_MSG_buffer(int *baseaddr)
. f" T9 a$ Q9 i1 o0 k
{
5 {# d( \7 g; z
pRX_MSG_PROTOCOL pshreRAM = NULL;
" G" S& z8 x/ c% L* | `. c' X+ c
# h6 d; K% h/ J0 @9 P
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% {8 ^; p# K* J4 o
7 V0 }$ A3 x: z
if(pshreRAM->packet_cout != count_copy)
; I6 V2 x0 w4 V0 f' d* D2 G! @% f& \
{
5 p! X& ?1 p& R+ g3 o
printf("a is %d\n", pshreRAM->a);
) _+ H$ D/ x1 {! W; @0 a
printf("b is %d\n", pshreRAM->b);
0 K. G( V7 i7 v( _) Z: {
printf("count is %d\n", pshreRAM->packet_cout);
$ ^! P: o& P; I U
count_copy = pshreRAM->packet_cout;
; I4 B5 G* n" k( h. q
}
; Z/ p* D* {; I! y$ b) N
else
" Z0 Q: o& ~, E7 Y, M
{
! G, `4 V" q( v3 T
printf("No effective message!\n");
s0 P5 p+ V% z! a9 ~7 \3 @
}
/ ]9 w9 z! o0 z8 ]# o$ I/ r: r9 N
}
+ K& h3 G1 m J j
, p% T: V8 v m6 S% K: o) j4 }6 f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 |. g" g5 n% X
+ k% A2 U4 P1 h U) z( ^% `$ m
* O+ U; c# }3 w# z! m; [0 f
# ^$ @8 w( _0 t1 B5 q3 b8 W$ {9 ^2 I
# E; b. f5 c) o4 w V
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4