嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% s. l0 n" t6 {+ y
# T" R0 L* V* b; n7 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( _2 W1 M+ u- ~) a9 i" @1 C/ R
#include <unistd.h>
4 a+ V$ Z5 s! q$ U
#include <sys/mman.h>
4 U3 J0 o. M4 n. c
#include <sys/types.h>
8 q, p+ i& |. b/ V
#include <fcntl.h>
& C8 z2 k" S4 ]' P
% r! K7 }1 q3 I# z, `
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 W; c8 d; U/ F9 n8 U
* S- B# \: t; r% @7 j& ~
typedef struct
% k/ x; t% n( t* X: C
{
6 K7 e: Y$ l& J( \1 Y/ | `
unsigned int a;
5 F5 p2 F$ _4 M' _# N# d4 q- K
unsigned int b;
2 }2 S1 k, O( y# h( Z2 K6 A# Q
unsigned int packet_cout;
! A5 Q+ \0 ?) c* k: ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 E. K) t6 L3 `- f, i5 T
5 m; ~8 v8 w/ E" F$ r) d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# G0 y; a& M% P
unsigned int count_copy = 0;
: n) o6 x. e$ P1 a( l- n
9 F. M, L' M) W1 n6 E. y$ b
3 n: M7 `0 U( S0 P
int main()
- T' e2 E( w* t/ y
{
$ _ W/ K& w- H/ J- R
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 I) y: _& s7 n- u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ C% k& b# h9 U% i: G8 c
: Y. \7 d' ^, o H: ?/ N
while(1)
! y5 b5 ?9 \& U" }
{
% M& H# x- n* x2 u# L
read_MSG_buffer(pshreRAM);
" Z( r+ ^1 G [9 \6 A" {# R' V
}
; u9 i ~( E3 A
}
) p# }8 P. U8 I( u/ O0 z$ d# Q5 u
! e( L* y) v5 q- v- R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' p1 M( |1 h m k$ }7 `
{
2 {( W( d3 O( e' K9 X
RX_MSG_PROTOCOL buf;
, E$ j8 e& L, ^0 D
" R$ h% b. K8 m
buf.a = pshreRAM->a;
; U( C: Z2 g$ l, O& z
buf.b = pshreRAM->b;
, [9 Q' a; i, p* K4 C2 t
buf.packet_cout = pshreRAM->packet_cout;
6 J; a& m8 \3 w) u9 a5 |
* Y& K* O8 ~2 |2 ?5 Z1 J
if(buf.packet_cout != count_copy)
' h6 r3 ?! X o1 P* i
{
# z) S# W' k. \. j. E8 E
printf("a is %d\n", buf.a);
& N) j" o) Z; r
printf("b is %d\n", buf.b);
3 V* u- {' |4 D9 I; A
printf("count is %d\n", buf.packet_cout);
s5 l# `: L# V4 X5 T3 w* U
count_copy = buf.packet_cout;
3 Y% B$ J9 `# W% ?
}
' C' N: ?' u& M1 V% b% j/ z0 \
else
: @2 m# i9 `8 D9 `- j# P
{
' D6 ~! C! r3 b7 y
printf("No effective message!");
1 h: \& E8 K$ `0 V
}
% p; |, X+ [1 r, o: x$ A) j
}
1 P7 O9 i9 p0 ]) o; w
% C$ w5 W( k$ ]8 G
& w" p) z2 b j: a4 Y8 w6 r' x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ a5 U! N% d$ \
使用下面代码,对内存使用了mmap函数后:
8 D! |& t1 v+ w- O
#include <stdio.h>
( r/ w# ~4 T/ S
#include <unistd.h>
8 Q0 ^# {. _) v) Z4 @! ?
#include <sys/mman.h>
- L2 Z) ~9 s v) Y1 G3 _
#include <sys/types.h>
& E) v5 j* W q4 V v! z8 o+ k
#include <fcntl.h>
% Y9 M$ Q+ v1 _! }: p0 m$ h0 x
" Q# F2 T0 s* `* y+ \/ K
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 Q' h X$ G4 d. F
#define SHAER_RAM_SIZE (0x20000)
" [2 W: Z2 C* e- n) m' H
* g. v( h) W: h* j! D7 s: n
typedef struct
1 D% j0 s5 ?, Y4 n7 [9 |
{
$ ?4 ^/ {' K& V; d5 m
unsigned int a;
1 \0 U/ ?$ Z% \" [1 G0 o
unsigned int b;
+ {5 }. w4 k, J$ ^2 X( ~6 Y
unsigned int packet_cout;
% {: q/ S$ `" @4 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 Q1 H$ d- U2 z" c
* v, O1 E/ C% e6 L
void read_MSG_buffer(int *baseaddr);
- l" v7 R+ W+ R
unsigned int count_copy = 0;
9 R6 f1 W3 l* T; M
) @% W8 N4 G# ?2 r& E& b8 a* w
int main()
& a& R0 j# B; N. W
{
8 h6 G2 `+ u3 m) J7 i" D. m
int fd;
5 V, w# L" X x; Z
int *mem = NULL;
/ @( R. ~8 w2 v% p; {- N
9 b! Y0 {( i/ j
if((fd = open("/dev/mem", O_RDWR)) <0)
' y7 e1 q' g7 L& x |9 _, y
{
+ M: D$ U& a% G/ p
perror("open error");
& r* o, V0 |! k
return -1;
) R8 L/ j) D& i4 t2 P
}
* x; V3 V& T7 G
& s$ \; F% ?8 m, d6 h& M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ y8 c+ w. x, v' C2 C, i
, d4 X0 t2 ^. q5 F8 |
while(1)
' D9 H4 [ S% S
{
( W/ y8 x1 {- _' }; S4 t# w
read_MSG_buffer(mem);
( |; \1 t0 b: T5 X
}
& y# Q* ~" ~3 ?6 g- F# e4 x
}
: ~/ h, y1 ~6 T' u0 e8 M& u
( c) N7 T4 T- b& t8 u2 m
void read_MSG_buffer(int *baseaddr)
: T5 c J% j: q9 ]( I: Q( w8 N
{
6 D# P1 {* J2 p& \8 E( }6 _; c
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ V& f& ]* Y) G2 \
- @5 Y4 H% }2 ~5 L( Z$ T: m
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ ^8 t2 O. j2 [2 `6 r6 v' w, K
( c! @4 _8 Z+ u$ a
if(pshreRAM->packet_cout != count_copy)
4 U5 M* v# ?7 D0 P4 K Z. [0 `
{
( ?8 N/ e1 o1 X- h0 e2 ~( \/ e1 Q
printf("a is %d\n", pshreRAM->a);
% g% [" H0 B. y$ |
printf("b is %d\n", pshreRAM->b);
1 W' c( `: [( x7 O, L
printf("count is %d\n", pshreRAM->packet_cout);
3 C' u6 \( k4 m4 e$ `
count_copy = pshreRAM->packet_cout;
) W9 a5 S9 h( w# W$ J
}
. N. v, h3 \. j+ }
else
! S4 U, s: l& P- |2 Y" {, {
{
/ D: N% a# D; ?
printf("No effective message!\n");
! \! a' w! ]& u1 F0 b" G) p
}
6 p) s0 _2 r* U" c
}
& {; E, s' w, B
$ h/ O; \. @% O% y) ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; t z6 p% k) [. V- l( ~
; [# m' S8 K/ p8 I, c* z* P1 m2 R, A
% j1 q) b, h! z4 z
5 s3 _! d* j) U) `( m" g) H
7 P+ \8 Z- z. M6 [
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4