嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 Q1 X( V; S: q0 N" K
( z7 x" C! X# T' W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 U: `* T/ I! ^' L% O, S. W
#include <unistd.h>
4 c8 }0 t% u( C n" J7 \2 i: I2 E
#include <sys/mman.h>
* I* v' L7 u" R! Q: a
#include <sys/types.h>
# l4 k) q" c2 |8 ^, S
#include <fcntl.h>
5 T7 X1 O1 o$ ]6 E7 @6 o r
2 X( }7 {( D m) \9 t: A+ e+ }' {8 t
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 d, v2 Y# F! N& \1 z. R
' F" c% i$ u" ~# |
typedef struct
$ y% T6 D+ n9 G
{
' ?* P% s$ D! A4 f$ m+ t
unsigned int a;
1 P% L% F% `- c
unsigned int b;
9 m6 l2 Z i D3 a! b) [4 c
unsigned int packet_cout;
% C0 A2 d* P' I6 f; w4 i0 ~9 V* M& v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 o. C6 i3 K) {2 M/ V2 u' e2 Z
" n- c, A- ~6 v$ Q P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
g( N: B0 P+ O/ A* _
unsigned int count_copy = 0;
' i/ H& j+ |" ?3 J, }4 a8 E
, i1 m: x" Z1 V' [
: d. \# ?1 V9 ?
int main()
( H4 i7 e* x) A+ ^% Q) t
{
% U: p/ C; l: A) ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ q2 n# ^& R7 h+ P$ h5 V* |2 G5 H0 r! E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ K$ V. L) I% o. e: N
3 f7 V7 l5 `* n0 f7 z
while(1)
4 @) N5 o% W4 X1 s1 `
{
M% d" e% o+ f
read_MSG_buffer(pshreRAM);
c! h4 A9 ~! V x& o( V
}
5 K3 K r3 b7 J( q
}
( D' d& z3 y3 |1 \, x
0 B/ K, {# {8 M% p$ x' ^8 O' c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 l% ]1 g+ z' W5 f* F+ P* R
{
4 y' i9 M, P# M% T1 ]) i
RX_MSG_PROTOCOL buf;
0 u0 D/ z' j" m8 r
/ V6 {3 U8 ]7 Q. u
buf.a = pshreRAM->a;
6 e$ G. V |9 D
buf.b = pshreRAM->b;
* E) A: A, G1 f* [0 E' c% Q
buf.packet_cout = pshreRAM->packet_cout;
( K+ t7 z0 ^& U! T3 W" {: g
" F" ?6 C4 Z& g0 M4 E8 ?4 n! N, R
if(buf.packet_cout != count_copy)
7 Z, [6 y$ L# B; w' z$ |6 Y
{
: J' A" C; e( D# ~' t- x& Y
printf("a is %d\n", buf.a);
: t* _' l( ~, k! Y$ W
printf("b is %d\n", buf.b);
; O. }; d l. L' @. E I. ^
printf("count is %d\n", buf.packet_cout);
" [; Z( m3 d. j4 A: |
count_copy = buf.packet_cout;
, C o' ?$ c3 O: f
}
9 F! n7 C/ G' ^3 M& ]) \
else
+ P; V, X% G* j0 | h
{
+ a& P% H- |9 a `- n8 E8 S/ W! Z
printf("No effective message!");
r6 {2 ?& o- F3 N6 h
}
; Z. y7 ?9 g" k
}
w9 G7 z! W- ?. L' v+ c
s# p) `3 O: w8 C5 _/ Q0 X0 {5 |/ C
5 v- O, t. _: n$ J, ]9 Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 ?3 a6 V' o+ e7 e6 Y
使用下面代码,对内存使用了mmap函数后:
8 N! D2 ~7 A; v1 `$ X3 h
#include <stdio.h>
5 E( q- v( ^, m$ m t( O
#include <unistd.h>
9 }2 @7 V4 Y2 G2 _
#include <sys/mman.h>
/ ~$ p* }, ^, _+ Y* B3 @
#include <sys/types.h>
8 E. v0 v$ @# P1 d
#include <fcntl.h>
( q( s6 G7 K5 B0 A5 Y' J
5 _) [( J$ |& f7 i& a5 N; {" R0 }' K
#define SHAER_RAM_BASE_ADDR (0x80000000)
& Y3 F, e7 v: Y1 K5 D1 D
#define SHAER_RAM_SIZE (0x20000)
* i. v7 b y8 o
" `8 X& _4 {% \8 s9 a
typedef struct
8 g+ w. H/ ^) _) |4 E# M( v
{
8 x' W* _1 B Z/ k9 i( H
unsigned int a;
. S" j* _% Z- _& ~1 e
unsigned int b;
7 @6 O3 t' I' S' W6 M% }6 o# l
unsigned int packet_cout;
+ ]7 O4 D" N& n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% W9 n- Z" p8 B p
2 X9 U% I ~' f% c- S- Z& Q, j
void read_MSG_buffer(int *baseaddr);
' F; b4 g9 o! ~$ A9 W
unsigned int count_copy = 0;
0 Q2 ` Q3 I3 w
4 i: Y, n" n( n2 a: B
int main()
8 i" z& R9 C' @& w& o P
{
* u& F0 ~6 y* u' C, O( H
int fd;
2 Z! d7 f# z5 i2 H
int *mem = NULL;
3 g' e N+ R2 v. l* q
# S9 P3 D* [ v) ^7 q7 u
if((fd = open("/dev/mem", O_RDWR)) <0)
/ a9 s) C- d! v
{
* u# r- U' u; n" ]. I5 q. k
perror("open error");
2 t) D+ Z) g' S) _ v2 S2 W& b5 U
return -1;
: o4 y, C+ b+ _9 h2 O3 @0 R+ z, l6 s
}
$ m8 ]5 s5 i9 c U4 a$ x P* ~" `- }
& ]! S! t5 S, L
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ a: J6 n' ~5 U- J
' f" _" Q- B' ~. v% `% \
while(1)
& P7 z- }( |, l. G) K: l- p$ z
{
( P) W0 H/ s+ y, U
read_MSG_buffer(mem);
% o& r8 F& S6 ^' l* G9 o, g% F
}
( b$ w' @5 A" g4 m/ ?
}
& m; V2 d- t T
( }9 x% c6 ~" S
void read_MSG_buffer(int *baseaddr)
, k; A( _& V3 }, E- A
{
: k8 \8 p% x( S: q8 ^ B# L
pRX_MSG_PROTOCOL pshreRAM = NULL;
' u! E+ r$ J9 k6 P( X7 u: J
7 e/ Z+ E, O# l2 B+ O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 @! U7 g/ l7 I- w8 p2 g9 {) C/ y, m
% s3 q" y& G, B$ I" B, O( G
if(pshreRAM->packet_cout != count_copy)
8 W0 }, T/ I; s3 `! i6 M. v
{
: M4 F9 f. n5 U
printf("a is %d\n", pshreRAM->a);
% l" z( Q. ?) d! ~2 U' y
printf("b is %d\n", pshreRAM->b);
G B& [7 C h
printf("count is %d\n", pshreRAM->packet_cout);
" r" [3 E# Y1 ^8 b
count_copy = pshreRAM->packet_cout;
9 t& |: u6 p$ \1 L' s
}
. O" y9 u% f# `; ~# q9 `
else
. L3 S" P w5 E
{
w* C5 o u2 k# }' M
printf("No effective message!\n");
& V5 o4 L- E6 `( y: q: L. R6 }- \
}
* k8 W$ R" G) L5 W8 X- D) Q
}
0 H- E$ Z; g' p' a( g
- {3 ^4 c2 G9 u! q6 K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& ^9 c( G( S( z6 n3 ]" E) f5 w
' L; a- h% u) e+ N$ d; q' _9 ^7 o) F
: H- E5 j! m* c! X
, E; G) d4 R4 s# q; Q ?) i6 C
, N; x9 Y# [; j8 Y7 W6 I
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4