编程william hill官网
直播中

王桂珍

7年用户 160经验值
私信 关注
[问答]

μC/OS-II内核的任务调度及内存管理,看完你就懂了

μC/OS-II内核的任务调度及内存管理

嵌入式系统的应用软件介绍

回帖(1)

冯敬宇

2021-4-28 10:41:00
  引言
  嵌入式系统的面向应用特性,使得大多数程序员沉陷于不同的应用中。在进入新的一轮开发后,往往只有一些简单的经验可供参考。为了加快应用的开发进度,有必要研究一种统一的应用软件结构,使开发人员能够通过简单模式套用,简化大量系统研究方面的工作,以加快嵌入式开发人员对新系统的理解和使用。
  操作系统μC/OS-II和ECOS(Embedded Configurable OS)是我在研发过程中使用过的两个系统。这两个源码公开的系统是我们研究的基础。开发平台依次是PC机和EP7212开发板。
  1 μC/OS-II内核
  对于一个嵌入式系统内核,我们最关心的是:任务调度、内存管理及时间特性等。这里,只介绍与多任务编程联系最多的任务调度和内存管理。
  1.1 任务调度
  任务的状态有休眠、就绪及运行几种。任务调度就是遵循一定的原则,使多个任务共同使用同一处理机的过程。这一过程主要是通过对任务控制块(TCB)的管理来实现的。
  当一个任务建立时,μC/OS-II系统为其所对应的OS_TCB赋值;当任务的CPU使用权被剥夺时,系统用OS_TCB来保存该任务的状态;当任务重新得到CPU使用权时,系统就可通过任务控制埠来使任务从被中断处继续执行下去。
  在μC/OS-II中,TCB内包含如下基本项:
  *OSTCBStkPtr是一个指向当前任务栈顶的指针,通过允许每个任务拥有自己的栈来减小系统的内存开销;
  *OSTCBNextOSTCBPrev用于任务控制块的双重链接;
  *OSTCBDly用于任务延时或超时限制;
  *OSTCBStat任务的状态字,0表示就绪态;
  *OSTCBPrio任务的优先级,值越小,优先级越高。
  在μC/OS-II中,还有两个与任务调度相关的结构就绪表和估级判定表。就绪表中有两个变量用来存放每个任务的就绪标志。通过分组与优先级表中的项实现一一对应,进而确定进入就绪态的优先级最高的任务。
  任务调度算法原型:
  *关中断;
  *取优先级最高的就绪任务;
  *若不是当前任务,则进行任务切换;
  *开中断。
  任务切换中两步完成:将被挂起的任务的微处理器寄存器堆入栈,然后,将较高优先级的任务的寄存器值从栈中恢复到寄存器中。
  1.2 内存管理
  在嵌入式系统中,为了更高效地使用内存,除了常规的malloc()和free()外,通常提供不同的内存组织形式,以满足特殊应用的需求。ΜC/OS-II中,操作系统把连续的大块内存按分区来管理,每个分区中包含整数大小相同的内存块。利用这种机制,μC/OS-II对malloc()和free()进行改造,使得它们可分配和释放固定大小的内存块,并且使这两个函数的执行时间也固定下来。
  为了使用户能得到需大小的内存块,在一个系统中可以多个内存分区,应用程序可以从不同的内存分区中取得不同大小的内存块。唯一要注意的是,不同的内存块在释放时必须重新放回它以前所属的内存分区。采用上述的内存管理算法,解决了内存碎片的问题。
  为了跟踪每一个内存分区,μC/OS-II使用了内存控制块的数据结构,主要有:
  OSMemAddr—指向内存分区起始地址的指针;
  OSMemFreeList—指向下一个空闲控制块或下一个空闲内存块的指针;
  OSMemBlkSize—内存分区中内存块的大小,是用户建立该内存分区时指定的;
  OSMemB1ks—内存分区中总的内存块数量,是用户建立该内存分区时指定的;
  OSMemNFree—内存分区中当前可以得到的空闲内存块数量。
  在μC/OS-II中,也可以使用常规的malloc()和free()内存管理函数来增强其可移植性,但在使用更严格的场合,应使用系统提供的特殊的内存管理。
  2 应用软件
  2.1 应用软件原型
  对于8051单片机系统的编程,最基本的架构是一个无限循环,应用的所有事情基本上都是在这个超循环中实现的。在这种系统中,系统上只有一个任务在运行,应用就是整个系统,而整个系统就是一个应用。
  与这种简单系统相似,超循环结构在复杂的实时操作系统μC/OS-II中也是一个基本结构;但不再是系统级的,而只是任务级的。图1为超循环的结构示意。
  1.gif
  在一个应用中,至少有一个这样的任务,它包含这样一个超循环,以使其拥有与应用相同的生存期,并由它完成应用的全部或部分功能。图2为应用软件结构框图。
  2.2 基本应用软件结构
  应用软件结构存在不同性,是由应用本身决定的;但作为基本结构,则是相似甚至是相同的。因为对于不同的系统,所调用的函数是不同的。
  下面给出基本应用软件结构的文字描述。
  ①声明系统的包含文件。
  ②声明全局数据:任务数、任务的栈空间等。
  ③主函数:
  *系统初始化;
  *创建主任务;
  *启动多任务执行。
  ④主任务:
  *主任务初始化;
  *若必要,可创立多个子任务;
  *进入超循环或退出主任务。
  ⑤子任务:
  *子任务初始化;
  *进入超循环或退出子任务。
  2.3 应用软件实例
  (1)样例1
  为了简要说明软件结构思想,我们在PC平台、Windows 98系统下,采用了Borland公司的C++命令行编译环境,说明我们的第一应用。
  其中文件的主要功能,就是显示一个HelloμC/OS-II embedded world!字符串。由于其是在μC/OS-II下实现的,与原理有相通性,这里就不再更多介绍了。
  (2)样例2
  使用Cirrus Logic公司的开发板EP7212,运行的操作系统是RedHat公司的ECOS。本应用的主要功能是,把从串口2接收到的数据再发送回去,并且在初始化时加发一个“Hello eCos World!”字符串。
  ECOS是一个比μC/OS-II更复杂的系统,其支持的软件结构更丰富,但其对我们所抽象的软件结构依然支持得很好;只是在我们应用的主函数中,已更好地将系统的初始化部分隐藏了起来。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分