嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* Y. q4 a6 z3 B; o
# z& R% k9 G) E6 p Q4 @ B0 n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ _. d# Q6 q6 o# s
#include <unistd.h>
/ w) |5 K5 t& D+ i( N& H
#include <sys/mman.h>
+ g- P" _+ k& m' r- Z% O n
#include <sys/types.h>
5 I' g( J5 {" m* R& N4 b
#include <fcntl.h>
4 B* D4 h( m p. x! V
6 C5 D3 X0 x& ]7 ~2 M
#define SHAER_RAM_BASE_ADDR (0x80000000)
# Q, c9 E! ` P$ c9 }6 ]. i q
/ V, I l7 }0 d1 L; @ k
typedef struct
( |5 r. f9 q; h
{
1 o8 U, T3 c J7 v) d1 g
unsigned int a;
8 m) r1 T( j# ^8 C" s, R& P# G( @. x! g
unsigned int b;
7 @# J7 q" w0 D) U1 O& j! W
unsigned int packet_cout;
7 f& h2 E9 v7 ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 ~, J/ X* D9 x6 K# `
) ^: ^7 l) z2 V7 t! G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& r: e! j! C8 P8 A' M+ S
unsigned int count_copy = 0;
# u5 b+ |; y! h) }
" {- i. A, m: ?5 }/ t8 N- \# i5 q
! p% j* g ~# s( y8 ^# P$ T( D) H
int main()
& S% g/ z9 M# I( \
{
7 J' o a+ d+ S' S# v. ^* b4 e
pRX_MSG_PROTOCOL pshreRAM = NULL;
' z1 M) F! s( L. f* p" h- X( T. @2 V' S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* G/ y+ Q/ Q! G/ p( L5 W5 b
6 T; o' o3 k) Z* p" u
while(1)
: o2 p* }. R+ q
{
2 Z% ^' L n3 x/ T$ Z
read_MSG_buffer(pshreRAM);
+ b' } S& A% J! s& f8 j! }
}
) R0 a3 y, }! B8 T' ^
}
( p7 S4 }9 J9 o
7 {, j2 q! O$ o7 v2 c. }$ {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, `2 g' ^% a! i" l
{
: \2 v1 {1 p$ H$ X L
RX_MSG_PROTOCOL buf;
1 |/ h& h; l8 ^3 M
2 t% J% j! v3 Z+ N& ^0 w1 k
buf.a = pshreRAM->a;
, D9 x( j ?( `! g F4 T: ? v6 N0 e
buf.b = pshreRAM->b;
" m* d2 l3 x( M
buf.packet_cout = pshreRAM->packet_cout;
1 J8 f. p0 _8 l$ w# G- _. f
2 Y* j z$ x- m
if(buf.packet_cout != count_copy)
" U8 E( H/ e9 |" Y
{
: y9 f/ [4 e$ ?6 u. x# s$ G: V
printf("a is %d\n", buf.a);
2 H6 G& U: k9 I
printf("b is %d\n", buf.b);
6 [& F8 ~; Y+ m9 y- ` _
printf("count is %d\n", buf.packet_cout);
7 a( X: v& }6 S% P A. p
count_copy = buf.packet_cout;
5 g8 k* h% w3 E1 C: {/ K' I4 \
}
7 ], D# ]" n) M+ U" T/ z
else
. Y" E, Y7 y9 p* s
{
* O: W3 z# |% ?4 m1 I6 q
printf("No effective message!");
1 c+ l3 T' Z' `" A, {% a
}
2 b ]5 x7 c% g
}
: B0 O; k. K% S" V, d2 v$ `: O
3 k: U+ H: E' m) a4 Q* H8 h
, m* r2 [# @: M/ K+ {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% i- a% s6 l- Q- N5 a+ X
使用下面代码,对内存使用了mmap函数后:
( \' h* J8 z, @, x
#include <stdio.h>
- m3 D1 r% y6 c
#include <unistd.h>
7 @ l# S3 l/ Z4 V! g/ i. \7 |
#include <sys/mman.h>
2 `1 z, n' {2 W* m
#include <sys/types.h>
# O5 V" q8 d$ m# n. H: W
#include <fcntl.h>
$ o1 d5 i/ b6 i4 G F/ \7 e
3 A: k; l; ?% w; R: l1 `
#define SHAER_RAM_BASE_ADDR (0x80000000)
, Q. O$ j2 i3 V6 A
#define SHAER_RAM_SIZE (0x20000)
# \: [* h3 D4 ~2 A N; S
+ U4 U9 W. i5 y) D8 u! d
typedef struct
, }, `% h3 d. [* v
{
' p; Y& ~6 I/ [
unsigned int a;
* _3 |9 l; P0 z. U7 E" o+ U; C
unsigned int b;
; I2 t1 r4 D3 m/ t: }" o) e
unsigned int packet_cout;
: ?5 I& B- g4 N( C$ \6 T3 H9 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 z& T' L: z" {6 u/ a4 \ q
1 `; X# ]$ H3 N- R' P
void read_MSG_buffer(int *baseaddr);
8 c5 u' b ?2 i- `% M
unsigned int count_copy = 0;
* v m' V& }: F) }
/ E! V0 j; T9 b
int main()
2 Y$ a9 c" _* p) b2 w
{
; i; ~) S8 W$ C
int fd;
g- o4 l. h5 q" D$ |2 c7 e+ h6 Z3 I
int *mem = NULL;
* D* R2 V/ O5 M; M* u
3 _! }! K; ?; A
if((fd = open("/dev/mem", O_RDWR)) <0)
9 k8 E! A8 ^2 `& f1 u
{
. j* Q8 n2 h1 C6 w* ^9 g, d
perror("open error");
# @: \, I- C3 d( h; z! P2 {( `0 L2 t
return -1;
/ Q- x6 N+ |0 L9 c
}
; B+ u5 F' I; o; e1 D
5 R! W; m4 c& L( E2 u( v& R S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ K0 j+ t( h- o6 M% Y
5 h9 N6 G& d! ^0 B2 ~8 S2 M
while(1)
& N* i% r/ {' u5 G6 K* L
{
6 d+ H$ y2 l" z6 Z U8 A3 [
read_MSG_buffer(mem);
( i- _5 W- l! L
}
) o7 ?- n$ ~$ m: ?5 {2 `# _
}
0 s7 R; B- w; k( e2 R6 K
: w8 g9 ^2 O, W: n2 u* M+ E% Y* m
void read_MSG_buffer(int *baseaddr)
# V( `/ \2 U7 ^$ T
{
! S: J- T0 G. w
pRX_MSG_PROTOCOL pshreRAM = NULL;
! ^% x) X8 s* ?( F- R5 B1 c& c3 j
$ V5 ^6 @7 I- m
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 A/ M, x0 g- C. m& v9 G, G
4 v/ b( O1 `7 ^6 H
if(pshreRAM->packet_cout != count_copy)
) z2 l; o# h* o4 @, x1 \6 C
{
( }6 U! r b$ v$ I
printf("a is %d\n", pshreRAM->a);
% v6 V0 Z5 J3 p7 l" Q: ?# r- T1 l
printf("b is %d\n", pshreRAM->b);
$ f! |+ [6 S8 E
printf("count is %d\n", pshreRAM->packet_cout);
2 }- ^4 R- D% l# E+ P7 c4 y
count_copy = pshreRAM->packet_cout;
" b! S; n- s6 W$ r
}
3 b+ y% K* @$ y1 k! U7 Q
else
% \- f0 x% Z! Q
{
1 r1 B/ ^' U' P z3 U3 e
printf("No effective message!\n");
9 W/ d/ `# \1 j X" r4 y$ W
}
( r8 ]: D& B: z% @# Z5 p
}
$ d( m3 F* M! f2 S: p* K
$ D( d/ [/ F8 E6 y8 z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" q% n" J$ H5 D' N
( Y" ~0 G F" h7 E
' g! f1 T+ D$ o; M0 w% X" Q9 k
0 o8 u( T( Z( d) }# c; C
% l% M! r+ g2 a' y, A1 b: {
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4