嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* z% w) c! O: D* Z0 b
/ F+ @+ W3 G5 q* d4 C# {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% S1 {" a. O- L, o8 z3 S
#include <unistd.h>
! L6 c8 P2 o' L: C! E i) S
#include <sys/mman.h>
* Q& ^8 w# I5 w' \: P+ S3 q
#include <sys/types.h>
5 [2 I ^% U% A8 ?, a& p7 E& _9 V9 V
#include <fcntl.h>
' L) N+ N+ f" M$ H* d
8 [+ Z$ |9 g2 O5 p+ P5 B
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 P( G( R& g. E& e# p
! g! c* E+ q! X5 ?* A
typedef struct
7 M- |* K7 Z* H
{
6 ^ a, F8 K; v) ~9 `' m
unsigned int a;
% v, g/ `8 T3 J8 O& ]9 K
unsigned int b;
. |% k0 Q1 z8 K8 [% P4 ]7 i+ `
unsigned int packet_cout;
6 v0 R, \- {% k" A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ h. t6 [& @; U' y
8 t2 e3 E V8 _! Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 h1 V7 K9 U# s: W2 i
unsigned int count_copy = 0;
5 J" ?0 v% A+ O% ^# |
, _) h- O8 S1 l- g$ s4 K' Q) M
4 w5 A& H( p' T" T3 h5 u; b
int main()
1 k7 d7 H% M1 ~' x" \* |$ F
{
4 a$ n2 X" ^, \' R! _
pRX_MSG_PROTOCOL pshreRAM = NULL;
r: P2 y5 E; I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 i+ D/ d2 E4 u' i) X3 R# P
& T! P8 X+ f# _3 d. |' O, I! d4 l
while(1)
$ W, c% E% a# Y: P: G) x; n, r( S
{
6 n g: _4 e2 l \, V
read_MSG_buffer(pshreRAM);
1 G1 c7 o( h& O4 U
}
3 l! l, v+ T. Y/ G
}
8 u: [5 W2 B* A5 A/ D0 H% {8 K/ O
1 c9 a3 J5 S2 {$ r" ?9 d+ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 D% |# e; C7 I/ L3 Y0 T
{
: R2 ]+ E" f( f) |
RX_MSG_PROTOCOL buf;
( S* J" P" x& h/ e
1 C, q+ W( y! N3 t$ X7 a
buf.a = pshreRAM->a;
3 x6 U7 t ~; i
buf.b = pshreRAM->b;
& I/ V9 U: S6 X8 Y
buf.packet_cout = pshreRAM->packet_cout;
( S& W) Z- j% G: d) U
% [4 ?* A2 Q" R9 v" v- o
if(buf.packet_cout != count_copy)
- h: n9 P7 a4 \% _: h5 d7 _; u' }# E
{
1 R3 K" Y$ s& D+ I1 N, o( }
printf("a is %d\n", buf.a);
f8 J7 c4 Y- F
printf("b is %d\n", buf.b);
3 M4 l1 p. d' x0 Z, z% c
printf("count is %d\n", buf.packet_cout);
0 ^( M1 c& O. Q! j* G& `
count_copy = buf.packet_cout;
+ ?8 k- v/ D* @1 {9 i
}
8 Z$ ~ H o, \, [& @/ A( X
else
: Q! w& u+ I- U9 `
{
; ^6 x, M% ]& ] o1 _- u9 P' H
printf("No effective message!");
# b+ S' d* g) |: `$ e6 E
}
8 S! A( o! z) R6 ]' l( g
}
G c( s8 P% d$ {
- ^# n$ ?7 z) x$ a
5 p& [" ^. ]9 |. Q; j' }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* l) z B5 I* [+ a. f8 a
使用下面代码,对内存使用了mmap函数后:
1 }: y! y, V( ~& ]+ F. u9 [
#include <stdio.h>
1 t2 S3 y" m/ p) m
#include <unistd.h>
2 T5 P9 M0 k9 D) w
#include <sys/mman.h>
$ z; ^% S' B+ r6 K3 s& S
#include <sys/types.h>
$ l0 {# y6 {! C2 z. @
#include <fcntl.h>
) A5 d: C8 w* x- _
T. F) O% D6 P1 t
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 a' j7 N. E7 K
#define SHAER_RAM_SIZE (0x20000)
6 c" q5 V, c( t/ r
. z" G2 i! L( M8 |' c
typedef struct
2 U0 J/ B+ b% q
{
; b/ e) Q; I* |% o3 I, S, s
unsigned int a;
6 C7 ]8 f [0 f5 p$ d- W
unsigned int b;
" a. O1 N$ o, K/ [" f) ?
unsigned int packet_cout;
: Y7 a8 h2 f( b) x! V: t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 C; x1 L) q/ U
- h4 S' ^9 Z$ W. \; T
void read_MSG_buffer(int *baseaddr);
7 z6 O9 R/ t4 N3 W7 B
unsigned int count_copy = 0;
7 X+ M8 o0 a6 @; c' |/ D7 R
8 y" x% U4 `" I0 Q# E) T. W( j
int main()
# z* x! L1 P# J3 y! J- y& K
{
! W0 x* Y p o- X5 A
int fd;
|! b( f2 d( X( L# C
int *mem = NULL;
/ T" g: q6 `0 D# j6 o2 M; e- x0 p
~6 v1 i8 e! t6 {3 z% ^
if((fd = open("/dev/mem", O_RDWR)) <0)
9 c5 O7 u- B( _ e
{
4 t' r8 S+ t. A! K$ |) | P- u
perror("open error");
# ?* N: \$ J# j3 p# e v
return -1;
9 B( G! u8 I& u- \! L' [; u2 M
}
5 L2 C6 E& O7 `0 ]+ R0 T
6 i8 i. Q( `. Z- q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) v+ v3 u7 Y- ]; F- \6 O# ^- k
2 A8 T% M; J9 `- H
while(1)
1 ?' b! h! }& n7 K' a$ F! E4 n
{
, x: x5 i; k, C& }0 H7 k
read_MSG_buffer(mem);
- L2 b$ K% r3 A/ B! ^7 ^ O( n
}
1 Z \1 `. q% H# o& _
}
+ ^% F7 C* |. ]0 c
5 U; h T9 F9 N7 A- k6 R& ~, Z
void read_MSG_buffer(int *baseaddr)
! E/ D) m" P, t8 B% l
{
6 ~) l( ?1 q% @9 q- }; Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 g! a8 s6 [% J" W1 M0 [& h7 W" l9 @
. O p2 n& B3 z( ]- H: Y4 ]
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 L* z, O% P5 k4 y, m
* x+ [3 l- U. `. w5 v: S
if(pshreRAM->packet_cout != count_copy)
/ @9 q6 Z1 E! p
{
0 B( v: {4 y( E
printf("a is %d\n", pshreRAM->a);
S# W" T4 e. H h1 O! R
printf("b is %d\n", pshreRAM->b);
/ M. f; w5 A# T" F5 n
printf("count is %d\n", pshreRAM->packet_cout);
, f+ q2 u9 x n/ ]) B1 h; K+ J
count_copy = pshreRAM->packet_cout;
}" Q) o# ]6 m+ P/ h
}
1 u" [+ e+ Q& Y$ m7 n: ?) s3 m" U
else
( Y: t( ]* e- i; Q9 ?) }! T( s
{
6 p2 F0 b- z4 s: j9 L
printf("No effective message!\n");
3 M s2 y7 H0 g+ c- h# T3 v
}
7 e, r7 [ @/ O2 F
}
5 w4 t* V6 h- z" F' B- X
/ A- M4 u u% g6 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 {6 h$ J. ?. r# l/ C0 e) Q
8 L& ^9 F$ O! m/ F# S0 g8 V) j
. X @& D+ p7 A4 h: J
( W, z+ F& U# \: d. s" W5 q
2 y* ~6 g4 J) |- y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4