嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 V& {- X* e4 `2 o, I7 _
8 o8 [$ J* G1 S! D# ^8 n J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) S5 m8 h: L% Q# F. Q- \
#include <unistd.h>
5 c' G' v/ b# e Z: y
#include <sys/mman.h>
) l9 T; o }+ O5 s4 p6 J1 R% N
#include <sys/types.h>
. m8 P6 C" B H: [; \( m) V3 H
#include <fcntl.h>
* e# o" V$ s( d8 a4 q+ ~, T
1 E& g3 e* K0 e
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ k. W, O) W& o& I) `. S8 a* I
8 @5 ^ K" y7 h& t. L2 n* O$ r
typedef struct
4 v" r* z3 r- X4 _3 M) ?( W
{
$ y! i& l% z: b! i5 I, u
unsigned int a;
+ z. I+ }. s7 z' ~& T
unsigned int b;
5 G2 [0 A# J* G3 N+ I. u
unsigned int packet_cout;
/ k7 p$ M* t0 R* M- h/ L, ^4 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 [/ Z/ q" `; t9 ^
1 A! R2 P( a: I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 t. y7 [! d6 X; k& H
unsigned int count_copy = 0;
% v( O2 _" H( r4 t
' ]. w( I3 R8 b1 E8 F
; G' u$ x+ O/ S' R
int main()
; E0 V. d& l3 [
{
& ]% z9 z& t8 ^. E% j/ R' z$ w4 B
pRX_MSG_PROTOCOL pshreRAM = NULL;
" I% E+ p# t$ X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ \0 B0 M' _0 Z; X- O6 V) Z( {
- g- @2 ?6 k! O; _7 m4 }$ T, ]
while(1)
4 Z6 K7 `) e0 g2 {0 a1 N2 N* p+ r
{
0 s" y6 l% p6 {9 V
read_MSG_buffer(pshreRAM);
# k7 p) R0 c6 ?9 U6 Z
}
& `7 p- n; j4 \3 s1 X. ]
}
: A0 {, m# ?8 h. J- Z" v; @
/ V/ e9 x: y6 H7 }1 { b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ e2 Q- [' @/ _( Y( C8 ~6 q
{
1 L0 C: D2 f" W v
RX_MSG_PROTOCOL buf;
5 y5 K, b$ R( g! P
0 z; f0 V& k3 w C1 R$ j
buf.a = pshreRAM->a;
6 e' y+ h( S, ~$ j$ \% X! y7 p8 @% }/ k
buf.b = pshreRAM->b;
" r7 y, e- O. q) n
buf.packet_cout = pshreRAM->packet_cout;
, q% i$ s B0 ?, m" f9 B( |( _
/ g% T7 M3 g/ P) u
if(buf.packet_cout != count_copy)
1 y) O |: ~8 r. ]
{
# H9 K7 t8 t, b1 u0 {
printf("a is %d\n", buf.a);
3 b3 B _4 i( M. K- e
printf("b is %d\n", buf.b);
. Y s1 i: |, `8 T8 d) s
printf("count is %d\n", buf.packet_cout);
1 I$ h) Y7 D& Y1 W% K2 `) @
count_copy = buf.packet_cout;
5 n" @4 H8 F% H" ~% U/ g, }. B
}
4 c, u; @% O1 j0 M/ ?8 a& _
else
8 N' J( T0 N3 Y/ P. Z. s: W: R: U
{
4 \8 Y4 E+ |. I% Z2 Z: \. |) l; z
printf("No effective message!");
, m7 U, k' j% V& g0 R7 l
}
- M& M" m& o+ u( X+ L2 W/ Z
}
, ~$ X# ^4 X# W' O/ i8 e5 T
- F- {: ~) V& |! p) y# J( h
5 v9 i% E. y& K2 A) v- ]$ }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' o0 Q) @+ {; M/ \1 N* i6 o
使用下面代码,对内存使用了mmap函数后:
4 |% x% i* y+ \( G- U
#include <stdio.h>
' m. ^) B4 W$ ^
#include <unistd.h>
' N# F5 w) ~. S& H+ b
#include <sys/mman.h>
1 ?9 Q7 x4 n8 Z+ x5 d" L" A; i
#include <sys/types.h>
; _* _" Y3 S, D+ r% c2 j* K
#include <fcntl.h>
+ l' O* W8 ^7 Q& G
- a; ?! V" G% g* ?2 d j7 c
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 b6 S% I9 L3 C' i
#define SHAER_RAM_SIZE (0x20000)
0 D* E4 T9 L. Y6 r
4 W, ?) W; c3 Y) T
typedef struct
# ^( a3 b7 G/ M E, }
{
" g5 L( b: \# H0 J
unsigned int a;
2 x* K: e$ ]& s* T
unsigned int b;
+ r: d% T8 C2 O3 b2 R
unsigned int packet_cout;
# O; Q J! j% }/ W4 `6 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 D1 X, C9 Q2 }: b
* V+ \8 ^/ a* _8 N$ s$ }4 u0 p# R
void read_MSG_buffer(int *baseaddr);
* x, M# J' i; V2 h$ u! I
unsigned int count_copy = 0;
) O" O9 C" U9 P. k( a' {3 m
5 D+ ?+ |2 ^" F7 m; T
int main()
/ i2 }3 _6 a) }1 W1 q0 \ g$ C. u
{
9 R' J, R5 }# Z+ |1 U/ U$ E8 P
int fd;
% U0 T6 k1 H0 A3 S- f; x: P
int *mem = NULL;
" O* F6 W1 R) W4 |
, B' b5 _' l1 Z. _. R
if((fd = open("/dev/mem", O_RDWR)) <0)
* t, `/ ~7 G, I
{
$ b0 v) v* U. r
perror("open error");
* c- Y7 { w" m' d: L" }( V
return -1;
$ [ j( L4 t; G" Y6 S
}
6 B, c7 E' ~- i- m7 @) W$ G
4 e# y! B% M- e; b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% D4 V$ p0 V, I- D
E$ M$ {; _ S0 H
while(1)
3 B' B5 W( f# l, g7 L0 B
{
. L2 L/ p! Q$ x" f6 C
read_MSG_buffer(mem);
( l+ ]; j- q" h) O
}
3 t) M$ w8 X7 k0 V- p3 l; a, o) U4 {4 m
}
1 j0 t, R+ ]% I. c5 H& ^1 l
- @, Z8 W1 h; s' U' s: E
void read_MSG_buffer(int *baseaddr)
! u$ }# \5 F. W, I6 \# ~8 [
{
C$ c$ v& V" P2 _( Q# c) }! K
pRX_MSG_PROTOCOL pshreRAM = NULL;
" Q# c' A. |) W: h
. z' S8 F; |. S' [0 _, K$ ]- X
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 [/ C7 P i# l
( o3 x4 E* s2 d
if(pshreRAM->packet_cout != count_copy)
0 D# E! T# B! n' e# ?
{
- K3 f9 F9 ^3 p
printf("a is %d\n", pshreRAM->a);
" s0 R1 i7 ^$ N% Y m% _
printf("b is %d\n", pshreRAM->b);
8 N& W+ f, ~" X- b) o* O" s8 \! u
printf("count is %d\n", pshreRAM->packet_cout);
( I1 H/ C) [, B- C
count_copy = pshreRAM->packet_cout;
0 I% G$ ^& F2 @( r8 z; A- k
}
+ [% ?& g" y" c
else
% G9 U( l6 o$ N$ K
{
9 M! S( l# [ W# T1 _
printf("No effective message!\n");
6 o* O C5 v! r7 z7 h5 Q, D! e
}
3 y$ |6 p, G& M4 ?# @3 C
}
8 T1 \ o# x8 P, J) N
8 b# r/ m" ~" ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ n/ Z0 g6 z3 \# @! ?; a+ ?
v0 J8 A+ Q" N) _
; N3 v) y, T- L5 X: u- Y* m5 E
: p( X4 P: b4 O" b' ~
9 P6 b9 \$ v. j% N$ V% J
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4