计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

uC/OS-II任务栈处理的一种改进方法

2017-08-28 05:40
导读:理工论文论文,uC/OS-II任务栈处理的一种改进方法应该怎么写,有什么格式要求,科教论文网提供的这篇文章是一个很好的范例: 摘要:在μC/OS-II内核中,各个不同的任务使用独立的堆栈空间,
摘要:在μC/OS-II内核中,各个不同的任务使用独立的堆栈空间,堆栈的大小按每个任务所需要的最大堆栈深度来定义,这种方法可能会造成堆栈空间浪费。本文叙述如何在RTOS中多个任务共用连续存储空间作为任务栈的方法,并详细比较二者的优缺点和适用性。

关于μC/OS-II这个实时内核及其应用已经有很多文章介绍了,对于学习RTOS的人来说,这个系统是很好的学习起点。虽然文献[1]的源代码没有行号和函数名交叉索引表等,给源代码阅读造成一些困难(可使用BC31的grep查找功能,提高阅读效率),好在代码不是很长,前面又有详细的中文说明,对于有一定X86汇编和C语言基础的人来说,仍然可以在不长的时间内掌握。

μC/OS-II内核是一个抢先式内核,可以进行任务间切换,也可以让一个任务在得不到某个资源时休眠一定时间后再继续运行;提供了用于共享资源管理的信号灯,用于进程通信的消息队列和邮箱,甚至提供了存储器管理机制,一个比较全面的系统。

μC/OS-II内核有些地方仍然值得改进,比如该系统不支持时间片调度。如果有一个任务中一段死循环代码(或者条件循环代码),代码就会永远(或长时间)在此处执行,调度程序无法控制,其它任务也就是不到及时执行。这种抢先式实际上和非抢先式系统存在着同样问题。当然,如果这种代码不一个BUG,问题是可以解决的,在不提供时间片调度的抢先式系统中,一般采取信号灯,或者任务主动休眠的方法(对于μC/OS-II,很容易改造成支持时间片调度,只要在定时中断服务程序调用OSIntCtxSw()函数即可);非抢先式系统一般采取有限状态机方法,不使用这种耗时很长的循环代码。不过,无论如何,对RTOS的使用者来说,这毕竟会使得任务函数的编码不能随心所欲。

ΜC/OS-II内核的另外一个值得改进的地方就是其任务栈管理方法。在μC/OS-II内核中,各个不同的任务使用独立的堆栈空间,堆栈的大小按每个任务所需要的最大堆栈深度来定义,这种方法可能会造成堆栈空间的浪费。下面讨论如何在RTOS中多个任务共用一段连续存储空间作为傻堆栈。

(转载自科教范文网http://fw.nseac.com)


1 任务切换要保存的数据

简单地说,一个任务可看作一个运行中的C函数。对于抢先式RTOS来说,在任务切换时,应保存当前任务的各种现场数据。现场数据包括局部变量、各个CPU寄存器、堆栈指针和程序被中止的任务指针。CPU寄存器是任何任务代码均会用到的;而局部变量,一般的编译器是将其它安排在堆栈空间中,堆栈指针也是各任务公用的,所以也需要保存。

对于全局变量,由于一般是在内存中的固定位置,各任务所占用的空间完全独立,所以不需要保存。

在X86环境中,要保存的CPU寄存器共14个16位寄存器;通用寄存器8个(AX、BX、CX、DX、SP、BP、SI、BI)、段寄存器4个(CS、DS、ES、SS)以及指令指针IP和标志寄存器FR各1个。

2 C编译器中变量在堆栈中的位置

对于一个存在函数调用嵌套的C程序来说,大部分编译器将传递的参数和函数本身的局部变量放在了堆栈中,编译器会自动生成压栈(push)和弹栈(pop)代码,以保存上级函数的运行寄存器。

假设函数main()调用funl(),而funl()调用fun2(),则在执行fun2()中的代码时,堆栈映像如图1所示(X86 CPU的情况)。

对于RTOS软件,堆栈中的各种数据就是一个任务的作现场。一般CPU的堆栈指针SP只有一个,在进行任务切换时,必须将挂起任务所使用的堆栈内容保存起来,以便使该任务在下次唤醒时能从原地继续运行。

3 μC/OS-II对任务栈的处理方法与缺陷

μC/OS-II为了保存任务堆栈中的数据,对每个任务定义一个数组变量作为堆栈,在任务切换时,将CPU堆栈指针SP指向该数组中的某个元素,即栈顶,如图2所示。

上一篇:PWM控制电路的基本构成及工作原理 下一篇:没有了