嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) f1 U: @( \8 Y
* A( L! Q6 a: k7 {7 W& [' d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) ?+ }* I7 a8 e
#include <unistd.h>
/ V$ \, O$ }1 u1 M
#include <sys/mman.h>
8 U; F% n+ i2 |+ y
#include <sys/types.h>
* y# f m$ j( ^9 l
#include <fcntl.h>
: H" h( Q+ v: \! n: [
7 c3 p; G6 ~# l- m2 y; e% L q# X
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 r8 v+ e' k1 V3 l$ k0 _# k4 a
$ `9 I2 C' u+ d
typedef struct
) Y9 Z9 b' F+ n4 Z% H# e
{
0 B/ ]/ s+ ?7 D0 n- ]9 p* m
unsigned int a;
9 o8 A$ F6 t4 n1 A
unsigned int b;
$ F3 r3 T7 C# o7 f! W$ B3 x
unsigned int packet_cout;
& L0 X% Y! V- N' A1 [- ~5 w' Q! s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- W! d8 B }$ F. C
) ^. q- A% F' U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 h2 l- F4 z4 C/ e
unsigned int count_copy = 0;
1 ]2 X8 Y% R6 E6 `7 p4 _' F2 i
* D h5 h6 C7 y0 J0 d# R
# q4 O; Q2 R3 n% ], _( ], q9 `8 S
int main()
' w3 d3 n" q5 u: l. I. [6 b& y
{
2 S6 B0 \, P; c1 n! w- h7 ~; U3 t
pRX_MSG_PROTOCOL pshreRAM = NULL;
. t7 I# e- u2 ^% G. f: W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: `2 B! u8 l& H. Y3 u4 k
2 D2 \' ?) {, {+ {# j
while(1)
2 s& D, ]9 ~- |% U; G$ h' Z$ ]
{
+ J0 E' G4 V* g: w8 w3 M/ F9 [
read_MSG_buffer(pshreRAM);
9 A6 @5 A: a6 \* I! x' Y" m
}
V( ^" F0 Y5 B
}
& b0 Q) |3 f/ W& n, B* R+ W& V" ^$ j
$ w- P: h( f3 t9 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" N. h) I- m' M! {& I0 s
{
9 l/ L1 j/ r; h' U* o* Y
RX_MSG_PROTOCOL buf;
4 U4 l! _! h4 g
' D- D* L: p# B/ b9 X
buf.a = pshreRAM->a;
* y* ]# f- Y$ D: z& x
buf.b = pshreRAM->b;
: }! C: s9 [; \4 b { n! ?/ ~
buf.packet_cout = pshreRAM->packet_cout;
# [% n$ W: M2 a0 p7 d, q
& g1 q9 d% e6 g# q: z
if(buf.packet_cout != count_copy)
# z7 `' Y. \. G
{
1 ?8 _4 k$ W/ u1 t; X, v( E$ A
printf("a is %d\n", buf.a);
) y9 K% Q, ^1 S
printf("b is %d\n", buf.b);
6 z+ H+ E, ^, d8 A" K
printf("count is %d\n", buf.packet_cout);
1 ~! f5 F, |' _- E8 \% u F: `
count_copy = buf.packet_cout;
) _9 z8 w. o9 E2 M/ u$ a
}
9 m# j* s; j1 B* Q" N3 j u& C& S2 i; r
else
+ ^1 b- S5 k# {+ O7 @
{
9 `5 K3 m A0 u
printf("No effective message!");
1 d: F6 y' g9 }6 [' C* P
}
' Y% k9 ^3 A s4 Q
}
! Y% l0 O$ r: E, I2 U
: R8 ]) z& T3 [4 d a& E
6 z1 ~' p2 c) ~/ _) n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% a8 y% o1 N+ R* n2 V
使用下面代码,对内存使用了mmap函数后:
( b0 ]5 J2 g' w
#include <stdio.h>
' ?' [8 i8 T2 X+ s
#include <unistd.h>
# X4 F! w7 j _ E& k( u- ]9 B( P* _/ |
#include <sys/mman.h>
7 Q" t9 \& T* w. g
#include <sys/types.h>
# J5 N4 L+ O, l" q
#include <fcntl.h>
# Z8 b; G* j, X7 G
) h. x3 J7 c" p2 ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 U; j( j( j' d
#define SHAER_RAM_SIZE (0x20000)
, W: H" J0 i: ^
/ h. \! Z3 s0 [& k; t
typedef struct
6 Y8 s% W0 A( v, t% V1 I; N
{
6 |" s4 x" Y" d% g9 A7 T
unsigned int a;
& X6 _$ X, I A0 ^9 g
unsigned int b;
% q* s6 W$ F" R- G; W, q
unsigned int packet_cout;
* N" l: A u' _0 T1 d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: k+ c+ y; { u3 Y& ]
! w" H2 E; n- a* O4 F5 b" ~
void read_MSG_buffer(int *baseaddr);
' Z! |6 w5 [5 g. J0 E1 q
unsigned int count_copy = 0;
5 [% x( Y" D4 ^! J: R0 U3 y
2 Z4 y+ |/ V1 ]: ]( Q! Y9 U; u
int main()
" Y2 g3 c8 q* V7 x( d9 C+ k
{
0 j# h4 A+ o# O
int fd;
5 ]% S# T, O y3 r) C
int *mem = NULL;
& `. x4 ]$ V5 X# R3 t, D
4 V; C5 S' A* N0 e8 n
if((fd = open("/dev/mem", O_RDWR)) <0)
8 g8 `( v) W# G- e; R
{
+ K2 E/ R' G3 f: y* b( ` B4 X
perror("open error");
2 {8 |* ?! v/ s( x I% F
return -1;
- n; g& x8 G% G
}
Y0 U3 I1 ~9 Q, R% f$ D" z
' f9 T0 `7 {" h0 G
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ P0 H- p7 x' S; o v
- D$ X- B" C4 V# M, G! t3 D }0 a
while(1)
( ~2 D: ]! N2 X/ ]/ o8 q
{
: G) q1 m( y6 X) x6 ~
read_MSG_buffer(mem);
, [/ s+ Z( ^# }+ I/ j& c
}
: x! \' M, ^! f) h [+ F& P
}
% T% o S# [/ x, @9 g
0 M( A" \$ V+ K' P3 x
void read_MSG_buffer(int *baseaddr)
6 u1 C/ v7 K* Y% n" R
{
" E" {) Q$ n& M, A/ e
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 B# Q2 M! w( o, f9 f
' O0 k2 m: r+ c. V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 V7 @" G( G+ ~2 u* `9 T
) z* n& ^& C X# [9 F. j1 l6 v
if(pshreRAM->packet_cout != count_copy)
$ s+ H. @; \2 N5 x( _
{
8 ~& N' s2 S0 `" [( z; x0 J9 f
printf("a is %d\n", pshreRAM->a);
5 \, D4 I( [* j k: K, X
printf("b is %d\n", pshreRAM->b);
( J# l; K/ u1 Z
printf("count is %d\n", pshreRAM->packet_cout);
& M& B7 o& b0 C- V# m7 B4 m( A
count_copy = pshreRAM->packet_cout;
! i* c& A; ^9 R+ @) _
}
6 v, P! O: g3 s0 p. A8 v" e1 |! r
else
4 ^* P$ r; e! u! D
{
2 R& M/ k8 I5 |$ i) Q! x- o
printf("No effective message!\n");
: p, s( x( @+ C: A p
}
9 S# Q% I& [. H9 b9 |8 A
}
4 H* d- S' T; Z, p5 q
- h" N) l# G. X( L0 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, |/ e- s8 B1 D
3 J" F( C- _! W) l7 b, k( t
6 G* a4 E! R U$ s8 ]3 s7 F
6 P( V/ T3 ^7 r* P
! M% C. n6 V) N0 K& ~
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4