嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 x V {3 g1 E; u" N& R
6 @0 _! {3 j! _. z' e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 r6 |6 A1 P' ~, \* q
#include <unistd.h>
. z% V: F$ _, e4 k0 X( G7 n
#include <sys/mman.h>
/ Z1 k0 o- u. N
#include <sys/types.h>
* U" }; \/ d @
#include <fcntl.h>
% `1 q# S* d) F, d/ Z
$ Y2 M2 i2 p- ]' |/ }& c
#define SHAER_RAM_BASE_ADDR (0x80000000)
* [9 ^# T0 C3 z
8 d0 q+ t, W) B- r" `+ @% A/ p
typedef struct
8 o1 N" y( N. a# S3 E/ M
{
% H, H" I1 `/ n$ U
unsigned int a;
# z- C$ r" h2 T5 ]( a' q
unsigned int b;
- }( R Q G% c( K# ]+ c& s
unsigned int packet_cout;
0 p' |& C6 f2 S8 ?) d* f5 B! m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 H" |3 a1 W* W7 j# l* t( ^
, `- n& j- f# w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. u9 R. ^9 H$ v3 W8 m
unsigned int count_copy = 0;
5 F* B. e5 ] |; V' J! F5 X: U7 Q
% G, h6 ^) ]7 h
) f H/ A( N& D( `
int main()
! r Q1 a$ F$ F0 @; ]+ C' ~+ \9 F
{
0 n, _5 Y B- ~/ ^+ @6 b2 {
pRX_MSG_PROTOCOL pshreRAM = NULL;
* O# B* k6 i( h) D/ m# G* E' v" @5 U
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ e* I/ z, V; ^& z1 ]9 {% ?
' p6 k2 m* a+ p l8 |/ s+ n
while(1)
8 r5 g' {" g7 w3 H! D* E4 L
{
% z/ z8 o+ V% l1 @
read_MSG_buffer(pshreRAM);
5 `+ Y6 G6 C0 W3 s5 z) x$ w
}
. Q, U8 O4 C8 K* m" n' r
}
9 ^* r: |9 J% A* m
; h% v# p' r+ w( s+ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" Y( {8 Z1 X1 v, k* G' K
{
4 e# ~" ~$ S! n7 }: A3 G+ j- p9 T
RX_MSG_PROTOCOL buf;
/ U# z+ E: i) U0 g" ]& [8 P0 j
/ D, C/ K6 {" \3 k2 x4 a% h* q7 F
buf.a = pshreRAM->a;
8 J) U' n0 n+ t U5 L" \; J% O; m, a; l
buf.b = pshreRAM->b;
8 k0 Z. }( c+ m6 H3 Y* H# Z0 ^
buf.packet_cout = pshreRAM->packet_cout;
; c' l6 b N7 u0 ?4 J& k f
" b. ]3 P9 U7 d9 q! |5 ~8 m8 F! @: Z& X
if(buf.packet_cout != count_copy)
8 u) @' G$ K* B1 z% N Q# x
{
' T! M' Y, q: h' R" q
printf("a is %d\n", buf.a);
! a$ D M+ p8 x! O# L# D# ]2 \
printf("b is %d\n", buf.b);
$ I t, s0 @; C) y4 D) B2 ?
printf("count is %d\n", buf.packet_cout);
$ C2 |9 H, z$ i7 Q6 V, h2 _. L
count_copy = buf.packet_cout;
0 m7 S. P& u! ?! a3 l
}
# e! {! |9 q+ g" Q6 F' y f
else
( s; Z4 j1 p! z5 _2 s( G
{
, u4 M/ g" q0 B+ Q+ x* L
printf("No effective message!");
- j% N0 k6 ~9 M0 M/ ^3 T$ G
}
: {8 [# H- k+ L( z. @- B
}
) W& T0 p; f0 j4 V
. ?* z, r! e$ E- P7 ]4 R! C$ P
3 J4 A' y1 w& V5 s3 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% ?- k6 v) P- V( j: | ^2 G
使用下面代码,对内存使用了mmap函数后:
9 U3 F) O' w. R6 Q2 D- U$ y
#include <stdio.h>
% f( z* B& d) y
#include <unistd.h>
/ B5 r+ Y: x6 c. w, [
#include <sys/mman.h>
& T! a2 A- {/ d
#include <sys/types.h>
! p! a/ m' w- J
#include <fcntl.h>
4 v9 t5 q) b- k: d
8 X6 i" S; \# i3 p$ ^2 ?( _
#define SHAER_RAM_BASE_ADDR (0x80000000)
! K5 [- z1 g% B. d- z1 t- |9 [
#define SHAER_RAM_SIZE (0x20000)
4 e0 |! x, Y1 j {- ^- ~6 e S; |
: A3 _- l% a8 d# N8 Q; f
typedef struct
/ w8 H1 m, T+ T
{
3 Z& [/ |# e, ?4 ]1 y9 O
unsigned int a;
/ I& ~. C3 a# x! W
unsigned int b;
( p7 ^( R' ~% ~
unsigned int packet_cout;
# y; s) b4 i. ?! ]' i# q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. I! U. d# i. x% d- j2 {" g
( ?& Y9 b8 h5 }" H% H
void read_MSG_buffer(int *baseaddr);
5 n; l1 O; X. T+ A
unsigned int count_copy = 0;
: C; {5 i! p8 X
6 n' V% r/ Z9 }0 O
int main()
- ]8 t% n: t8 j# v M3 K
{
1 S M4 [$ d L9 @/ d& \( M2 J
int fd;
+ F# z- `' k2 t# k; i
int *mem = NULL;
, E+ R- ~6 L: z: Y5 n9 B
. ~* [6 n, H {* s) s7 m
if((fd = open("/dev/mem", O_RDWR)) <0)
^! u2 p+ x, H% M% Q8 k3 z" X
{
0 ]/ a( ~, N0 `4 O, @6 V
perror("open error");
9 v( m) n$ y6 E( o: E
return -1;
, P) w8 H3 P) e: }" p% C8 B3 `2 O
}
0 W$ I1 }4 E' r( _
' @2 J+ m r1 X9 b9 `. h8 u5 Q1 @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& n2 y9 ?2 Q) C6 H" K# I
& k6 j* @' n( k3 D O
while(1)
5 L2 p, J6 w9 Q8 O8 @
{
: Q) @: [% V6 ^/ ]
read_MSG_buffer(mem);
* \" @+ h: ?4 ^) j0 o! \. t! R
}
& U/ w+ R o5 t# k2 r& c9 ?# I2 l
}
% q' S# a& j6 t
6 Q) }% H9 K$ F/ `6 G. E5 D5 t# L
void read_MSG_buffer(int *baseaddr)
5 y! k' Q& `, n5 W1 F" O# n7 _4 c
{
. R2 i- K4 I* }/ M
pRX_MSG_PROTOCOL pshreRAM = NULL;
% G7 P& Q+ K) `$ \, L% G
4 M1 I- Q. e+ r: L) U: ~8 o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! ]! Y4 Z* b. g# E. x4 ^1 L
6 J3 F9 y8 G, d. N! d
if(pshreRAM->packet_cout != count_copy)
3 L w3 y# j% ?2 a5 K% `
{
* c; n5 c! g) ]+ Q. i
printf("a is %d\n", pshreRAM->a);
! k7 w2 d9 L8 i) x1 x
printf("b is %d\n", pshreRAM->b);
* ^( ]" m" s, V( P. ^
printf("count is %d\n", pshreRAM->packet_cout);
, |8 v% |9 G: f5 K
count_copy = pshreRAM->packet_cout;
; {# E1 F$ v4 B6 j3 x0 a
}
2 ~3 S, X/ f' K1 ]* o3 u8 g
else
0 w$ F2 _( p" K! L8 n
{
. _5 {( F+ t6 c4 g
printf("No effective message!\n");
( @& e- f8 E/ q
}
2 X( s& Q: d( i; X- _- z
}
) Y) U( H H0 I% E
# d5 V* r; J$ ^6 T. O/ p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( [, Y" X7 `, x; h* t8 {* V. r
0 b2 U7 j6 U6 y- X
4 e6 G5 q/ {% F
, \/ a: ~0 e& ^9 M! k
5 e2 v! k* Z& g. r V9 x6 Z8 v% u
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4