嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- ~' I3 l6 m" N/ c
% o7 m" t6 i: O+ M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" i3 T( h3 {" b' q& G: l8 A
#include <unistd.h>
# @1 X- M- E7 i) W2 I
#include <sys/mman.h>
( e4 [9 E8 x: b4 b* }' G! @
#include <sys/types.h>
: k9 R* B' A2 ?7 B
#include <fcntl.h>
1 G+ x. Z# `" s) ~" T
& n) A) _' p$ U4 e" [, U+ W
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ z+ o; Y; m, O. H* U
. x, J; E D k% z- [2 P( v
typedef struct
! |- I- f$ z' e3 S9 P) E" Y, P9 D) u
{
& C2 X2 W4 t( M A' P
unsigned int a;
D2 i" R0 Z2 r! h v
unsigned int b;
* Y4 a: @1 ^$ C' p( j
unsigned int packet_cout;
( ?+ Q2 k2 X0 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ~& h J* L5 s8 R M+ m
9 P9 C, O6 G; a- b& ], d2 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 V7 i# N- p p
unsigned int count_copy = 0;
& o; ?9 C1 ?8 T
4 w$ C. X. r, }; v: W
. p7 a7 R8 {, M9 {- v8 H
int main()
6 ~+ Y; E# e5 e
{
7 b/ V* b& h J/ I8 o7 u2 O
pRX_MSG_PROTOCOL pshreRAM = NULL;
& E. m5 l+ N. G) ~7 v5 B% {
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ z1 Q9 b! I( ^& B
6 d' g+ }+ _! h. T" o# u
while(1)
( k; p3 C' V* `7 _# y0 M
{
7 a5 h* Z0 |" k @! [& @' n
read_MSG_buffer(pshreRAM);
. w$ ^6 _2 z9 s7 Q) n, C
}
5 ]* t1 a' H }) E$ l! G: `
}
% b* u; t" G' l$ L9 R/ P, |
8 M X. J: |+ f4 }7 p9 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* B/ c/ o- I7 B7 P
{
0 j& @1 h( l' w) X$ O
RX_MSG_PROTOCOL buf;
+ F& r6 }- ~7 J2 j" @ N
0 N+ ?" j+ x% x) {
buf.a = pshreRAM->a;
) P4 e2 z# a9 V" c/ X( w
buf.b = pshreRAM->b;
5 K* [8 d; a; G2 U. z4 e
buf.packet_cout = pshreRAM->packet_cout;
# x a \- X" d8 q
0 x6 ]# C1 P1 J, k8 B8 b% w! j
if(buf.packet_cout != count_copy)
( ^$ u+ K. Q5 h, S! Q
{
/ y* ]! ]8 p: |4 T n- [0 y
printf("a is %d\n", buf.a);
% l1 y% I2 i0 f4 z/ ?2 j
printf("b is %d\n", buf.b);
3 V: E) u6 W$ ?
printf("count is %d\n", buf.packet_cout);
: S* g1 ]* D( Y0 ~! ^' c8 G" G. M
count_copy = buf.packet_cout;
4 }: ~( b+ O& \3 M0 |3 `" _
}
; N' z1 k( v& E0 m- v
else
+ q8 v0 t8 H4 x! Z3 X
{
4 V% H4 `% H8 a& P
printf("No effective message!");
/ h N, A# F, h9 f( ^4 j
}
2 B, y# s- e9 H3 h- Q5 \' S+ x
}
0 K& y+ \5 p$ I. q
# w2 R0 N0 T( U' H8 r c$ l
2 z! T$ e1 e( {3 V1 \7 p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 X! r7 Z6 H9 E+ K$ a5 [
使用下面代码,对内存使用了mmap函数后:
3 z: y- w' |3 |% M/ }6 G8 c$ A! S
#include <stdio.h>
' y$ B* \/ W2 q" e6 ~9 i5 Q" p
#include <unistd.h>
3 q6 O* T4 h8 @, Q2 D. i: [
#include <sys/mman.h>
_% G6 N+ G' G
#include <sys/types.h>
% ?* u: \. b- B5 u3 _7 J7 t0 i$ j
#include <fcntl.h>
7 L5 W5 ~- S0 z4 T. L- a
; B% u; W6 u2 R- a
#define SHAER_RAM_BASE_ADDR (0x80000000)
' S) M3 C) v% S$ n* M
#define SHAER_RAM_SIZE (0x20000)
3 U( j) T; i- O
5 |2 f) L, w) \6 p9 j- B2 ]0 u
typedef struct
6 v, G5 _+ P( \
{
( b! N& v0 p, d9 q9 J: e" Y! F
unsigned int a;
7 r' r9 I7 }8 @/ {4 d: C' @8 i
unsigned int b;
/ L- w9 s6 @- B" `. b0 I! j' Z
unsigned int packet_cout;
- ?; A. @ S! B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 s0 `* l6 J, G( v1 W) G
; h# B% B$ P9 j4 a& h% \1 R5 T
void read_MSG_buffer(int *baseaddr);
" C7 M. q3 J$ {
unsigned int count_copy = 0;
, b: n3 k6 b+ d
1 t( n( }0 V: i; n+ F) J" ?+ G$ Y
int main()
# U+ L/ X7 y, M
{
6 S$ o0 G2 s; e
int fd;
* N, {# s% ~$ l6 t
int *mem = NULL;
% S' R/ X: ]9 Z% S5 k; b7 [6 E& o
1 V% n( @* A2 }
if((fd = open("/dev/mem", O_RDWR)) <0)
5 _) C( o+ f. I
{
% y0 V: \# r5 i1 B
perror("open error");
: H) ]$ q% Y- ?" }4 A
return -1;
( J4 D* h; _8 r* p: ?$ F
}
* f3 r; o1 C+ ]: G1 B1 _
- {6 r0 B7 I( |4 w4 q5 r5 ^2 V9 g" ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) u1 o' V4 Z- M5 I" R
$ @. @2 j T; l; T' `
while(1)
0 f6 o& c* S9 D
{
$ M9 y9 V, B5 d
read_MSG_buffer(mem);
. [) p7 r u/ A
}
7 T; O' i" H2 E7 x6 j% n$ b
}
: O, Y! }/ M9 P
3 d, N1 W) T @$ I: ?
void read_MSG_buffer(int *baseaddr)
- i4 Z# x, l7 @- t9 V' u
{
2 t9 s% f( [) _7 D' E
pRX_MSG_PROTOCOL pshreRAM = NULL;
& _* z+ l7 O. N0 ^0 W, B
* a5 s' O, w7 k _# C% D" B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! U a' R5 U: e4 S: L% W
- ?/ g/ _& I# I; q
if(pshreRAM->packet_cout != count_copy)
3 [. r, u2 d+ [
{
. L/ I" H) L1 W3 {+ s# i
printf("a is %d\n", pshreRAM->a);
# {% l1 R- H j$ |4 [* f
printf("b is %d\n", pshreRAM->b);
1 X h! v1 U3 k2 M
printf("count is %d\n", pshreRAM->packet_cout);
6 e2 C, @& G$ d2 k6 \7 ~
count_copy = pshreRAM->packet_cout;
$ b) T; c$ K k! O* e0 s* }
}
) Q. }6 g- T, M" {& {# N
else
" a0 T9 k( U3 ^4 i2 s8 T
{
# \: a, t# g$ e5 }0 y
printf("No effective message!\n");
* d( Q" [1 I# G3 i% ~ |
}
! B4 U0 n7 N# N3 g" D- Z2 b' \6 y/ h
}
$ N' R; H/ [ W6 P* ~7 p) h
6 k; Z, I% f: t6 n6 n( H4 t" b9 y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* _# g# ?+ W0 M0 x$ W. [ T
' D# t( X; \( {# T' X+ u
2 g. M: |9 C1 \. C: l' t! s
1 j. S( P. z! U5 r6 g4 ?+ T
% T+ R3 f3 R) b; K E
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4