嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
r. J: }* g4 |; r
- a( I$ ]- l- Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) U$ m2 S$ l- ^/ b' h
#include <unistd.h>
9 E2 z& H3 h- L, I4 C
#include <sys/mman.h>
5 P n7 I3 D/ v' t- n
#include <sys/types.h>
2 b2 ]$ p, B) n* O0 F7 v- J2 o
#include <fcntl.h>
0 q8 I3 X4 M' {* x' x6 i# |9 p/ o
0 y+ j6 e! [1 C6 @; T( l
#define SHAER_RAM_BASE_ADDR (0x80000000)
% S4 t0 L ~% m$ S% N* ]/ H1 R
K: g( I$ y6 V$ N( l
typedef struct
7 k- V, C& V* r& q( v& ~! s3 [: X
{
* a& G5 S# q& ]" K
unsigned int a;
* t( t2 A3 J5 o6 K i; ~
unsigned int b;
% u1 b+ L9 y; j# B6 A* b5 f9 k' r
unsigned int packet_cout;
# l) N' U- n& R% v5 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& B/ @1 Q! i( E8 X0 M
- e! c8 T' m- Z' k9 H5 u2 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 Z& c9 q1 g3 i. d/ l/ n
unsigned int count_copy = 0;
6 N1 X; M% \) ^( Z) w/ m# J4 k
9 F1 F2 E3 C! Z; k
k( w1 U6 d( Q
int main()
1 m% H5 E$ t, ]$ B0 P
{
0 d2 X( ~7 C5 H
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 |; `! l' |& L" \% W- K
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) i8 F( O7 Y9 {6 l! J' `) H5 Q% I3 I! f6 P
8 V% n' J2 b( E; i. D# a' W, N
while(1)
5 u! x( F# X% a+ o
{
, z8 w0 `, |3 y2 ~: T
read_MSG_buffer(pshreRAM);
7 w7 _: [. H, J7 _- _9 K+ O$ o
}
" Z9 T% l. I0 v- P& `, C
}
: S) v3 C) C) C/ W" A
7 j' ^5 F+ U" }0 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 a, x2 g8 B. s* o
{
7 M% a2 p% T1 r0 i# ]& d
RX_MSG_PROTOCOL buf;
R' \, Y1 W% }1 b# N% d
6 v4 r. F% x) {8 K" v
buf.a = pshreRAM->a;
) {6 u, W# X4 F9 K9 P# s
buf.b = pshreRAM->b;
/ t1 b' i! g: E/ ]
buf.packet_cout = pshreRAM->packet_cout;
! E' F. _3 `/ ?3 }* r5 a. R
8 d& c; W" O# j3 U7 }- B/ F# e; p
if(buf.packet_cout != count_copy)
1 z Z; r- V6 O- z; L1 w
{
F2 u$ d9 V+ i. O0 R6 ~" J
printf("a is %d\n", buf.a);
1 R; v! W& \: t1 z, H- A
printf("b is %d\n", buf.b);
$ f- g( }2 M/ p" L! N4 B
printf("count is %d\n", buf.packet_cout);
. b1 ^$ v$ G) f+ I0 Q5 P
count_copy = buf.packet_cout;
' D% y% c8 b, E3 D; f7 y$ D: N4 c
}
/ q% H" U2 `: ^4 Z3 b
else
Z8 `8 |1 X5 S# e' ~
{
& B# Z& \. A+ g; K! R
printf("No effective message!");
1 o/ V% j" d7 N! v' d. n
}
- M, p3 w1 l6 }- |! y+ Y7 M8 S
}
* S% M3 a- E& v5 k
7 l! K2 V O* s
9 t$ V2 n$ T9 z& b) C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) z, M: z, G4 k) W$ _% q
使用下面代码,对内存使用了mmap函数后:
$ ]0 }( |9 b3 \$ N
#include <stdio.h>
( \# ^6 f6 x% m2 I- `% d. S
#include <unistd.h>
! N% ~4 q- s$ B8 O$ L$ s6 P$ G
#include <sys/mman.h>
8 Y' Y r. ~7 e4 E4 E
#include <sys/types.h>
- K: y- m! U5 X+ C- u5 o) l+ j
#include <fcntl.h>
4 P6 q" f8 r* K0 k* E3 J; _7 T, V
/ @7 v- ~" P9 G% u/ L8 X0 ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
* T: }9 [. L( e. X- [9 Y% L
#define SHAER_RAM_SIZE (0x20000)
+ B1 E5 C& P* v% W/ s# ?# }) D6 E
5 n; N5 r3 B4 J/ ^+ P1 n& e
typedef struct
; |5 a m" z1 N! S; P3 F
{
, z* H2 k& _! W5 T
unsigned int a;
* y' `/ X$ m8 Y, m
unsigned int b;
! j3 u6 ~1 @& i5 Q+ J! Q" u
unsigned int packet_cout;
9 ]2 I I0 B3 ]9 P! {$ P& N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ D1 Y7 h( V8 t7 h: N8 \8 _( ^4 s
- r6 h: c: a# ?& X! v' J7 h
void read_MSG_buffer(int *baseaddr);
& f) v7 G4 p* @
unsigned int count_copy = 0;
* g6 M* g3 D3 p2 l
% M" _- [$ O5 ]+ {
int main()
( A ? O. L& M2 s. ^7 Y
{
/ L+ a4 y8 b8 Y+ {& O8 D
int fd;
/ W e8 U8 W Y$ a6 j1 T% m8 p9 z3 ^
int *mem = NULL;
( z: u6 I- b+ K3 }
; y! N$ N" e2 {: ~' [7 _& U$ Y3 A
if((fd = open("/dev/mem", O_RDWR)) <0)
; i% f/ y% @" j7 B- K' P2 }+ d
{
) @# ^& B, q9 K8 ^0 y+ m
perror("open error");
& `5 y% ~+ g" ]: T5 v3 V+ P
return -1;
+ n/ Z7 B9 r: g3 t0 K% `& @3 t( K' s! f
}
B$ Z6 W: t: x; c7 W' y8 y
% A' J' i( C9 m- v
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 W* h1 J1 i" p1 F, Q
) k# { U. w* X7 K5 L
while(1)
3 X* B# I0 a. Q9 C- E# F1 O
{
. \) P3 }! d3 g- s: J S
read_MSG_buffer(mem);
S- D, A! b7 ]& e2 A* g4 N0 f
}
! I2 v" x# t; v% g9 `2 W& w2 r( b
}
/ \8 n' ~6 M* g# l. o2 N
. }( ?3 \. O0 f$ l6 R
void read_MSG_buffer(int *baseaddr)
* j8 O8 F. [# s5 i
{
3 B% \5 N% w/ o0 {7 S
pRX_MSG_PROTOCOL pshreRAM = NULL;
j" d8 ]+ }0 |: a
) Z4 K: ], A% |. S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 Q) ^' }7 x5 ]2 f ^* @* ~, S
q! M) y) N2 ]' A& W4 R
if(pshreRAM->packet_cout != count_copy)
) ]$ [1 ~1 I$ E3 `! Q1 z
{
7 ^: I. w$ Q; G3 G! m
printf("a is %d\n", pshreRAM->a);
3 k$ b5 H' d* p5 Y% A
printf("b is %d\n", pshreRAM->b);
( ]( X: x0 Q' @' U& F) y
printf("count is %d\n", pshreRAM->packet_cout);
2 w* R* M; \6 q3 n
count_copy = pshreRAM->packet_cout;
6 x# }6 f0 S# z+ K6 O# c2 X6 n$ x
}
! W9 [7 \" K' _9 ~0 b
else
9 G1 `, W2 f4 O- J$ w" C/ g
{
8 b' z3 L0 t# E3 U
printf("No effective message!\n");
0 R8 u$ P0 M+ l5 @3 _# z) c; ]; q
}
* u# G: ? H; }6 N6 q' T
}
- Z8 _& c) Y) J' f5 f) O
" j" ^: ?; u$ O# R5 l+ X9 O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" a# n. p+ e+ c1 M& \
2 {/ y0 }' F5 t4 ]
0 I9 k+ I9 S' j4 z- B' v0 {: k
0 @ }3 C$ `: {% a* k
$ T$ Y5 g0 a" c
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4