位置:51电子网 » 技术资料 » 嵌入式系统

嵌入式系统通用的应用软件结构研究

发布时间:2008/5/27 0:00:00 访问次数:350

摘要:嵌入式实时多任务操作系统在软件编程上有一定的相似性。这种相似的特性,使得我们可以将个别系统的编程经验推广到更多的系统上。本文就μc/os-ii内核的任务管理和内存管理进行基本的介绍,并介绍一个通用的应用软件结构。然后,与之相对应,提供两个不同操作系统下的应用实例。

关键词:嵌入式系统 多任务 编程

引言

嵌入式系统的面向应用特性,使得大多数程序员沉陷于不同的应用中。在进入新的一轮开发后,往往只有一些简单的经验可供参考。为了加快应用的开发进度,有必要研究一种统一的应用软件结构,使开发人员能够通过简单模式套用,简化大量系统研究方面的工作,以加快嵌入式开发人员对新系统的理解和使用。

操作系统μ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—内存分区中内存块的大小,是用户建立该内存分区时指定的;

摘要:嵌入式实时多任务操作系统在软件编程上有一定的相似性。这种相似的特性,使得我们可以将个别系统的编程经验推广到更多的系统上。本文就μc/os-ii内核的任务管理和内存管理进行基本的介绍,并介绍一个通用的应用软件结构。然后,与之相对应,提供两个不同操作系统下的应用实例。

关键词:嵌入式系统 多任务 编程

引言

嵌入式系统的面向应用特性,使得大多数程序员沉陷于不同的应用中。在进入新的一轮开发后,往往只有一些简单的经验可供参考。为了加快应用的开发进度,有必要研究一种统一的应用软件结构,使开发人员能够通过简单模式套用,简化大量系统研究方面的工作,以加快嵌入式开发人员对新系统的理解和使用。

操作系统μ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—内存分区中内存块的大小,是用户建立该内存分区时指定的;

-->
相关IC型号
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!