嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# p/ Y, o- W! S" m9 a+ i+ ^
+ G) V. o) p( U8 d( `0 Y3 j0 d( ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' [% L4 \# q8 f) Q8 x. W) H2 s7 X
#include <unistd.h>
2 C/ n3 v5 f- ?1 t
#include <sys/mman.h>
5 r% X b- V% [ C8 P" r6 Z
#include <sys/types.h>
& G$ B/ h4 Z! W1 a
#include <fcntl.h>
2 n, z" n7 _/ c& S
* D8 w# t- X1 K% s
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 |) {$ ?2 K- C5 w' B' \
J/ g5 @! W* h& Z
typedef struct
( q: A1 J* a# w) ?% ]: V0 M7 |
{
6 E% l: _9 f+ u% @, @, L
unsigned int a;
* }. v9 o) C: U6 O# H* v" r
unsigned int b;
! \) P( P3 r, ~/ U8 I' P. v
unsigned int packet_cout;
& \+ U, G1 K: q1 j' X9 K1 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: a, N7 c4 z* u F: ~: P
& r/ q' B( R# W$ {2 L/ H4 S/ S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ c% `; q# k- @* l3 T6 J
unsigned int count_copy = 0;
- c# e$ }5 \: {# R/ B( V
/ l U, l% C: I2 E- h
+ U/ j! D, E" T0 @% U- B# @# V
int main()
8 r3 S" }$ e/ i# o/ l- `
{
* X0 {- G& U9 Y L3 k
pRX_MSG_PROTOCOL pshreRAM = NULL;
, E+ r3 l# D7 r
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ b) w6 c3 G0 K% f3 W+ w! {( U
1 w" B7 L$ c! n K' W0 o |
while(1)
y# ?* A% i$ Z5 X0 w
{
8 e# y2 m h3 _% {0 p0 Q. f8 e V+ j
read_MSG_buffer(pshreRAM);
# Q, d; j; z( j# G8 p" e
}
1 J' D0 s+ M( I& D9 c0 w
}
3 |' u' {9 `( s9 w6 _8 Z" P
: i. z) ~" E' h* ^& r0 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 y) L8 e {" _8 \/ u8 `& m
{
+ ~+ @- j1 }9 S' _+ [; S
RX_MSG_PROTOCOL buf;
$ i6 v2 Y: _4 U& N3 I7 S, Y
7 u' ]6 e# {' n5 F) d: \$ P, l
buf.a = pshreRAM->a;
9 P" S5 M+ G* [' A8 a* R, q
buf.b = pshreRAM->b;
: u& [$ Q- L) c$ ?# C! |8 v% z
buf.packet_cout = pshreRAM->packet_cout;
$ G5 y# `* Y/ V9 ~( q5 ~4 S/ Z' z3 d
2 }) L7 K8 U- D: x# s4 V2 i6 t5 ~
if(buf.packet_cout != count_copy)
8 H3 T3 C0 `; H( | A
{
5 F4 |& v( c0 A) [
printf("a is %d\n", buf.a);
6 E) g7 Y1 [2 P: w" C
printf("b is %d\n", buf.b);
/ c0 f) [. r1 t& B5 J# n) I7 o. y
printf("count is %d\n", buf.packet_cout);
2 U6 }" K, s ~8 ]5 T9 I& A; E
count_copy = buf.packet_cout;
; Y& t1 C' ^$ o0 a! Q p
}
2 E+ v$ q2 r' ^" _% I
else
! @6 U X r1 r! d
{
5 d$ a6 Y7 i) m- h& a/ D. T% q& m
printf("No effective message!");
) h/ Y/ S' K& F8 w8 L' G
}
- p2 d5 d# {3 M0 M
}
4 P" Y( `1 E) s
% F: Z7 L, j+ u) r
2 r' G; ]! I& c: N" @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( b- I& n4 H7 O E0 U5 _
使用下面代码,对内存使用了mmap函数后:
1 _& g) Q/ R; W/ G
#include <stdio.h>
( x8 S) @+ o/ M7 {
#include <unistd.h>
" S+ j, {! j& ?! T$ Z# \
#include <sys/mman.h>
7 Y" R3 Z- _, c3 l, m
#include <sys/types.h>
9 ]* Y6 m: N1 K! R& F6 u$ G i* f3 H
#include <fcntl.h>
$ i" M/ _* E$ I8 J
2 Y4 h7 ?7 }/ \* M% |) D+ |: C; S
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 s1 m$ a- Z8 p& _6 ^
#define SHAER_RAM_SIZE (0x20000)
$ R5 S# g2 i+ _0 q
* g1 n& f6 W- H) O
typedef struct
4 ~( [9 B: K Y' D" d( s
{
5 w' o7 R- {& Y- v2 ^; K
unsigned int a;
! q6 i' d q2 w; ]7 F9 c
unsigned int b;
* a! k. O0 J8 u" q- k, h4 z' {
unsigned int packet_cout;
, b/ m& x# S& O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ B' t, @% R/ V" g+ }/ `0 ~
# n8 e5 C6 w" H6 o) F3 X4 f
void read_MSG_buffer(int *baseaddr);
1 C$ u, l1 B2 l7 C9 m
unsigned int count_copy = 0;
0 b+ z% e: G6 [' i) j+ {
% D5 D0 i- T3 K% L" U( R
int main()
3 Z0 E: I. r% m/ P3 U, t
{
" N4 }( S { x2 a4 N
int fd;
9 V4 w8 w7 ~1 `* o3 d
int *mem = NULL;
r" W) {1 `& m* K( Z
& Q) t* Y, n' b
if((fd = open("/dev/mem", O_RDWR)) <0)
' Y' [' b# v3 f2 [, E: ?
{
5 d3 s1 V4 i8 z0 a# J x' X
perror("open error");
. L& o) S/ i- z& [; F0 ?
return -1;
. W; X* @; V m
}
- a8 o2 }* V, W& r/ x7 ]
) b5 y1 j% B5 E6 I. o, Q' X3 _
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; I9 L- j$ U: F4 O, s# s7 N
( V) N7 r* u T
while(1)
1 G( m- Y7 S" ?: z3 C1 X% J1 |
{
, s& j' r9 M- b" k! Z
read_MSG_buffer(mem);
8 H" {4 L" T& V) J5 S' ?' e
}
& y8 l, p6 G6 Q; y0 I0 L. Y
}
7 z. T9 {' j r7 T5 d7 {6 d" c" P
7 Z% s: N7 `- T6 V& \
void read_MSG_buffer(int *baseaddr)
" b. |) ~5 k6 i3 N
{
% q* n0 l- F9 l3 N5 F# Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 k- y1 }6 U4 X7 j
; R, H+ a# h1 a2 v9 p& y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* M9 d3 }' V4 x
$ {- H, z! P+ s+ n L3 b
if(pshreRAM->packet_cout != count_copy)
( Q, y( X" N7 X. e, p& \
{
- _+ D6 z0 D- F! n
printf("a is %d\n", pshreRAM->a);
0 A+ k) O* L; B( p* u2 e. i
printf("b is %d\n", pshreRAM->b);
1 k# N* V: d1 ]. y: @5 b' ]* F
printf("count is %d\n", pshreRAM->packet_cout);
" T$ ]5 N9 M- H `( y
count_copy = pshreRAM->packet_cout;
! m) A; e; A, h
}
# Z6 K* ?1 ]7 `6 z! _
else
, x, r" V$ m! Q0 q @. }) \$ o
{
" a. O3 U2 {; o. c5 F x% H' p
printf("No effective message!\n");
9 E. M! C4 U# s0 r2 I+ w, r L: M
}
( H; s+ m: @( {/ h; j# d! z+ S* v& L! b
}
l( [2 l2 d3 p! O: J
4 r, h& N7 I* f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, u3 q7 g& D9 b/ ]& |. o4 D! Y) n
/ S. D8 O3 q5 C: h0 s3 h
$ D$ t7 x# y: V3 ]
: s9 S s% x1 @( W1 O: e2 ]- |
) y9 J6 m6 Z: s6 f- @
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4