嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 \) h* T% ?/ W x
0 K3 m3 U3 }$ \( r) O: B% i, w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. l8 X, D/ C9 E- t/ ]) F% x
#include <unistd.h>
4 I6 V9 B/ e; a9 e9 m0 |" ^4 Y
#include <sys/mman.h>
! q! M3 n7 Y- _/ F
#include <sys/types.h>
% J: p5 j% g9 V5 j1 ?6 z9 H
#include <fcntl.h>
" F; F6 r# W, }1 j# Z7 \
$ b- S! A# T1 Q. R9 P( R
#define SHAER_RAM_BASE_ADDR (0x80000000)
; X' T r; t) x5 A: R0 \% k
: ?' v8 n( z1 D
typedef struct
/ K" O+ `! [& R) T* x; s3 U
{
* W1 w. ]% V; f
unsigned int a;
7 R- H* H7 P5 k" k: K. j
unsigned int b;
& R' s) U0 Q R' d
unsigned int packet_cout;
" u/ J8 S& t/ ?( } I ^; ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* j' K7 ]2 Q, [* l- l, m
# }6 _% c3 m! m( d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 F+ {. g' b" p, N: X
unsigned int count_copy = 0;
8 E1 ?) f( {5 t8 q
% X- t- n: k3 r; i1 }. e. K0 q
' s* n, i7 f- X* K* D4 [
int main()
4 u& k9 E& E5 W7 d( U. b
{
8 G" g4 r1 A8 g& `! c
pRX_MSG_PROTOCOL pshreRAM = NULL;
* Z8 C. T% c5 K# V# W+ H' A1 C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 Q( D9 g i+ h: e
( `4 B% ~4 U! ~3 d6 W
while(1)
; s1 N3 @' I, w( ?: o' u9 @$ w( J. [
{
2 G5 `$ ~7 D, s7 i) a3 }
read_MSG_buffer(pshreRAM);
4 V* ^4 c% v9 f4 G& e( R! B
}
' i$ x' e8 ?$ I ]" g7 h
}
2 N( u2 ~1 U2 z5 }5 N
" P4 S. v* [. l4 T! }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: X; S# Y c' [" @6 f# }5 y& W
{
8 J8 I4 s: f! ~& T# D
RX_MSG_PROTOCOL buf;
a/ k i- H& E
% j, q& ~3 Q- L
buf.a = pshreRAM->a;
- U% w& W$ {! ^! M9 \3 A* b, ^
buf.b = pshreRAM->b;
4 X/ h4 j) z/ @/ A
buf.packet_cout = pshreRAM->packet_cout;
8 v; P8 |0 D3 E
/ W5 R/ ]8 Q/ [8 W
if(buf.packet_cout != count_copy)
# M0 Y/ ?- z, |9 O: S4 Q
{
' x- B# h4 G/ `
printf("a is %d\n", buf.a);
0 a2 |, H( _ b
printf("b is %d\n", buf.b);
6 i/ |% K+ U/ _3 @3 c; ~" b; }
printf("count is %d\n", buf.packet_cout);
+ S) {9 t# h" A
count_copy = buf.packet_cout;
9 g, |5 i4 y9 A( N& M* `5 g7 j$ F
}
; }% l8 R `( `4 B9 T% a9 q
else
( v' P% [# {; i+ f2 K+ |; g' m
{
- B0 j# @2 n0 A2 l
printf("No effective message!");
' d- t$ }3 D! e$ P
}
! [0 N- n1 q4 f$ V% ~" Q
}
( q4 P6 I/ E& C* ^9 S. v' S
$ C% v8 o! C) j+ r1 a
+ }) G) n" L7 ?6 J% P2 E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. h# M& `) V- e; e) a/ K U( K0 {! v
使用下面代码,对内存使用了mmap函数后:
; z' y0 D# J, r+ _3 e# |+ O" C
#include <stdio.h>
9 w+ }( M, s t" S, ~
#include <unistd.h>
) [9 h/ l/ H, D
#include <sys/mman.h>
, f1 t( b/ K6 [% y6 ]
#include <sys/types.h>
* N+ h8 f+ _: [
#include <fcntl.h>
4 Z u. D, J# R: B6 C9 U: F6 \
( X& C% F% n. ~: P3 G! ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
* ^6 |- ]5 c E4 K, t' u* r
#define SHAER_RAM_SIZE (0x20000)
k+ z$ B0 z8 w% \+ Z
" k4 j L$ i; D: N+ V5 e
typedef struct
4 X# ?' @) f$ f0 Z5 [
{
0 ^$ M& i& f* X( O, r! }
unsigned int a;
- y8 U: _- I# b7 ^% z" n/ o
unsigned int b;
/ o1 C9 \! x- P# K" H3 H
unsigned int packet_cout;
( ~; e+ ^0 d" n6 i2 |3 V1 A6 O5 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 w, W; X3 I( d
# F9 i1 U3 j7 t4 i* o
void read_MSG_buffer(int *baseaddr);
8 x9 l8 J- F1 H8 r. D' J
unsigned int count_copy = 0;
7 s4 Z8 L# D ^# `& \
) R7 N+ M2 @, f4 n
int main()
* U+ D4 ? v* j7 Q+ L1 q; b
{
+ b# Q3 Q2 F. `% D# M
int fd;
" [! o' R2 D# P6 }9 J7 Z" s
int *mem = NULL;
, R' R- {# S# \! d, g
3 T4 y0 Z7 s" K* {1 o
if((fd = open("/dev/mem", O_RDWR)) <0)
8 y6 ]4 s8 y8 U- r5 L# w
{
+ W O5 q8 {2 \, \6 x1 ^2 N; k/ z. n
perror("open error");
~. K9 w9 y+ a1 O& T
return -1;
. o6 W' h( k7 X2 o6 G
}
4 u& m- Z$ s: w/ E. I8 s$ X
4 z4 y; T3 y$ y: m3 j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 z0 }! ?$ y% ^! q& y0 s
& N$ Z% `) M3 m) Q% m* L6 q) ~8 j
while(1)
: x5 F: Y5 R( L: e! Q4 |0 a
{
$ }, k5 Y W. x; p3 b
read_MSG_buffer(mem);
+ b. \+ f& m, \1 [) t
}
P( I# Y6 n5 h7 d
}
8 C2 I* b) ~& ?0 ?! B
" k2 u4 H f5 v
void read_MSG_buffer(int *baseaddr)
' K6 c1 U2 b: P0 Q |
{
! ?$ o3 V' D" |0 m. M
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 ]3 N) C7 Z1 }5 W0 u' A4 @
9 O' n8 ]/ e" V2 L7 |* V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; _2 y. e6 [0 A: R. W8 D
1 Z% a# a4 d3 H8 W: [
if(pshreRAM->packet_cout != count_copy)
: q. V; a( Z) o5 d
{
3 b) v8 d9 |2 ~5 N: k& W9 n
printf("a is %d\n", pshreRAM->a);
/ L/ ~' b, D) ~0 q. s! J8 E
printf("b is %d\n", pshreRAM->b);
/ w. }, l3 @1 R4 F/ s
printf("count is %d\n", pshreRAM->packet_cout);
/ @1 ?0 h3 c+ _' k
count_copy = pshreRAM->packet_cout;
$ p1 m& X5 P/ R, g7 q+ ?% y, R
}
% u, P. W1 j# [0 {/ R
else
; h8 R# v& X; D
{
: {# i( ~# K* G$ d
printf("No effective message!\n");
6 |( P0 n) L* U4 U" A. q9 p5 v
}
, @. Q! S& z) w: ]/ l* r( y
}
3 c' A5 t# K( f* C
# g7 D% b' r& v& r: g& l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: @, Y) w) m( g4 T X
9 b- V V; q' j! Y
; F1 h5 ^. F; X
- G4 D9 G7 d0 s% _, U; e
3 Y. \1 M5 x b" p8 l4 U
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4