嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' W! m% p9 a9 h x+ h# n# U
% w0 Z/ W6 Y$ o0 j9 M3 e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 R7 n |& v0 z- M+ b: Q
#include <unistd.h>
, G9 f! j& ]0 g, w
#include <sys/mman.h>
# z6 \' b9 e1 |- K' D8 G
#include <sys/types.h>
) ~7 J0 ]0 U1 T, q4 X
#include <fcntl.h>
/ l+ P8 B( Y) r$ ?6 E- H
" @/ B0 }' _* N5 w
#define SHAER_RAM_BASE_ADDR (0x80000000)
' {. T. ]( W. V+ P: Y3 {$ N x
3 n4 l @$ e9 J' i7 u' Z1 X
typedef struct
( o9 F8 d' S8 N5 R4 Q x) e: j
{
) k' k" N8 V/ r' C! E7 L! x
unsigned int a;
' y/ r4 B2 W V C( J9 u; G
unsigned int b;
9 ]% b1 d; R' H2 _* D3 b
unsigned int packet_cout;
# v( P7 D( W/ K( d, D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 S0 k! ]) @8 Y1 t( a
4 c* ~- S& J+ S6 M0 T) J3 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 t7 o, v" A& B- G
unsigned int count_copy = 0;
5 e7 o, [) X2 t' S0 Z
9 O" b) h; R9 B" m4 k
" L* `- q* D: t
int main()
) u3 `4 G0 l! B0 J6 {% g6 Z
{
, f3 u- G: X- p# B4 d
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 F5 l4 L" L" d8 g' w; A$ F, |" D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* Q9 v' Z7 w0 A* t
( F7 q6 ?# F+ g( ]
while(1)
) f: l9 P- M* \
{
" L0 R; |1 Z1 R; t
read_MSG_buffer(pshreRAM);
; F3 i! _& [0 w$ y1 a B0 {2 O& ~
}
0 W( y* O& p- C% u/ N3 q. W8 k
}
: Q; k4 g1 J6 Y% v" Y* x# V
" g g% F A5 e6 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 U7 P% j* i4 a9 q; Y! \1 ~
{
1 D( G% L- _9 e2 I
RX_MSG_PROTOCOL buf;
$ J2 Y0 N1 b) u
+ E) h- Z% e: f% u) J4 v1 G
buf.a = pshreRAM->a;
- M0 M, Z9 C. t k @
buf.b = pshreRAM->b;
+ u$ o+ A8 A, [
buf.packet_cout = pshreRAM->packet_cout;
# ~; F1 b# c& R& F: W; x
- v: Z! A2 F) [, K+ L
if(buf.packet_cout != count_copy)
# M7 D( }% w( m% u+ N7 U" R6 `' H
{
5 F5 k7 ?& ~7 H3 s! t# c
printf("a is %d\n", buf.a);
# W& T5 c% ]# v2 Q
printf("b is %d\n", buf.b);
& F7 O0 V B2 e# M' ^
printf("count is %d\n", buf.packet_cout);
5 @3 V( o% o+ Q7 P
count_copy = buf.packet_cout;
& P# q) {/ F, p' z7 j4 U/ {2 t
}
' Q" ^- a2 R" }
else
8 J) z7 P1 P2 k: ^; F1 h) K
{
) ]; O" Q Z t4 p, i1 k# m
printf("No effective message!");
0 V* r! u) w! ~, s3 t+ l5 G9 Q
}
8 ~! v- l M/ q; N* v( S8 D
}
1 j- Q, F# ?( h3 ~2 D
) r& x' K( S: d k
# g& h2 y; W: n8 ^5 r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
x+ w# l2 K; z8 Z- g
使用下面代码,对内存使用了mmap函数后:
4 ?( [2 C, E, ^. \2 Z8 E: x
#include <stdio.h>
! U" Q' J7 k% J
#include <unistd.h>
; t- |- J* W+ O/ T |; O8 v& W
#include <sys/mman.h>
! a( x6 ^# r6 o; h% y" Q
#include <sys/types.h>
( J' V0 S' x3 l
#include <fcntl.h>
) b; w R4 w m. x
& Q, T2 G: g' |7 D, C
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 K5 @+ |/ \* k; \
#define SHAER_RAM_SIZE (0x20000)
% @3 l6 L: e7 Z" \2 x
# G# f2 b: a& O) q7 X$ c1 \
typedef struct
8 D" b! f! p# M
{
3 T5 E2 _( A# w! Y8 q; g$ |( ]* l
unsigned int a;
3 c/ a; R/ B2 c3 \; `9 t ?
unsigned int b;
. e! j3 X1 D7 ]
unsigned int packet_cout;
; x8 m8 D* y% a8 D/ E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' T2 _4 l% j' L
0 H; t0 y) B, |7 T! {% X
void read_MSG_buffer(int *baseaddr);
: ^7 W [0 @( p( q$ H* f
unsigned int count_copy = 0;
" D2 o6 b% O z4 Z/ w
6 W4 v3 g% | \4 |
int main()
; Q1 S+ q# ^8 e$ x% f; v+ m7 a3 \! d; \
{
- R+ B# A9 i N( e9 L
int fd;
8 ~* v- E4 C4 T
int *mem = NULL;
n4 B# z& D9 j; {9 D# K
' V9 k5 Y5 s, I8 D' h2 G" i2 h3 x
if((fd = open("/dev/mem", O_RDWR)) <0)
: T' n6 z* G; f4 N' A2 M
{
/ V: D( ~8 x1 s. z8 N, c
perror("open error");
- Y2 x6 ^# w) u/ R
return -1;
4 H. U* Q- D$ Y5 r: X* S
}
4 i( S4 `. d9 g/ g( T. ^' y2 d
2 J0 j' |6 F) |6 d
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 a8 b8 N- [& F, o
( Z" u+ G1 e4 }- e+ S) }
while(1)
( q4 r6 {# A/ W2 s+ \7 P- Y
{
C _- l: _. n+ _# F; J6 u* Z
read_MSG_buffer(mem);
' R1 z; B6 v* a( v/ f, F0 h
}
1 N) U+ q! H/ s3 X$ v
}
7 C8 D; O4 b' b. r! @9 F; ]( w$ p
/ I3 x8 t9 X1 |& u5 S
void read_MSG_buffer(int *baseaddr)
. g5 G% e: q: n3 A# A
{
! z0 X( t) R0 K+ s* J* e. [
pRX_MSG_PROTOCOL pshreRAM = NULL;
. {4 e* S- z- R* s9 k0 }& t3 Y( C( ]4 `
( P! h5 Z$ ^1 ~2 k5 t# U& B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* R" S- v# g3 F: Z
9 W8 [; m. H L$ s, T
if(pshreRAM->packet_cout != count_copy)
6 y3 \( S2 z4 P/ X6 v9 \. g
{
' I' U/ l# q6 S3 z5 `
printf("a is %d\n", pshreRAM->a);
# k, P& L: K( p* O! S; P
printf("b is %d\n", pshreRAM->b);
" {" I4 \. R8 K* ~( M' |2 E
printf("count is %d\n", pshreRAM->packet_cout);
- S) I; C' \6 d* |" o
count_copy = pshreRAM->packet_cout;
6 c3 a9 w; J5 C5 ~0 x
}
9 S: S& g: K. r( O4 y, \
else
; Y# V% C, \: G% l2 M9 K
{
: w: c( W* p; T! H- U8 o- d, q
printf("No effective message!\n");
3 ]/ g$ E# X& q m
}
9 }' Q; b _4 E! B8 x
}
9 M# t: Q# i7 |! O) k: Y
% A2 p4 N# v6 H2 V8 h; w, @ M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- K) h! r0 l& y) i9 ~- i
9 M3 P5 d. `7 |
0 u6 m9 {, K6 s. |, D
; _# \. P- g4 g' O7 h8 N4 d( f2 x/ r
0 ]1 S/ y4 {0 ]' Q- K
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4