嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 P3 k, T* w* c G3 J) k( R9 N6 w
) U& R* j e; k. \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, Y# F$ o* d$ B+ p% l
#include <unistd.h>
/ ?9 f2 t6 D" H& D( r
#include <sys/mman.h>
; i8 c( m2 {% W' B
#include <sys/types.h>
6 n8 o" F0 z$ c% c. h
#include <fcntl.h>
0 m9 N, p7 b: T# D, k
" o9 [( Z1 L2 w9 g ]8 g0 K. G
#define SHAER_RAM_BASE_ADDR (0x80000000)
. J: y0 H3 G8 A0 w) [: E# m
( I. J- [! u9 E$ C3 C, d3 F
typedef struct
/ ~! R' f& A1 A$ J |( \- {0 \$ l
{
7 h7 \( P4 u F- M6 y# d! q/ V
unsigned int a;
7 o0 `$ m6 n5 e8 |( y& t
unsigned int b;
& N% X0 q4 g& U( ]: a/ b! f
unsigned int packet_cout;
( d+ x/ \& j0 G( h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. T3 k! I8 T1 [7 o) V# } ` Y. `
% w$ d# W+ H8 E8 h0 b( j# c( R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 s7 C& z% `1 C
unsigned int count_copy = 0;
. d3 @" S! N4 R* S
* m5 O# L: a; S, c# {$ d
7 K' T. S% I& D& m3 b0 O
int main()
4 x. m7 I& O" ]9 _( p( I( m9 S
{
6 V5 E; u4 ]' X/ ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 D) L: p) ?% D) _
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% Y. C$ ?4 v( e9 w
) ^, A& o3 x& N) |
while(1)
% H5 V5 T$ n, |# { c$ x4 L9 R
{
! A. e! T9 |+ x' O
read_MSG_buffer(pshreRAM);
* M* e9 [4 B8 x* i- ]4 A. g
}
6 A% T( `6 H' C$ J; `
}
S0 A9 B& ^ d4 ~" _
" }* m. B V! Y' u# ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: }0 `7 R* D8 Y# f, h
{
( B e( j' e* \4 M x2 h
RX_MSG_PROTOCOL buf;
, J! ]1 ]$ U7 f/ F
* D3 A0 i7 |3 D
buf.a = pshreRAM->a;
& W6 E. B" k" [: N( D
buf.b = pshreRAM->b;
# { u: F6 g& Q0 H4 b
buf.packet_cout = pshreRAM->packet_cout;
; w% R& w3 E/ e) ]: ~) m5 t( ?
+ g; v8 m& }3 h; X& h& u+ G+ q
if(buf.packet_cout != count_copy)
9 n7 P* h& p! Q, V( P S2 V2 g
{
; m1 m: n, r+ c! r! A: |. L& L
printf("a is %d\n", buf.a);
. `" \' ^( ]! q
printf("b is %d\n", buf.b);
$ R) ]: @( I! b- m2 v3 C: S/ N
printf("count is %d\n", buf.packet_cout);
8 S5 F7 s, g) x5 m
count_copy = buf.packet_cout;
* J; f9 k8 S ~* Z* \& a
}
/ J+ X2 K/ |% _5 O8 x% k7 ]
else
! c2 q n7 o8 [2 }
{
: e: v6 A) J: U: n! z
printf("No effective message!");
5 x! Y0 X4 B. \- l. q
}
" b% A% g7 q0 P7 a: A* b7 I# G6 A
}
& w* ^- X! m5 Q/ {
8 v) P8 I1 \' F8 G, H
, B: y9 x3 }- A3 j4 S# ?4 F
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 y7 w5 J, } }6 v6 L: ^+ D
使用下面代码,对内存使用了mmap函数后:
: x+ U7 k( ?* P3 D9 e$ h
#include <stdio.h>
; \5 g" z# _; Z8 z3 l
#include <unistd.h>
, o n! ^0 W0 v* O3 c4 a
#include <sys/mman.h>
2 a. W8 _9 `4 a3 t! B |
#include <sys/types.h>
: h, D$ C- S5 D/ X
#include <fcntl.h>
6 e8 a5 W1 Y. P) ?# O' f
' _: ^% e. B, g
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 E; J1 i, o; u/ E( o
#define SHAER_RAM_SIZE (0x20000)
( a N6 S3 Q6 Y% l2 p
* {; G8 O& M: w
typedef struct
7 J8 h3 l1 j% O. A0 |: @' n
{
6 b7 J) ~5 h y6 b0 I' R- `5 |
unsigned int a;
! j. m% v/ t; G* l, i# X) W
unsigned int b;
- Z0 o* Q- d, \
unsigned int packet_cout;
4 s8 u3 Z7 f+ f5 j. s' I' s. P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 R& J x4 Q- b0 ~! x4 G( d
" l& |/ ]! M! \+ U9 `
void read_MSG_buffer(int *baseaddr);
% P4 y! h& j& k& _
unsigned int count_copy = 0;
: c$ s" D- s7 X2 E4 p
7 J7 v% D% i) R! K
int main()
/ [# p( R2 t6 _. E( p# W
{
( y: @7 b) L7 i4 d0 ~
int fd;
$ U+ [. [- w6 v( z2 ^! s$ U
int *mem = NULL;
0 D1 t' ^1 u& o* M' Y& x, ~4 p6 ^
) D# M) G2 x: \
if((fd = open("/dev/mem", O_RDWR)) <0)
: L% z, d, \- P: N) f' J
{
* I6 K. w, G+ p3 u6 s1 x
perror("open error");
5 f/ B6 [1 z4 v% }4 G% j# q
return -1;
2 o; W- ^. t' o% v2 l0 H8 r+ |
}
3 _$ {6 |, r; x4 i" }8 p
' f) L ~8 C5 ~( @7 e6 _. T# A/ S: e2 j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 F/ N6 I- h; y: c! M3 Z
3 Q' W+ ~# B, |: Q' o- U$ K* T
while(1)
4 ^7 _1 y9 V1 y+ x9 Q. ^
{
5 a# V' V; {/ n8 M! t% u+ u
read_MSG_buffer(mem);
" g; U# k6 g9 T9 N
}
4 c2 _$ F6 \: j- q7 }( @2 f$ i, Z
}
3 U* f+ [- E9 k% w
/ K A3 |* J5 Z' O5 g
void read_MSG_buffer(int *baseaddr)
! }% ^) Y9 q S/ l1 b2 q9 y3 u
{
y/ \% A# v: y, Z6 G6 ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
) Z' k1 t2 g8 }
: ^. ?- m* N5 F7 `6 y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, G% Y( M& K5 Q' [. r k
9 d* ?: Y7 D. J8 `2 V4 A
if(pshreRAM->packet_cout != count_copy)
% T l2 m! P2 l1 L
{
7 ?9 N- g3 ]9 R9 x& P
printf("a is %d\n", pshreRAM->a);
* C+ ^$ d2 J2 H
printf("b is %d\n", pshreRAM->b);
" Q% u. f/ k: A) W3 t# o9 B7 i9 L1 t
printf("count is %d\n", pshreRAM->packet_cout);
5 ^) O0 p: Z2 w, s& x, \
count_copy = pshreRAM->packet_cout;
9 H/ V3 u5 v: E. I
}
( a$ n8 a' F4 U
else
6 Y2 u# i9 d |/ ]
{
/ v3 g p. l# z& k0 |! L/ t4 d
printf("No effective message!\n");
) p1 ?' E: ?; E* j
}
$ }3 l1 m9 j1 S; R8 r
}
a# n% |4 w- {. E# M# C% ?/ H2 w
" y# `: L3 h* u' l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 a5 J4 E# |* @7 v: W: }. A Q Z
* Y. t' l9 \% m) @1 N0 r
- {4 Y1 U3 a. B% s. p Z, n
) J2 M- |) J! J/ T5 ]1 K7 Q
. [, V e& ~8 Z0 l. r
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4