嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 u# V! L% i; C; ^9 A% r+ @
4 N; @0 x' K' C9 ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 O* |, X' n$ w& V6 ^ A, n
#include <unistd.h>
( [, C* E: I% m% y+ o% a6 Y" c& f
#include <sys/mman.h>
7 ` ?( J+ U0 d- R
#include <sys/types.h>
9 T4 G" S! C- x8 U7 d, v6 Y
#include <fcntl.h>
% y; v. @9 B6 Q
5 h# H5 p p9 l* V% {1 P
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 c3 @$ p" V$ r* {7 K7 n$ w4 I9 H
a7 F0 \( ~- ^: G+ ]
typedef struct
! W" q' j/ u" }+ w
{
$ V. _/ y; V* R Z6 Y2 O7 j" D
unsigned int a;
$ d- S h# A. |3 E$ l- M3 j
unsigned int b;
5 Q8 t1 G) c8 H- Z4 H
unsigned int packet_cout;
7 l- p6 [ ~9 i3 o7 d( S+ F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ q( T% d9 g4 k0 i- Z' m
( } \# d0 G4 s2 c* D D. {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 q9 {* ^. ]. P- @: H
unsigned int count_copy = 0;
" B: n0 e7 O- ]& I* n
% |6 b) Z: i7 d2 i) N
, r! h. j$ c. k: p
int main()
6 C+ O, Z& ]% d- q+ s8 l
{
; R& T/ a2 ]8 z
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 ?+ ^/ ` |0 C5 Y$ e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 Z! ^. \6 U7 R* o
8 c$ j3 b1 y5 a9 P
while(1)
- T/ }% V! H# _( e7 z; E; b* ]7 V
{
8 j, e3 t9 I3 u; D5 p% F' U' [: d
read_MSG_buffer(pshreRAM);
8 I4 |) ?1 X4 w8 J9 d
}
; K2 b& I8 M- r- o5 i
}
2 D: z4 M# r% H+ P/ J
4 H) R* D9 z3 l" D/ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" S) r8 h; f3 Q
{
7 Q) x9 X9 Q. S% W
RX_MSG_PROTOCOL buf;
+ E3 P' Y1 W% [' ?9 E% F4 l
' F) f! L+ d$ `& _5 ^7 i
buf.a = pshreRAM->a;
/ c; L+ [9 G( s: o% f
buf.b = pshreRAM->b;
# |+ x$ j0 C4 G% B; u' l
buf.packet_cout = pshreRAM->packet_cout;
# M; v% {- a' u) O& U5 e- I
" b2 C+ o9 k8 X+ h$ {
if(buf.packet_cout != count_copy)
7 G2 ~6 [: S" k0 R" O. r
{
5 ]8 S7 Q, P' D2 y( K, f
printf("a is %d\n", buf.a);
; k; ?8 W& X5 |7 y! q
printf("b is %d\n", buf.b);
: l% {+ Z. x* r) ^. K
printf("count is %d\n", buf.packet_cout);
/ M5 c+ V& C5 R% V( i$ U
count_copy = buf.packet_cout;
. L1 r: b6 J$ \* B6 }- l. V) f, ?; O
}
* A5 l. u, P5 |7 n. s$ [
else
8 [3 ^3 A: v0 K- U b3 {1 I5 f
{
, l- b! x3 M, M0 b1 f" m: P
printf("No effective message!");
/ j! U; f+ m- k" }8 {
}
* S/ q& z6 B: K0 v8 p6 Y( m/ `
}
: ?4 Y7 a) N& N- C# _, h! a
$ j& C6 M# }8 J9 @
; L/ `% G, ^ A, }( w$ m, N" u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: Y$ B. @, ]; z# j- o2 I# K0 m4 u0 H
使用下面代码,对内存使用了mmap函数后:
2 A. U% Z0 t1 M5 Q' B) V6 P n
#include <stdio.h>
, w& L3 ^, r/ w5 g2 q$ ?) x
#include <unistd.h>
6 m9 ]8 _" O+ W5 K" g& ]( Y
#include <sys/mman.h>
$ u; F; L8 ?! }* g- s3 j
#include <sys/types.h>
6 K* ?; C2 u0 L8 f; v
#include <fcntl.h>
' J: Q! v7 F) t6 ^
1 w: U/ |& {$ c2 N1 b/ u
#define SHAER_RAM_BASE_ADDR (0x80000000)
% a, @. L) h4 s3 C- Q
#define SHAER_RAM_SIZE (0x20000)
7 R. Q: t8 u( T* n- W
4 h# Y/ m% N0 H( T4 h6 K( i
typedef struct
& A$ M$ ~) b* }. D
{
# C0 p+ v+ Y8 B& u% |! j
unsigned int a;
0 h( A$ [, k- d) q+ Z( x+ t
unsigned int b;
' Q6 F4 i5 z$ e5 t+ a
unsigned int packet_cout;
! A3 { B$ I5 a6 v8 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 q( o% }) e4 b" V* g
* L9 L# s" [" E1 X( c, y/ \
void read_MSG_buffer(int *baseaddr);
- n* r% O: ?+ u6 V9 h" v5 J% t
unsigned int count_copy = 0;
5 f+ C0 a& c2 X4 g1 ^8 I
$ }. J. W, T3 a, q) x# D/ I* }( O
int main()
4 y: @1 d$ T0 d, C- S
{
2 k% P# N- v; G% X2 V2 ]
int fd;
- ]. L: F! m, u0 A7 A' m& S; K f
int *mem = NULL;
1 \$ b) S6 k) M% Z
5 P& G. d2 B1 z8 o) P
if((fd = open("/dev/mem", O_RDWR)) <0)
0 O( i7 {; D4 Y
{
; |8 r, w. G& c4 s( K) r( ]* j
perror("open error");
, K5 n! j7 b5 P, e) v2 H; I8 e
return -1;
" d+ V. J4 q; x4 \
}
% h; B& C% u5 @+ Y
3 y! A! D& E+ {: C9 R5 J2 v
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 {+ ?% C( S c! J" V Y8 E
8 K! R3 p: c# W4 E. V" Y
while(1)
* w' e: Q, D% l5 \- }6 T" J& n& \
{
1 N# ?2 ~& \4 C, y0 x7 K9 ~6 I/ O
read_MSG_buffer(mem);
4 ?/ ]0 O) m8 X5 H
}
7 K7 i8 j8 v, j! T! z h
}
9 F o' a1 ^; _, q" x- i
1 x; B; j) C8 O( b% F
void read_MSG_buffer(int *baseaddr)
* w" K3 f& U' B3 e* x
{
! t% B1 T% ?; O4 K
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 d) u3 P$ Y* E( |/ m- x
# \0 a' N8 Y7 P9 F5 X
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 A* G/ [8 w; m- Z. B9 m# c3 G I8 l
1 |- C: V2 n* U; K. M( g
if(pshreRAM->packet_cout != count_copy)
& D& N2 I6 A9 {" @8 ^+ r
{
; v" y7 a8 l' }5 M' }, O
printf("a is %d\n", pshreRAM->a);
6 ?6 @% G# e' E+ }
printf("b is %d\n", pshreRAM->b);
* q3 w9 J, D% q X+ Q2 K7 M
printf("count is %d\n", pshreRAM->packet_cout);
$ D5 |! w0 t1 ]: o) R& E" V- l& X2 G% x
count_copy = pshreRAM->packet_cout;
* m1 \$ e( e- T2 H, W5 |
}
) o- q, @( ?- Z( f. C5 G5 d5 |* ?2 o
else
- u6 ^9 R, @" d, Z( Z; r& V: D
{
- [" E2 \4 T c4 m. {: f
printf("No effective message!\n");
$ E; @ a. G- i8 u. a7 s) s
}
' P8 A( G( d4 ?! W; j
}
' O) P) Y8 H3 |5 K
0 Y6 g j$ w7 l) e! k0 [3 _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. v1 M: C9 W# r ~6 I1 p# T
3 e9 j8 f/ C/ E0 c
1 ]4 ^2 ]; W2 p @, ^
& I) ^. G$ v; F- t* M
B- ~0 x* q: G' P5 g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4