嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# a4 @ x$ A5 n! V4 P" ]7 \ S" p
6 D4 F6 M# c; ?% d. I' g8 j" D7 W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 G1 z/ i% ~; u0 o( W$ `
#include <unistd.h>
- u$ ^' U* G& _( N0 E9 V
#include <sys/mman.h>
9 b, z, Z7 n7 S3 E& e0 V9 t
#include <sys/types.h>
& i5 ^% M* p/ `# P
#include <fcntl.h>
. T) v8 W! a4 ]
& D* i O$ S% j8 y
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ P! `* C; I& I
5 V2 x U) i3 w: V f* ]
typedef struct
8 n2 N, p* v) U! Q
{
: e+ Q: j: y) C H( k4 Q' F) a
unsigned int a;
" \% C9 S2 P% Z3 h& C3 v3 c3 E; k1 U
unsigned int b;
. L7 s0 C4 y0 _% ]- Q+ l
unsigned int packet_cout;
0 r5 z4 O! Z+ \! U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ X9 Q1 u) z' j4 f7 o6 R
* i1 V( j8 G. e) H. U" P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 D" N; z ?0 M }
unsigned int count_copy = 0;
2 e6 |3 f" C$ B! \/ Z( [3 N% G
5 E5 k: f: k' h: Q+ w% A! r) }( d
4 d2 h+ ~# E) r L* f: b5 }
int main()
3 \2 W! [- K$ l" p8 C @, d
{
/ m; M8 P% ]* t7 O- n
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 ~1 i1 ]9 Q1 w* r0 e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ K+ U2 d. A, g* l4 \6 W# d; ?8 |$ k
) j3 S! E& S( _8 J
while(1)
0 A p0 Z L( l v
{
" n& M( U' C3 v& E9 O5 U/ m
read_MSG_buffer(pshreRAM);
: v( T* S0 ~0 F
}
, d* G3 w" ^# a6 w+ s7 B
}
1 L1 ^1 E5 D/ d& F) E9 p. u
6 a4 w% E; Y/ f* [+ c* Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- a; k3 [! G+ H
{
+ k( G# h* y7 U" G2 D& v
RX_MSG_PROTOCOL buf;
" @5 u* w- `4 k* T; X5 g
, d" }- k: Z1 ]3 e. a- Y5 ]# x: P
buf.a = pshreRAM->a;
- Q" l. u( o i! I" x% A( U' ?
buf.b = pshreRAM->b;
# b- g7 R$ a0 ^ D* w
buf.packet_cout = pshreRAM->packet_cout;
" t1 d# U B# i. q
, v; b# I6 {; Q- L8 e
if(buf.packet_cout != count_copy)
0 M+ |/ n' s3 ]! ]$ x
{
; o+ O9 }, P; ?
printf("a is %d\n", buf.a);
* X0 n0 W/ ]; T6 W
printf("b is %d\n", buf.b);
# E0 L8 a( |3 k. l2 A$ o3 d- t
printf("count is %d\n", buf.packet_cout);
5 [' j/ S0 ?1 F& k8 Y
count_copy = buf.packet_cout;
. h* k! o6 J# ^% T7 }7 e, I- }+ U0 q
}
0 B: c3 Q8 C+ R9 h- l; `& G, y
else
/ w4 I' F$ h, t; q0 T0 _
{
. _( W! I+ A- s# B
printf("No effective message!");
1 n* k2 ^) z; \5 M/ ^7 b S2 V2 Y
}
8 b% L1 b% l; A' I
}
) p0 A' ?% S6 C/ c# \9 [( y$ `
4 A3 ]9 G0 ?2 _" a# g
7 {- S4 R; A/ h2 ~% V& w( Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 }( H1 m# Y! ?" Y9 a/ {" @# ?: u
使用下面代码,对内存使用了mmap函数后:
; Z/ U* g9 t% X2 |; ]% O0 R
#include <stdio.h>
, \' W+ O. q1 ~) \
#include <unistd.h>
. Y7 ]' ~ B+ t- E+ k$ C @" n
#include <sys/mman.h>
' Z3 r& t9 w$ r
#include <sys/types.h>
7 D3 C }! M$ k! t2 ^* h8 X& n0 c
#include <fcntl.h>
. P8 Z4 a+ A5 R+ n* a
( B; C# m* K3 a$ Q5 Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
' W# e) G7 O3 x% \4 |4 `3 H
#define SHAER_RAM_SIZE (0x20000)
" ?6 w) o. b% }1 h X5 V8 n5 _; N$ ~
2 V2 x' M/ W. Z% \0 n
typedef struct
4 h$ E1 r5 s: Q' m! R7 B8 P# y; m
{
1 {% Z" A& z# D+ e1 T! z
unsigned int a;
. L: P7 a) L6 q3 @5 d/ @
unsigned int b;
6 _/ a: y3 R0 d& z6 U) H- I
unsigned int packet_cout;
# y3 P. r1 K( }0 R- D D3 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 E5 A: f" V; @% s
E, n- P3 |/ R0 h0 W# e
void read_MSG_buffer(int *baseaddr);
/ g. |( k1 R1 C) ?% m6 B0 ~
unsigned int count_copy = 0;
( q8 A/ v; ~* z2 ?7 w' w: x9 O
( M2 {. Z$ d. A7 J3 K8 `
int main()
- {0 }; i* X( _ p
{
# s& Y" |$ p- p, p. k1 x
int fd;
% R. T3 e# p; K5 i: P2 {4 |
int *mem = NULL;
. T- @2 M; S, K; c
# U" \2 I' `" A9 `5 \
if((fd = open("/dev/mem", O_RDWR)) <0)
+ \8 r8 I" y4 N4 B; M! R V/ v
{
8 f$ ~5 w2 A4 g1 o5 ^" b/ J. o2 O
perror("open error");
# g7 u, K! x. f u
return -1;
5 S$ I! C4 B, u0 H- V
}
. @2 j9 Z( y# r8 o
8 e/ r8 n! a3 t3 B- a. v q9 v; J; Z. W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% M( s/ I8 M, d3 C+ T+ @2 `5 t
) A, z( k; J! h
while(1)
5 v2 w% e3 w6 u" a$ p+ e: {
{
3 {" M0 E! O3 C" m3 l
read_MSG_buffer(mem);
* t5 L9 s6 E7 \; Y) M' d7 |0 y
}
& A2 b+ B2 L' @
}
7 i# P( k$ i3 p) b
/ V K# K. X4 Y: F5 Q% I) V
void read_MSG_buffer(int *baseaddr)
9 p3 o# q4 n* h0 ]- c( X' N* s) G6 r
{
3 A4 ?# Q0 H# L) P ~5 K
pRX_MSG_PROTOCOL pshreRAM = NULL;
- S. E- ^6 V" q' F/ \
8 t( m, j7 q, p2 h3 V0 a+ R
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, k. t. F# A2 P0 d0 v( M
; v$ w* P2 y9 Z4 X1 `
if(pshreRAM->packet_cout != count_copy)
, E" D3 y: H' R" m$ S1 J! a
{
5 z6 h- {1 U, g% K/ i
printf("a is %d\n", pshreRAM->a);
. H# D% x0 d# n& o" N" I
printf("b is %d\n", pshreRAM->b);
. D; g7 K# O7 T2 C0 z7 p4 J8 K, _. G7 }
printf("count is %d\n", pshreRAM->packet_cout);
* D- @" e$ ]5 d
count_copy = pshreRAM->packet_cout;
1 b# f+ m" Y4 k
}
4 f# C. Y, t/ P0 A
else
7 ]8 {- h9 b5 d6 y5 @" y) ]: Q+ w& o
{
. A+ ^1 D% I# t; p
printf("No effective message!\n");
: d- ~: s9 N& n1 _2 o# k
}
; B/ e+ G8 _* V- P
}
6 H9 _/ D; T: I) n# J
2 u! U0 n5 t7 }0 @) R* \
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
j$ i4 b1 U' m' G) I" L2 s& `
! s0 a7 ^* W& `6 @6 t0 @, o
% M" h; q- U$ Z0 V" y4 u2 P, P
, I( d7 H) s% u0 h2 Y8 R
- T! A( M0 _& o) F% D# V5 A1 L
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4