嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 ?7 X7 U* U- R1 X
( ~% A& h) x8 q+ |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 Z7 `$ L! Y6 w) y& V+ `- x' \5 E; V
#include <unistd.h>
/ e+ g) @( W+ B0 n
#include <sys/mman.h>
' [1 F& z- P& P: b L4 ?
#include <sys/types.h>
" @# T7 l+ F$ ]/ r& T
#include <fcntl.h>
7 B5 I/ [$ A& {) w
( u. x" _+ e" _# q2 x* N9 q0 o9 \
#define SHAER_RAM_BASE_ADDR (0x80000000)
; A3 L3 s0 ?1 w+ s
% G/ m4 \1 a* a1 M6 U
typedef struct
. }2 M) ?, `0 s3 Z& m: E
{
4 D* y3 @/ r( a% Q0 h l. y
unsigned int a;
5 F6 j; s- V6 x- U2 s, X: n: H
unsigned int b;
. C: {8 f. V% R
unsigned int packet_cout;
- m3 L* D: X3 q6 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& a6 X# g" Q5 l- }6 X- m, e
- c9 P( t2 M2 F ^1 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 [3 [% n$ }4 C5 l+ `$ |
unsigned int count_copy = 0;
2 g7 Q7 z' v, L6 y _+ R
+ F5 e/ q5 I8 B" h2 w+ K8 C
. u: M8 ]9 K0 f# i
int main()
0 o) p/ a* j3 m. b4 W& i! z% [# |3 f5 j
{
2 p2 K1 H+ ]9 [" z
pRX_MSG_PROTOCOL pshreRAM = NULL;
' y, G( r% H/ t: R* @$ A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 M, }9 m H4 j; u# i5 J
6 g P1 A; \" q* r& ^) `& T% [+ E
while(1)
: L, f6 r/ ~" B9 J
{
$ ^4 |% M/ y6 e3 a
read_MSG_buffer(pshreRAM);
4 H4 u; x1 n, X x6 S' p4 r
}
* D4 p$ `5 R4 R- O( S
}
: I; b8 y/ k7 M, K, s; q
7 U u$ o7 ]+ K7 a% r. c2 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ ?' e( b0 v' t, ^8 [
{
* |/ c3 Y) X M5 f0 x1 j6 z W
RX_MSG_PROTOCOL buf;
! N; }& N7 Z# E( i" }/ H* w
; @5 j- \7 F. j0 s. Y5 q: ]
buf.a = pshreRAM->a;
6 t. O) H% T6 l$ W" c
buf.b = pshreRAM->b;
& V7 n( c8 X: e
buf.packet_cout = pshreRAM->packet_cout;
9 d: c: H9 q; U; ?6 b3 h9 L
+ O1 |/ y' X: G4 q2 L( R! _% w6 G
if(buf.packet_cout != count_copy)
1 C$ C% P% _# h
{
R$ s4 ]" F% }) h ~: D4 F
printf("a is %d\n", buf.a);
1 s H6 V: d6 {& [# ~
printf("b is %d\n", buf.b);
. ~( m1 c: `# l3 ~6 I; Q
printf("count is %d\n", buf.packet_cout);
2 z2 b( Y$ q: x) O
count_copy = buf.packet_cout;
1 l/ |' p/ T- |! m( `
}
7 g9 W& P( M4 H
else
4 c& b/ q6 ^" h( R) G
{
; s0 d4 s0 ]& ?3 U( {
printf("No effective message!");
$ n3 c5 C( N! U2 g) }# ?8 D" `- L
}
- v* r4 n( o* I. O$ P( O
}
. O6 k& [6 J" e9 ~" l
+ {- D5 j3 g8 S0 W5 l; ]
- \& b3 J/ \9 g( M* B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% J, Q3 b! U7 C* x1 f5 }9 C
使用下面代码,对内存使用了mmap函数后:
a$ |" B* }- ^- S5 [& ]4 x
#include <stdio.h>
: U9 h+ u! w* [* |) f/ n
#include <unistd.h>
5 R% x M: ^' o6 G
#include <sys/mman.h>
; W3 [5 V+ D' [! [
#include <sys/types.h>
k- e8 q. X6 P
#include <fcntl.h>
; E% d) F; J9 }1 n7 K
& C8 y& j; Y# L9 q4 l5 N
#define SHAER_RAM_BASE_ADDR (0x80000000)
# N. \$ t A; ^9 i) ]; {; A
#define SHAER_RAM_SIZE (0x20000)
5 B# ~3 d. A5 y0 |6 B9 g
$ h: T) D! t; S; F/ z& }4 H
typedef struct
5 y8 K2 S4 x; @, Y0 V$ y+ |
{
) l/ ]% E7 S8 o" q2 w
unsigned int a;
* {( @$ ]8 }- K8 d
unsigned int b;
. Y* ^2 K; G1 Q4 A' L1 h3 u
unsigned int packet_cout;
[( p+ Y" }" Z$ ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
d7 p$ b: W9 N9 r, K+ h0 W# ~3 V
4 R3 I6 i; z3 s4 x
void read_MSG_buffer(int *baseaddr);
2 `2 N" b) ^# w& f
unsigned int count_copy = 0;
& M, o* I9 [9 p) M* ^4 U
$ s0 a' J+ u% Q9 {# M
int main()
- E; W# r7 z. |6 ]( y, F
{
4 E- n9 t6 p" s( v0 n0 j0 r
int fd;
/ C/ Y# t$ n' H/ L( E' E7 k; n
int *mem = NULL;
2 y+ j* X1 G( |
$ A+ q0 f8 @# T
if((fd = open("/dev/mem", O_RDWR)) <0)
- W. o2 D1 f. {, T A/ C- {
{
. \4 u, [5 \2 @1 T' T
perror("open error");
* ~/ D! ?4 I0 l- f
return -1;
) t, k2 V' d }: |3 T
}
! Z' u$ h3 ]: q7 j
! _8 g' n' Y) t$ s/ k# o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ V3 C% X. e1 @! ~
; U+ k" t9 M- q
while(1)
8 Y6 F2 [5 q8 P* m6 h6 C
{
2 j" r# M6 w8 {, R$ P+ ]1 Q. p: v. `
read_MSG_buffer(mem);
; F4 k- K% G: e1 `9 h* O' F' W" [
}
: r6 p, d5 {. A$ k/ y
}
2 L6 s5 Z: F5 z# T+ X
4 f$ i5 A" I; S7 _2 w: \
void read_MSG_buffer(int *baseaddr)
8 Y O% g" c& T
{
u: a: m' \1 ^* x) h
pRX_MSG_PROTOCOL pshreRAM = NULL;
& j8 Q) P8 W( q* u! S( ^
% x9 {: R* i" v3 e! Y( I7 n
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 c/ H7 J2 j- r- Y
, x" T) ?- f5 D9 @& {( T
if(pshreRAM->packet_cout != count_copy)
/ }5 Y) K4 N' [3 M# Q
{
/ |! D/ `5 O, {) D% I
printf("a is %d\n", pshreRAM->a);
) ~: b U! G& V; F; R- E
printf("b is %d\n", pshreRAM->b);
# A. r8 L0 t. J# q! A' x
printf("count is %d\n", pshreRAM->packet_cout);
9 L8 n3 u6 L& }8 ]! z g
count_copy = pshreRAM->packet_cout;
# N) @8 ]4 L' |, v
}
4 d& ~9 t" ^! J- \
else
2 E7 c9 g9 E( \% W0 I
{
4 e; E$ D0 b: J/ X) k8 G
printf("No effective message!\n");
4 J) \- W4 |: d. Q1 k+ X
}
& q+ C; ?/ V! M9 C8 W/ ~, f/ |. Q
}
9 V' J: L7 t# r% o& F9 i
+ h1 V" t3 i) b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" r8 b" |8 `( f$ e, i
3 B) c8 q/ C3 Q, p/ t
7 ?5 k# J. N+ [- S' d! O
1 { \0 ]- K! R2 ]* N) Z' H5 n0 P
2 I- l2 g$ N, _- `
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4