嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 R$ G- P, M- J( V; m8 Q
?* L9 J% @' M4 v2 G3 K1 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 n7 q @7 {) Z C [. K2 [
#include <unistd.h>
7 o9 s, w$ C7 n+ p9 Q: ?
#include <sys/mman.h>
- c" C; r. w8 c/ [0 R! {! [' D N
#include <sys/types.h>
) n7 O J) M. Y# F5 {0 x
#include <fcntl.h>
( Y- U# Z( V9 i" i
( [+ H. M- h1 e6 c" d
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 o+ [9 ~6 n* O' u% W* ]
* t6 G5 L) R/ y
typedef struct
$ X* X$ s+ T( w2 ~3 d
{
+ `! N7 f* |1 q( |/ H
unsigned int a;
2 i) m; F# s% d# L/ ]/ s
unsigned int b;
- ^$ }" g$ W" B1 J
unsigned int packet_cout;
+ {; J, R; P) j6 N0 q* Y i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 C- B0 f1 H0 y& |
2 M6 U( Y& b) t" E( D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& {, c9 N$ I. t+ U8 n( U
unsigned int count_copy = 0;
- d$ X" _8 b- G& c4 L9 L+ f
3 ]' t5 Q5 T) Y" V+ w
' F' U0 F0 O/ q1 O& Y4 {
int main()
5 e+ N0 ?& @- n
{
0 p0 }3 ^6 `2 A9 F1 B
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 {. H5 G1 A2 j0 I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 H1 D$ B* K2 n1 J! J5 O/ v
: k c% q2 p% l! Z7 h, T
while(1)
! x9 C; w; b O
{
' S/ m+ e; {$ w# ?2 w9 t0 ]
read_MSG_buffer(pshreRAM);
/ m p* o6 U( _" P2 x I% {9 G' x2 M6 T
}
; N4 w$ M" g1 G+ u2 f: W
}
+ o2 y# y2 W! U
+ p% q6 D" h9 B% _" E" Y+ p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( {% p6 q) b2 U* }# } ~9 A
{
9 W/ a, `, E( ]6 [2 Q T0 S- P. H
RX_MSG_PROTOCOL buf;
5 D0 `" u J) v8 D; a: i
/ T3 U( h2 }. l; e. @
buf.a = pshreRAM->a;
! ~6 @7 @* n7 {9 \* Y- e, l
buf.b = pshreRAM->b;
( x3 U) Z$ c5 e$ V2 j; d
buf.packet_cout = pshreRAM->packet_cout;
: X% Y$ i1 o- H y- x
; p0 \4 o! { k) H6 f
if(buf.packet_cout != count_copy)
9 T- f! z$ k+ E
{
7 J# v" Q0 i+ f/ x
printf("a is %d\n", buf.a);
! D' m* b2 z+ K
printf("b is %d\n", buf.b);
' U! g# d* z0 J! V
printf("count is %d\n", buf.packet_cout);
% X9 H# z% \- T; s& _0 r
count_copy = buf.packet_cout;
5 e6 @5 \3 ?+ q5 V, f" j
}
[- q: ?9 e) N# F) E" D/ E
else
. p( s4 A! x- X. \
{
- X7 c+ n- k: O) Z0 w: w4 j- l
printf("No effective message!");
0 e( X, E- C/ `9 \3 M4 O8 U! a" y+ Q/ s
}
7 Q0 U2 i. a5 L3 P. \; A* g, w
}
. j b2 _& d4 h# o" O6 R0 }( Q
2 y2 c( m4 ^& ]8 i( y
u* @! ` `; M7 L& q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" r( s! d7 W3 Z. s; q+ U9 {
使用下面代码,对内存使用了mmap函数后:
% Z, w6 [" ~2 \8 ?, \: |
#include <stdio.h>
: C8 l7 W7 J2 v% J
#include <unistd.h>
& v S, |3 ?/ s* m9 h" s% a
#include <sys/mman.h>
- u! ]8 _8 |! a7 m! n4 O: J; f
#include <sys/types.h>
( |( s F9 D Z7 m5 J
#include <fcntl.h>
6 M7 Y% C6 R3 v5 y. W
: d+ M' @- ~/ o1 A% U9 h3 ^$ p: J
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 v/ \" U9 K( J/ C* T; T
#define SHAER_RAM_SIZE (0x20000)
& s( M* w5 }& d
! ~' i F& s* b( |% d1 \
typedef struct
8 a/ j: _/ z6 G/ c
{
) h2 I1 Q7 C3 i- }; X- V. B
unsigned int a;
0 s, l) K% Z q. t
unsigned int b;
+ ^: t# W; S: z* Q. {5 u) I
unsigned int packet_cout;
9 x0 u2 f# y7 Y$ M, J% U B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ K) |0 \2 i* D& P! q \) `
6 W0 F* b- G- z2 F
void read_MSG_buffer(int *baseaddr);
) B5 n! j t% a) Z6 d
unsigned int count_copy = 0;
" w4 P- z% E5 S6 R- A6 ^- z1 J
: @: r3 Y+ ?0 @1 [
int main()
4 T6 K& ?9 z8 J8 `( ]
{
/ v' W* T' h# ?# H/ q1 u5 G1 n
int fd;
; A% W& m0 S( ~. G2 p
int *mem = NULL;
6 G- }5 ` G5 \; k/ h
5 b+ i+ d/ j t T/ c; O
if((fd = open("/dev/mem", O_RDWR)) <0)
5 ^5 l0 i. h) g, ~2 _
{
9 R! h9 q R/ W2 F; d: Q
perror("open error");
) u" z/ m6 \$ K
return -1;
. L! ~( R1 V- u N9 W- e3 G
}
$ Q9 `" f: P& v
8 e- T( Z6 k9 M( G! n
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* ?, d/ p! ^( s& i# C, X
, U! h5 M1 K3 V I
while(1)
8 \" W1 B' [* H$ H) ~3 e4 [
{
2 @4 `# S" \: L5 e$ f8 p. n$ s
read_MSG_buffer(mem);
0 Z A) G7 T+ ?2 u& c
}
0 C- v+ u+ ]+ `
}
5 u0 W& s/ G( }6 r
+ A9 E+ w. Z; e& k6 L- x: D
void read_MSG_buffer(int *baseaddr)
# k8 ?( I6 e% E5 P! T+ `8 x/ H
{
- N1 O7 E9 s+ r; I8 p% C8 g7 {
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ f; C/ e0 {3 Q' l3 c" L
! P. @# ~+ |7 Q7 R% p) D
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% u) g9 V* b5 w0 e2 N: l4 j" P
. h k7 L% z, |3 i% a! ?) C
if(pshreRAM->packet_cout != count_copy)
" K0 S! i% y0 ?) j! n) Q& G
{
! I- B# p8 _1 @ @+ b
printf("a is %d\n", pshreRAM->a);
9 c) X* f Z5 u
printf("b is %d\n", pshreRAM->b);
1 K# P+ ?: F0 y7 a
printf("count is %d\n", pshreRAM->packet_cout);
, E& R- S3 n& Z `% V
count_copy = pshreRAM->packet_cout;
0 ]5 Q, W/ M! a+ P2 @8 f, S: u
}
; @. M( ^( @6 t! {
else
0 Z, R% e! V8 z1 w( g
{
0 n# r8 ?( t' g' d# g5 o
printf("No effective message!\n");
* e3 g6 K5 Z, z5 t t' J1 S
}
! R1 s+ U/ u% q) V
}
- n/ I/ n! t: J: P
: P" e, M6 z& E* \* ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 E* {) S: |$ E' R
8 S8 F8 f$ \* K( ?' j
. X. w- N; A7 c" U
# \: A/ K. e; o% D
* Y p) e. q) v. R; ]' @
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4