嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- \* b( Z; H+ A6 C, U. k: y2 @7 ^
' I, ^, x0 N. c0 W, P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 S p# j2 ]/ x: Y9 r
#include <unistd.h>
; V9 E. N/ @9 h- _5 Q6 w
#include <sys/mman.h>
- z6 u8 K* E p9 j3 w$ s
#include <sys/types.h>
6 Y, e+ t7 W1 p6 P9 p0 w4 @$ G" {
#include <fcntl.h>
# S" q0 q9 ], D: b. u' a, Q6 U
) Z, Z/ a5 R# ?/ R7 R2 C) ^$ A
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ K) _- ?- E% {2 J: J( B1 [- [0 X: E
! r9 _7 X8 \3 e' w
typedef struct
; J* P7 E# K! r% `8 l
{
! Q0 c8 J" j. P6 a- N% g% e: W+ q) B
unsigned int a;
. W k9 a ]% ]: \, _0 R; x
unsigned int b;
1 q; B+ ^" I. J }
unsigned int packet_cout;
- S$ D: e1 s, D) p% E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 y, D" e6 q! B8 u6 n
/ b) J& | H5 c% G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; T: X, c# O) h6 e. s2 j) h, l/ s
unsigned int count_copy = 0;
4 O/ N/ T5 X' n' x& G8 x
, Z$ _1 \; T B3 D; F/ |% |
5 m0 u/ O2 u1 A
int main()
; {* {8 H! g& @7 m3 V. L# U
{
9 ?5 X. ~+ R7 ?- O9 {
pRX_MSG_PROTOCOL pshreRAM = NULL;
# F, y9 F, y& Q+ x8 q& B+ {* T
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 N) p* z m! Q. q6 g& _
) U8 s3 h) u, w+ R- T$ G
while(1)
" U/ V( {- Q1 x2 B1 W
{
! N: }$ v7 H1 g
read_MSG_buffer(pshreRAM);
$ a2 V7 V M- s+ w4 N
}
# P$ x& O( G" L6 z+ g7 k
}
& a# ~$ c" q+ g: w0 f
O8 n+ Z+ c5 t! v% s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 O# ]5 G' m( s! b8 u/ {0 V
{
: v. |* [: e2 ~' B' x5 \4 B% h
RX_MSG_PROTOCOL buf;
$ r- @* P( A8 A$ y. P
: w. a! i+ I6 k6 C2 G! ~6 X1 r+ F
buf.a = pshreRAM->a;
6 B4 |8 ^7 f' a- i' ?: `
buf.b = pshreRAM->b;
5 R& j2 ]) t( h9 O, X, `; S {
buf.packet_cout = pshreRAM->packet_cout;
9 Q1 P' H' M# t& H d
8 w6 R. k! d g. Y
if(buf.packet_cout != count_copy)
& X# K/ R# ]8 ]
{
7 }; ^+ R" _, n" b
printf("a is %d\n", buf.a);
9 @* b5 b) c* q. K9 t
printf("b is %d\n", buf.b);
! P) D& C9 g( _& }2 [, [6 C
printf("count is %d\n", buf.packet_cout);
3 Z$ ^+ J+ N' C! `
count_copy = buf.packet_cout;
; P5 Y+ Z9 ]1 F& R: {4 I
}
# }2 g$ a9 H1 w$ Y/ a1 `; x* }- v Z
else
2 j# L6 Q& I* N% k8 a0 |0 s
{
$ d) J0 W1 d( G
printf("No effective message!");
0 }. R& ~2 x; x6 j- u" O& j! Y
}
" ~9 P8 i: }- A0 w
}
) U& s) o, B' K6 }1 N5 Z
! |' ?! ?1 S3 ^: b6 u: n
( x5 |9 g; D+ w1 z) D$ n& b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& G) {: F7 E$ A. `$ X
使用下面代码,对内存使用了mmap函数后:
2 V0 Q9 {2 E: w7 D# r
#include <stdio.h>
6 l0 A: k) _' \
#include <unistd.h>
. l; }- ~, J) v( }. v) S7 P
#include <sys/mman.h>
8 `) G4 r( ]7 Z0 u1 H/ P
#include <sys/types.h>
6 L3 W/ d0 r: [, q# n3 M
#include <fcntl.h>
3 x* ^5 e$ K8 [# E9 q6 P8 f
5 V) `, {& i! I( R5 Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
# m- P& S" @" S( W1 Q4 U
#define SHAER_RAM_SIZE (0x20000)
3 u L# g9 T8 L0 a. [) j
1 C) D8 X$ k- i5 y3 C
typedef struct
, \& g' s2 b# v0 J: g2 E+ Z
{
- a( \7 |# E, h" O9 d% \
unsigned int a;
" k* L1 }; ?# K: H! c
unsigned int b;
! p0 X+ t7 X' I2 J
unsigned int packet_cout;
; w& A! D9 `% L6 Q; K9 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 x( @5 D* L Z7 f" q- M* B
5 g9 t9 i5 Q) W% O, L3 I) S
void read_MSG_buffer(int *baseaddr);
# j" I2 l% v2 k, D$ m
unsigned int count_copy = 0;
* ^+ C3 j7 o$ l$ Y b2 p6 i7 Y
( w& p/ P6 ^/ F8 G3 h/ H+ g
int main()
+ d _+ }' x) j
{
6 H3 i! h: N8 G7 u6 S4 N# p& q
int fd;
4 j$ b7 a1 _5 K; p3 k4 U% d+ O& j
int *mem = NULL;
s# A: b9 i. ]. m# G
+ l {0 N& V& y0 `, G( Y
if((fd = open("/dev/mem", O_RDWR)) <0)
4 T5 K x, F% K/ o3 O1 l+ w
{
+ i. [0 t) A3 D5 l: I% J
perror("open error");
' H; \+ |# B" j. n
return -1;
+ _% K/ v2 ]* O+ y, a4 _
}
$ b8 ?4 J& s7 u7 M. Z, k. G
* Z& e( P0 {9 U7 X; j, |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! h# P3 r8 y2 o7 h/ B6 G
! H. Z2 ?, `9 o+ W0 @, Z+ ^+ q4 y
while(1)
- H7 k5 ?/ x4 ^, x
{
" d# { U( S- z, Z2 F: r, f, K
read_MSG_buffer(mem);
^' Z# L0 o* E7 f0 C
}
& f0 m+ j9 m3 {, d4 B2 K
}
2 o5 u" T9 C2 x( g
' I6 l, g0 _4 ]
void read_MSG_buffer(int *baseaddr)
' N% U5 H5 O. V& S/ x6 t2 n2 o
{
6 m0 X6 |2 y% h$ o3 t
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 ^4 D3 T8 R" ~: \
! S9 q/ O' u5 y3 { \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' _- U+ D- K: \1 S* b. t
, S1 C% Y5 L. e* x/ D& D6 k, n
if(pshreRAM->packet_cout != count_copy)
8 o9 N" m6 M+ l1 L0 o! C3 e
{
' S7 y$ G( ] ^# g5 @3 Y" ^
printf("a is %d\n", pshreRAM->a);
* o: B& D; J: k6 h
printf("b is %d\n", pshreRAM->b);
" ]& k3 v* g8 y4 b8 g
printf("count is %d\n", pshreRAM->packet_cout);
8 ?5 i- ~4 [7 _
count_copy = pshreRAM->packet_cout;
% S _& E0 T# f# K# }
}
" E. o% b" e9 D2 ?
else
7 Y; I5 j8 E+ i2 R+ [ m5 T
{
# _4 ?+ ?6 ^1 m3 C; K" n5 \
printf("No effective message!\n");
( c) M# j/ f( }6 s# S. g
}
6 [3 m6 L9 | J i# ]5 D# Q/ f; P
}
& M. z: a/ f! ^. v% u7 ?& @2 H
3 ?8 D R# ^# a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; t. f& z* h& C9 E; y6 h" m
) h+ e/ _, F# U/ a2 D: V
5 U0 p5 x" d% m1 V
5 R' Y, \, K8 |1 i$ v
4 d7 Y u) Y8 B1 V8 |# K E
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4