嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ y/ i- H7 q; X* F8 L, D6 v
4 ?/ t# b+ B6 i: r. Q# h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, @0 ]+ |) @- `/ `1 X$ i& I
#include <unistd.h>
1 {8 C! r* V1 N
#include <sys/mman.h>
$ Q5 i' X: M! C: X/ r8 ?* Q. n4 F
#include <sys/types.h>
1 P/ F6 b' u/ K: b N, F
#include <fcntl.h>
9 N# K8 z) G. g7 C5 D, Q: J- |
: N0 y3 \- I8 s& ]# t* H
#define SHAER_RAM_BASE_ADDR (0x80000000)
) Y" W8 { f8 }0 O$ t1 T8 S- @5 p+ {
' J6 L: { C: O% k7 C6 h# c1 M3 E9 I
typedef struct
: c% `( a# A! a6 @3 W2 F
{
+ [' L6 i* O4 D* S3 u0 m5 _
unsigned int a;
" r R+ s9 I2 _! Q2 \, \9 S
unsigned int b;
6 M$ U7 F- `0 Y8 J0 X: @
unsigned int packet_cout;
. h4 i# c' B3 n6 L6 Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ @; _; m9 x- t6 y; t$ l. D
" q/ c& u6 L5 [: [6 a5 z+ }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" t- z I1 L# y& D
unsigned int count_copy = 0;
! b0 z3 y! m' k% P' j" d; Q$ S
% L$ v* ^0 A; u# Z9 V" {
' \! X& S" s+ Q5 _
int main()
9 |9 f2 o( `6 F: ~- p$ |7 ` a
{
: i% e% w; v7 m
pRX_MSG_PROTOCOL pshreRAM = NULL;
& W9 k8 g+ F7 O1 @# R7 z9 X6 S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 T# n Q, Y8 y" x6 `6 u5 M* d2 S
) V/ a/ d; G0 h/ v
while(1)
6 e- H8 G- f7 j/ a% J" z
{
$ s0 d A. ~* x- r% A5 W* k$ y
read_MSG_buffer(pshreRAM);
$ L6 @7 k0 P1 [" e# b* ]" J! ?
}
% r2 K" t7 q* c5 c
}
. U0 L3 B/ Y6 O4 B! ] v, q5 ~
. }2 n# b3 d$ g/ v" U$ z) w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ c( y# D5 I ? F, ^
{
8 {8 D/ x& [' t( t3 G( y( B& ~
RX_MSG_PROTOCOL buf;
9 s! d3 j; \6 }1 V# Q: s
9 r8 v- j+ Y# v7 m: G
buf.a = pshreRAM->a;
3 u8 Q: Y4 j. u: _; H" p# K9 ^
buf.b = pshreRAM->b;
+ B1 T" h4 d2 [
buf.packet_cout = pshreRAM->packet_cout;
# d* B6 i* h4 X" S/ N( ?/ ?: u
: U& m8 Y, t C1 l" x
if(buf.packet_cout != count_copy)
: Z9 `( U% K/ w
{
" \1 S4 S7 \4 A4 e L, n: a% M
printf("a is %d\n", buf.a);
( k% t# ?& v: [9 T" I
printf("b is %d\n", buf.b);
6 K6 @: l/ S1 q; u m" U. Q
printf("count is %d\n", buf.packet_cout);
4 O4 o" }' Z {; |
count_copy = buf.packet_cout;
' w: d: \: ?. S5 l8 e0 [
}
3 d ~8 J3 a7 H' ]+ j; J9 Y6 U" K
else
$ k7 _6 P% ^" \" d) l+ y! R8 v, ?
{
2 y5 |. b" p0 o+ E- V
printf("No effective message!");
/ f( z% o' l7 D* J
}
9 K( ?' X: Z: O+ T& A6 c) e: h
}
# B$ E3 G. f) p4 W
- v, E- H0 G+ c2 K9 e( ^4 R+ h
9 [2 |- [( K C2 y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, K' [! q7 T5 J3 d
使用下面代码,对内存使用了mmap函数后:
6 [' t; Y; V5 ~8 p
#include <stdio.h>
- }$ h/ ^6 T) s4 k; s" B L
#include <unistd.h>
6 X1 Z3 d" _$ o
#include <sys/mman.h>
4 ?1 m0 G9 b3 N
#include <sys/types.h>
, M/ V$ ? r: O+ s6 v
#include <fcntl.h>
' l2 j: y$ _% U
W* @+ ?; H! i' S7 E
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 r# W* R- h" X' a
#define SHAER_RAM_SIZE (0x20000)
$ H" c7 ?5 r G7 x3 d5 o$ h
& d3 T( H) ^$ U9 i) u' d7 X3 \( ^ y6 u
typedef struct
# X1 m4 D7 n7 R/ C5 F6 D6 Q" H
{
* e {% J, g) _, t
unsigned int a;
9 d9 z5 L* a4 @: O7 j# j
unsigned int b;
' R% I+ ~. n- a7 b5 a/ R0 B
unsigned int packet_cout;
% h: l7 \( N; D+ Y# j7 d' n. B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 }. h! i! {1 @" V' S
5 P, o! }! P" n6 I2 \- T. H4 M( ], ]
void read_MSG_buffer(int *baseaddr);
8 I8 O6 h E2 K' b* [7 `) x. y
unsigned int count_copy = 0;
3 q9 k8 l B( ]8 g0 l/ v
: X, N4 |1 e7 P, P& H l& f
int main()
9 [0 p9 Y( [) n+ q
{
/ \( }. W" D! J; z; D' o+ O; ^$ M
int fd;
/ y8 ^' C9 z; x8 }; a+ v* ^
int *mem = NULL;
( |& h( ^" e6 w- H& c$ j
r# y: k+ Z8 |, U* E$ _9 i U
if((fd = open("/dev/mem", O_RDWR)) <0)
8 D, e; F/ V, r- W2 x- U, e( D
{
) c; ~- T; y6 l
perror("open error");
2 _0 C$ G; M9 R( Z9 K9 I4 i
return -1;
7 J' \$ j2 p6 e
}
3 B" x5 _7 q9 T8 W* q4 e
: n# \2 Z0 F, G5 T$ [9 c$ i4 j+ ]
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, _/ W0 [8 t) `: |9 ~, v
2 `+ J1 `' @: r7 L* |3 p$ p& ]. W
while(1)
. u% r% R* x. c$ x; Q
{
- r# @' {; u, M6 A3 D W, }
read_MSG_buffer(mem);
. I- _! R' ^# ^ w
}
8 C) w' d- Q! @1 U
}
+ o5 k. C$ g1 s5 S
1 Z) w3 e# w: V+ l, t% x
void read_MSG_buffer(int *baseaddr)
: F4 s3 N* b" D# X
{
4 R; N% H. S6 U( O) k, M+ @2 {
pRX_MSG_PROTOCOL pshreRAM = NULL;
. L, }4 B7 F) @* x. \0 _
, g" Q8 A& {& U2 i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- j6 b0 J7 T, p4 x- Q
2 L0 o9 v' e- c9 }
if(pshreRAM->packet_cout != count_copy)
7 z! R4 _) ?: B R3 I" c
{
# h6 n6 B& F5 E0 F6 B) q
printf("a is %d\n", pshreRAM->a);
7 a. [: g1 k, C; K( x2 ]
printf("b is %d\n", pshreRAM->b);
# H9 f; t& ^& T+ O
printf("count is %d\n", pshreRAM->packet_cout);
R" A: j* [1 j
count_copy = pshreRAM->packet_cout;
`8 I- Q E. H" @2 _/ n
}
& O$ ?5 P, o/ L& E8 ]% H
else
4 P# V# ]( t$ l: M7 X5 S
{
" G4 ?5 U' l4 \; o7 |$ [- o
printf("No effective message!\n");
0 i! \! I8 K/ T
}
* }9 Q1 R: I- F* p$ G3 K( R
}
H# A$ W, ] v- @/ M& g
) y7 ?: g' p9 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" o b# q! g( _: e
Y# Y% P1 h: g6 t0 [: a1 l$ Y* t
" J; w \- D. f% s; S. B4 h$ T
5 g( X4 E1 I3 r8 q, j
& q8 ?. N2 n! H: F: Q7 e7 \
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4