嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 A8 M+ N o/ y# y, V# I1 _+ f( y5 e
0 k( p* i2 D4 G+ a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# E4 G8 `/ h9 _! q4 ]/ m7 Z4 R
#include <unistd.h>
% z, P7 y* k4 X
#include <sys/mman.h>
9 R9 B( o2 C$ |' G
#include <sys/types.h>
& a( ~$ P$ j" l a. [, ~
#include <fcntl.h>
7 o. M8 f! G2 @' j: x$ [$ l
f8 E+ i) J- G6 h: R) p
#define SHAER_RAM_BASE_ADDR (0x80000000)
* n* t. P( ~ m) W3 L4 N! Y
% K Z0 b% a; w8 O
typedef struct
, @% z1 r7 L- l. B' `
{
5 u f, D$ b6 X! t+ l- h! c# k
unsigned int a;
4 i$ L6 G4 ^. l0 _! b" J4 b
unsigned int b;
M3 J1 g1 e2 h+ G8 E9 {3 z9 y* K/ a
unsigned int packet_cout;
% J G5 k" t3 J. R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 s$ D! _' e `5 G) @8 a2 g4 c) Y
6 a$ F) j, P0 U) b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# e# Z$ P2 l- N
unsigned int count_copy = 0;
8 J( ]" P7 v$ v$ [
% P: |% A( T+ W6 V2 l
1 ?3 r& V$ g0 [0 s- B3 n' `
int main()
$ m2 c: R, Z# W4 ^; I: f
{
* t/ Q* s2 X. C% v0 ^/ ~! }8 ]5 C
pRX_MSG_PROTOCOL pshreRAM = NULL;
, A* u! {+ c! D0 ~( V+ |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* j/ B3 K$ ]/ ]2 ^! K9 \
+ G1 |4 @8 Y* l
while(1)
$ |) D, ^' x4 p a/ L
{
6 ~+ t% o4 F' c) ]% _6 G- d2 {/ @8 k: Q
read_MSG_buffer(pshreRAM);
: V& n* f" Y- P/ q# o9 w) h2 G
}
$ L3 J2 {/ I8 K: s \8 p
}
5 g0 Q& T+ ]2 w, Y# A, J$ S: p
% A4 Y5 r8 L3 \" z$ h2 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ }# j( r! z( _# b" R
{
9 W4 t1 K: ^# s V0 o6 Q; i/ _
RX_MSG_PROTOCOL buf;
3 A3 V: ?5 r8 a8 N( M
( p5 n2 o* F' r* W) J
buf.a = pshreRAM->a;
: @) {8 R2 P) n1 q1 ]# o
buf.b = pshreRAM->b;
6 Q1 ]# c2 |2 |7 v3 @/ D3 h( k
buf.packet_cout = pshreRAM->packet_cout;
9 n+ `: n) P6 o2 A9 a
; R6 i7 P) r T) z. y$ L
if(buf.packet_cout != count_copy)
5 O: m8 N( o! Q i: R0 K& ]& p* p) h
{
; i- R4 C/ o% s$ \* }- F' [
printf("a is %d\n", buf.a);
5 ~; Q3 ~! e' }& f; j8 q" j
printf("b is %d\n", buf.b);
: m7 d, @& A1 K- g. v. G3 z
printf("count is %d\n", buf.packet_cout);
m% g+ K U0 z0 {
count_copy = buf.packet_cout;
) T' B, @& K8 M& X# [
}
- O0 L" _5 \. R" E @1 Z) f" W
else
" b5 A( ?8 } i" ?
{
# e l8 Q. `6 F9 o
printf("No effective message!");
& `4 J$ ^1 U! U3 A& l
}
) l! ^1 J7 w$ U1 F/ p8 E
}
7 v W$ |6 M9 y- s, n8 }! M
/ j+ z3 E+ ~. _# ?9 F! k3 f) {
4 @- W7 \ n6 w4 v: b: U3 ]
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ }2 g% _9 ?* Y/ k
使用下面代码,对内存使用了mmap函数后:
: G; s l& w) K- n1 \- W6 Q+ H3 [
#include <stdio.h>
* M# p6 f J+ H2 P7 s w
#include <unistd.h>
0 U H0 T: {, w
#include <sys/mman.h>
) H, Q/ b% T* r. V& b
#include <sys/types.h>
O+ \+ L( V' D) c# Q
#include <fcntl.h>
# O* K4 \# v. h. A$ S' I! S
) A" |7 }; W4 c6 f5 b9 _
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ x5 S" e8 d' O9 r7 u0 Z! K7 M% G
#define SHAER_RAM_SIZE (0x20000)
I) B9 w2 ~# Z$ W
% j$ t% W: j, G, p& `0 [5 y) \
typedef struct
8 z/ a' h" L, u6 k T
{
$ r" V! h2 U* ]
unsigned int a;
: F- R n3 n1 t" L
unsigned int b;
% q2 X0 p! ^% m& e
unsigned int packet_cout;
( @% j; ]$ j! b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& w; T: g3 @. e# p4 R/ H4 }+ S
* Y- L+ E/ ]- U% y& E
void read_MSG_buffer(int *baseaddr);
" N. M- }! B+ i
unsigned int count_copy = 0;
" }) u, P# R$ h: p9 ?9 v
7 c# v# Q$ C @% D/ U
int main()
$ _1 V8 W: }5 C
{
- {" K7 K+ ^; i3 K9 C
int fd;
* Z. B( w1 E6 h5 K) \/ J3 \7 N8 _
int *mem = NULL;
# p& {- c( Q- f- Y
' p/ S' C4 I- ^5 ?7 g6 I; c
if((fd = open("/dev/mem", O_RDWR)) <0)
3 U: Q; `7 m4 q
{
! p e) a- @' r8 _, J$ R' @6 i
perror("open error");
) C; o; ]9 m" v* F. m1 r
return -1;
; K( y5 ?- l" B9 v8 T# h ~3 q
}
* _3 ~/ N8 L6 B& `* v6 M* z. C3 I
, k! n$ }; m/ s* {) v
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# u$ `1 _+ g2 I& W8 N
( W7 O3 W M0 g
while(1)
5 \: Z5 L3 ~7 v; Y
{
8 Z: P/ @0 C- {; C
read_MSG_buffer(mem);
5 o# @( d3 A! h$ I, b- S! s- o
}
6 g4 {0 e6 [* @) p
}
9 M* {' Y* S0 U7 L( N$ S, W
2 ]; a" s- M5 I2 s
void read_MSG_buffer(int *baseaddr)
* r c7 J5 [" ^2 e* |
{
- J1 ~" c, s) D! J+ b) \) L4 n/ X
pRX_MSG_PROTOCOL pshreRAM = NULL;
* x j& _7 n% s% ~ S' s
- _: x' A2 @, I" K" N. ~4 @7 y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; n) S7 X( F2 R& _, x, k
3 w0 I) I' w- l
if(pshreRAM->packet_cout != count_copy)
2 E: j; P! U7 `
{
4 W( B+ \- c# e# I
printf("a is %d\n", pshreRAM->a);
: f/ d" e* K& q M5 h2 K7 c
printf("b is %d\n", pshreRAM->b);
! |- E8 n& `3 g/ {9 \2 ? ]
printf("count is %d\n", pshreRAM->packet_cout);
; l/ z0 N% z- s% A, |
count_copy = pshreRAM->packet_cout;
5 m! z* Y0 E5 L r/ B
}
2 [$ C1 ?* S7 |
else
) ]9 X* U/ v+ n+ M' |' ]/ g
{
/ g& f) N8 t. _. O0 b3 p. M
printf("No effective message!\n");
# T: u1 Y P7 A/ z, D5 S% E
}
3 ~& `# i6 n9 m+ [
}
$ Q6 i( ~2 X, o! b8 v
] R, d5 h2 y. P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* [7 v3 K( z( i
" t# O& {1 B: j. j
- r0 H5 B- q2 U1 t9 d
" n4 A* I1 m+ P1 t: C* ?, X3 l. I
' Y' Y8 R$ D" q% p& {7 O) }! r" U
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4