嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: Z- B1 E( g$ ^8 ? M$ W" g6 J- A( j+ G
) m8 R' [# O2 ?( ~% e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% {% |* M( [" P8 d/ V# }
#include <unistd.h>
. Y& ?2 j5 X! Z1 ], A6 d! ^
#include <sys/mman.h>
7 s x* D! v0 |
#include <sys/types.h>
$ D* V1 u0 \) o8 _, n0 N
#include <fcntl.h>
N2 N6 R9 J3 b7 e: w3 D5 k1 X
/ {# A6 l7 E" f; I/ {
#define SHAER_RAM_BASE_ADDR (0x80000000)
; A) E- i# ]' c4 o6 b. _5 R
5 J9 [" D' J y5 K4 C1 J
typedef struct
0 X. J T( H* ?. G G9 b
{
4 j1 _( i S; G; t
unsigned int a;
* j6 E" L6 F! H" s, ]/ Z! }
unsigned int b;
6 }9 f" s* m6 H$ Q
unsigned int packet_cout;
5 O N( f1 { X% R% \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e- y) k6 S( e7 J8 Z
; T! p' U4 Z5 [' o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% B: Z5 M7 F. Y) M6 o
unsigned int count_copy = 0;
$ G1 P) H; Q4 g# {' a
# [ Q5 ? e5 x# r1 ?& d, y
4 R0 V- S% Y; Y0 u6 x& V
int main()
$ n0 x4 ]0 A) N$ J3 @
{
+ z6 {) ]8 d- t$ {8 u4 V* v
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 `6 q$ L5 X9 e$ v m
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 m" @# V$ Q: d4 r. V/ K
( j) ~0 n) a8 o! M3 Z' g
while(1)
/ F2 h9 @3 Q2 m
{
5 b+ P7 Y6 Q; B$ n" m7 V
read_MSG_buffer(pshreRAM);
" ^9 T3 S' G2 w2 t5 z1 m1 L& x, Q2 K$ o
}
9 ]( ^9 u8 f5 x7 L7 h7 A
}
0 V1 W B# k/ \( V" l9 @
8 @3 [1 L& r+ h7 U, Q5 Z6 j$ P: |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 y D; H% P$ S5 A/ ? x
{
4 H6 ^/ q! |7 m5 ~6 z" a$ {3 O
RX_MSG_PROTOCOL buf;
9 b8 x/ v6 n7 X& D2 i
# @' @9 n# t+ |; z, l
buf.a = pshreRAM->a;
0 L# I! O, _ o$ v; a& M+ E/ |* X
buf.b = pshreRAM->b;
" H" T& ^# e+ X% d7 u( c& Z
buf.packet_cout = pshreRAM->packet_cout;
4 d6 g. d3 Y' `6 r( X
* H/ e0 y: a6 P- T9 h% \% d
if(buf.packet_cout != count_copy)
2 ?* A2 Z; j8 Y# @3 ^
{
4 @9 R2 C+ y. o3 R$ Q
printf("a is %d\n", buf.a);
: k" ^ `/ ?- s. S' N( `
printf("b is %d\n", buf.b);
; Q! T2 k* b1 \8 G( C
printf("count is %d\n", buf.packet_cout);
U( c s* S( v' M
count_copy = buf.packet_cout;
0 r% k1 h, d5 t6 }
}
% r z% R7 a& { r! w6 H- g; F+ |; j' z
else
3 @, i/ c- U& J
{
3 m% [7 m* t- J" |* ]8 R
printf("No effective message!");
$ x/ `# K: F( P! ?1 P. t
}
7 H8 M+ _3 v6 |; W0 l
}
3 q# l. \7 V2 @
: G' y5 \$ g; k. p0 h& h# a
$ g3 Z0 w; }4 ~8 d+ Q8 A5 O3 s% o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- r( T' G% ^8 P- }8 O, x
使用下面代码,对内存使用了mmap函数后:
0 A. _/ `9 H4 W0 W2 a0 @
#include <stdio.h>
- U6 s0 g3 |4 A
#include <unistd.h>
& M, k4 T3 h3 Q! `& b9 F0 ^
#include <sys/mman.h>
$ d" W# P1 S; R) A& i K- F( M
#include <sys/types.h>
: p" U+ d) L( k* [
#include <fcntl.h>
( O N3 U$ m& S$ n5 ~( ?5 U
' E( L& V+ d" _' n& y
#define SHAER_RAM_BASE_ADDR (0x80000000)
* b7 E0 A! x# v% M# H
#define SHAER_RAM_SIZE (0x20000)
5 {6 c1 j8 ^) P* @
* k$ b. ]/ q) y2 A1 Y
typedef struct
, S+ Z" D+ S* w! _
{
8 [, }8 z% @/ F7 b0 i& }0 \
unsigned int a;
5 l: L( i# \' y* o7 K- @. y* c
unsigned int b;
/ H* C* U( @( W+ c
unsigned int packet_cout;
, z" C1 `9 M/ T8 S3 I# M' Y/ C3 g- v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 T8 b1 H& a( H$ P
" z n$ v! e# G4 ]/ C
void read_MSG_buffer(int *baseaddr);
: i, Q q$ M9 ~$ i! e9 p0 j$ k& \
unsigned int count_copy = 0;
7 L' b5 F5 Q; n& c4 v+ M1 V4 Y
! a' t, w7 w$ m2 m0 O- g* E; D) \% u7 x
int main()
( a3 a4 w2 I7 \2 `, L
{
: Z0 i) t& |0 U0 q% B% S: Q; l
int fd;
9 }4 b* J) d; U; M
int *mem = NULL;
5 d- n# B1 }6 _; \8 x/ d! H, m" [5 O! u
7 j" m) A; F4 Z5 g& P
if((fd = open("/dev/mem", O_RDWR)) <0)
/ [7 R' h8 Z0 l% \7 K6 A. T( S$ |
{
, U3 N9 Z4 B, p
perror("open error");
2 F/ ~% f" k: u6 Q- p5 e
return -1;
) D! p, E# k; \
}
. r' m, `2 H5 ?; ?/ B
$ w- m; _$ s) z7 ~8 a7 T' V% g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 d' k ^7 N \# |1 D7 L" k1 g( y
. |5 L( {* T, `; z0 i
while(1)
4 H- l- g6 L) E5 e- V |
{
+ C! R M4 G5 n0 q0 q
read_MSG_buffer(mem);
7 |" q3 b5 o6 q9 A- t/ P# k8 D$ N
}
: Q; B$ n5 `2 t; x, V" @& ]
}
4 y- R1 l7 v- i( @
4 ^0 Q, m/ A5 j- m
void read_MSG_buffer(int *baseaddr)
* l: l2 }9 ^) q! g# W$ I1 C
{
: l# Y. I% M) b- D
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 W! n, R1 _; N/ `
' }4 X4 y) B+ N, U; ~% d0 `5 B# Q" W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 @; u2 \/ p: Y% t+ T- K2 L
" x+ p1 k$ S k; W! [
if(pshreRAM->packet_cout != count_copy)
6 s7 [- d* d& E, Z% d
{
+ F% m) f, y* p X2 d7 }
printf("a is %d\n", pshreRAM->a);
! _" c- s; @2 G% D" [
printf("b is %d\n", pshreRAM->b);
) e1 U/ Z( S" I
printf("count is %d\n", pshreRAM->packet_cout);
( Y7 u7 ~( O( s& A; M* y
count_copy = pshreRAM->packet_cout;
& B8 @+ E; n7 w* H; y' |
}
$ F5 V' G5 P: q6 C y+ U& _
else
: i u: ?- J5 N. J% a
{
1 _- D: s5 J0 N
printf("No effective message!\n");
. C) c9 X4 s& s. p& H8 H, l
}
3 ^1 S; j% n" C. i7 }9 L& e9 u
}
. t8 L4 @- \2 x& E/ w/ F
( n* z% C9 e. @- X, B: W# S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. ^& s" ]5 a$ Z2 _* H
6 o0 a2 u( e D- j. a, m: O
( Z2 W \, d! m9 Q1 U8 G \
0 s: F% w% X* [
$ p& X. b' j& F. b0 P
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4