嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- S" W: h5 u3 e% P3 Z& P
; h0 K7 D+ v2 a/ B$ @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 u* M$ c9 j3 \- E0 ]
#include <unistd.h>
, [% X1 Z! t* V! s. d. o( ~( _3 _
#include <sys/mman.h>
2 N) |7 t! y! u# C) I
#include <sys/types.h>
. b& y% h1 Q5 b K' g
#include <fcntl.h>
3 W4 o! U& u5 s" h# l5 v6 O
, n6 k4 J) M3 R1 a8 ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
) d/ |! W9 [: L4 I
' i0 i9 ^9 D; c8 K
typedef struct
- n. H7 `3 S8 l7 z+ X
{
: ~1 X+ ~ j* y0 H9 v- Q( f
unsigned int a;
0 A% a. f4 b0 J% k" U3 x# u" h
unsigned int b;
) B) r4 `# t3 t- p+ `
unsigned int packet_cout;
0 h" ^* ? { [8 ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: H* Y1 i, V' p
7 l! y7 ^" O6 S6 |$ x+ e9 F4 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 j- i1 l. ]- [( |- ?% \
unsigned int count_copy = 0;
2 k' j" @$ {8 L! z% ]
) S' V/ p4 r! h; m" k5 G$ `# f
* b8 ~& {* H+ @8 s. Z4 ]
int main()
& ^% \0 h5 E' C% j' p# I8 d2 W
{
0 q s& x5 J( Y2 c4 ~9 X! Y2 L3 S. U
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 r5 [6 o w% Z- B" ~; u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" u" d6 P4 n2 d
! q9 o: F8 j$ a* ?# P7 x
while(1)
2 E9 ^7 F) \8 w) g
{
# @7 M, a, }5 \: ^1 X5 X- N
read_MSG_buffer(pshreRAM);
7 `1 b+ p2 f# q6 T; c
}
, c0 i2 M$ a- p4 O- J( D; U
}
0 ?7 R7 }7 L2 p3 n
7 \' V; K' D: Z4 w9 X1 [+ H. @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" l- O/ u- p& I8 |# w1 m
{
/ u# t% V- `$ u
RX_MSG_PROTOCOL buf;
' D6 k" n, G# r
+ Q) V/ Z. W3 k1 H
buf.a = pshreRAM->a;
5 H6 _ o, {; ~$ H2 d
buf.b = pshreRAM->b;
; ^% P$ e0 ^0 `( Z4 h3 i8 J
buf.packet_cout = pshreRAM->packet_cout;
9 V4 {. M6 V9 V
5 {, X" D5 S" h& m
if(buf.packet_cout != count_copy)
' R5 @* S% M* g; H$ k B9 X# ]
{
# }( S& W T) N* Q; o' ?: R2 ~' `
printf("a is %d\n", buf.a);
0 q) H% Y* q( g% v* h3 E8 L1 B
printf("b is %d\n", buf.b);
( y: q" r8 K5 i
printf("count is %d\n", buf.packet_cout);
6 K4 M( R9 h( N9 Q
count_copy = buf.packet_cout;
& `& L9 U+ d$ c' M
}
% ~4 ?/ L# i) ^7 ^# i, _
else
( X: |! C0 w- b$ K' [" j$ N7 R1 @
{
! a% U7 q& P$ u$ @7 @+ U
printf("No effective message!");
' i+ y: e) q) R6 m! S5 X2 T
}
" }# I0 P# J- `! ]/ k
}
# d, x8 l: p' a# l/ N( w8 m
1 [5 Z6 D! M$ l2 y- t
8 s; ?8 l$ H0 P" x4 i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 ~5 w% K! q/ x
使用下面代码,对内存使用了mmap函数后:
* u7 ~8 s" ^2 @1 E5 ~* l9 L3 \
#include <stdio.h>
* \3 i) p% F! K3 F; [4 z
#include <unistd.h>
. c& L; @- D) U$ g7 M/ Y# _
#include <sys/mman.h>
" K$ E0 m' E* v$ t' z) d$ Z* S" A& q
#include <sys/types.h>
/ J* k3 f7 @& Q3 r6 s4 u
#include <fcntl.h>
( t/ G% ?; k' n- r$ @
J% r3 U8 Z$ c1 z; V& M
#define SHAER_RAM_BASE_ADDR (0x80000000)
; a w& A: l5 E' M/ ^
#define SHAER_RAM_SIZE (0x20000)
) k' c# Y9 {$ c! d; q6 |
8 x' c; |( L- y4 E- r; u O. @. F2 h
typedef struct
! _' [" y6 g1 x' x3 Q
{
( ~, P) ?2 R0 R% j
unsigned int a;
s, @/ K4 k- K
unsigned int b;
7 g- r" `2 l1 H
unsigned int packet_cout;
) C6 r, Y8 [! A8 v9 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 }6 k! f! g. v' j7 _
; N, F+ r, P( j8 w
void read_MSG_buffer(int *baseaddr);
5 S" W! J( U/ g2 ]7 A+ m
unsigned int count_copy = 0;
9 M0 X3 X6 M, x' w- n* f! P0 N9 E
3 K4 K" Q3 N8 b' _) \
int main()
5 ~( ?4 S: m# ^5 n" f
{
! x W& j4 Q2 }
int fd;
8 i/ B% W+ R; j( d
int *mem = NULL;
& R& y4 B+ \1 |# U( S2 E* R7 I
5 m" Y- n# `0 f( ?7 x! ~
if((fd = open("/dev/mem", O_RDWR)) <0)
8 I& l$ R; v9 f, N) [
{
, X1 M; p( X1 r: n" j8 \# y
perror("open error");
+ p5 e: f2 |! |* A8 |' _$ P
return -1;
+ ]3 ^4 a% z7 V) U. W) v; x2 Q$ d
}
; r2 A7 G) t c+ \3 x* i s
/ f5 o$ t/ j; S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 f0 M& k2 i/ r2 {* L9 Z7 C
* c1 P4 h# k* F' |
while(1)
4 y+ k+ S" X* l) b- O1 M4 i
{
' i; v6 t" ^! l+ p2 _ y! E
read_MSG_buffer(mem);
: p8 y2 O* v6 O# ?: a. D' A
}
/ ^) u" w8 }; v& `/ `( n' Q
}
4 N9 H; v2 _3 p# q! t2 r3 J+ V0 |
6 |& ?) n* A% p4 D; J, i' L9 S) g
void read_MSG_buffer(int *baseaddr)
' l$ {2 Q- w$ `8 E- |% [- e& b# e
{
# z! p A* G f( d+ K* {3 [3 R
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 R2 n. f) x& G+ ]! y9 n9 Q
l0 \" s$ E5 Z" u# a
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 Y, z# j- y/ S( p2 R" U
! Y& y4 [( V' t8 K! R9 T
if(pshreRAM->packet_cout != count_copy)
. {. H; H5 ~" x. T6 w" w. m
{
" p* j( `. i9 |. T8 @' Y
printf("a is %d\n", pshreRAM->a);
# R7 `# y O2 t( T/ q
printf("b is %d\n", pshreRAM->b);
1 _9 J1 a3 I+ B O$ w( P a
printf("count is %d\n", pshreRAM->packet_cout);
. V8 W# N5 ]' n
count_copy = pshreRAM->packet_cout;
$ z' _, p! I* z C5 s
}
& r1 ^1 j- I* Y( p& o
else
& ^# f3 I) B6 p- K1 @1 I3 k
{
9 X: c; C+ |+ B+ }' n
printf("No effective message!\n");
2 R+ J( M& ~& T) M: z8 k) @1 n
}
- P# T* p0 X$ a$ P7 M T
}
) t; J0 h" n& H" W: s
" Q: }; T7 r; I1 V: o d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! V( W3 k7 Q7 L6 b7 j
, z0 E" x# d! x0 H+ m; s o! Y
9 u1 L3 }4 m4 P8 Y j0 f2 t3 A
* R- {- R! q, B" u @2 z$ Q
$ K# w' ~4 B, i% b& B. K" \7 z
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4