上一节讲述了在没有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. Topcoder SRM548 Div 1

    1. KingdomAndTrees 给出n个数a[1..n],求一个数组b[1..n]满足b严格递增,且b[1]>=1. 定义代价为W = max{abs(a[i]-b[i])},求代价最小值 ...

  2. 自以为是而已,不知道它是什么 window.onload 放执行

    var $=jQuery=function(onload){window.onload=onload();} jQuery(function(){alert(2);}); $(function(){a ...

  3. 和菜鸟一起学c之gcc编译过程及其常用编译选项【转】

    转自:http://blog.csdn.net/eastmoon502136/article/details/8162626 版权声明:本文为博主东月之神原创文章,未经博主允许不得转载. 上篇文章,知 ...

  4. python爬虫beautifulsoup4系列1【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/beautifulsoup4/ 前言 以博客园为例,爬取我的博客上首页的发布时间.标题. ...

  5. 给出一个string字符串,统计里面出现的字符个数

    给出一个string字符串,统计里面出现的字符个数 解决方案: 使用algorithm里面的count函数,使用方法是count(begin,end,'c'),其中begin指的是起始地址,end指的 ...

  6. 51nod 1182 完美字符串【字符串排序+哈希】

    1182 完美字符串 题目来源: Facebook Hacker Cup选拔 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 约翰认为字符串的完美度等 ...

  7. Codeforces Beta Round #91 (Div. 2 Only) A. Lucky Division【暴力/判断是不是幸运数字4,7的倍数】

    A. Lucky Division time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  8. Cosmos DB

    类似的数据库还有Google的Spanner. 参考:官网说明 另一个介绍 Key capabilities As a globally distributed database service, A ...

  9. Longest Common Substring($LCS$)

    Longest Common Substring(\(LCS\)) 什么是子序列? 子序列就是某一个序列的不连续的一部分. 如图, \(abcde\)就是图中序列的一个子序列. 公共子序列 公共子序列 ...

  10. 洛谷—— P1680 奇怪的分组

    https://www.luogu.org/problemnew/show/1680 题目背景 终于解出了dm同学的难题,dm同学同意帮v神联络.可dm同学有个习惯,就是联络同学的时候喜欢分组联络,而 ...