嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 x* t- `/ ] A
8 ~7 ~# H1 l3 I K$ n5 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& a5 M7 p. F* ^9 E8 H/ S% w! c0 v
#include <unistd.h>
$ j& b% }+ Q i
#include <sys/mman.h>
0 Q+ s) T* l q
#include <sys/types.h>
9 n. h s+ K7 M/ C! e, k" G) S
#include <fcntl.h>
. O3 ?% m$ G6 h
% T0 J& D( ~/ D, J
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 r* f( B. j _% t" v) t7 x6 v
; M; L6 m4 Q- o! F
typedef struct
/ a' E7 {+ L M" ^; R
{
5 M% f' H% r' ^) f8 R1 C5 ]
unsigned int a;
# C S3 P1 { F/ l! O4 \3 Y, W; a
unsigned int b;
' n7 o' {" H5 T% W# c
unsigned int packet_cout;
& r: Q# `* U8 C8 B& L: k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, k Z: y9 f0 g0 ^2 ^8 P1 T- a7 c% o
# d! X3 ?0 N4 c& I7 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; _4 e& D/ e, n6 }
unsigned int count_copy = 0;
( C& F4 M6 x+ z- Z& R- q- S: T* {
6 |$ W+ X. ]+ M+ [
! _' R8 _$ |( j( k6 D
int main()
7 ~# S3 M4 g8 v8 y3 ?
{
; n* _6 f- P" Q3 J; ^3 L4 A: E$ h) r
pRX_MSG_PROTOCOL pshreRAM = NULL;
- s' u m4 y8 I6 o" q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' t1 n6 i5 w6 _) K9 R. P
, A& |: \; `; W
while(1)
! L. e# p) D! x+ w0 \+ h
{
$ U& U# E' z2 i
read_MSG_buffer(pshreRAM);
, O$ H; n8 X6 H2 B# s7 _
}
9 f/ k; @+ Z1 z1 _ V8 e
}
+ L$ ]5 P* L0 Z- T* }9 j
0 Z" P1 A+ R, `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' L$ d3 u: @( }$ P& ?1 M; m; h
{
6 ]3 o$ t n; o3 y- M9 Z7 Z' K' o
RX_MSG_PROTOCOL buf;
6 k: P2 |$ |4 ]5 w- @4 I4 \
3 a/ V; K( m* c. s _4 ]
buf.a = pshreRAM->a;
5 e) v7 s1 k# {* X- B& y/ y
buf.b = pshreRAM->b;
1 F) k! v" K4 y7 V1 j. X8 u
buf.packet_cout = pshreRAM->packet_cout;
. q% ` V7 K& R7 n
/ P$ F- I5 x3 S. ~1 t, C- Y! V
if(buf.packet_cout != count_copy)
3 X" T) C6 \6 @" N6 ^* X
{
}: K9 A7 A1 K2 C7 E) e
printf("a is %d\n", buf.a);
/ o: p9 K* l' h n' z
printf("b is %d\n", buf.b);
/ T: r/ r W* @* F, b5 E7 S/ _0 @
printf("count is %d\n", buf.packet_cout);
% ?: a# s) Q2 z; i' j$ B
count_copy = buf.packet_cout;
7 x Y* C$ V1 i+ Q
}
5 F c' J, l$ ]1 R3 y
else
: _! t- L4 }8 @$ Z% V
{
! D2 C, f% H$ w* p3 u3 A
printf("No effective message!");
) w& ]0 k% t% j( E* b
}
* O$ U' ?; ^% O6 E S4 Y; G
}
$ R1 `: n9 v# Z
" b6 b+ r5 C {& O
% ?3 h% ^; n. j* X- C/ W x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
B% c5 x- g* }+ c
使用下面代码,对内存使用了mmap函数后:
% [+ l# V& P O( P
#include <stdio.h>
) n7 }) U2 F! p% t- u" Z2 m f
#include <unistd.h>
% k% X3 ~$ x( P5 u
#include <sys/mman.h>
; [, y9 c |6 t) ]2 O6 I
#include <sys/types.h>
% g0 u+ z7 J/ F: S
#include <fcntl.h>
1 k: |) k8 c) q; y
$ a2 Y2 w4 q4 X5 u6 d
#define SHAER_RAM_BASE_ADDR (0x80000000)
# }) o9 c( ?, j9 f
#define SHAER_RAM_SIZE (0x20000)
B: g8 ?0 ?0 g( B) k) y. z
+ ]2 e! s9 z3 `, D
typedef struct
! G9 H$ Y5 W a2 ^: |+ n& |
{
& j z+ |: p1 }0 a3 z- T
unsigned int a;
" m) ^. H: j; d7 E
unsigned int b;
4 s1 `0 F8 h8 n0 T
unsigned int packet_cout;
- r# p z( ^- i3 e. H; r; |9 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; T% O. q$ N& V! H: a1 ~7 W+ {0 ~. {
/ o& o+ ~: O& x" U3 o0 L y: v
void read_MSG_buffer(int *baseaddr);
1 o/ H2 Q) ?, ?4 y! Z- k$ U
unsigned int count_copy = 0;
J" `9 M9 P5 K! A5 E0 e3 D, U- J4 J
5 D. s# A$ T' _3 O& p7 B% y3 C3 u8 d
int main()
8 D5 J1 z7 A! G4 c7 a/ ]* x
{
; S8 v; t0 b" z
int fd;
( _, j: n9 O+ O9 u/ X+ N
int *mem = NULL;
4 j+ f. F7 [0 R" ?
# p3 ~% x' b5 |) Z4 B
if((fd = open("/dev/mem", O_RDWR)) <0)
& c7 J7 W3 ~! Z9 V d2 W, p
{
9 T$ D& @% {' R# x$ T
perror("open error");
" R* c3 ]; _8 {; a. b) j+ ]3 q4 W
return -1;
4 d2 p/ x& _- E
}
2 |. h' i5 H, v. G! Y: {2 t( h
( p$ O1 a+ y7 y4 r1 M; a8 d4 ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" W) i8 _5 m* x4 G2 G p- W
k! ]. x# | G
while(1)
+ q' m# {0 L3 ^" W
{
6 P7 @: b% l$ k3 n5 S0 p
read_MSG_buffer(mem);
& J( z9 h" e. i# u, d! |
}
- j+ s# Z4 _6 [! N/ J B1 E
}
+ p9 t6 X8 y7 m( t
" g( F# u$ A6 T5 {& A6 d3 _
void read_MSG_buffer(int *baseaddr)
$ a6 U0 R8 E, W, z1 Z- Z, `# G
{
z6 x- c9 F! H( r0 [, o
pRX_MSG_PROTOCOL pshreRAM = NULL;
) }6 q4 j& z% w/ _- ?9 P$ p; c
S. }* {! F; D# i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" E$ n; `9 `% n2 Z
0 j* T; m. h, N) X: y4 }" x
if(pshreRAM->packet_cout != count_copy)
& d( k, X% \3 q! H) M4 b2 r+ r
{
1 z) f$ z/ o$ S; r
printf("a is %d\n", pshreRAM->a);
1 H( F- c J$ |3 K. r# U
printf("b is %d\n", pshreRAM->b);
8 K. [, _8 Q, H. m5 E$ y* `1 {5 u0 c- Z
printf("count is %d\n", pshreRAM->packet_cout);
9 M2 Y; S; d; t# b7 C- N- _4 L
count_copy = pshreRAM->packet_cout;
( y5 R9 O( s9 p; E
}
; |' O5 r5 f, H- w9 D2 A
else
- P( ]/ V Z5 @- n
{
/ k% V3 u4 S: D Q
printf("No effective message!\n");
4 D* s+ a* {- E7 O) l- @2 B3 {: j5 ?0 d
}
: l! ]1 H7 d8 P' f; a
}
9 N- o1 U6 d: F+ Z. s! ^
3 v r/ b8 `9 H5 `- j0 ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" c* _1 T- z. X8 e C$ ? \
9 \1 t' ` ^9 m# N: `4 t
( D. s" y) H' |4 |& g( [( e
2 c }9 ^) J, _9 D
1 v" I- p) ?$ j8 [
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4