嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, {1 F: ?: i' k- ]( o
, i3 p8 [* [- J! e' }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" \ }% Z9 W% y4 H& J8 p
#include <unistd.h>
7 ?, X3 n; s/ D: P! r
#include <sys/mman.h>
7 L! v3 Q$ P3 j; m& e0 [% x& J1 ]$ a4 ?
#include <sys/types.h>
) D/ A/ a2 F. t& c5 ?/ n
#include <fcntl.h>
8 |7 H9 O) g; u5 F6 l. K
7 N# J) t# n' I6 Y+ t7 r0 e
#define SHAER_RAM_BASE_ADDR (0x80000000)
" `5 a2 R$ \/ K
9 a+ a5 O4 y7 p8 \: Z
typedef struct
1 I. k& q" w9 o' d: ?) r: j
{
4 \. ]! }* n, C& ~! R6 A' b E
unsigned int a;
: y% K/ @/ r+ Q6 {2 j
unsigned int b;
, y. e% M, W5 r+ f3 ^
unsigned int packet_cout;
( O% S$ |1 z; `! B" R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; N% ~6 Q$ @ C; L& @: T7 X
6 I S x7 ~* A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ p* p1 r* z/ d$ P5 i% Z) R/ L
unsigned int count_copy = 0;
8 m M! L( Z' l
% F! q8 \; r3 _- P! y
8 x$ }4 |& ~" g$ X) \$ X
int main()
4 o$ z0 ]1 |- Q( n8 I0 r$ h
{
; ~8 C' S& ~) {5 ]2 G
pRX_MSG_PROTOCOL pshreRAM = NULL;
* l( O* O: f6 P& c% H5 ?& l( j& a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, ^. b$ g2 _& ^' O( E
t& M2 C$ A( I+ J0 y/ ?
while(1)
6 C) Q( T7 W5 y/ a6 y
{
/ @- P8 l; n2 }8 N
read_MSG_buffer(pshreRAM);
! V7 ~, K- V' M9 H* ~& x
}
# C5 U2 d! ?5 h# @+ Z
}
0 y z& H( e# k$ L
, {+ e- e/ @ I$ x+ Y- h" o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' c1 A, P& L$ }+ U8 u& B0 _2 {
{
) W. Z" z4 @; ]* }0 t1 S
RX_MSG_PROTOCOL buf;
* \6 l8 M8 a& Q' m4 B( v
& A# C6 i7 y1 v2 F+ F8 E+ W
buf.a = pshreRAM->a;
/ a& b2 ^. | r
buf.b = pshreRAM->b;
. h: @1 ^8 G) @
buf.packet_cout = pshreRAM->packet_cout;
- H: A; A& \' _+ |
0 ?2 M" j' m% \7 ^, s* R( o
if(buf.packet_cout != count_copy)
1 ]+ J% a( z% p/ W$ `& V n6 d
{
" \. y( K! `5 c5 f3 R5 G
printf("a is %d\n", buf.a);
( L" f q/ X6 b8 V' D: \0 _ o1 c
printf("b is %d\n", buf.b);
7 v r! P& z6 R( M1 k
printf("count is %d\n", buf.packet_cout);
% Y' w3 [ ^& U9 `, s7 W, R
count_copy = buf.packet_cout;
3 C* y" ^0 m3 O3 A3 J7 Y5 Z
}
$ u3 p9 S# h; r$ J3 q4 P
else
% m+ a1 T+ q& A0 }3 C8 R' v* s, c
{
" I {5 n$ Q! j* D+ D
printf("No effective message!");
+ n9 l2 r+ ^# a- U
}
: v n( ?+ K' Q; m Q
}
) w& x. E4 E9 d6 y) e
3 p% ?' y9 B: f
4 i% s4 y% v" } j! `$ [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. u7 a! o- E6 v/ _# }+ ^: X: v
使用下面代码,对内存使用了mmap函数后:
) X' d. D8 `) o% a
#include <stdio.h>
# x: l- Z6 f A& x+ M x- u4 [. `3 T
#include <unistd.h>
4 }/ d% ]1 ]% E8 G- K) s
#include <sys/mman.h>
* g- w& {+ F( p+ O; D
#include <sys/types.h>
( A7 K' l1 _ x) g" B ^8 }- X1 n# X
#include <fcntl.h>
0 X B2 i# a2 z) }6 _( u2 w
- t& ~/ O5 [, P& [
#define SHAER_RAM_BASE_ADDR (0x80000000)
# Q! o, J- t4 K `) j. n( |% V
#define SHAER_RAM_SIZE (0x20000)
& a) D+ ?+ b( m% m
9 [& W; j0 Z( d( A7 e
typedef struct
& L* V0 B: L# V/ O' p: m
{
3 f4 i: O8 s2 F! O! A% A2 K2 ^5 K
unsigned int a;
* Z8 ~. h# ^1 E0 d9 U
unsigned int b;
- _/ V4 x% _1 u0 r- w# o" O8 d
unsigned int packet_cout;
1 M. C; Q0 t/ k7 f/ d: Z+ O: H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 E q. j+ _+ Z* a% M' U& R/ V; J
# z6 y0 F" n0 @9 e9 Y" K1 \' \
void read_MSG_buffer(int *baseaddr);
5 V" w& v3 T9 B, \' R
unsigned int count_copy = 0;
1 d! r% e) \) b8 ]
Z. |+ k! s1 I0 V
int main()
- {3 J) I" L8 L" L& H" R
{
" H1 M8 R4 z; `( e
int fd;
; T6 q+ U; Y$ n3 B! e
int *mem = NULL;
1 `5 T" |; v9 P
. y7 o7 E7 V- G7 s! D( E# i4 D* {, h
if((fd = open("/dev/mem", O_RDWR)) <0)
% E" [: T* x, K* o( ]4 W4 |
{
+ e8 [6 Y$ `3 _7 w: B4 ?
perror("open error");
' F' @& g q* q' Y2 j
return -1;
8 S) R" f* U- i$ E% y p
}
- F+ x1 q$ P3 j' J) M
7 B' W$ h; B3 Y. X o+ m, N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" k6 c3 k ?; N7 `$ Z% A
6 R. D, K, m F7 @
while(1)
: z: y( S3 d; T% t
{
+ Q% S2 N, H1 |' w% F5 d
read_MSG_buffer(mem);
- m0 A4 w g/ h+ Z& x
}
/ G/ q2 x4 ?# q2 Y/ B4 c" o
}
) Z8 o$ r1 A! V& U# E, S. z
+ O f! |7 m. X% _
void read_MSG_buffer(int *baseaddr)
' U6 _1 F m- X% ^- X
{
$ g; `9 V, l( @6 K5 i
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 N: U! L) O0 X" \' z T$ K% y
; y# u* g: F+ b& C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 l6 j- i' b3 [: H8 i1 S
0 q( X+ W" q" q h$ Y; d
if(pshreRAM->packet_cout != count_copy)
8 S: `1 s! }# F! w& g) P P
{
, o# l1 {4 L- b( ?2 r
printf("a is %d\n", pshreRAM->a);
$ E" O4 J4 R% Z; H) N! \- J
printf("b is %d\n", pshreRAM->b);
; D3 T& y* j8 D) {: s
printf("count is %d\n", pshreRAM->packet_cout);
" Y3 }7 d* U$ M9 S6 F. i
count_copy = pshreRAM->packet_cout;
3 G+ I% l6 J/ o8 H5 Q
}
& ^' M' Y- `. E; J( Z( ]; Z. D
else
3 \+ t3 M; ~1 Y7 s6 h. G6 h
{
3 @& V: x7 L4 Z2 C- T
printf("No effective message!\n");
' j$ n5 {! N0 U# q9 I
}
$ R6 F/ c& `" T. F8 ]2 i! H
}
4 U0 i2 \' N U( O( g
- b0 }$ I8 y" w1 [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
h& J q0 v1 n. y) {9 _& _: b+ \1 c
, k* F4 Z$ X* |4 Y: i
- s: _7 U" P5 j6 T
& o8 V" ^1 T o8 |/ I; H
4 O0 F% a9 V2 `: C% U$ f1 G
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4