嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% r! C% X/ `2 p# F8 X& T
9 q! c5 h# g5 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 u; U7 I- T- M) d$ Q, v
#include <unistd.h>
5 b4 k( K- b% Z& A( z- N8 A
#include <sys/mman.h>
& m& a. q" S6 X0 ~' L. e8 e/ k
#include <sys/types.h>
* J9 X# g. R. c( f( A e
#include <fcntl.h>
, q( j6 u9 X. |+ m; ^) U# y7 S
( ~9 c5 f) z+ }+ l, B+ `0 b5 W! I
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 ?% N* r: Z6 c: H
4 f: v( {; l8 e) V7 U; H! ]
typedef struct
6 A1 k! E$ g, L& r; Y" `; w* r
{
# K1 M z+ F7 t( X$ ~3 q' G
unsigned int a;
& ?$ v$ z# [- t( O `. q, b8 w0 U
unsigned int b;
' o0 ^' X8 U9 y" }" u7 ~1 [
unsigned int packet_cout;
% M6 z0 ]# S2 l) O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 C X1 y$ [" ]! s9 D5 |" P
8 e( E' s2 j6 W% T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 v4 d& I x! l. ]! g. X5 w
unsigned int count_copy = 0;
- D7 @% v% Y7 \4 u8 t$ A
, j" {/ g w1 x& K" M# _! U
/ j! g& X1 ]* R. f
int main()
2 n* i* E5 l# f% p' [
{
: D% W3 ~+ ], O
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 J& r- ?# @) H- g
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. A; I' N8 q: c& l
' ]7 K- I! v2 u1 v3 J
while(1)
4 `; x, l; q" d) c8 K, p
{
: G; C: Y& H% K8 B
read_MSG_buffer(pshreRAM);
5 Q1 ^) C. q) ]" [
}
+ a/ h! g: n6 ]/ b2 M5 K$ d6 c2 }
}
; C% p3 s& G* y h: n+ P2 t' t
0 Q% W, m! M* [* k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 w/ z6 J2 p3 p# l2 a. n! r
{
. N7 ]; X$ V9 r: B# ]6 B0 w
RX_MSG_PROTOCOL buf;
! _- w. Z: C6 y1 Y) o5 \3 z
% ~& U4 M* `5 |( y2 k
buf.a = pshreRAM->a;
( ^( `$ B. o. ^' K
buf.b = pshreRAM->b;
# c& t1 ?( J5 n1 f. m
buf.packet_cout = pshreRAM->packet_cout;
$ a s7 _3 z8 y- D7 e2 E2 [
7 \6 ^7 [8 u. p) H' r8 P
if(buf.packet_cout != count_copy)
" N* D2 G. J6 f8 a
{
% P0 j" W: N0 O4 R8 K- L/ v
printf("a is %d\n", buf.a);
e& ~) @+ X7 z& J+ w# h
printf("b is %d\n", buf.b);
3 r Z; {$ K( P ~. `! s
printf("count is %d\n", buf.packet_cout);
' ?7 @0 ~2 l% P+ ?3 s
count_copy = buf.packet_cout;
9 C& L" I5 x8 {; ]
}
" a- `8 e2 U- U( n7 u# ]8 b
else
% T1 u- D) \2 }. x4 Y* I3 Q" N
{
: E' @/ c% ? s1 c6 c9 v/ A
printf("No effective message!");
7 h8 q4 p% K4 D2 G$ u V
}
: _( H$ Z* v8 ~
}
0 b) l# e! D4 O; R
% c# w3 o, l8 j; r6 p* l8 K
5 a* Z8 f, m% C. R( e4 Q- i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 m& `; T% `3 g
使用下面代码,对内存使用了mmap函数后:
2 e2 {1 A$ y; U1 d/ P
#include <stdio.h>
+ i n# b2 P* _; v& {4 p" i
#include <unistd.h>
# h* f, N. P" q) Y$ R" f- H
#include <sys/mman.h>
: n \2 ], e" N' R
#include <sys/types.h>
7 H! N/ }9 P: b" U. L
#include <fcntl.h>
8 B$ l0 l* D- C7 t) s" r0 }- I* a
' `6 t+ S; W; C7 S
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ f( \/ D; m7 S" h7 q: X: }
#define SHAER_RAM_SIZE (0x20000)
3 \8 I y/ D3 R; Q6 g3 L
6 U9 q' c* o! P
typedef struct
7 J6 R: ^5 x: e4 A
{
9 E! l2 t# Y. c" x
unsigned int a;
4 z- M" i$ D7 \6 U! o( E: r1 n) [
unsigned int b;
% U5 w g6 ]) V5 q
unsigned int packet_cout;
; K% t( f- C, v! x# Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 o- G) P: t. l3 S# r
; T1 h9 e3 P6 i) ~4 [7 ^
void read_MSG_buffer(int *baseaddr);
/ A! R& u4 H5 G
unsigned int count_copy = 0;
; S' }! s/ p" Z, D2 w) a
, @' m. K( w; x! d
int main()
0 l- K# U' l; P; b1 h
{
* X8 F q9 `# N+ g# L
int fd;
8 R8 g7 g: O' K0 |! m2 a
int *mem = NULL;
& Z5 b& f5 l% A' V- w
2 \9 }( \& I8 C# d) ?7 t
if((fd = open("/dev/mem", O_RDWR)) <0)
8 d- e: k$ u; \8 v
{
1 T$ i ^# s( v# D) N
perror("open error");
5 K& T( g. F, P3 X4 R6 Z. q
return -1;
' z# y; T+ [* Y/ x( R1 H% g
}
" ?) u6 z- u2 z3 k3 T v5 ?6 g
& s3 c" p1 Z1 }7 a
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 O; W% \! R0 V
3 G! l- B r3 J, v" G% }
while(1)
I. z8 {. }8 K- A" r) d8 c! m
{
7 w& Y( l1 P$ g2 g0 E/ T. e
read_MSG_buffer(mem);
! b% C& N$ @. C# G4 h3 Y
}
$ S7 V/ u% P n4 k7 @7 P
}
( @) S& |8 l @, o1 K
' f3 \$ u, ~% u
void read_MSG_buffer(int *baseaddr)
0 T+ c, R( i0 o* i- W4 y
{
! F3 C/ R: r. v) y9 E
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 ]0 E/ x- \, k( a
; C- d/ {, h! c: U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 y( `& q8 n1 j+ A( A) O
: _( ?2 P5 M( j
if(pshreRAM->packet_cout != count_copy)
' j' w9 m8 \( _+ p
{
# ?+ E3 q3 G, a, K3 b+ o& j
printf("a is %d\n", pshreRAM->a);
0 ]- Y* i4 c0 K4 l
printf("b is %d\n", pshreRAM->b);
! ~% H( ~9 I4 n) P: Z5 X* d- |
printf("count is %d\n", pshreRAM->packet_cout);
3 F4 l6 {# V- |8 {1 F" _2 P
count_copy = pshreRAM->packet_cout;
0 V( Z( J% b# ?- _9 a
}
/ E* E1 c' Q) O
else
+ C( o9 h: K* n. P6 s; P* c
{
* u9 u \- t& K1 D ?. ], p
printf("No effective message!\n");
) p9 z) ~" o0 }: f' K. ^
}
- g: u! K+ X- m% q8 ^. a& t
}
8 p3 U! `6 i, i) \) i8 V
8 ?' G1 H, L7 k! d, O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 B2 E' D* Z3 ?- N; |' s$ l# D
- t' w' {# l1 Y* A6 y9 _! e8 b
6 s# _% W6 Q8 q, q( m; v/ O, |- y
, z) P; G4 V. i2 x8 ]$ x8 k
6 y8 Y. ?) J+ U" x2 y9 {+ I6 C
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4