嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) K" b: X J7 t7 I
2 }( q* \6 _2 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 x( E5 M' Y& Q& g2 r" r
#include <unistd.h>
7 Y( S* o" E6 N4 h" J6 K: N
#include <sys/mman.h>
Z8 M1 o6 O5 B" E" v% p
#include <sys/types.h>
* g( Q% a4 y+ ^+ _% e8 X
#include <fcntl.h>
7 E P/ @4 M* ]0 N
8 l$ s) j. K/ f2 ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 o6 Y' e) |9 F
1 U. p+ d4 _0 t( P7 ~
typedef struct
8 J. O5 [& ~% ?" O
{
2 X( ?; ~* }1 l; H
unsigned int a;
! `) q5 c3 N7 V% F- S0 I' Z) e$ u- ]
unsigned int b;
# @ o( e( E4 O9 X9 f
unsigned int packet_cout;
# u% }$ d$ B) T& |: P1 }4 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" w( Y' k* l9 y) J! ]
. V7 \2 C# b5 U& b7 F/ _2 s I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ r8 j6 [# }3 u w8 F# R4 ?
unsigned int count_copy = 0;
$ _/ B; b6 x) f* C% `
; Y' a+ ~6 t$ V; O1 F
. |+ N9 J$ K- C. g2 A2 f
int main()
/ u$ y Y1 T* D4 U+ w+ g u K
{
- m1 M9 W- n7 |2 m
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 Z, u+ t2 Y% t/ p3 N! P& ^7 P9 `. ?
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 w9 K0 T6 v3 |: x0 L6 t
$ `0 Z- L: c, j
while(1)
& L3 O( D9 g( @* x8 R2 }. q# D
{
5 g1 M2 F& P# v) E7 ?5 F
read_MSG_buffer(pshreRAM);
9 @# w: o# G9 q* I* M
}
% |+ `8 H- y' V) @3 x
}
$ o ]2 x+ {- }8 q7 b3 C
2 |% T8 ~) ?& e5 ~6 n+ Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ j! X- e p" Z2 V" y9 ^0 f% e
{
7 ?# k, Y: L' E4 L. }7 T, h; q
RX_MSG_PROTOCOL buf;
$ U& g' ~, _* O" F) I
; q, U1 y- k8 ~! ]
buf.a = pshreRAM->a;
% M4 h/ W& N; E$ b
buf.b = pshreRAM->b;
: N4 d. Z: X. }, K" f
buf.packet_cout = pshreRAM->packet_cout;
* f9 ?3 _3 }" W' \1 M( G6 h
1 E+ W3 u! I0 w j
if(buf.packet_cout != count_copy)
9 d |( ?" g) { h
{
4 [# n( p3 q3 z3 a
printf("a is %d\n", buf.a);
1 J3 ?9 n: e' Q* I" V0 T! r
printf("b is %d\n", buf.b);
) L4 b- ]1 j5 e5 V6 j9 c# n: L' \1 J
printf("count is %d\n", buf.packet_cout);
4 r& C4 s# W4 D) X2 Y* I# l
count_copy = buf.packet_cout;
) e' Y' j8 A' w- v# w6 N0 }
}
8 Z! _$ t# l$ k8 j+ r: b0 B
else
* ]( R8 w6 m( c4 U& d! i* r
{
, O+ {; v, ^$ L" A3 O) }0 D% U- S7 o
printf("No effective message!");
+ j& g$ j7 V1 j$ [
}
0 O4 ?# P, |" s `
}
, m6 J" x: d/ w+ H+ `. b
6 d7 a+ {$ u' o
( i+ X4 ^1 J2 k( f2 X# R, e7 E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 P- b# m0 y$ _9 w# ]
使用下面代码,对内存使用了mmap函数后:
& K; L5 }" \2 ~* Z# U/ ?
#include <stdio.h>
2 {* U7 p q/ `' v) |- E6 {0 @2 F
#include <unistd.h>
Q. H! c T* }! _3 ~1 ^8 F
#include <sys/mman.h>
: D d6 K0 {3 |4 _- I3 w2 x
#include <sys/types.h>
1 G, r9 R a( [8 h& a# L
#include <fcntl.h>
- B( U6 w( v5 B7 i
2 o$ ~/ D$ o1 w( _
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 _$ R8 i9 m7 B. A( g4 |. L% J
#define SHAER_RAM_SIZE (0x20000)
6 q1 T; p: T7 G/ H) u8 j [
" Q$ {. m) {7 c% C9 p5 j
typedef struct
1 X! C. w4 j9 G3 ?8 N( M
{
/ T0 z ~3 T4 N2 Y' r" J/ h) q
unsigned int a;
4 l7 N+ _( A/ e$ F2 Z
unsigned int b;
! X" n/ G1 K5 f, `) V8 E2 l' `
unsigned int packet_cout;
3 }3 I6 Z- E K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ s0 t2 ]1 z! l
6 X- Y. x& t" d4 Z. {$ @
void read_MSG_buffer(int *baseaddr);
$ z4 U, Q! O: b/ W" @
unsigned int count_copy = 0;
1 K, w5 P6 U0 Y; Q! v
: H5 h: r" y3 k Q+ _
int main()
8 H. c6 r, `0 T5 {! f
{
2 a- J# c9 e$ Z) h& e: ~# x" U9 ?5 S
int fd;
) J O- n5 P% r, d: q' [# ~5 b8 S
int *mem = NULL;
j( I/ p' o% @* _
( Z: j, b9 C$ q' G" s) j! u
if((fd = open("/dev/mem", O_RDWR)) <0)
3 ]' W4 p0 s, ]8 {, V) z
{
0 W* {8 V5 a7 r' B9 H4 q- A
perror("open error");
; U B% t( {$ U; A# L9 C) F) x
return -1;
* G% J$ _ W# A
}
) R; P- _# x: }4 A
: h" n* c; s, x$ j8 [
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% M; p, e, s& c) ?. g) c
; m/ {0 K0 C* l& {. y& m
while(1)
2 ]% B9 s% o: j3 G- A
{
/ Y1 d# d* Q; ^8 z; ~* y# F1 M; D
read_MSG_buffer(mem);
) T. s; s4 e; D5 t& w
}
1 J8 S" A& l' p0 C# `3 _
}
) }6 A3 f# ` l) S1 N9 x. |5 Q
4 h8 e t/ H5 m7 S* z$ O2 \/ x4 H
void read_MSG_buffer(int *baseaddr)
: X/ v5 g4 O- v1 W8 t
{
% _% r5 r5 z8 @/ b+ M
pRX_MSG_PROTOCOL pshreRAM = NULL;
; q+ t) v& m: K- p2 i c% D' k
1 h2 A4 N. r- J& s: k& d' N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; B# [) J, j9 X/ h
$ c% b' a. Y1 |
if(pshreRAM->packet_cout != count_copy)
/ L- u6 v$ h4 N3 T
{
0 \ I0 e; d. |5 V% L
printf("a is %d\n", pshreRAM->a);
/ q* l/ G/ z7 }4 z1 a7 b9 ^
printf("b is %d\n", pshreRAM->b);
9 O: I9 H. H. _( z: V
printf("count is %d\n", pshreRAM->packet_cout);
9 k# Y, Q) a4 h+ z' [0 A
count_copy = pshreRAM->packet_cout;
x9 ?/ B+ F: c' Q
}
& J; ^/ c, z, V" \( G# t7 ~
else
. B3 @, P- a6 J1 f
{
0 c- @$ Y' n9 k# \3 t/ a
printf("No effective message!\n");
2 G X8 Q; B" f, W
}
2 F$ ~/ @ p6 M" n+ h, b+ k
}
" B+ T5 x( m" ~( B" Q6 u. a3 q( C
0 I; g; |3 w% o5 V z, C; I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 e/ n$ n7 C7 J2 q
9 j8 x' _" u5 H7 p2 Y6 j0 E
, U! x, p4 D7 w4 S* {4 d& ]+ [9 f- R
& ~% w( T2 B1 G# R0 E: N
+ v- l4 i9 B i, r: K* y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4