嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; @( K/ r' q$ h' E9 y* U6 g9 A
* [ @3 }, ], z0 Z: A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 A% K" B) b: x
#include <unistd.h>
6 Z6 G1 H9 t5 X5 [' Q
#include <sys/mman.h>
% t4 Y( L9 n0 s
#include <sys/types.h>
0 v2 K* ]. |: I# T: V/ v
#include <fcntl.h>
1 l* `4 G8 _, g* S. p2 [0 u* @
# `$ X& l3 C1 J; r$ `. I
#define SHAER_RAM_BASE_ADDR (0x80000000)
( Y/ A! a2 |' g
7 A% g9 L0 f _ n$ q( f- J. Q
typedef struct
2 j) s- Z* b1 i& l3 z; S
{
; T, m! S6 B8 f/ o* r* f/ C0 Z8 J
unsigned int a;
4 K, `- B' k' ] z1 v( c6 \ K0 _7 K
unsigned int b;
/ d% `" x8 W, h6 A7 c
unsigned int packet_cout;
0 O( ?. F% y3 b9 u7 T$ g4 z1 ~3 v! f2 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 q( @. U; x: S' c) f% `
! N" s& n* i, q" I6 m5 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 ]. x0 o6 u0 M6 j
unsigned int count_copy = 0;
- w9 o3 E; o6 f& T- T4 p5 P
6 f3 p' \, }( G, S6 K9 ~
4 x+ c K; v, B$ O8 _# o5 Q# K
int main()
7 p2 S* e3 t/ ^: X: b+ S
{
8 }! }2 N$ ~6 ~3 b% `4 c. x0 [
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 A5 S7 N) P2 I* W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 Z0 R2 Q; }1 y( ~( ]) X2 U
5 b" ^+ f& {+ A; D
while(1)
3 t! u" w( c. c6 W s3 P
{
8 K8 d4 {, n7 q7 v- R6 |
read_MSG_buffer(pshreRAM);
! V5 _3 A p6 [. l2 m& M8 o: k
}
( U. d5 ~; w/ n$ a2 V& c5 c9 m
}
1 W2 ?5 V; W) \: K7 z% V
( Q3 ^1 E; w' i# ^5 V' U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( {* S( ^4 Q. S v+ ~
{
% F1 r y5 I7 [0 ~) _- y6 X
RX_MSG_PROTOCOL buf;
% }) H$ S# s# A( ^5 ?1 ~. _+ D5 Y+ z
3 i" \' K0 c2 D% @1 Q+ ]
buf.a = pshreRAM->a;
: }6 B* f# }- Y% C7 g. r4 j
buf.b = pshreRAM->b;
2 A- o* h9 e9 r; t; ~, I/ z" \) W
buf.packet_cout = pshreRAM->packet_cout;
( f0 q1 W2 N) b, @) e: F0 h
$ a: \, { y% {. v; G5 N7 s
if(buf.packet_cout != count_copy)
7 ]" O3 `, D% T
{
; M9 f* \* k. }& Z2 s# [
printf("a is %d\n", buf.a);
( t) [6 S, D/ F7 H
printf("b is %d\n", buf.b);
9 D, n( f' z$ {* P1 x/ e- o
printf("count is %d\n", buf.packet_cout);
/ g3 l1 q4 c9 N* i) |
count_copy = buf.packet_cout;
4 i# t6 R- W" d' e4 s9 ]
}
6 u# p/ v9 N7 ?8 Q5 ~4 z9 ]! W
else
4 G% E) L7 B7 Y, j0 _1 c
{
. V) F! l# @. a
printf("No effective message!");
) k; g' H( {3 N9 T- t
}
9 J+ g, \2 [' A" b6 Z/ s& Y- e
}
/ Z0 ?1 G D/ t! {* b$ a8 L- D# X
* v: r3 D- U/ `1 |, J
2 d3 a; J$ d- }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- i6 @- ^2 v% g' W2 U* s
使用下面代码,对内存使用了mmap函数后:
+ [, s( M* C( e
#include <stdio.h>
2 X! K4 K- |2 n, ~: V8 J
#include <unistd.h>
; | a' c D- [; n( r3 ^1 n% p
#include <sys/mman.h>
. R; t9 C+ i" s S: _/ K
#include <sys/types.h>
1 i9 N# t9 j" _2 p F
#include <fcntl.h>
/ G( \" n5 J4 s/ \
+ X: x/ }1 j/ d+ t6 o
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ q1 i {9 n1 v- t D- h
#define SHAER_RAM_SIZE (0x20000)
2 z8 F) m( u" Q/ f0 e
. W/ l& _8 ?: m- R
typedef struct
( d/ E. i# B7 M9 w3 l9 ]! G
{
( |1 N! L$ s4 u; y2 ~! X9 ]
unsigned int a;
/ @/ i9 @7 b+ F( r
unsigned int b;
% C/ `1 t( `1 u# a/ F
unsigned int packet_cout;
, P% K* {' F3 v/ z0 v# q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 y- T4 O7 z1 V/ Q9 `+ r) a
: ~( Z- \, R4 P5 o! y
void read_MSG_buffer(int *baseaddr);
3 n1 u- a$ @" ?; t* ^1 J" s
unsigned int count_copy = 0;
& ]3 j; p' x% Q8 l/ {& N+ c2 l
9 m; P/ m* G: F% b7 N% x
int main()
0 _3 P+ i/ |0 U" m
{
# O6 p# k3 M/ N+ f. h, |; S6 r
int fd;
1 _8 e& |+ N/ K
int *mem = NULL;
+ X7 N& t/ F1 B4 p
S$ z! O4 n. O1 G$ ?- J, G; ^
if((fd = open("/dev/mem", O_RDWR)) <0)
6 q. a6 `0 i6 s; W1 G3 h( w5 w T' f: {
{
9 ?' D9 \: S0 e* l
perror("open error");
" s1 e7 x8 Q* R; A4 V" d* ?
return -1;
- V# D5 y8 y/ q+ w9 P
}
f( M6 c7 M9 a* _ ^. `
' b3 N1 |, V3 t8 {, E3 H' c W" j0 T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% a( k# [; l' W
' p" {- o) j) v6 \ W" \, {# }
while(1)
) c5 _! S$ {0 J# d7 v; c2 J! d$ y
{
/ Y3 q) k: j. X; B g2 u+ c6 \
read_MSG_buffer(mem);
9 z/ Z+ S* j+ C% V7 E2 E- V
}
' Q5 C: o; u7 `2 Y
}
. L# T5 d+ n' A3 |# {" J! p* j' M, M
4 q) e( D( U* N
void read_MSG_buffer(int *baseaddr)
. z# @2 s( m9 c7 i0 c; o' @
{
+ ~- J4 `* M. o( N0 \
pRX_MSG_PROTOCOL pshreRAM = NULL;
N. O0 V8 Q' O
+ J7 T. n3 k" f0 r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' C- O5 e0 p: o# K) F: h; L
' C4 U) C; V% B$ \4 G
if(pshreRAM->packet_cout != count_copy)
, }1 ` {/ F# C+ F" A" G
{
x) S/ e6 \9 p4 z" Q+ p0 s) `
printf("a is %d\n", pshreRAM->a);
5 U8 f" m m: @+ }: a4 f
printf("b is %d\n", pshreRAM->b);
/ L% A) k0 B& Q" h0 H
printf("count is %d\n", pshreRAM->packet_cout);
2 ]% J6 n4 `% D, q9 z; H0 s; x# A
count_copy = pshreRAM->packet_cout;
9 J; ^! r% v6 g
}
u& g0 T( N6 i! t; Z
else
/ y" g8 b7 D' B, ^" K5 i
{
" F) E: c( |% ], o
printf("No effective message!\n");
( |0 c+ ^5 I$ W; @* c! j
}
2 ^% y/ Y K( _
}
+ U1 D" g V+ G* D! M5 W9 s
0 {- ^3 E. m5 p o; k1 I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; f& U9 t1 S6 \+ ^8 Q
8 p& B) f# W: g+ D" e
& ~2 B/ v8 a$ k& P
% L' y9 I* c* ?, i
% W5 ?7 T4 ], `4 ]. I+ S, P9 n. r" L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4