嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 c/ V' ]' [1 v& r
8 L6 l0 Z% Q) K5 X! B4 b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* z1 X4 }% S# l, V- g$ t
#include <unistd.h>
. i$ ~5 `! d; K# T( o$ _
#include <sys/mman.h>
9 o9 Q. ~* I! i$ W/ m/ ~+ N% v
#include <sys/types.h>
1 z3 @, Z0 o4 @( E. V
#include <fcntl.h>
! a$ S6 `) a4 V. x9 n) \! J# @
$ v/ O; U0 k; d; H4 z( @
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 q. q" v$ p3 q9 {& R/ n9 J
2 T w$ a. L3 B" ~, f
typedef struct
9 {2 b8 d7 v) X, K7 Y5 ^
{
: _( G0 v0 `7 p* ^
unsigned int a;
* Q9 _# C* T9 h$ J/ M. E) _6 `" V
unsigned int b;
/ ]& T2 ?) u ~( w3 k" n
unsigned int packet_cout;
7 g4 X: Q0 N- @, Q8 a' q- z( F3 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* r* N, a" y8 O$ A* X
( O; S/ B! s6 X: f: l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; F, v, g2 N8 G( T( [
unsigned int count_copy = 0;
) I5 j& W% w& {, G, P3 V
0 }/ J+ u* G7 J% q. A2 f* K
+ v' c% j1 l, b
int main()
; P6 K; G+ y) S) F: J$ j7 U
{
) k$ G" z b" t$ A* t0 `. [# E
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 G! c4 F6 e8 `' R J- _% L
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ L! v( w" c) P
0 t/ z3 k( z6 V" s a- n, I
while(1)
2 ~0 n( a0 ]; E* M2 j4 T% f
{
5 t' g5 a2 o2 E9 |$ N- Z
read_MSG_buffer(pshreRAM);
% `9 n( t! p/ y3 }2 |& U( c; r" U" W2 [
}
: n/ B9 X3 \1 G4 o# Y7 f0 j/ y
}
8 \9 U$ n, ~: R6 {" r
$ Y* D+ J" L7 J7 j5 w* {# |/ d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. }+ t1 d8 `/ c9 r3 ?. z3 D1 X
{
, H: m- x; C# o1 y3 T. M
RX_MSG_PROTOCOL buf;
7 T5 W- s9 o% F
1 q" @- i4 ]# `+ W
buf.a = pshreRAM->a;
. w- T, P3 h+ f9 m1 J" T* U
buf.b = pshreRAM->b;
5 x) G8 \' M T
buf.packet_cout = pshreRAM->packet_cout;
1 q' ]+ c. n/ D
( L5 M& P- x* N5 Y5 K# A
if(buf.packet_cout != count_copy)
p, w M# e3 m0 u
{
3 z7 S- ^* T2 G* o: z n
printf("a is %d\n", buf.a);
$ z( k" y y$ y! i/ [
printf("b is %d\n", buf.b);
# d. `3 Q. @4 @- T
printf("count is %d\n", buf.packet_cout);
' G" l& R; y' M: {0 ]/ S9 [
count_copy = buf.packet_cout;
: v& d, H$ k6 @, O
}
3 c. b5 K, k- d9 }( A2 H) H$ D
else
/ d4 n9 e+ i" x6 U* C" W
{
' k9 w# h% L) k# M
printf("No effective message!");
{. o5 j: M# {# X, K
}
{# m1 K; g; h! j Z# L
}
; d3 k: p2 O9 p! z- U0 H) W$ y
3 z8 T: K/ H' F
" y2 u6 H# i( E1 k4 q2 \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 H K8 S! H; _* S' W/ h
使用下面代码,对内存使用了mmap函数后:
" K. m p1 g0 ?; x" u5 c
#include <stdio.h>
6 A j* i1 F" u) Z X
#include <unistd.h>
9 e9 Y9 i0 e5 G2 ^: v
#include <sys/mman.h>
$ N- o9 m: p# f; Y
#include <sys/types.h>
: s5 k+ W' m& h, G0 Q! R
#include <fcntl.h>
6 N U' C S* n* O
- ?1 s' ^# b5 v4 t. ], ]' C
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ F- V6 T4 m; v
#define SHAER_RAM_SIZE (0x20000)
$ `8 r8 |% @' ~; e
& U& s& H3 B Z% @# x1 Y4 x' k
typedef struct
9 q: W: _* Y' V
{
; k7 O1 w. e$ G* n
unsigned int a;
) ?; n- D8 g+ x ]3 }* B3 S
unsigned int b;
# b6 c" v& G$ I* d' R
unsigned int packet_cout;
5 B% O6 m: x+ b% q3 R" E3 b) p: J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ H' [8 t0 |3 G$ [4 ^+ e
2 t# b H( ?$ [
void read_MSG_buffer(int *baseaddr);
8 A. D& ?6 k. W
unsigned int count_copy = 0;
. U$ A+ o2 m: ^9 M7 u4 V
8 |8 y, F9 k& z4 K. h9 ]2 [& u
int main()
) ?1 p1 g6 l8 a# F; {- ?4 C
{
" @! t+ [2 V% t' d( p/ ^5 p' \# Q
int fd;
2 K7 g; F0 ~9 R" U/ P
int *mem = NULL;
* l# \5 g1 \) y! V* G" R
% S6 l' z2 q* A
if((fd = open("/dev/mem", O_RDWR)) <0)
. S. R& V6 B4 p% e+ e
{
- D8 e9 `6 \# ]$ o. H% R
perror("open error");
* u1 [4 Y U/ {; ?% u
return -1;
, G' j* p, ^* ^( Y9 s8 J
}
* C" o8 J0 g" u1 r+ s5 R
* i4 L e6 n! B S% k0 b2 t
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( @5 s0 d6 x0 _4 ]) q# M! @, L
% l; M/ h- q. y7 U
while(1)
; q# p( K$ n5 E: ]2 {
{
; N. m: Y9 c- p' b" L- W' d5 S
read_MSG_buffer(mem);
9 ~: F7 { n' @4 M9 k& K C% ^# c
}
6 ^ A. J+ |' n/ x
}
* h- `$ F4 u7 D a Y; ?
; o0 u8 _5 w7 q
void read_MSG_buffer(int *baseaddr)
5 v1 i. T6 t' P/ }
{
5 y' o" q# u7 H3 m4 Z! t- M4 P$ ~3 R
pRX_MSG_PROTOCOL pshreRAM = NULL;
" B- L/ J/ j" b3 I- h' k+ G& C; q
) `' f0 O1 {% a! `- Q6 C/ @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! {: r! ]0 R( @
' Q6 ~9 h2 w' r, E& F, b
if(pshreRAM->packet_cout != count_copy)
9 R {' q6 A: e% X( _7 U) V
{
- |$ Z+ k* Z4 X1 f, B) S
printf("a is %d\n", pshreRAM->a);
) A+ d7 C/ V2 Q# w- ]- h1 e
printf("b is %d\n", pshreRAM->b);
9 F6 ]3 Z" ]3 V7 w, x1 E; R1 S
printf("count is %d\n", pshreRAM->packet_cout);
0 n& K- @$ t: H/ R
count_copy = pshreRAM->packet_cout;
3 F" l5 g2 T6 }* t4 t
}
1 J! @! I, o: F4 x3 j1 H f( ?
else
) { B: H9 o( K: G8 m6 g' h- w
{
8 z* y0 r$ E0 ` y- @
printf("No effective message!\n");
4 f; D4 }' {8 y5 F+ [6 E0 x: I
}
8 x; T( j2 z$ p+ W% j$ y
}
; V, `+ l( L' ~6 z2 O# b3 N) i$ V
* W: r0 m2 Q% p4 S8 @: E# i( m6 w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 g* V' }2 H, d, c/ [* v
1 d9 e- M5 H8 q/ v/ G
Q( W$ `8 X. a% z# h
4 ]: g" ]3 {' p/ E6 r7 t6 L
( |1 _0 a/ a/ K4 G" k& b( K
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4