嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 U( m9 q. g8 t9 ~
1 d1 m% M# {$ _+ W4 t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: u8 _1 `) ?# ]$ l
#include <unistd.h>
~/ J. G5 |. `' N2 E+ P
#include <sys/mman.h>
, R4 n! ]2 |6 V! R, i
#include <sys/types.h>
2 [- E" \% G4 b$ V6 v9 l! G
#include <fcntl.h>
* R& e- n1 l# |7 n. k9 _' Z
9 R F* B# ]# ~2 H$ l
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 I0 E9 ~/ B: ^& O N+ r9 u5 x
9 T" z; H* R2 H; v0 m/ F% d
typedef struct
K: R$ v! g6 \! v: `9 n8 c
{
) j3 Q0 E5 D4 W* y( C/ p* `8 ~
unsigned int a;
/ ?/ P Y! }3 C6 w8 _2 U
unsigned int b;
3 E9 Z1 p- o: _$ G
unsigned int packet_cout;
5 Q1 P) q, }, }8 n; J5 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% X4 Z) A0 ^# h0 p! e! d0 @/ C
, j [( P: v5 ?) L$ a6 o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( e7 h; {. Q/ a) i f
unsigned int count_copy = 0;
1 n3 q' A4 f# |
3 D5 K( s7 I1 M+ L* e
- k# |# t- O9 m
int main()
$ p s6 p2 ~0 ?% F4 I, S. F
{
- o- a+ N( R5 v% A
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 |# u9 P, }6 e7 S% d, R5 ^7 h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ p/ F, ^& a# D, i, V+ Z
: @! P9 h6 R3 n
while(1)
: M- y" O% j, o7 |2 y
{
; ?/ K& \/ o# M) }5 T
read_MSG_buffer(pshreRAM);
6 V; L* u: J m+ M
}
5 s8 E6 A- K" J0 w3 c& x% L; Q. w# F
}
- z5 C8 Y2 ^0 N
7 r. D% D( e" o6 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: W, J3 d; B8 h3 u% F) E" ]: E
{
) u$ i' ^: R- V- i4 M
RX_MSG_PROTOCOL buf;
7 ~- p: h& j' Y+ R
( I- y. D9 \& t6 Z2 R ^, L \8 ?
buf.a = pshreRAM->a;
# m) T2 X0 b$ G
buf.b = pshreRAM->b;
* p& r/ `* F5 v6 l1 u; b3 d
buf.packet_cout = pshreRAM->packet_cout;
8 D7 v8 i. c/ M! `5 M6 |1 K. u+ ~
1 T: F' m( u1 f6 p
if(buf.packet_cout != count_copy)
# v9 `0 p$ q! {# P% u0 u* e$ S R
{
2 Y8 s3 O; ]" {. H) X
printf("a is %d\n", buf.a);
+ ]6 Z: L2 u$ r8 _
printf("b is %d\n", buf.b);
. X6 i; Z4 z' C% s
printf("count is %d\n", buf.packet_cout);
, {1 L9 b7 ]8 H) o2 z
count_copy = buf.packet_cout;
5 a5 l/ o4 `8 G( E
}
% l% A. X; z4 c- E# P% [
else
- I) L5 N+ ]2 s. ?2 ]. I
{
$ u2 s" d( F+ N+ P
printf("No effective message!");
; U( p( M N: a) y$ m5 Y' V2 n; g0 a
}
8 {$ C4 m# L4 D- P+ X6 C
}
5 l. G* i# A# X0 s/ ~
$ `. J' A5 Y, l; k
' C2 P, U' m9 w/ P, c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 t8 S" Y6 X$ _: {6 w
使用下面代码,对内存使用了mmap函数后:
! ~5 U. E: |8 @2 K/ Z
#include <stdio.h>
* C! K% |! S3 ], n9 o* _
#include <unistd.h>
( F; c' E: z! j3 O7 l- B6 D/ `
#include <sys/mman.h>
; P, H' |; U0 P
#include <sys/types.h>
6 c9 ? p" v: g% E
#include <fcntl.h>
! _, Q0 q K0 h
" R# Q; j* k. A8 Q3 N. l/ s8 p: n
#define SHAER_RAM_BASE_ADDR (0x80000000)
% ^& F8 y4 [8 O. U
#define SHAER_RAM_SIZE (0x20000)
9 x* \: h- Y* n1 }
) ~0 T% B3 z8 e4 G. r$ @4 d
typedef struct
3 U0 m; \* r Z$ p$ D5 M% k
{
/ k u L" I6 A/ d
unsigned int a;
, `0 J s: P% d1 j/ O
unsigned int b;
, L9 Z$ j; _' z0 Q" U6 o
unsigned int packet_cout;
1 E. r9 K; T b2 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
A) x$ t( q5 y$ ~& R+ H
3 D7 y5 l* p! O% u. N* {; [
void read_MSG_buffer(int *baseaddr);
8 g+ x4 g9 v" Y3 Q" Y' N
unsigned int count_copy = 0;
; `1 X& y, D( k
& Z: E' L) ~7 c
int main()
, v! k* a) x% t% G
{
% B4 n: J9 I. E1 H
int fd;
! d$ }7 I X' ]) ]* S# b& S; f
int *mem = NULL;
# }! F3 S1 T( [9 Y" S3 c
% D. i8 k8 r! P6 d
if((fd = open("/dev/mem", O_RDWR)) <0)
% ?0 y. Y: x% d' P) `5 D( ^( S
{
# M1 B0 t" L% v/ r( h' t( k
perror("open error");
4 g* [' r) o) Z! F4 J& C
return -1;
* \3 R3 p, J+ H0 H# Z% G; \
}
) M# I3 N; o( h4 B
d5 }; W0 Y' i/ K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- [3 W, p4 ^, G6 s, c/ D* m
+ k: O+ N2 e/ K! H: A
while(1)
+ x9 n% T, @; P a6 J, Q
{
# N+ R8 I7 T2 n N
read_MSG_buffer(mem);
/ W. N& R) D! C! s6 U/ a8 w5 R
}
. X ?" c+ Y! @ J. A& g
}
+ i% @% o4 f. r, H
5 g/ j3 q5 J# g, A3 l, u
void read_MSG_buffer(int *baseaddr)
' E5 G, T7 {0 I. P5 a1 t
{
8 A: ]2 w8 D. C/ K
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 y c/ V% w2 \; |
2 L v+ V! B4 \4 I1 ]/ y Y3 s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: c6 r3 A4 o4 H- D4 i Y' q% F4 U
. h0 P& U0 x0 e; f, S! O
if(pshreRAM->packet_cout != count_copy)
7 V2 n1 o$ @& ?7 N8 s5 }1 F- y
{
0 L$ F3 _, U6 g4 Z( e" @; w
printf("a is %d\n", pshreRAM->a);
0 o b: R t- I/ R9 H
printf("b is %d\n", pshreRAM->b);
0 u$ c P: w& L3 l# U
printf("count is %d\n", pshreRAM->packet_cout);
9 F9 ]; ^- i+ V6 l3 F
count_copy = pshreRAM->packet_cout;
! t9 g0 O# {# W! p
}
1 x7 e3 q( ~' E
else
6 `) ]9 [+ } e% L5 N; O4 |
{
+ k* S6 X: T: K6 O3 b D
printf("No effective message!\n");
1 X) G; u$ l6 t7 H* A) J" c
}
7 f1 q7 T7 K$ R, Q2 F" w
}
0 j2 A9 W0 F0 @ b
% |' w* {. { J8 z6 V2 G2 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* e7 ^: }, k7 J% R
& u7 E3 I4 {3 Z# S% F
# }7 @! z* `% H% Y
) v/ r% `# Z7 Q+ l3 s" C
/ P1 r1 l" b9 V( i3 R) H% J7 p7 o
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4