OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5234|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* J0 S* v4 ~$ z6 j; E1 h2 l; S1 N2 V; L" s8 E- C7 B$ e; V
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% T  m8 c" \0 O7 c! M9 B% c
#include <unistd.h>! Z) ^. V* A: K2 f% `
#include <sys/mman.h>
- \+ r- O( e. H( ^& k#include <sys/types.h># {/ j4 w7 F/ N2 U! W: H# B
#include <fcntl.h>3 i  o, R) W, H  }: S/ T
" c8 O5 d! A! Y, k- [* s# N7 p$ G9 z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * |# W0 @# N  T+ P- n/ j3 c6 m

  y0 v' q$ J2 ^2 Btypedef struct* ^$ a7 [( g& f" ?+ b8 ]1 z
{, M) u9 K" D6 Q: A! L
        unsigned int a;/ q* @5 s( E+ z
        unsigned int b;: ^1 r5 i4 R. a$ m
        unsigned int packet_cout;
0 T( }" R3 j( C- z0 A5 x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. @2 g; ?" D% h3 v' T3 q0 @, E
* d  }; e/ q9 t4 D* K+ ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  O1 m5 a( o! o
unsigned int count_copy = 0;
7 L. q4 e) \. K- f$ x6 ?- m& U+ \4 w3 l, H; Y

. c5 g- K* Y1 Hint main()
0 F9 H0 u" i) b, k{
( ^) c) U' Z. g; t$ m5 f        pRX_MSG_PROTOCOL pshreRAM = NULL;* {( v9 P8 C; ^! l6 T% m! I: |8 D, b
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 K& A$ U  x- A' [

2 b6 j; Q, v2 A8 g/ q+ S        while(1)
" w/ q/ F4 G, k6 r* J6 u        {% I* ]5 G* E4 s6 h' p6 F# m# o
                read_MSG_buffer(pshreRAM);0 v% Z  @1 z8 k5 w$ G4 M. o
        }                0 Y8 d) e6 \+ M1 C
}
2 T  A3 C- y" P$ M7 x
) M  I( y# q4 T" w$ Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) |' G' u+ D* F: n! S4 u" ~8 g  Y8 a
{& I" C/ G5 p6 p( I0 n9 H7 M2 h
        RX_MSG_PROTOCOL buf;4 b4 S$ T# A; k. x( F
        
' F  X! a4 d% k; i6 E: {        buf.a = pshreRAM->a;
" Z3 G6 M# ?. h        buf.b = pshreRAM->b;
# x5 i! a4 V! [9 S7 m$ [6 o7 D        buf.packet_cout = pshreRAM->packet_cout;' p; ]4 o8 S- z
        
8 G7 t: X2 Q6 S! ]& n* `, z/ c        if(buf.packet_cout != count_copy)
2 o$ @4 ^& J, e3 I4 t8 h        {
/ W4 R0 N* x( b, V" `7 @& ^9 X* U                printf("a is %d\n", buf.a);9 x, J5 I# R2 B7 S6 r
                printf("b is %d\n", buf.b);  C2 D- x; w0 h6 l# I; C
                printf("count is %d\n", buf.packet_cout);
4 |! _' c! S; r                count_copy = buf.packet_cout;
( ?5 ^; K# x1 W( V        }6 l" V" y2 `6 z: Z% c/ E" c
        else: v, s  A- T1 A5 ^" d( \! h
        {
5 q! H- s7 g& @! J1 i1 i                printf("No effective message!");
& h3 _! u3 Z. _0 Q) E; |        }
7 F& G) F5 C9 w7 p; D}; y+ _. y4 n" F* M( j" x9 |* ~6 R( V

( d. Q! q1 X' H5 m/ r# k  k1 k0 d$ A! N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 m4 U- o2 D) Q" F) u) P3 u
使用下面代码,对内存使用了mmap函数后:, w- U  ?# [( H. l8 Q1 t- U& |: u
#include <stdio.h>& b1 X1 N# c- X2 r3 O( L
#include <unistd.h>1 q: X7 W, B- P) S! y! A. }
#include <sys/mman.h>+ z. |, {+ t# C5 Y$ N; i& T% w
#include <sys/types.h>
5 u' X4 i! Q: m! m#include <fcntl.h>
6 o2 D( _4 p5 _: W- u  Q7 g# A5 A( c5 a! M$ I
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: w7 K. Y7 h7 b' s- ]* l9 i#define SHAER_RAM_SIZE         (0x20000)   
* l$ u' n6 N1 O0 y
5 D' ~9 @. g; a3 n. U6 k1 M6 ]" Ztypedef struct4 C! x) Q# X& ?. h/ a2 w; v
{
' X9 D2 B) b, i* l7 a        unsigned int a;! S; K+ G( `$ w7 m
        unsigned int b;4 p; C) h" ~) a# x
        unsigned int packet_cout;3 ^8 b2 G$ z! X1 z* b( i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, Y/ C. }+ q( k& |2 r( ?

6 O& ^5 I4 B6 J2 N3 }void read_MSG_buffer(int *baseaddr);
9 J+ d  C  o, A# ^6 P, b8 xunsigned int count_copy = 0;6 k3 K; J8 x$ `: R- M

2 c: d; L5 S1 v: C+ @int main(); c/ K5 h8 g+ }" D1 p5 M% s
{! t3 A( R1 L6 d8 X
        int fd;) Z' ~% I5 h, U- l
        int *mem = NULL;
" G( a: o8 _2 v+ K6 C8 h* T- x) y' O: J: d2 f) h
        if((fd = open("/dev/mem", O_RDWR)) <0)- v1 J# P" U4 ~/ c. K% A: Q0 C, T3 O
        {
3 |% G9 p% i# b* v                perror("open error");
! K, l9 A! H# n7 T# c3 b                return -1;
4 E& C( m5 `4 d, w& v& l$ Y+ a, B2 `        }- U: S4 [4 O9 F* O) X
        ' ^% T) N: j5 D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: ^1 R; B, ^- `' r# p7 x; F/ c) ?6 q' [
        while(1)
9 \1 t9 w- H$ z9 }0 S1 C# T- \5 u        {) F0 L& S2 u* l! F5 S: M  l$ w1 l) @
                read_MSG_buffer(mem);6 ~* X/ s. k* E$ `4 v# B
        }                $ @) j; N6 B1 o, n
}
2 X4 s1 l/ H) T) Y; S* r6 Z
5 O1 ]$ W3 W" U. b& U: B' ^7 q/ _) rvoid read_MSG_buffer(int *baseaddr)3 a. R5 k/ W4 H4 g" @8 j' V
{6 I* Q9 t/ V* Q. u5 b/ \1 a
        pRX_MSG_PROTOCOL pshreRAM = NULL;, n8 F3 E* D. w% [" R7 e7 |7 M! M8 F

- Y$ _  U2 @2 K' q+ u        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 S9 c9 i0 H* X& Z$ G0 P
6 S, V1 \5 Y+ |4 }9 h( U
        if(pshreRAM->packet_cout != count_copy)8 b( C, k. W! }4 D, b' @8 R" G
        {
9 v$ s0 g! \1 U# ?9 j0 b' _                printf("a is %d\n", pshreRAM->a);5 H. g# H: N7 r1 f' s' r9 S% a2 I
                printf("b is %d\n", pshreRAM->b);
% r  _' R; \8 O                printf("count is %d\n", pshreRAM->packet_cout);
' ~9 ]% T7 L" w' c% K# m" x) D                count_copy = pshreRAM->packet_cout;
% ^5 W- P. h: j        }1 E7 k2 y' r3 s) Z
        else
) p; S8 l+ [9 p+ K; F! _        {
6 W$ E, z% U* e, h                printf("No effective message!\n");/ y- n, ^: U' i. U
        }4 w0 j4 H, O: q! x
}, h7 L: Q' }9 g. j$ u1 r4 p* Z% x
! O2 t  U. s+ a6 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% M/ L8 O7 u7 l# x" z" @) F6 d5 k6 h( y1 M% {! i1 p2 E/ ]

& T6 w9 U) q8 A+ E+ w/ m( r+ {  f3 r

$ ~* M* ]9 \  E: V+ h8 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-3 03:00 , Processed in 0.039069 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表