嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 A* U6 }$ S, C# b& |
' p0 ~, z2 B+ }" V7 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( S9 y1 M. i! Y! B6 ]( `
#include <unistd.h>
/ f6 x3 n! @2 j# L8 B4 Q# `
#include <sys/mman.h>
7 t3 O$ I' Q7 u
#include <sys/types.h>
; o, i U% G# L2 [ I
#include <fcntl.h>
8 ]6 Y* M( v+ d- B
' R0 n) E1 n, W1 ]: z' R
#define SHAER_RAM_BASE_ADDR (0x80000000)
* Z$ W3 p3 J( N }& y
6 B0 g4 J [8 _! p
typedef struct
' Z& i. P& b5 @4 }; x2 y+ S/ G
{
) a! m& Z. [) } U$ i( {6 h1 q
unsigned int a;
$ x( s5 L3 o$ ]; p2 \- g( S5 B- i3 E
unsigned int b;
3 ^! @- X# ]3 B# M/ H4 o1 j
unsigned int packet_cout;
: |7 n$ R3 x4 x4 y( n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* n7 x: B; Q# P% G" S
' h! q1 t1 L9 p: C( H9 y7 J! `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
P: o0 M/ u0 L6 [2 h1 v" q; ]
unsigned int count_copy = 0;
, i7 F0 i, a5 p, W6 I
8 _' l' J/ o0 k
' v" i8 I* D. k: g" F. ]+ W2 O
int main()
% ]: L H% z: O, x7 L( Q
{
5 k; `* q$ b! F* U9 m
pRX_MSG_PROTOCOL pshreRAM = NULL;
' \* [! N" p) o. o! I$ d, c0 v2 b9 R
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ c- d# ]" F9 ~- n8 f
4 z( P4 g6 d- k+ u' S! A
while(1)
. c; C& x7 b3 n
{
- n+ V& o' Y8 a3 t. y# X) o9 k
read_MSG_buffer(pshreRAM);
7 y: t3 F: {$ |( l3 h; @) y
}
: X4 W. J! i) ~, w3 B% C
}
& M( p3 ^9 P1 P7 i! V- I0 o
* y) e& U% G( c. O& S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) K4 l0 W; F: d' s- ]
{
4 Q5 c1 u \1 x1 Q8 ~% g: L% y
RX_MSG_PROTOCOL buf;
& Q0 e! D/ K* }6 |0 `5 [
- ~2 U2 C3 u4 N. i& h: m
buf.a = pshreRAM->a;
" X$ i+ n% ^5 b! o. n) ^1 O! R3 V. d
buf.b = pshreRAM->b;
! z# h6 D5 X* U
buf.packet_cout = pshreRAM->packet_cout;
i- L9 E* B) z" E6 D
5 g Z4 Z/ c3 W3 s* b* @+ O# N* q2 @
if(buf.packet_cout != count_copy)
- s" w, f8 Q& N' I, N8 I- J
{
+ @" [' U. C; }3 |+ d
printf("a is %d\n", buf.a);
/ T# W. t3 u/ Y; v
printf("b is %d\n", buf.b);
/ V6 V! t d; _8 j+ C
printf("count is %d\n", buf.packet_cout);
1 u/ m. J2 K# Y. X! U. J+ Z- s
count_copy = buf.packet_cout;
3 D2 h& c* ~6 U; {& F+ w- `! [
}
8 M+ b; s' ]9 l7 ` M0 G# J
else
$ g s9 ?$ c+ }
{
5 m5 p2 P: {' h2 R5 T
printf("No effective message!");
# w! x& Q; w8 W
}
5 Z0 r, s [1 r3 E
}
* ]: _8 i- `; S( ?
* s$ e+ {/ `' t& L; g* A
" o3 n' ?) |+ Q, U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% R6 ?6 [9 y+ ?
使用下面代码,对内存使用了mmap函数后:
4 z) ~9 Y, N: H5 i8 a
#include <stdio.h>
- n2 K" l# b) Q% A/ v
#include <unistd.h>
% S/ L' P8 G9 A: H+ h6 A* K/ Y6 f
#include <sys/mman.h>
) q/ N7 T* F% t
#include <sys/types.h>
. |8 \7 J# h2 _6 d% B5 Z/ h
#include <fcntl.h>
: {, v( p) D, m0 p
& B. j4 W( x5 `" t2 b
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 |+ h( U4 r3 l( Z5 y; x) E/ @
#define SHAER_RAM_SIZE (0x20000)
5 B( ]- ~' P- Y: X7 v: y1 K
) M; B' U) l! l$ P/ K6 H
typedef struct
. `: o' j2 C; ^3 P7 Z7 M2 \" N# ^) n
{
3 E& e! x( S2 A: w& S/ P- S7 H
unsigned int a;
/ |2 d( X1 q* z1 x7 h1 L
unsigned int b;
4 `& }8 `; q# z! M# u
unsigned int packet_cout;
8 b D/ Q8 k( j9 T% v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; u! u6 G4 o3 e+ p& }: C
: n7 H6 {% L6 n: r' L% M1 e
void read_MSG_buffer(int *baseaddr);
5 M& c4 l4 l& G9 i) q* t) V2 U! y" C
unsigned int count_copy = 0;
9 S6 [' f7 q- o" b$ [8 V# ~
& R! x1 G/ b& x; ^! k
int main()
$ n% g, [6 z: Y! w6 g
{
' l9 x/ g, a2 e5 b, S& s! W
int fd;
! j/ i! Q6 L( w1 U
int *mem = NULL;
6 p/ D( ?/ D Z7 l
4 P q( B) H0 z: O9 {. f$ h4 d# Z
if((fd = open("/dev/mem", O_RDWR)) <0)
2 _4 d1 @2 D) n& W8 y
{
) V# N$ Z3 y v
perror("open error");
) c3 b6 l- l, I7 s
return -1;
# p3 C' F( u- H/ n. P7 h( g
}
8 I/ P5 |+ R' r* V' o
, [0 l4 x# e+ K6 g& d3 W1 L1 T2 @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! Y4 `7 U7 h+ S3 F* D3 P
7 t9 W# W5 d* q5 J( v9 ], z
while(1)
. |# \4 X8 e3 Y. W( T
{
7 B6 y" U2 f, o b( B- `
read_MSG_buffer(mem);
2 W8 |- ~; j4 a& |
}
9 J- z8 ]' n% i5 Q# _+ K1 b
}
. R5 x- a+ j) l+ x7 f
h3 _1 `' Z$ |, L; w
void read_MSG_buffer(int *baseaddr)
) }! a7 q# O( a: j7 ]& r8 x
{
! G+ y) T5 l( s
pRX_MSG_PROTOCOL pshreRAM = NULL;
' |" G$ f& m5 ?, f1 i* m; k
* ~: N7 U) k- |0 c1 |" h5 ], E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 L* D9 d% D+ I6 m5 R
- O( N: S& J5 Q, u( R$ _
if(pshreRAM->packet_cout != count_copy)
2 ~# v' I" D8 X V5 R! R
{
2 [; Z! }9 M; L
printf("a is %d\n", pshreRAM->a);
# A) V/ H! D# N; A
printf("b is %d\n", pshreRAM->b);
+ O8 d. A: p6 G2 H) P$ o' f' \
printf("count is %d\n", pshreRAM->packet_cout);
% N6 D7 S% d( r5 X; B5 g: E! H' d
count_copy = pshreRAM->packet_cout;
. ]: A1 l' G ~- @: v
}
; }% V7 F. W# `; T% B
else
. `0 |) \8 ]9 B; \% t
{
1 r2 a7 [+ m. x- B0 X) V" F' I
printf("No effective message!\n");
6 _ R. R& q' `. C1 p }
}
: F) l$ c: s8 T$ Q" b8 m1 w) h
}
& M S5 j: ~0 Z/ q9 S
# V3 i3 R& g1 X1 q" ]& O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, Y" d/ B' o+ i5 A: w5 V0 V. b1 {6 X
! T. G5 @; R; x0 Z' ^
6 ?* _) _( q/ b! ^8 d
. q. o3 O7 ]' P, Z, g7 r
G7 D% j/ Z9 P
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4