上一节讲述了在没有MMU的CPU(如80251、MIPS M控制器系列、ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法。新设计的内存管理管理单元要实现虚拟内存管理还须要操作系统、代码分块(Bank)的支持。详见SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法。这里要阐述Bank设计的一些原则。

Bank设计是为了实现不同一时候刻执行的Bank(代码块)执行在同一块内存上,所以在执行之前操作系统须要将已存在内存的代码/数据进行缓存处理,并载入将要执行的Bank到该内存上。为了实现这个目的,须要明白下面要点:

1.为了提高效率。我们觉得代码是不会自改动的,即代码是仅仅读的,则在Bank切换的时候能够直接将已经存在内存的Bank代码丢弃。

我们仅仅须要将当前已经存在内存的Bank代码的Bank号入栈就可以。新载入的代码能够直接覆盖该块内存。

不同的Bank有不同的虚拟地址,为什么能够放到相同的物理内存?事实上是新设计的内存管理单元的电路决定的。參考前一节的文章(SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法)介绍,关键是同一个Bank组的不同虚拟地址信号相应的物理输出信号是一样的。

2.程序调用后返回到一个Bank的某一行时相同须要载入该Bank代码,这时操作系统会将之前的Bank号出栈,并依据Bank号将相应的代码载入到该块内存。从1和2来看,调用Bank代码和返回一个Bank设计到Bank号的入栈和出栈,假设设计的Bank代码中的函数的虚拟执行地址带有明白的Bank号信息,那函数的调用和返回就是一个入栈和出栈过程。这样操作系统能够降低出入栈的工作,代码执行也更顺畅。

3.Bank代码中的变量数据处理:

1)全局变量。

假设全局变量定义在公共区域。那Bank代码切换过程中不需对其进行处理。

假设全局变量定义在Bank内存区域,则Bank切换时须要对这部分全局变量进行缓存处理。即在Bank号入栈之后,将Bank中的数据存到堆中。在Bank返回时除了从外存储设备载入相应的代码时,还要将其相应的数据从堆中恢复到Bank内存。为了加快数据的恢复。往往默认一个Bank数据空间的最大值。这样就不须要记录每一个Bank的数据空间的大小。

2)静态变量。跟全局变量一样。

3)常量段。其是仅仅读,跟代码一块处理。

4)局部变量。局部变量是在栈中分配空间的,所以不须要进行缓存。

5)buffer。假如该Buffer仅仅是某个Bank调用,而该Bank除了代码还有剩余空间大于buffer大小,那将buffer设置在代码段之后,并定义一个指针局部变量,程序中直接指向该buffer的首地址。

假设我们将Bank内的全局变量所有转为局部变量,那操作系统就不须要对数据进行缓存管理,就不须要堆空间。可是局部变量相应的栈空间就加大了。一个Bank可能有多个函数。而多个函数是可能会用到相同的全局变量的。但这样的情况须要的全局变量往往不大,能够考虑都转为局部变量。

假设不须要进行数据缓存。那系统管理将会很easy。

4.中断处理不能进行Bank切换。Bank切换须要进行读写外存储设备,会造成非常大的延时,所以在中断里面不应该产生Bank切换。

5.操作系统、驱动、应用各层次频繁调用的代码应设置为常驻代码,假设发生切换会损失效率。

假设频繁调用的代码非常固定,如操作系统的调度管理等代码能够固化到ROM中,以降低成本。

6.Bank内存分块大小要适中。在保持切换性能的基础上选择较小的内存块。

Bank块设置过小,就会导致Bank切换频繁,损失效率,Bank设置过大会造成内存浪费。

7.Bank内存的起始地址应该对齐扇区(512字节)。这样读外存储设备可以达到最好的性能。

请关注SoC嵌入式软件架构设计(控制器SoC固件架构)系列博文:

SoC嵌入式软件架构设计之中的一个:系统内存需求评估

SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法

SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则

SoC嵌入式软件架构设计之四:内存空间规划分配

SoC嵌入式软件架构设计之五:可运行程序的重构

嵌入式:节省内存的软件设计技巧

SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则的更多相关文章

  1. SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其它代码. 我们PC然在同一时间大量的应用,地址空间差点儿能够整个线性地址空间(除了部分留给操作系统或者预留它用).能够觉 ...

  2. SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...

  3. SoC嵌入式软件架构设计

    内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...

  4. SoC嵌入式软件架构设计之六:API设计方法

    在嵌入式系统中,驱动都是以API的方式提供给应用进行调用.这里介绍嵌入式系统的API设计和管理方法. 驱动在系统中会按模块进行分类,比如按键驱动.LCD驱动.文件系统.card驱动.I2C驱动等等:每 ...

  5. SoC嵌入式软件架构设计之七:嵌入式文件系统设计

    嵌入式的系统区(system disk,SD)包含操作系统.驱动.中间件.应用和字库.UI资源等文件,本文讲述SD区的文件系统设计.文件系统最基本的目标是为了实现单个文件的定位和读写.由于一般代码都是 ...

  6. [简短问答]LODOP如何查看用LODOP打印设计的代码

    该博文为图文简短问答,具体详细介绍可查看本博客的相关博文,生成JS代码相关详细博文:Lodop打印设计(PRINT_DESIGN)介绍.Lodop打印设计.维护.预览.直接打印简单介绍.Lodop打印 ...

  7. WPF换肤之四:界面设计和代码设计分离

    原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...

  8. 一行js弹窗代码就能设计漂亮的弹窗广告

    接到一个设计需求,要求xmyanke在网站右侧挂一个弹窗广告宣传最近的活动,找了半天都没看到合适的,自己鼓捣了一行js弹窗代码就能设计漂亮的弹窗广告,来瞧一下,欢迎拍砖提意见,js弹窗广告代码如下: ...

  9. Webpack之Code Splitting 代码分块

    如何实现代码分块 默认情况webpack会将资源文件打包成一个js文件,比如app.bundle.js 实际情况我们需要按需加载 方法如下: require.ensure(dependencies, ...

随机推荐

  1. POJ1163 The Triangle

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44997   Accepted: 27174 Description 73 ...

  2. Relation(NOIP模拟赛)(二分图染色)

    原题: Description 有n个人,编号为1àn,告诉你那些人之间是不友好的.现在,让你将这n个人分成两组,使得每一组之内的人是互相友好的,如果可以分成两组,则输出如何分组的,如果不可以分成两组 ...

  3. CRichEditCtrl 输入字符串长度限制

    1.我用 CRichEditCtrl 控件,发现它通过代码可以向里面写大于 32KB 的字符,但手工却只能输入小于 32767 个字符,再多则自动舍弃. 2.初始化时调用CRichEditCtrl:: ...

  4. QML与C++混合编程详解

    1.QML与C++为什么要混合编程 QML与C++为什么要混合编程,简单来说,就是使用QML高效便捷地构建UI,而C++则用来实现业务逻辑和复杂算法,下面介绍了两者间交互的方法与技巧. 2.QML访问 ...

  5. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】

    转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] ...

  6. (二十三)深入了解epoll (转)

    一. 介绍Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性.传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃至 ...

  7. Scala学习随笔——Scala起步

    实验楼学习Scala语言的笔记,课程网址为https://www.shiyanlou.com/courses/490 一.Scala简介 Scala 是一门多范式的编程语言,类似于 Java .设计初 ...

  8. jQuery中的each关键词

    #转载请留言联系 从一个简单的例子引入,jQuery里的each有什么作用? <!DOCTYPE html> <html lang="en"> <he ...

  9. 厦门海沧区磁盘只有1TB的解决方案

    厦门海沧区磁盘只有1TB的解决方案 1.为WINDOWS 2008 r2 服务器增加5个1T的硬盘 2.打开命令提示符,并键入 diskpart. 3.在“DISKPART”提示符下,键入 list ...

  10. Java程序执行时间

    第一种是以毫秒为单位计算的.  Java代码  //伪代码 long startTime=System.currentTimeMillis();   //获取开始时间 doSomeThing();  ...