自制嵌入式实时操作系统

    返回首页    发表留言
本文作者:李德强
          第一节 内存规划
 
 

        在这一节中,我们来一起完成嵌入式操作系统的内存规划。我们通常称嵌入式处理器为单片机,意思就是说这样的处理器功能简单,比较适合做单一功能的嵌入式工作。对于单片机来说,通常采用一个主循环来完成所有任务,这对于较为复杂的功能来说开发时比较费力,程序代码逻辑也不太清晰。因此我们需要完成一个可支持多任务的操作系统,嵌入式操作系统与个人电脑中的操作系统不同:

        首先,是内存容量很小,我们使用的Cortex-M3或Cortex-M4处理器的内存大小通常只有几十KB,这与个人电脑中的几百MB、几GB的内存相比要小的多。

        其次,我们使用Cortex-M3或Cortex-M4处理器的内存是操作系统中可以使用的全部内存,并且所有进程可使用全部内存。假设某一个进程越界使用内存并修改了其它进程的内存内容时,会导致其它进程运行出现错误,甚至导致整个操作系统运行错误,或停止运行。这并非是操作系统不够健壮,而是嵌入式的内存架构使得所有进程都可以自由访问所有内存而导致的问题。

        第三,与个人电脑操作系统不同的时,每一个进程使用的内存都是实际的物理内存,内存地址也是实际的物理地址,而非个人电脑中的虚拟内存地址。因此嵌入式操作系统中各个进程所使用内存的总大小不能超过实际内存的大小。而个人电脑操作系统采用虚拟内存技术是中可以使每一个进程都具备与物理内存相同的内存大小的。

        最后,ARM架构下的处理器与Intel架构下的处理器不同,ARM架构的处理器的程序代码是保存在Flash当中的,运行时处理器从Flash中直接运行程序;而Intel架构的处理器需要操作系统将程序代码由外存载入到内存,并占用内存中的代码段来存放程序代码,然后处理器由内存中运行程序。因此ARM架构的处理器不需要将程序由外存载入内存,我们的操作系统也就不需要在内存中为程序代码分配其存储空间,即不需要分配代码段。

        程序在操作系统中运行通常需要两部分内存:代码段和数据段。代码段中存放了程序运行的代码,也就是机器码(或称为机器指令);数据段中存放了程序运行时需要使用的数据内容,即常量、变量等。我们知道ARM架构的处理器当程序代码保存在Flash当中无需载入到内存中,所以我们就不需要考虑代码段内存,只需要将数据段内存合理使用并分配给各个进程即可。实际上嵌入式操作系统中的内核程序、外壳程序以及各个进程程序都将被编译成一个完整、统一的程序被烧录在嵌入式处理器的Flash当中,所以这是一个具有操作系统特性的独立的、单一的程序。我们的内存规划如下图:

        这就是我们嵌入式操作系统中所需要规划的内存分配情况,其中,内存中空闲的区域才是我们这一章需要主要关注的地方,我们在前面内容中已经讲述在创建一个进程任务时,需要为这个进程分配其栈内存,而这个栈内存就是由操作系统在堆内存中找到一块大小合适的内存并分配给申请者的。其中涉及到内存的分配算法和回收算法。我们将在后续章节中继续讲述这些内存动态分配和回收算法。

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号