嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ _! \7 y5 [2 G' i- f2 m2 o
/ z6 N/ I9 P) Q- ^3 k1 t1 y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; I7 `7 B$ b0 G" X/ _5 v
#include <unistd.h>
2 P5 [+ `* Q9 W; O- o. t- C
#include <sys/mman.h>
% K2 C' F5 h( W1 H0 ^
#include <sys/types.h>
2 H8 \4 E8 C- D5 @
#include <fcntl.h>
8 \4 F+ }" H; k% P) l
/ `% m" L, Z0 F; c$ b
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 t; h5 G5 m: s# Z0 `
# m3 H6 W( b |9 j
typedef struct
. W/ V4 T3 Z% m, K
{
5 c% r+ I% F0 X
unsigned int a;
7 Y& ~9 L# Z4 C% U) ], U, b
unsigned int b;
. ^) Q" n) `0 X0 J7 b2 y, h
unsigned int packet_cout;
' y. G1 ^6 R4 l1 r9 u% X$ F- t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) e# e" [ d! `, k
% O% _0 @' j; }( o( L% B0 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# T0 A# `* ^6 x2 r+ Q1 w" E1 I6 {
unsigned int count_copy = 0;
6 `* B( c1 t' E- H% h8 I$ [
( M( w! j$ L: Q* [$ W( b
0 X# x- t: H& R3 M* U# F+ c* [' s
int main()
; ~2 E4 e. O; T4 }
{
9 }/ A, L- T8 U1 Q; t5 e
pRX_MSG_PROTOCOL pshreRAM = NULL;
: h% J% r5 G" X: Z' v4 F; \6 ]1 p
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 k- m. I F" n ^. N4 G8 U; o/ p: `4 i
9 r0 @1 Q& i) L* ^- c2 D
while(1)
. k7 v4 e6 L9 K
{
6 r4 C3 i: h# m
read_MSG_buffer(pshreRAM);
# c/ D$ } h2 [, |% T
}
3 b5 Z/ [7 s$ E/ {- I
}
; k. d. [* N7 }2 z, o
5 Y" a) _1 Y- H, H, s* {1 s1 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 v* ?+ p ^& ]) n0 P
{
) ~' l/ g7 e* a( O. A3 f
RX_MSG_PROTOCOL buf;
/ f4 B9 M* t! f* e% L
& c# _( k |+ U7 a. s5 |% o4 E! L
buf.a = pshreRAM->a;
- l7 ^, Q$ l/ G' i
buf.b = pshreRAM->b;
9 J7 y4 p% t9 j1 Q5 L) S
buf.packet_cout = pshreRAM->packet_cout;
8 f2 {9 n Z5 A2 x( N
9 }. u7 x" R0 x4 f
if(buf.packet_cout != count_copy)
% K) N$ ^+ W$ Y# H
{
# X- e$ q) k, Z7 T2 D+ `) @
printf("a is %d\n", buf.a);
% I, s& A: U- U( p6 O4 |9 }& b, m
printf("b is %d\n", buf.b);
( }2 s c* R5 d3 Y5 H+ ?1 t
printf("count is %d\n", buf.packet_cout);
, F: z, \& C( R1 \( W- \( C
count_copy = buf.packet_cout;
4 H, ]; e3 \* \4 e; |8 @2 v
}
8 Z% i f/ O9 Q
else
" k2 X$ e" x: m4 G
{
0 m; }1 V6 H+ D w) ^: k
printf("No effective message!");
5 ]" h9 G9 w3 k% k" N& l1 Y' h
}
1 ]/ r2 S; q2 v; e. K3 }7 V
}
[* K1 ?6 ]) t3 i) }- r K
6 ?( d$ l5 \* m2 \, D& i
3 U k& ]8 e: i* Y+ H( ?2 \# d$ N9 N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ D, Q% i$ b- N* ^
使用下面代码,对内存使用了mmap函数后:
: L ~6 N" ~+ b$ r. W
#include <stdio.h>
) g) U) K3 u/ F( F: T o
#include <unistd.h>
. z$ |1 W; U9 L4 p) c! W/ ^! w
#include <sys/mman.h>
. j4 D0 ]5 K# z1 g- K
#include <sys/types.h>
4 X! a! f) o" I- K/ Y! e. P
#include <fcntl.h>
5 }/ O5 ?# m- G+ D ?( C
. K* r' K3 W+ z! S3 a
#define SHAER_RAM_BASE_ADDR (0x80000000)
* V$ ^; g& k& e- s+ y; W( N# R
#define SHAER_RAM_SIZE (0x20000)
% {: ?* a& w( h2 b. J3 M2 z& p( f1 g
* ~& @1 x: J) O1 w3 M' u Y
typedef struct
+ e! `8 B+ J1 T
{
0 \* I% F7 _ `0 B3 C7 i! }! r2 I
unsigned int a;
( E7 T& P- m2 v( z. y. g6 L
unsigned int b;
! W( D. Y7 M7 o& U
unsigned int packet_cout;
% h F/ h4 y {" v) D+ b$ a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
}* _% [ e. Y2 K5 c. W
8 R* }4 f& }/ z4 [ h* Q/ C$ d
void read_MSG_buffer(int *baseaddr);
6 b% K; u# y g; z2 }' d
unsigned int count_copy = 0;
6 X- T, L9 H! t6 V, W
3 g4 T8 r8 E- K7 R
int main()
# i9 b/ |( O- C. b
{
$ d% U9 ^+ O s2 r% i; |4 r& y g! L
int fd;
) M: K7 \9 p4 T9 J1 F6 u
int *mem = NULL;
& k$ F9 t1 ?9 u% X P
" v" b2 W( k0 e' A% s. D" S
if((fd = open("/dev/mem", O_RDWR)) <0)
{4 r- E; k9 Y% N$ t
{
5 l. ^! p6 \; m$ U
perror("open error");
' T0 S7 o2 q& B, O% d/ Z8 @
return -1;
# m, o' J! R( e# E
}
9 U$ g% ~' Z+ m- @' i
) H7 S/ Z/ p4 u: q. F
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; z! m$ N# V2 F' g5 d7 V# k+ o" b
6 S. W( R7 u. _5 d/ `. A
while(1)
+ g4 G! W* g2 K& h; D' n9 v
{
+ m/ }: n, ~4 L4 M3 N* B
read_MSG_buffer(mem);
4 ]3 n% ]" D6 N/ \$ _
}
0 H0 I) {2 U% }. g+ G _) I7 ~
}
! g# c# _) A. L
" U* ^8 Y% v: Q
void read_MSG_buffer(int *baseaddr)
8 a" L4 \2 B9 n1 m+ V+ C' g- P
{
& L" ]3 \* m; I
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 v, M B4 r" Y
" r9 E! {) o* {' e: `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 ` `" _# \. p$ F7 V& ]
! _/ M; f$ `. V+ q
if(pshreRAM->packet_cout != count_copy)
$ P* i% A- x! P8 M1 p
{
3 D, w! J- S9 y+ e
printf("a is %d\n", pshreRAM->a);
V c$ c$ P& g
printf("b is %d\n", pshreRAM->b);
5 u3 j$ L W9 W5 R+ ]" q+ p% ~0 Q
printf("count is %d\n", pshreRAM->packet_cout);
2 ^$ X: W, K0 J& E6 e8 T
count_copy = pshreRAM->packet_cout;
8 Q( H" y, h) u# b5 B2 ? C Q
}
- l. v$ r7 H% \5 B, P3 O6 o+ y& D
else
+ Q8 o& t @* X! H& g; b2 q
{
; m& H# B# ^/ S( C
printf("No effective message!\n");
( j9 O6 c) M# E- S Y
}
0 O1 o! w9 C6 U! V
}
' k+ f+ d" v2 R- X
% u! I5 c7 a6 d% k: R+ I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" L0 d- S! k* J% F. i
2 _! R; z, M1 i' t
2 M, q5 ^$ Z+ b- \, K5 y( c
5 s; S9 }4 w2 J
' f& g! Z) z9 t& C
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4