嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& H$ ^2 w$ l! g
) d' O+ i* |, b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) g0 x$ w8 z8 k8 }( f
#include <unistd.h>
: u* q+ G9 G1 j) K+ k$ \/ D
#include <sys/mman.h>
9 @ e4 P. g* o
#include <sys/types.h>
: u# b# h) e4 Z8 ]/ z! w
#include <fcntl.h>
. Z/ _3 K0 w$ H' R% b
+ n/ a C$ L( Z! Q9 @
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 W; w9 x9 N! f4 F, o6 o+ x: }4 Y+ u
3 z* _+ E' l3 N+ u: j
typedef struct
' I( I' q2 S5 j, F: G7 x
{
) g V! _6 D, p. R) Y& o) o/ a
unsigned int a;
, T: D$ A) q- C$ ?$ Y& f3 ?
unsigned int b;
% B* j4 W: P/ Q1 b
unsigned int packet_cout;
( N6 d3 r+ R+ x" C a5 t( q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: D! l$ w1 m# t( G/ M2 k* r/ R
6 Z @) i% Z: |" Z( U. D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' T+ q5 q2 P5 O# Y0 o$ H
unsigned int count_copy = 0;
! k( k- t5 j1 e/ n0 Q9 f1 r% ^
5 {/ q2 j3 M# L# X, I2 H8 ~
! @7 ]0 `; G& x
int main()
5 U O& f- [" @- [) n
{
+ K) w/ ?( F# ~1 P+ S# u
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 p" h8 v' q, K, ~. ?) W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 u4 E$ p0 {+ f6 y
- M; o2 p/ c3 F5 S3 y- n( T' o* ^
while(1)
( G+ }- b1 X3 @' }
{
+ E; N4 C$ o7 g2 B4 X& z6 k
read_MSG_buffer(pshreRAM);
: K. T" {1 @, K( u
}
+ K1 w4 B3 u( ?# r
}
+ e/ ]3 T1 y8 I2 p7 @
& W# m% g! I9 V- {$ m d4 u0 D3 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
I0 h7 k w* v
{
1 j0 L7 R1 A' b9 y' o Q' K
RX_MSG_PROTOCOL buf;
& f2 S; F- Q D+ F- I8 F
6 K& `% X. a8 N' |/ Q
buf.a = pshreRAM->a;
' {/ A( f" C x: l
buf.b = pshreRAM->b;
. g; R+ @' l* m: N( D5 V; L7 h5 z
buf.packet_cout = pshreRAM->packet_cout;
: F9 o; |0 q% Z' y5 E& M& z- D% L
! H' F. `5 ^4 k. Q! y
if(buf.packet_cout != count_copy)
1 L5 {5 d: x/ }+ d+ ~
{
$ O) D7 z3 h& H: U1 Y" r
printf("a is %d\n", buf.a);
* X3 t( H; R$ Z& @# P4 G/ \# u2 j% V
printf("b is %d\n", buf.b);
9 V% y. z( V4 f7 L
printf("count is %d\n", buf.packet_cout);
5 T' f# ~$ U h$ \6 S
count_copy = buf.packet_cout;
! ^& i1 F- g- T9 _7 i
}
5 _' r2 p2 Y2 [, ?* u( q
else
4 M( Y: i7 m y: q! h7 G
{
) n1 h B4 u7 p( J2 I1 v' {; G& K
printf("No effective message!");
3 q+ \/ o- n: a( `$ C7 R
}
. B0 ?4 X% R5 r
}
$ w7 F# u6 Y; _7 J3 o1 P
4 d9 s5 _7 Z8 ~5 D* ~
$ U# t1 S, K& B% l; \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 {0 e+ c- c) \, Q2 L
使用下面代码,对内存使用了mmap函数后:
. A7 R% E, h' S) |. }6 u. G
#include <stdio.h>
! [3 `2 N8 A8 Y5 I
#include <unistd.h>
% U J& a. G, m& Q% j, d
#include <sys/mman.h>
2 Q# T: M% T7 e( J0 `
#include <sys/types.h>
3 M# S0 U+ z1 i) E$ K9 z; W
#include <fcntl.h>
5 j3 l9 H% N: ]' e, u
8 p- K* h5 r7 u/ G6 |: O( D! D
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 |- |/ g; ^. @; ~( D$ `% N
#define SHAER_RAM_SIZE (0x20000)
% S+ D) A+ r9 n
( d! F! [! N; {8 x3 c
typedef struct
& Q9 @7 i8 p5 F6 r9 E0 n/ g6 \& B
{
6 R% |6 u& i0 V0 |7 x* b
unsigned int a;
! R, x: \" l* e
unsigned int b;
- P+ [$ [3 v* C( b+ W# u
unsigned int packet_cout;
Q+ h% Y7 ]; X1 ?( W( t' f- H/ N8 w7 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% W; d( T$ W( n% e1 B
" W2 C4 O* m3 I* O1 y% s$ ]
void read_MSG_buffer(int *baseaddr);
' Z$ l3 S" X$ ~' W+ h. Q
unsigned int count_copy = 0;
0 e0 s2 V0 _# G
$ `8 Z4 {, Y9 H! b6 O/ B
int main()
: k/ f! T6 r4 V
{
3 d, z7 p. F, w6 Y
int fd;
+ O" ]9 S5 ^0 `9 D. s: L- b. b
int *mem = NULL;
4 f; c' D e/ R/ G) W. Q7 R( }5 R
9 R6 b" v2 P! f$ v, C- q: w
if((fd = open("/dev/mem", O_RDWR)) <0)
! P/ P3 j3 G8 B h ]
{
* I' Z3 W1 F1 P; h
perror("open error");
) w( k3 A! H1 C% \5 x/ C
return -1;
* K d! C1 A2 |# ?0 w$ w' b# M
}
, O7 {1 e ^* L7 h8 u
- d* X$ y8 E, r+ u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) z% e7 w: @ {. e
4 S1 t) E K& f+ d
while(1)
6 c6 W, ~' Q& Y# ]
{
; X4 X4 C) Y& k8 {
read_MSG_buffer(mem);
- i0 O; R) ?3 b2 }1 w" Y+ ~
}
8 D: y9 W8 f; T1 ]: a! _/ w
}
9 F2 w3 U( A; K% w' D
, d4 H* q3 ~6 P' ? O/ ~" J! _: ~
void read_MSG_buffer(int *baseaddr)
4 ~$ y& Z0 ~: t( @
{
, m9 Q5 d8 p- Y5 }+ u7 [) H
pRX_MSG_PROTOCOL pshreRAM = NULL;
; H4 I4 p! u. @
" s$ A2 ^6 q- ^
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ L7 b% g9 h1 Z
1 x. s& [5 r1 D( e. Z) j9 O
if(pshreRAM->packet_cout != count_copy)
6 u/ Q+ [& j3 t4 w% Z4 B* h
{
# u' F+ H1 k, J' z. [, F
printf("a is %d\n", pshreRAM->a);
: u0 U" g1 s. B N# \
printf("b is %d\n", pshreRAM->b);
5 |- }( |) }8 R0 X) n' C) a$ w0 t
printf("count is %d\n", pshreRAM->packet_cout);
- b* f @4 y/ D3 v; [9 q$ ]
count_copy = pshreRAM->packet_cout;
! s* c r. m4 v$ \- l- G
}
; o' T: x7 x1 o/ q
else
# _. }+ q, P* @5 ?$ m
{
4 d) U2 S( Y# e
printf("No effective message!\n");
; Z% E5 w8 o5 A, P4 X* v; X
}
; k$ V4 M' ^0 D% s
}
. Q7 q& o$ w$ d. ^- A- T
1 p: m2 o" l3 @0 y" {6 M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 X7 ]4 [& H- g5 e& I
4 N! r6 A6 W- y5 x- A/ u
6 N4 V* l$ L% S" Y- n
3 @! V) B$ w# |: c" a4 ^$ U- k
5 s: z4 L8 v8 c w* E9 k: ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4