嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- ]2 z$ ?5 {; @4 R/ ^) N
4 V8 y0 c3 \6 f6 H: T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; y9 k. `7 i! x) V
#include <unistd.h>
4 [+ Q9 }' _2 V4 _
#include <sys/mman.h>
9 e3 L, D+ U) b) b2 X, x. z$ s" Y4 n
#include <sys/types.h>
O% F. y" q) M# q+ X# n8 h
#include <fcntl.h>
: H+ C0 P/ [# ^: _1 l
! x4 F' @3 T0 d- u
#define SHAER_RAM_BASE_ADDR (0x80000000)
& P$ o( G& Y. P6 e
* h2 z7 V }3 l" @7 F$ c0 L% V; t
typedef struct
- s' I. y; V# ^+ S( l' h
{
" u# W a6 C' o- H$ m2 C% {
unsigned int a;
% G* q6 B8 r, G7 g. ^
unsigned int b;
3 R/ \/ ~/ G3 j- b1 Q& y; q: s
unsigned int packet_cout;
3 k* c; R( W3 ~" K, K% Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
n6 S5 d& s* B* [. H9 @5 S
1 {5 v( x& |9 Q9 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 J- F9 s7 w0 ]
unsigned int count_copy = 0;
4 H, W" s ^; g. j! ?
- @1 t. U. y4 x" f$ i- ?; K
7 X" e% I! d# i1 f
int main()
, `5 s- n( i* a' |/ S; ^
{
4 d0 ?7 z, \. Z' s2 b a5 U6 W
pRX_MSG_PROTOCOL pshreRAM = NULL;
" ?/ r4 I" C! N# u# c) t
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) x0 x" A; E) z, Y
) _$ R: X+ z2 d6 z1 @0 W1 I' R
while(1)
+ M, _. V3 o, c( A6 F3 V# j
{
, ^! v7 r. w- R9 P- Y
read_MSG_buffer(pshreRAM);
0 g9 f" u0 ^' J5 f* M( ]$ ]
}
7 w5 B$ k% y( z% K/ A% M
}
" `% I" _4 V3 N; V' t
2 z' H5 k U& r( a( l% n A: D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 R) r! D2 \4 p; a4 ]( [
{
8 }: h8 n- j' r2 q
RX_MSG_PROTOCOL buf;
9 k+ I9 P0 v p8 J2 K
0 i% {+ @6 y4 f( W, Y
buf.a = pshreRAM->a;
3 r2 `9 s# A5 C
buf.b = pshreRAM->b;
8 t7 D* F" N; Q# ]/ t
buf.packet_cout = pshreRAM->packet_cout;
% q- a0 L. ] X2 l
! V7 R: u) d, b1 {- P7 G0 `
if(buf.packet_cout != count_copy)
. A- m2 Z9 ?" v' q m
{
; [& h# l, C; W; T% C
printf("a is %d\n", buf.a);
$ j1 _: U; {' M- j8 w% X
printf("b is %d\n", buf.b);
1 F* g! I: o: m
printf("count is %d\n", buf.packet_cout);
" T6 Z3 { F' q: e4 |1 [
count_copy = buf.packet_cout;
4 j0 R; `" L6 r' w C# M- f, ^
}
7 L2 ~ C1 D4 D. r
else
7 e/ e0 l# w) C4 r3 L5 y
{
& E5 {. F3 F+ P- J5 E
printf("No effective message!");
$ k! A" J# M' q, o
}
/ R4 F4 m% w/ V0 w/ K
}
% g3 Y- ^9 `0 t* ]. K
5 P. n: W$ X n/ d$ q
% l- B" u/ [0 ~8 i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 b# }! U8 s5 o" D9 A; W
使用下面代码,对内存使用了mmap函数后:
! j$ t8 d4 m8 |- X
#include <stdio.h>
# T* ?7 W2 x( S( X
#include <unistd.h>
3 w5 t% n* @1 p# f
#include <sys/mman.h>
; \4 T. x( k m, N
#include <sys/types.h>
+ L9 F0 u1 M1 z4 E8 A. w
#include <fcntl.h>
5 q# ^9 W1 W4 l5 w, [2 x% e
* @8 g0 Z. g8 p7 j/ {6 u
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 ~! L3 N! X Z9 m
#define SHAER_RAM_SIZE (0x20000)
" b; d+ r7 n8 [. A3 L" [- F
1 ]1 s! K4 s( l, h
typedef struct
+ z, c/ I S# B0 |
{
) e' j: a; F3 G1 N. Q" Z# w+ G
unsigned int a;
. `: }3 X8 a+ Y7 [
unsigned int b;
/ O# n* u7 r' n* H) `+ U: S& O
unsigned int packet_cout;
, i' ^+ W5 r6 E) @7 l* o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, v9 h5 V+ z9 n3 p8 Q5 e% O6 K
- l% x" x! o5 p* E8 J0 v- c
void read_MSG_buffer(int *baseaddr);
0 P* K" l$ l1 }( [$ v
unsigned int count_copy = 0;
8 J; }! Z/ r8 Q/ d6 E
9 i' G2 T7 G) }/ u6 E
int main()
. c n/ U- `0 p% H& q. c8 w5 S
{
0 C' o% O+ f% O) l) w# V* ?
int fd;
+ E) |7 I% U( t: Z7 }2 F W# ~
int *mem = NULL;
" |) @* L' D, [
% |- j7 s1 r( d$ Z& r4 }" t
if((fd = open("/dev/mem", O_RDWR)) <0)
# Q4 b+ A4 }" L' P
{
! [$ c; ?* \& H
perror("open error");
# f4 q* |" y9 b4 _4 m
return -1;
& v/ `2 E* ~0 @5 f0 J$ f: m) @
}
3 `. X: G1 D2 y( O
( ?: I3 t2 v7 ^% }$ N. K4 R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, ?5 \, ~5 L9 V- Z' v' ]$ k
* I$ @7 Z0 D1 B, o8 H4 D
while(1)
; X2 J; g# Y# Z: B( w, S( E2 G2 Z
{
c, p: A9 G6 g
read_MSG_buffer(mem);
; D9 r) _: a; I( Q7 Z8 c
}
. n, c1 k# B5 U1 C
}
* c+ E; D7 B0 F+ E2 F% s
; |- }' g/ G! g( l) f' n o1 b
void read_MSG_buffer(int *baseaddr)
" N) L+ }& ^# [" t/ b
{
& B. `! @3 v. Z9 I- U$ P3 W; Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 \' F- F# p1 B" g5 C7 U% ?! R- Q
6 a" }) y5 @( X5 Q+ l, V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# _+ z8 s/ l" N C, V
! R9 [1 O R7 Y2 w9 e7 L
if(pshreRAM->packet_cout != count_copy)
6 i( c' A% u+ X# G4 _6 B) t
{
0 [' l; i" K$ z: [
printf("a is %d\n", pshreRAM->a);
& c0 l: Z, _6 I( i3 U$ ]
printf("b is %d\n", pshreRAM->b);
, |2 T, P* W8 u( _: O
printf("count is %d\n", pshreRAM->packet_cout);
c; q+ y' ^: t( e* R
count_copy = pshreRAM->packet_cout;
* p/ }3 d' h1 c( c$ z
}
" ~7 Z' X/ ?, O+ u& V
else
& w& _5 i: _3 Z& ~- I7 L% W# ~5 h
{
! w7 ?, a: S1 M$ b: @& G
printf("No effective message!\n");
+ v6 ~$ n$ J. N
}
& `% P, u6 c! q. _ U N
}
* i; t H. E0 f
% D. T5 H+ x8 [: P% y7 l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 ?4 X, _. y. @" Y* h. \8 g
7 N M o+ C6 |: {+ Q2 a
( D2 b1 T; M, ]) ?! Z& o
6 E2 p( Z! K X/ P6 f( [
$ ~8 ~; o0 U2 O" }
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4