嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 O6 F9 B% s4 L; p
& o+ a& i' V) A" _0 a% a) o4 _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( a+ k% `) i9 ]9 U& A0 J" k
#include <unistd.h>
" S+ [5 |- S" S9 U& v
#include <sys/mman.h>
, z% K) f' `6 G9 r" E
#include <sys/types.h>
- n4 C6 U' `% W' M: S
#include <fcntl.h>
1 R& [" K. r% R: E% O
) l- n! `/ Y7 I
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ ^( v n6 W; x. Y7 }* k* E% N0 [) n
6 b; I* d) [, y* O4 ^
typedef struct
5 V) j5 w' T8 i y+ i" M) W
{
9 T+ B) s* x; x8 Q) [
unsigned int a;
9 a) y2 \3 }* U5 F! U; k2 i
unsigned int b;
- e% @" l8 v0 j
unsigned int packet_cout;
& E/ u% T3 D" A7 H' D. ~) `: D- I# x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) E' D4 w7 [, w2 r' }
- R: i4 e3 i1 N; s$ k' D! G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' V- w, P: f, h2 \
unsigned int count_copy = 0;
9 a$ K) v) z8 L2 N) V5 r
) G) q+ R* v r4 h
$ `0 J. b- X/ i: O3 A, O
int main()
# r& h" I; m' I9 a& A7 w- r
{
1 L# g: n" R: w6 M- O* v
pRX_MSG_PROTOCOL pshreRAM = NULL;
( H, n0 z( e/ |( O% f" z) I' @8 O
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
N: B# L$ N7 e4 S/ K# I
# @0 l2 I2 ]# N( ~
while(1)
& H3 K4 H: j- f% Q: o }& `
{
4 s8 z. u/ N2 B8 }( u$ J! G! G. ^
read_MSG_buffer(pshreRAM);
% R/ M5 C3 q! S
}
% m/ d( H" T1 R% q( F! f
}
% R' l$ n( O4 \+ m+ t
# |( P0 G) W$ Y y) ]& b" s% c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ ]4 S# h, m+ `/ ]) }* X
{
$ O2 N0 ~' h, a* a7 q5 \: U8 d
RX_MSG_PROTOCOL buf;
+ q ?0 m# F7 Q7 t y
( H3 ~" k: m$ ?
buf.a = pshreRAM->a;
1 o* C" Q; n* I+ @4 J; `. L4 O" k
buf.b = pshreRAM->b;
0 ]. z6 h c% e& _% J) s. i" q
buf.packet_cout = pshreRAM->packet_cout;
( L4 |$ a) f2 V* U9 \
3 a3 o+ d9 p" O" a7 u/ l, a# o" ^9 v I
if(buf.packet_cout != count_copy)
+ Q/ ]1 \6 h. k
{
}% m' X3 O( ]6 k% C
printf("a is %d\n", buf.a);
9 }) M U1 Q$ Z I; T& W \
printf("b is %d\n", buf.b);
2 \2 o' ]4 r" K! Z6 E. X
printf("count is %d\n", buf.packet_cout);
8 O8 i2 O$ k" M! L
count_copy = buf.packet_cout;
7 l L0 |% l' V6 Z
}
) Y! ]3 i7 q# v) F5 n
else
9 E. u& K* Z1 P3 J4 x
{
, r, k7 H+ m, s6 L. T
printf("No effective message!");
/ T0 h* Q8 g& S" Q7 s; N9 M
}
: ]7 M1 b# e7 C( }$ e
}
; O2 g' [- U5 L/ q/ I0 R' [
7 F/ _$ f6 @4 V3 _0 F! ^4 @
^" Y& S5 R3 }$ f$ ?% [8 z; l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# q7 J/ Z" J/ F' T+ n
使用下面代码,对内存使用了mmap函数后:
5 }& X0 X1 y& h* F$ z( z$ n. T
#include <stdio.h>
, A* u8 ^, I1 N3 o+ z
#include <unistd.h>
/ v3 _# N/ D4 L5 _ ^
#include <sys/mman.h>
. y1 B0 A7 h, g* {5 v1 g; z' I
#include <sys/types.h>
" E7 s4 g& k0 w' s- ^' J" z& x
#include <fcntl.h>
; u" f( f$ q3 ~0 |5 s$ _3 [8 Z
+ B7 U6 U5 q4 e) ]! p$ A4 E/ t+ Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ i& ?$ r/ f9 K1 C8 V3 E0 }8 K1 o
#define SHAER_RAM_SIZE (0x20000)
; Y2 N/ u% v) Q# c8 z
# ~1 n0 U9 o( ~; L- _
typedef struct
4 d2 d& O1 S5 ^$ H- J- S& O
{
. y9 J7 k5 Q# W- d) {
unsigned int a;
5 w4 ^2 B& E7 D' ?6 w$ Q
unsigned int b;
9 P% F0 ~( k* G3 \) V
unsigned int packet_cout;
5 B! o) J" ?2 |6 D0 j& w& U& q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 p W3 U9 W5 {. x, i+ L0 f
. r1 q$ Q# w- N- K
void read_MSG_buffer(int *baseaddr);
0 N+ F4 z5 H c; S6 u
unsigned int count_copy = 0;
1 B: d0 O! ~& P0 Q
/ X+ \( K# P1 h/ U7 Q
int main()
" u7 Q" e) L* W) q2 J! S
{
c0 Q$ }7 Y" r, @. [0 l$ o- S: d. @8 T
int fd;
4 I3 a) c7 l# v; b# S0 P I
int *mem = NULL;
8 h, b3 h8 Y! @/ A2 R! N0 l, c
; X. h/ f2 m: M6 L: P7 t" i+ n
if((fd = open("/dev/mem", O_RDWR)) <0)
( c$ o6 R; Z: E( A7 f. G$ _' |
{
& W0 m) V. p# h
perror("open error");
* ^5 A# w i) d4 ?- ]
return -1;
! L* T& E/ j+ h# ~7 g
}
' P# p9 X- `) M3 F u$ |' i) }4 G
) O! X6 L: Y! `+ z; N2 z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 D$ K1 s' c+ Y3 s
, `8 U6 ] r1 C+ v r: h
while(1)
- q! E" n4 Q# N8 n9 q. O1 |
{
8 ]! m; d0 A3 e( U. z4 E/ m6 [
read_MSG_buffer(mem);
t" _+ j, b1 y$ X
}
+ a \0 ~: l6 V$ O, _
}
$ y( e; _5 l: x2 ^0 C( A
% D* t& O$ A1 U' g
void read_MSG_buffer(int *baseaddr)
2 ^- g) E- \' G6 e- |4 ?! m3 k; Y- ]
{
e# S3 V3 J% @
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 X6 t9 k: X' w
* ?% t# ?, _- T2 b7 a6 C# M* {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 A. H- j9 E+ I9 j0 h& g
; S$ Q7 R* K. S' }7 e2 w' w
if(pshreRAM->packet_cout != count_copy)
8 q/ E" o9 j- w
{
( ~7 |0 Z% |8 R% j, g
printf("a is %d\n", pshreRAM->a);
+ i" J' q. J' O
printf("b is %d\n", pshreRAM->b);
, R+ {- z+ X) K6 C: z8 c ~6 h2 y
printf("count is %d\n", pshreRAM->packet_cout);
% `. R7 K. n1 |$ d
count_copy = pshreRAM->packet_cout;
( |. V2 G6 d* _) a7 w0 @
}
3 U) A- k. W# O
else
+ B$ G+ [6 F7 a) n( u( Y; M
{
$ ~1 Z4 h8 Y3 x6 q1 z: p' @
printf("No effective message!\n");
2 K+ V7 X5 ]& M$ {. T" ~' g
}
. {+ w& P& y! B
}
# v2 g3 T; K- i7 K- z' `
% _" W1 }. a: a, f$ k% X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 d- ?* a, R' o* z+ \8 @+ T5 ?1 ^; \
" A$ X8 |. g' i; E; v& N5 i, l6 Y
# J6 d6 k, a6 R) [3 E
0 {1 P$ U! u; t3 S' Z: l& ~
y( Y, s7 B" J0 M, I- S/ L. `! g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4