嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) p5 c) j( s: Q6 U* N
# [3 e5 s/ n) j3 C. U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 c$ Q b. p, g: v% ?
#include <unistd.h>
% c8 c' A% K" h5 M7 s2 ]- W7 Z
#include <sys/mman.h>
4 ] j9 h$ n0 u3 B1 \
#include <sys/types.h>
0 k; d2 B1 f6 q, `# }
#include <fcntl.h>
/ r% m2 U# V( ~1 {3 v& F
4 P2 N6 q7 L8 J4 F( {0 Q2 P
#define SHAER_RAM_BASE_ADDR (0x80000000)
, z1 T6 o7 c: \9 ]6 N4 b- g
. K) D# Q' Q- B8 u
typedef struct
4 {* V8 ~' _6 k* F* B, W# H
{
4 a2 O3 ?/ T2 f$ d, S( V+ N8 d4 m
unsigned int a;
$ m7 U# p. x I' {* i4 m
unsigned int b;
. {8 E( `" X( ]
unsigned int packet_cout;
# i! I" }: R, ~" i$ F7 Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: E4 g* E, r" J( S' g( I+ V8 T9 e0 b
* A) p/ T* I8 u+ W/ A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. b4 E) Z! ]0 {3 `0 v7 Z m% E
unsigned int count_copy = 0;
$ U9 G1 h U+ q6 K
+ @2 `2 Q+ M: q% \6 a- U$ `5 }) ]
% o/ F4 r& K1 J; H, |0 {) u _8 Q5 G
int main()
& A4 ?0 n3 Y$ c" `9 E
{
; X" k& s7 r d8 a
pRX_MSG_PROTOCOL pshreRAM = NULL;
: s n: c9 f& [" c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) O7 B: ?- G& w1 |/ h
: u* g' ]9 L/ u" q
while(1)
* o5 d& H. y6 V. [% {3 v* I# W
{
: v7 x& a1 H0 N# ^6 N9 ?) r# J1 j
read_MSG_buffer(pshreRAM);
; p: O5 W6 M) q$ w6 A9 `
}
% k) H& O- M8 e6 v4 E) H
}
2 |) {3 i. v1 g& n
9 S/ C: t! K3 Q8 `9 ^$ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; `/ Y8 w9 k3 p! ]; |9 U# p. ?; p
{
: d4 K7 P) E6 j: M( {
RX_MSG_PROTOCOL buf;
1 B9 n4 S& s5 o
B4 c5 u- o1 ?6 q; c- j
buf.a = pshreRAM->a;
8 G+ S/ x3 j7 `; Z' C
buf.b = pshreRAM->b;
2 j+ k, E9 t; C R0 T
buf.packet_cout = pshreRAM->packet_cout;
# M; \( Y! n8 p, _
6 W* P$ N; Z: s0 ~" a
if(buf.packet_cout != count_copy)
; W- T: q9 [; ?
{
; G9 K9 \! J4 L; c8 U6 |
printf("a is %d\n", buf.a);
0 w$ D( l* G" G0 e( t: H
printf("b is %d\n", buf.b);
2 a* J1 s" @5 d8 @5 `
printf("count is %d\n", buf.packet_cout);
% S( |; r6 Y4 m% v4 `% t
count_copy = buf.packet_cout;
* N1 W& T; d5 N6 Q0 G1 ^' k+ m
}
; s+ ~3 r( [2 o! C' J
else
* u- t6 [. \1 @( [, o, g
{
* e6 R0 G6 m0 i0 p2 W D
printf("No effective message!");
# H+ l; E2 g; a9 k8 X! H- Q
}
1 @' v8 G/ z9 ~6 `3 [, D1 Y8 H
}
t2 ~8 A) x1 @4 R1 v
% h% ?' j, t' j8 v3 G x
4 A" I, U3 W8 _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 H& {. L4 I1 p' N
使用下面代码,对内存使用了mmap函数后:
( Q1 b4 [& w1 R+ g# r, ~
#include <stdio.h>
f z% d1 ?: K e
#include <unistd.h>
$ z7 N- e* i) s( T
#include <sys/mman.h>
) {4 O0 W& S4 \& ~( P$ M5 j
#include <sys/types.h>
* ]; o* p' f, ]8 d
#include <fcntl.h>
7 Z- m0 M& F( v! b
5 O6 k* V$ v7 h
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 G7 `: c) Y; i9 d2 S7 a; W: f
#define SHAER_RAM_SIZE (0x20000)
* Q" J. q5 A6 g* D
0 O9 H7 u( a% p. y/ n# o
typedef struct
) v1 c8 u6 H) l# [
{
/ V8 ]$ J6 l6 I; t
unsigned int a;
$ k6 K; x+ L/ O0 S# O+ S- v# b
unsigned int b;
* M6 W7 J- Q$ S T& A
unsigned int packet_cout;
% v* q! i; n& u i, E& P& u! s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 _* r: e$ T2 R( V+ J
+ B, H {: f4 h7 M- v* a
void read_MSG_buffer(int *baseaddr);
: X/ @4 o, z* n$ {5 W: P
unsigned int count_copy = 0;
1 k- f. F! M5 F* T/ Z9 P( Z
$ A) i1 s1 ~* B8 p, V" ]: W% r- X
int main()
, @; o$ B2 `1 T1 U1 X5 \
{
( h ^( v" J0 H9 @' w) {
int fd;
: d* m5 Q) J; u" Q
int *mem = NULL;
, f& {: R/ Z7 P4 {" M4 J' ~
) t% f* ^8 X- {; x+ _& L
if((fd = open("/dev/mem", O_RDWR)) <0)
4 Z& O. i) o) R$ Z# W( i
{
4 F% B& ?2 |) N+ x/ s9 F
perror("open error");
* S4 D+ b9 X' }: Q0 h
return -1;
! R5 V/ z- b1 J0 Q
}
" k+ }0 z9 }* [3 s1 y
8 y0 p( y" i5 G# o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- Q2 V9 b! s0 t+ }1 Z$ m
[0 ]: v3 ~: y. i
while(1)
0 I% [# m& Q# A
{
8 Q8 V1 I6 h4 ~* G4 ?4 m
read_MSG_buffer(mem);
' @8 d, A+ b8 j' z4 \
}
3 f' r/ K3 d5 [! |8 e
}
' P7 J8 c7 w9 J) d
5 b1 W9 H7 R' {& G( |6 Z& Y; S
void read_MSG_buffer(int *baseaddr)
) H+ h& y1 ~$ H; g `# |2 k" e( R2 I
{
$ j- i1 @& g% X. H4 O, Y+ Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 \$ I7 O- a- g9 R2 Q
I! X0 q/ K# e
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ i- y* X9 X. V" @ E, x5 F) S
/ W2 X/ ~1 B) W! Y
if(pshreRAM->packet_cout != count_copy)
: i$ i# R$ {2 Y) w. j8 ^0 R
{
. S% ^) |4 B& \5 ]6 ?1 g
printf("a is %d\n", pshreRAM->a);
2 n3 p2 s! l) [" A
printf("b is %d\n", pshreRAM->b);
9 c" ~$ B/ a5 P" s% m' B, \
printf("count is %d\n", pshreRAM->packet_cout);
! o+ p/ F j! H3 a4 s8 G
count_copy = pshreRAM->packet_cout;
/ E& H2 Q9 a$ x# Y
}
* \: ?9 _: ^% N+ r) f$ K7 e
else
2 `: Z) w' Q: G6 u1 L T
{
6 m! Q3 V% K [) }! ~+ `3 s
printf("No effective message!\n");
6 y. v! l/ @' |6 I/ }( t1 U$ a
}
! N* y0 K! P8 l# p" P+ h
}
6 K7 X: S( I' y6 ^6 P; Z' z$ G
1 o( n6 O. N: d; _: H& b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% O5 a* e" g( | T
% j# y$ T/ K; j ?
" c; ^8 g# t6 h9 W
$ z9 }% O5 X$ W* G7 F4 M# Q
' ?: ~& j1 H; |: k/ y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4