嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 J# J% Q7 }$ D+ K0 H
7 }1 A2 U, y4 q9 ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* ]# {% I' j$ `
#include <unistd.h>
4 e, r8 @2 |) x$ V8 q- T
#include <sys/mman.h>
" G; O. _7 D3 _! X$ q
#include <sys/types.h>
2 G5 d* C0 ?5 w X* e3 x
#include <fcntl.h>
; v2 a7 ?" x- b x( E# a: s: p: e
/ B; z' |1 H# p$ b
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 V# Y# \, Q1 P7 e/ M
6 s) w# p8 S4 b# H3 M! v
typedef struct
" D7 e4 T9 A. W, z# i. q/ Q
{
) \5 A; B3 x c. |9 R8 Z" ^# {% r: O$ j
unsigned int a;
. M3 B0 o A5 P) r) K, G
unsigned int b;
2 y6 u! R2 l6 E2 j$ P& ]% {7 V
unsigned int packet_cout;
: R5 ^& k/ f3 n5 c" v& ^* P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# T. `! Z5 n$ w# G
2 d0 `! \: e6 v: Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 [5 \- `% E& |0 r1 K0 l+ g3 p
unsigned int count_copy = 0;
2 h+ N6 q) b1 M& \& _, e
3 }: B) T3 x3 v2 F3 j
M( v% e& q9 F+ ?- D
int main()
# }( ]6 t, g* @
{
$ @ J3 o9 ~' ?. z# P
pRX_MSG_PROTOCOL pshreRAM = NULL;
) r, e3 N) d/ a- c' \, s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ ^/ [6 h# N V; l/ L0 |
% q1 w* y5 G' r8 {" R' ?* r
while(1)
+ a# w. J+ w: X; M# R4 ]
{
+ S1 d. B) d6 H6 i/ z
read_MSG_buffer(pshreRAM);
9 [3 n% P& X. q8 @9 O# B" o4 t
}
" ]2 C3 f# Y g! ?. A3 l
}
, |* e1 b7 L% O+ T3 }/ [. y; A' C
$ `. m. {) v' Z+ M" A* R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 e. ~+ s, M, T* @3 d
{
" q; s3 f" A8 u9 Y- _; ?
RX_MSG_PROTOCOL buf;
7 X3 `4 ^- n! C- }5 E7 b/ o6 w
$ n: ~0 U) j1 `; n$ e; ?
buf.a = pshreRAM->a;
9 @% M& Z+ X0 ? P+ Z
buf.b = pshreRAM->b;
& f+ g" _3 ~- J9 w2 X% ?
buf.packet_cout = pshreRAM->packet_cout;
( j3 @- m, w( U7 G: P, K i S
4 V, ]! X1 i' k$ l
if(buf.packet_cout != count_copy)
3 T9 Y( ?) \5 ~# f5 T5 w) R
{
7 x: l6 G( `* f" N
printf("a is %d\n", buf.a);
0 E3 p. _1 H. p# z2 |2 V n
printf("b is %d\n", buf.b);
* L! o/ R& E. c: }/ q; E+ I, U
printf("count is %d\n", buf.packet_cout);
& }) J2 A$ ?8 I, @7 _. g. E
count_copy = buf.packet_cout;
# G: S' `: x/ \/ C* i2 L" j: W& R0 l- |
}
" g; }' u. X3 _4 K3 g* {2 ~
else
+ s, o' D! |3 A2 \) S! J
{
6 n! [0 u0 ~) R; L4 R; w' u# Y
printf("No effective message!");
A1 l6 p( u. \, ~
}
+ o2 @! b# e) F r8 B% \3 e( S
}
9 @% r8 b& P4 |2 W/ P
, E8 {5 L* G( v# f& ^
6 b3 }% d3 R# O* s! n' w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" Q6 w0 X- l( s; m* }. f4 a- |2 v+ w2 v/ t
使用下面代码,对内存使用了mmap函数后:
, O; ~* x/ ?5 S
#include <stdio.h>
& _$ Y p1 X2 p
#include <unistd.h>
# z$ V; Q4 V, G( d1 A; {4 ~
#include <sys/mman.h>
* V$ ]3 H# _# j$ [
#include <sys/types.h>
! B/ i8 r8 U3 y/ j( x
#include <fcntl.h>
& F& ]7 O% U0 K( v3 Q
. N/ R W2 o! j8 d
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 E/ g' U! m% o( l: A
#define SHAER_RAM_SIZE (0x20000)
) y: w/ Y2 u: c# g9 N, b
4 o+ |+ Y7 ~6 a) u6 t
typedef struct
% y0 s1 X& _' [( p6 C
{
/ j* O3 _( r: i' ?& I3 y0 C
unsigned int a;
! o- p- ]6 L$ Q/ p* G
unsigned int b;
: a% b- \: a# z( n/ n: M+ L
unsigned int packet_cout;
: [. u( p! Q# J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ N4 k/ Y0 O: Z0 A7 \' h( @) z; G
6 P2 S) Y1 [ u& W; A
void read_MSG_buffer(int *baseaddr);
+ w/ Q: r/ A% _( q) [! Q" u
unsigned int count_copy = 0;
. N3 E- T$ j) D* D J" G( X3 |
3 H. S; x! H* f$ i5 e1 s
int main()
$ k" f0 `( c3 A' D) ]; v
{
( Z6 q/ S2 Y. m" b6 W
int fd;
8 p C6 |' o6 h6 ?( N1 a7 y
int *mem = NULL;
# t" Y1 ~8 b. }" W5 {5 j7 b& ~
; h/ ]8 K; f1 N+ | u. \
if((fd = open("/dev/mem", O_RDWR)) <0)
0 K9 w# w5 z8 B& y# B) b
{
0 h4 r- P, i7 V/ S# D i) c& {' {1 m
perror("open error");
; |1 Q& x/ n% Q/ C$ t4 D5 S! T- ~
return -1;
- X) J4 A3 S+ V
}
b y/ @3 w( b5 \
( R! M4 Z/ b/ N3 |) I
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 e* g! e" W+ x) U; q; T: t
* [0 }3 p4 B9 {7 v% m9 _
while(1)
, y% p9 F W9 W, \- F5 j9 e
{
: b/ ~ h1 T; a& i% [& G- g1 B' n2 N
read_MSG_buffer(mem);
. E$ e2 a g) i' g$ J5 U- Z
}
/ D" B2 S! Q- d2 Q6 G
}
0 [5 u3 I; {8 ]- t! D
+ }6 A, u' R# C5 s/ o
void read_MSG_buffer(int *baseaddr)
$ g. _& t& C8 b% X1 _' S# F
{
& q6 L% E4 o; G& Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
# x' }" q i% |# o5 s. X* p8 H
7 x# |9 J' p# ~ W U) v9 k: e2 V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( I; I0 _+ f" i# E/ r
6 y3 R7 f' P. | u+ U
if(pshreRAM->packet_cout != count_copy)
' u |; Q8 ~; p9 E" }; p1 v. K
{
% K2 a' n& q* z$ Z* h
printf("a is %d\n", pshreRAM->a);
- h2 w f/ c$ O1 g% [# l1 T6 t+ C
printf("b is %d\n", pshreRAM->b);
$ ^4 F7 Q1 ^& Z9 s3 x
printf("count is %d\n", pshreRAM->packet_cout);
* a3 G- d- N8 F" c6 }
count_copy = pshreRAM->packet_cout;
. S; {$ v1 E( a7 _+ o
}
, Z" r2 G) w& U) ^# ^( x
else
8 k- `4 w5 v8 z1 c3 {2 F
{
. M. l0 @% n# ?
printf("No effective message!\n");
; R/ x$ U* t% U E8 |/ C# i) B! H6 i
}
5 p/ j z5 Z9 C- M% j7 c
}
' d0 N* z4 _# s
6 I2 X* `# b4 p7 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! l+ j+ w2 e2 g3 m- @9 U
! n& M h1 c |/ P3 f$ \: z; i ?. k
( G# [: l% N" p" ?# a4 k0 f
" l5 S5 v1 d9 J5 J, H' H1 G0 M
4 |4 K1 N9 V, q5 v% u
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4