嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 R3 L2 `7 T7 Q* t% [5 G% B8 i
' E* s4 |& c7 [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ a7 w: q0 [9 s8 o5 Q
#include <unistd.h>
9 O! g+ s. S# j/ s. S
#include <sys/mman.h>
" j Z$ t+ b( G# m8 g
#include <sys/types.h>
. W: K& s% L8 O7 A! U. E
#include <fcntl.h>
: g5 c* G) o1 G; k; x
* z# t% U& I# E$ H- `
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 g% V$ N" y0 j6 @/ v
- Q8 Y0 C, |5 Y5 ~ ]+ Z- }3 {' P6 B6 L
typedef struct
K: W; r4 M# _
{
9 |# L4 M) ^1 @! O% z$ P1 \
unsigned int a;
7 u' X& o* p. L- h# i1 ]: H
unsigned int b;
6 }- G) v6 b; W
unsigned int packet_cout;
- X/ t/ x& |& L! U$ Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' `% a8 I; X1 R7 r% ^" v4 C: G
" x/ N# e) A3 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% ^ w6 n$ v: a" P+ Z
unsigned int count_copy = 0;
) A" S) ]2 E" T) e' [3 B+ n/ C
; t+ e+ ]2 H/ `6 i1 ~$ |
' H$ Q" J7 N* @! G
int main()
' f# W9 y" F* g f' Z7 ]& J+ e& \
{
* y7 X+ m; @& ?( Z; ~% c
pRX_MSG_PROTOCOL pshreRAM = NULL;
. ~% E. i7 a+ |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 [# z3 n* J# j' V: ^; i6 p
- v0 T* Q( K, t! I: l |2 l0 T" p
while(1)
# D. o- p- _1 @4 t0 Q
{
) p! T( Y5 M+ ?+ d. S
read_MSG_buffer(pshreRAM);
' v9 u2 N! _6 g8 P& O
}
0 a: p" m @$ r9 K; F
}
! P" i4 F, I* \% s4 P
7 P. e$ g$ ?, c, v4 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ ?4 T! {$ _: F+ j' u# A% C
{
; `' m- `9 l/ Z4 f2 I& d
RX_MSG_PROTOCOL buf;
9 S4 b3 [$ T3 t& _9 D: ^
2 L, {8 D0 r" \9 L+ N
buf.a = pshreRAM->a;
* f" J T% N- s x2 F' ?- _7 a
buf.b = pshreRAM->b;
3 e( t4 g4 D/ M
buf.packet_cout = pshreRAM->packet_cout;
. ~5 D) l: N+ N+ v4 c; u
) [; R. V0 M* S; S7 j _' X
if(buf.packet_cout != count_copy)
7 u$ g1 m5 y0 r0 u& e
{
" |1 q7 v4 U, s* P0 }
printf("a is %d\n", buf.a);
4 a! z1 O O# [- h2 f; r
printf("b is %d\n", buf.b);
7 q- A. I' {) V" `* R/ `- U, p- a
printf("count is %d\n", buf.packet_cout);
a& O" ~. x; y7 L
count_copy = buf.packet_cout;
! a, n% j" H3 W$ M
}
7 ?6 d% Z; I6 i5 ~ Z
else
: l1 i1 |1 {2 Y+ Z
{
0 J* W0 G5 e: N1 x" c: W. S. |. {
printf("No effective message!");
9 C' _' k# R. e9 Q7 z, b
}
7 \: `! O+ s. L6 q+ ^+ K* d
}
/ G& Y( T% t9 b& o
6 w& `; I( D$ j
$ v: z3 `' {' {2 A: O0 Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
j/ k* d3 w; Q
使用下面代码,对内存使用了mmap函数后:
8 \+ R. x- ~' w" Q
#include <stdio.h>
4 D. j' P! m5 L) b/ T5 |2 B% D
#include <unistd.h>
; T4 T2 E. o( K# g% G1 f
#include <sys/mman.h>
2 Q7 g# w/ t$ c4 Q
#include <sys/types.h>
- b! d& }$ s: c: p5 p- O" j$ s- }3 I
#include <fcntl.h>
% U3 P7 w6 G1 X
1 z' y1 N) Q. R! z& x2 e/ o6 S
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 {: v4 H% Q: h
#define SHAER_RAM_SIZE (0x20000)
& m* u+ r0 y& \; K$ G8 Z
* _5 p, j/ s7 F% `3 G6 F8 D
typedef struct
5 U$ Y. D- X: b* F: x) p
{
) {$ a+ ?- j3 v3 z o5 F
unsigned int a;
+ Q7 ~0 w9 o2 L! y4 y: z
unsigned int b;
6 {6 R: ~+ B( F7 J
unsigned int packet_cout;
# w2 n& y1 R: J# H i) L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ |( o7 |. G! q, ^* n
2 ?* Q, t. ]& Q1 ~" A" r3 u( r& o
void read_MSG_buffer(int *baseaddr);
, [5 A$ Y, X9 p& s2 l2 |
unsigned int count_copy = 0;
3 l* c1 c r3 h* |7 K+ [
" p7 G; b7 F; R
int main()
8 a5 k0 u% p. V! r' _
{
+ p) r2 D4 [4 k6 K
int fd;
; N7 }9 ?$ e, ]! s7 q4 @/ l4 Y
int *mem = NULL;
& O6 X% R, {& E$ e; }; L$ t
4 @# a9 C' B" o; w6 R$ C
if((fd = open("/dev/mem", O_RDWR)) <0)
$ U9 L6 W+ t/ k9 f }
{
& Z+ g% T) N* Y+ [0 q
perror("open error");
- w( V' X/ a) k; N6 E9 F
return -1;
/ ~" N' g: ~1 ?; G5 ]) h& \" {: c" t
}
! n3 z0 N- V1 B" Q0 M
5 B; ?/ e9 h& s5 H
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* p- i- Z7 E# w
6 p1 r& T2 _7 t/ U# h
while(1)
0 _& M' _' b g( z6 ~! T/ P
{
! z* i* C8 r+ G/ [ L
read_MSG_buffer(mem);
) L% j2 t, _: S5 l
}
l I' v( u' H1 J2 k* f
}
$ R. |* H* s" k% g# D
7 P h4 l+ w; G3 l
void read_MSG_buffer(int *baseaddr)
9 b5 P# X% ^8 x$ V C
{
' C$ H4 u' V9 d1 _! q
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 N2 M, Q5 y. T$ c
: h- s8 B5 z/ y! {+ I: r7 r: j
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 O3 L+ J# X6 r1 t/ H1 f2 t+ F/ r
4 G) l$ Z* b/ i- P; H! G+ ^9 e
if(pshreRAM->packet_cout != count_copy)
& I- w* q: F/ T4 ~, t1 p
{
' A8 o! h; d. c$ \9 \
printf("a is %d\n", pshreRAM->a);
! K+ ]* ]# C H! I* q& t9 e/ b- X
printf("b is %d\n", pshreRAM->b);
1 |/ J* A1 W# _; V0 v; v3 x
printf("count is %d\n", pshreRAM->packet_cout);
|, ?6 S+ n; Q& O& H
count_copy = pshreRAM->packet_cout;
$ i- B1 Y/ W$ H2 N$ S- t
}
0 v0 C% }' S: q. {* E
else
3 }8 Z8 _1 k3 I# j' ~
{
0 W4 f- s) K. C9 q/ u0 }
printf("No effective message!\n");
, B- D" a& J2 s( `$ @3 s
}
: p2 K. q2 c) X* \8 h) t0 Z3 v/ c
}
2 n+ P b. L) B( V- e+ T! v8 u0 ?! k
" P, x$ L2 Q& S; |2 `4 T2 `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! @- N' m3 ^, D4 o
( H' j+ l* W" J
. O& V" ^$ d' T; n7 [
, [4 h( @. K3 W( Q' h# Y
3 l4 [% B7 B* r; P% y! {! Q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4