嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" r2 f5 d" F$ V1 R6 u
+ U1 [* Y" O C7 U; }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ g8 ^! a+ m! Y# R/ V
#include <unistd.h>
# u; M& v9 G3 B+ k! j) i9 ?0 q+ {- j
#include <sys/mman.h>
! U+ b# b4 p6 I5 Q! T* M
#include <sys/types.h>
( `6 g U# u' i& C2 E! u5 r
#include <fcntl.h>
! b, m0 w# @6 g+ d/ g L: F
7 Y/ v: N% X% b
#define SHAER_RAM_BASE_ADDR (0x80000000)
( A6 u& p _5 J# ^% O7 M9 c
/ U( B: I& d3 D7 ^, @% ^& n
typedef struct
! H2 ` Q0 Y+ T4 F& C& _; e9 E
{
2 `) [; L0 ], |$ ~+ `- k( N
unsigned int a;
$ p( ]! J3 U" _: w
unsigned int b;
+ K. B/ D7 ?( _# B
unsigned int packet_cout;
G' @& f9 c' k- z: h4 g! Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 h5 ]1 K+ s H7 w; c& J
3 h# e# X( G% Q9 N. h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 h& \. b" x" v) P p0 [
unsigned int count_copy = 0;
% a: F1 T6 d4 x9 J
8 J: E+ b% |2 J! W5 D8 A. R9 K
T- d J) {# a8 K% j% X$ s/ W
int main()
7 D6 } y7 q) [9 g
{
2 R6 G8 ~$ K% W8 `# L, ?% [
pRX_MSG_PROTOCOL pshreRAM = NULL;
. ]" C+ d( y+ }* X s6 c2 @, u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 o' J' Y3 S; \& Z2 t
6 c& H4 R7 c7 H0 C0 t& E
while(1)
& I# g& h" t( t" P H% t
{
! w, P1 r, I; x5 t, {2 \
read_MSG_buffer(pshreRAM);
! h4 ~) h' M& k
}
. o+ D$ v W6 }2 J
}
, H. w* M4 A! U' Y
0 U! ~5 `$ V) E& R0 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ a% Z! i+ M4 o6 {# h
{
$ N6 @( \. d$ z
RX_MSG_PROTOCOL buf;
5 M' q7 P/ {8 X5 U6 L/ ]; y
1 D# I( b8 Y$ S8 v" X% |
buf.a = pshreRAM->a;
5 r% i2 `6 T$ |% M* I( {
buf.b = pshreRAM->b;
; P, d! ^1 Q+ N1 b, B6 N v0 L6 x
buf.packet_cout = pshreRAM->packet_cout;
+ `7 r, l) W0 F" [3 }9 m [4 Q1 }
0 s) y: ~' ~ f: X: P1 V
if(buf.packet_cout != count_copy)
& }: d7 d& _: n0 I& l5 }
{
; `1 l2 T8 G4 A' k& B) l7 c+ R
printf("a is %d\n", buf.a);
" f$ B) [$ Q, v# k
printf("b is %d\n", buf.b);
' N7 P& j7 }' H @ V5 q; O* }
printf("count is %d\n", buf.packet_cout);
7 j$ o5 [ z& Q) E8 v; Q
count_copy = buf.packet_cout;
2 i! N6 ?" Z" P2 E+ u
}
, ]5 M. @/ R- |( K% ^. ~
else
9 B, W/ M: h8 |- M+ ?: w9 b3 B* ]
{
9 F; z( _: A \* ^3 G( a
printf("No effective message!");
: M. X* A8 i& R' F) }
}
. l7 Y9 `- P4 k8 [: Z j
}
5 v2 H' c9 v+ k9 c! r* P" W; x" I
1 j" f& @! ~0 g' l/ V
' m* g" y$ m# k* T& ?- {: F* X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. M- g' b# R8 \1 |
使用下面代码,对内存使用了mmap函数后:
: H, M: v" \- O) I& Z
#include <stdio.h>
' ~2 l4 H6 o9 G
#include <unistd.h>
9 r9 p: K) N+ A2 u
#include <sys/mman.h>
* [+ `8 M* b* u7 C( @
#include <sys/types.h>
3 H4 M- p6 t$ Z9 r
#include <fcntl.h>
' e$ W# W" j, R) z% U" s
; X5 S3 U) h5 s# r
#define SHAER_RAM_BASE_ADDR (0x80000000)
: ^0 z; E" w; ?- S/ b
#define SHAER_RAM_SIZE (0x20000)
# J* Q. ^! Y. P
0 ^( d0 R3 L: c+ W# E) R! {
typedef struct
. h) \# [& g4 r
{
9 D5 Q# w t; D+ w. C4 E
unsigned int a;
9 S; J. G7 C: Y; E! Y1 E$ K
unsigned int b;
0 `0 c# R8 n3 H$ W
unsigned int packet_cout;
/ V3 k! m; r) {& b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 T# v0 S- o3 l7 l! T' i& M# _9 M
6 t0 N3 i: p9 t
void read_MSG_buffer(int *baseaddr);
; n- V7 I( D2 Q" k
unsigned int count_copy = 0;
3 [& l( t- @" z3 M0 {( X: f2 `3 p
2 Y7 Y, M6 c I' q2 i2 [
int main()
: b' A2 O8 O1 x3 I
{
. p* [) p) T( Z7 x" c3 U. N: X: ?
int fd;
/ e; j7 o! m7 b7 ~- G
int *mem = NULL;
. g" z/ v% X6 s7 a
: Y4 F0 b/ F5 G: t
if((fd = open("/dev/mem", O_RDWR)) <0)
3 {2 w4 M5 T% d& y$ F
{
' |. h( J" A/ Q. ^0 P
perror("open error");
; O) E" s- ~7 N- b
return -1;
, X% Q1 i7 O( z" c! f
}
. c V9 E) k5 M% S& Y
* U7 L+ m3 I& z6 X @0 E* r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 `3 E/ W! `9 l% |! Y7 y# B
' ^+ Q, I( k: r2 ~7 V3 H" D' ~) [
while(1)
4 s: w9 H3 h( k. a9 E2 k
{
9 d6 n, i ]& Y/ l2 B
read_MSG_buffer(mem);
3 I* F9 J v, J
}
j2 ?& B) O% s+ K/ x S& j; `: H
}
6 f5 J! C8 {$ e$ e
; J$ c8 Q0 }" p$ r3 F
void read_MSG_buffer(int *baseaddr)
. S9 Z; t" B7 k5 g- _) }* H% `
{
3 q4 S" v: n, U( g& R7 d) n! d
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 B, }1 X& K, [0 \
* C/ d4 D4 M8 A- D8 `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 k) P6 x$ A$ b' n& ~5 B& l5 H0 C
, |% U# L" a0 J7 v8 ?9 n) N
if(pshreRAM->packet_cout != count_copy)
- X; `$ O7 C" M! i
{
1 P5 k1 q" U5 w: Y) y2 e$ C
printf("a is %d\n", pshreRAM->a);
4 e5 ]7 [; {+ [3 L8 i6 x
printf("b is %d\n", pshreRAM->b);
) Q8 |, e+ O* ?" h4 Y" H b
printf("count is %d\n", pshreRAM->packet_cout);
* a1 e8 ]* \+ o) b
count_copy = pshreRAM->packet_cout;
% `9 o- n" q) \! B( e
}
y9 m( {. ?" p; U/ u, |
else
1 L0 s' x6 C, N+ s4 ] I- Z8 I
{
, `) w/ A5 }, s
printf("No effective message!\n");
& Q+ T; }1 \5 C
}
7 j+ @7 R6 I0 Y/ O! h1 j
}
. q) X" F1 R: B. S. q
$ Q9 @6 }- k$ B( W, Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" Q5 q/ |1 b# o) I& b4 n; P8 P
1 I6 E& H( x! P: y6 V2 E
- S: I: \0 E, k( s Y( Y
; Y# }0 c/ Z1 @8 j) H% G
9 g$ J8 w4 C, c( }: u
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4