嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ D! W3 k, M4 d1 g V
4 c5 z4 P. o1 k- b% p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 ]3 W: x3 s4 ^" Y9 s0 N/ L
#include <unistd.h>
6 ^9 A0 o* s' E9 r& v) I
#include <sys/mman.h>
. c0 l. h9 A' }; Y0 v
#include <sys/types.h>
0 T5 ?2 l+ {) y2 m3 j
#include <fcntl.h>
) ]7 K+ d* p& @) }" \2 d
0 w- x: ]+ y* P9 S" A" W
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ f5 M% ^) P- m' q- ^
A# u; |5 x1 o5 w
typedef struct
0 |5 j) f& \, B6 b% ~: n
{
3 ^3 z* I% A# C. O# R) \
unsigned int a;
, V) O2 N7 W" y* x; x
unsigned int b;
" \! r u% M2 b. ? D
unsigned int packet_cout;
- O |& J7 a2 o1 @( D; z3 ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' j* [2 d2 ]1 X# z8 M
, M+ q7 m o# W- [& ]5 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ }$ f( Y6 h5 x4 z
unsigned int count_copy = 0;
3 j% l( ?' F( y
/ d: L% {, | _- J
& N: x. A7 Q. \- O) L( l) O
int main()
C; v/ N9 H' n/ f; O8 B$ [& L& L
{
( t" l, Q Q" d; I/ L* l: K
pRX_MSG_PROTOCOL pshreRAM = NULL;
, a0 T k* w9 v1 k; o" A7 U3 Z- T
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 R. ~ E. ?$ l! F9 ?8 V9 E
& k8 G9 s4 I9 ?9 q- n
while(1)
9 F! u/ W6 C4 f% X
{
% _& i) M! D9 H3 ]
read_MSG_buffer(pshreRAM);
$ t/ f0 i- B, k1 I0 k
}
- e% X" B) C7 c r. t8 p! _
}
, M/ E* P$ B* [
4 p0 r# L" m+ H2 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
b0 _" ^0 N6 [1 [) f, P
{
5 P, E, O) X" q4 N$ |
RX_MSG_PROTOCOL buf;
5 w% b' U9 i5 `( ?' y
5 S$ z6 c+ K' y7 Y
buf.a = pshreRAM->a;
' U3 J2 r) m' @1 p0 {# k
buf.b = pshreRAM->b;
# R0 d5 O, l9 v3 n' j3 Z
buf.packet_cout = pshreRAM->packet_cout;
1 O; A$ {; W0 q2 D- u
~) h; ]! N7 ~* K
if(buf.packet_cout != count_copy)
( r0 v1 @3 r5 d# {0 N4 u0 v
{
: E2 a2 B! R& ^2 w; i, M W
printf("a is %d\n", buf.a);
' Y! x- n" ] j1 u& j. @
printf("b is %d\n", buf.b);
* ]8 s( h* j8 ]( j3 R! {
printf("count is %d\n", buf.packet_cout);
1 M5 {) ]! w* v! y7 n
count_copy = buf.packet_cout;
) H; S7 C5 a3 p7 z$ @
}
6 I. p% {+ o i8 R0 V" Q* G1 p
else
, C z, \4 `* m; M$ l5 s; U
{
1 j# k- P8 [. ]0 a
printf("No effective message!");
0 Y: p) e9 L% u! N) ], _
}
2 }- |; B9 }* {) }- S5 a0 k+ A& D: {
}
( u0 k, V3 z/ ?3 d4 \' L
* j. }" R( ^' J9 Q9 y# h2 ?
6 D. O) A3 e5 u( c8 J& i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 @" X$ z L2 W. S4 _4 A0 \. I1 J
使用下面代码,对内存使用了mmap函数后:
4 H' V' {' I* N
#include <stdio.h>
9 w# \& `3 O5 P/ }# C% U h9 n6 z
#include <unistd.h>
& B9 t! v; N. }1 f) _
#include <sys/mman.h>
: f, C% _/ T; f( |% `
#include <sys/types.h>
4 F% o" J) y! o- D2 N0 _
#include <fcntl.h>
% N n+ _! s6 m+ B! u) i1 d
. M' I1 q8 ^! P( `
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 Y- w; M7 v2 C! o4 J% u* \
#define SHAER_RAM_SIZE (0x20000)
0 e0 X4 y+ u$ F$ s8 N
' M/ Z8 N! M0 S
typedef struct
7 x; P) s# H0 z7 j8 z
{
6 w/ X5 n9 `* q
unsigned int a;
. ~; Q3 Y {6 w1 S' j" S
unsigned int b;
2 d* U0 q9 u$ Z+ q$ s2 H
unsigned int packet_cout;
5 e' Y" t, j! O3 t7 k" X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 F# f) V5 F, ~9 S/ A# x4 t
) y) y4 {9 {1 Z7 w/ h0 l$ N4 A5 Z. F
void read_MSG_buffer(int *baseaddr);
! F! Z# V7 E; T7 c- R+ y7 w) g3 d2 j5 ]
unsigned int count_copy = 0;
9 \. b$ [( p& w+ `/ X
y: K8 T- V# R* a" R% \) j
int main()
) U7 n& _' t R, d8 _. w Q. ]
{
9 K1 R! o5 L) t* f2 u
int fd;
! B0 L0 X: Z: v4 g! z; B9 l+ L
int *mem = NULL;
# @/ e" W/ h* I* l2 N
1 u- i9 ?/ I) V4 l2 v
if((fd = open("/dev/mem", O_RDWR)) <0)
: {$ @$ h: u0 {* z. z
{
, q/ \. R) W2 L+ [! b. @/ ~
perror("open error");
C+ e- [- w9 j$ g# o
return -1;
n( B# w! U, }5 W" T0 J& D
}
$ H* ~( B5 U5 S- U/ |# D6 p
. U, }- E: M& l5 U( t
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% Z, u# j" d1 N6 K5 s( w
3 \" P* U& M* Q1 V1 x
while(1)
3 I2 o" O4 z1 K; S
{
# N& I7 z: y" H* G/ t. T6 T* {; s
read_MSG_buffer(mem);
( X- @% e3 x/ t! c' G, e- k
}
. z% j) U# a7 H( \) ~
}
; S# @/ M/ t c0 b& G% ]
+ O& X9 D6 S/ z' @& o, s1 S; Y! \
void read_MSG_buffer(int *baseaddr)
" E- @& s( E# w9 q- [
{
3 N# s. w3 S1 D D
pRX_MSG_PROTOCOL pshreRAM = NULL;
. B" j. [% a/ |9 t3 V
$ @/ V. }$ I9 R& D( Q2 u
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 ]; R# Q+ m: U* T& r
+ m& H9 Y4 O% M- r: s. z$ K' V4 V$ U
if(pshreRAM->packet_cout != count_copy)
" D5 j, K/ p5 P
{
& a' E$ m$ J5 B1 A$ \0 f
printf("a is %d\n", pshreRAM->a);
2 T* |: Q( i) p- ?1 Z' Q
printf("b is %d\n", pshreRAM->b);
; Z# p; `( r. U+ N" r# ]
printf("count is %d\n", pshreRAM->packet_cout);
# e, o( q/ ]- C$ u4 m( }
count_copy = pshreRAM->packet_cout;
1 C) @, B+ i! |- ]' x( ^0 h
}
, R' q0 u9 G) C- v# f }# B+ h
else
; v4 m! `( G: G5 e" Y( t9 w
{
4 {( Z6 a# G! j; R, V5 d
printf("No effective message!\n");
0 p R7 c- |) G
}
& r$ C% j9 B2 \
}
7 `0 V9 f6 o7 I# t+ r8 K7 ]: S
6 I8 |' {3 O5 _ B) ~( L8 }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 I0 `: G! d5 d5 \
- `- }8 J4 c1 Y0 z* ]. a& R3 k
& [3 v( {9 i0 U& m1 n$ N Q3 F+ R# I8 g
3 C5 M# B3 X# ^+ Z2 Z+ Z; s. n. u
. n! [2 b" [9 S$ m! L- M% w8 y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4