嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: g, i B5 S9 F0 q4 k: d, @) Y: v
+ W0 ]6 h( A. o ~. f: P0 {) i3 b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: y& s3 F1 v. I8 B4 F
#include <unistd.h>
$ ~9 y7 N% _1 u; i
#include <sys/mman.h>
) o" k' a4 X' D4 H2 o0 `3 Q8 W
#include <sys/types.h>
. K9 h. Z# p: K( t
#include <fcntl.h>
5 P/ W5 O% l4 P$ Z j8 F& S
. B* U- ]3 ~7 B- k8 \7 \7 q
#define SHAER_RAM_BASE_ADDR (0x80000000)
" f5 P$ _7 `; n, `* |
, Q' `7 r$ a1 q! r9 W- T
typedef struct
0 ]& D' I" o4 j" q- [
{
( o8 c2 b% f: S4 e M2 l
unsigned int a;
' m; ~9 B# @ z5 T0 x0 Y' c4 o
unsigned int b;
% V" P* z; K: P
unsigned int packet_cout;
8 a5 N, c4 \& L# J- l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 ^& K- x8 f$ d7 Z+ l" C
! E1 ?( T6 g4 N5 _1 t" [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 K) ~ d! M4 r( a' |8 C
unsigned int count_copy = 0;
$ J$ {/ O6 L8 c+ y) z
1 s" i5 d( Z& g
) v2 m% [( E5 k$ g' x0 c% w S& Q
int main()
8 D# i# Y. F; Z+ N+ E
{
! Q) N* w4 i5 v! L/ s; Y* c# i
pRX_MSG_PROTOCOL pshreRAM = NULL;
, s0 Q0 Q0 s* s- V, r" i" y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, A a% w3 [, Y6 p7 v
1 n. O. S0 c7 Z/ v% n7 i* {7 o7 x
while(1)
& I! z5 t3 |( J! Y
{
2 q0 H# P; _% R+ Z/ X3 h
read_MSG_buffer(pshreRAM);
5 A* c! e' W- g& E W; O
}
/ a. b( |: j# p$ c
}
& I0 C `: r$ S: X* Y d! R
2 L2 ^$ `1 H% I* Z% [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 h; s- s# w6 i2 S1 N
{
, v( Z# t0 u) q0 t
RX_MSG_PROTOCOL buf;
. ~& T& a) s% j; t8 P: j( l
2 x( A- C q1 m% A0 H: t
buf.a = pshreRAM->a;
8 x2 r( o: g6 Z4 e+ y; I9 D A2 P
buf.b = pshreRAM->b;
) K8 @5 O h% N1 c1 e
buf.packet_cout = pshreRAM->packet_cout;
) z$ t) u5 Q/ r+ i5 p
+ D: J' U/ k" E% p$ K+ m+ i" }
if(buf.packet_cout != count_copy)
- U" T8 R* c) N4 u: t8 t
{
/ _) Q; x' N! o8 T% N( k: p* m J9 S
printf("a is %d\n", buf.a);
; T4 u8 ~* |! ~ q c! }" M2 ~9 x
printf("b is %d\n", buf.b);
* b9 q4 {: b8 L
printf("count is %d\n", buf.packet_cout);
0 v' ?/ Q) `+ f& n) @2 J+ w" O7 o
count_copy = buf.packet_cout;
. `; }2 F; x1 P& u, I) O3 M! @
}
2 v ?* a# }4 M! _. B
else
9 E! P( ^7 @, q7 v: z3 ^
{
3 k" C- \! f* n7 k" r+ \
printf("No effective message!");
' Q( m9 x7 g/ @- |4 E2 @/ c3 g
}
) Y4 h3 f0 b) Q$ y3 a, w
}
2 ?! C6 h3 |8 C) k" W6 K+ h* f
# o- u' C, X/ ]$ L+ ~
0 m4 ~# z1 e! ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 |% H) }9 j* g% J# P, M
使用下面代码,对内存使用了mmap函数后:
1 [5 {) Y2 @, y0 G1 V
#include <stdio.h>
) g2 Q5 i& F9 _! ^$ Q) g$ f
#include <unistd.h>
6 T6 i( O" s% }
#include <sys/mman.h>
P3 q3 ^0 i9 I, h5 U4 p/ C
#include <sys/types.h>
4 r+ s3 m J' Z. u5 W! J
#include <fcntl.h>
. j, Y' t/ \& F$ _4 _4 t$ f d5 v
6 ^. N+ r5 M# s6 L$ A
#define SHAER_RAM_BASE_ADDR (0x80000000)
F1 q' T4 t) k
#define SHAER_RAM_SIZE (0x20000)
5 l1 t8 r( q. Z% o }
# Q7 G/ p* A4 P6 V' m
typedef struct
* l$ `. C: x* n% Y
{
, X1 F" r+ ^ F" N: W
unsigned int a;
0 E( K7 g2 U" T8 I
unsigned int b;
! w1 l% J) J! _/ o3 D1 W
unsigned int packet_cout;
J7 T) O* Q* ~' R& a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& j% ?: a8 s- @" z3 A' f6 q, [0 J. l
) c( m" n a; l3 K2 J' V p
void read_MSG_buffer(int *baseaddr);
1 ^8 }, O2 [" w6 |0 j
unsigned int count_copy = 0;
9 @* ^+ J1 H: C1 ?- p" j- C) |2 v
% I; V# f l( t
int main()
6 g3 o) Z+ y& Z& D+ u& J
{
* m: T1 o; T! ~) J* u5 I' E# K
int fd;
/ W+ U4 I3 P1 c
int *mem = NULL;
! F, V1 ^+ M1 A- W s6 t) {
& C( I* w$ A6 p9 j
if((fd = open("/dev/mem", O_RDWR)) <0)
9 v4 t! Q* `# d
{
0 t6 m8 R6 j" O
perror("open error");
# }' }. ^/ U5 H# B$ r2 v3 L; g
return -1;
$ ]( u3 [: s b/ s! @' }7 z; E
}
$ O' t/ F8 L5 D6 X7 _# z& Q
/ \ x* _& ]2 D) S/ o- Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 u8 U5 r" r% @, H) x% L
% k2 u' ^" z) F* U
while(1)
' q% p E( @! Q5 U" k
{
: E9 A* i6 }% A
read_MSG_buffer(mem);
0 t5 w5 Q- X% j# S
}
4 B9 p; v6 \! f. q; Z6 Y5 j# Y
}
- y0 | C7 `' Y2 o
, b; }- S' ^: D* b
void read_MSG_buffer(int *baseaddr)
$ E3 m' ~" A+ Y9 J ?; y
{
7 E# r* d; \. Z2 M1 F
pRX_MSG_PROTOCOL pshreRAM = NULL;
" a; x& X: D8 v' D
' o" J: w& v5 K9 ~) v' Z9 ?0 t1 O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& K! \6 C9 X* L0 l
7 y2 w- s( u o& R
if(pshreRAM->packet_cout != count_copy)
1 a6 B* @4 V5 K2 g5 P3 q" k
{
2 I7 p. E4 p; r2 d& |
printf("a is %d\n", pshreRAM->a);
7 ?7 j/ W a* @+ ]. |% G% f
printf("b is %d\n", pshreRAM->b);
7 ^7 L2 p% i) x6 r7 ?2 C
printf("count is %d\n", pshreRAM->packet_cout);
8 a3 N1 a8 R4 X$ @' y
count_copy = pshreRAM->packet_cout;
6 P) p' u7 z5 O5 X
}
! R9 e3 Y ]: @$ e; Y0 g3 _5 s& [
else
1 O( x( d; x9 w( ~! F Q
{
' a: C& e1 |! s% j4 S0 l
printf("No effective message!\n");
( a# A6 V( C% W8 N9 p) E9 Y
}
/ x4 r. ?9 ?: x5 a$ X
}
1 m/ f8 `3 y0 v
; |3 F& g4 f8 G Z# J& T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 U+ D8 [& H, x
2 C- k" k; \" D8 }* o3 a4 ?
% C1 Y# B W9 }8 O r
, f% s2 R0 C& D: X9 U" {5 `- m! @3 ]& ]
+ c3 v9 R# m ~# v# Y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4