uCOS-II学习心得(-) 堆栈的处理
uCOS-II学习心得(一)——堆栈的处理
glen_cao@126.com 2009-9-11
引言
使用uCOS-II来进行嵌入式产品的研发,使得软件的开发时间大大缩短,同时相对于linux学习入门比较简单。这也是近年有较多的工程师对此研究的一个重要原因。uCOS-II在产品研发过程中的优缺点有些文章已经作了较为深入的论述,我们就不再讨论。笔者在学习uCOS-II的过程中参考了邵贝贝教授编译的(《嵌入式实时操作系统uC/OS-II(第2版)》)书籍,给予我较为多的启示,同时也建议初学者尽量拥有一本作为参考资料。笔者认为作为uCOS-II的应用者(以区别研究人员),首先要搞清楚任务切换是如何进行的,这关乎到移植的成败。而任务的切换的关键点在于堆栈的处理。任务切换的处理集中在OS_CPU_A.asm文件中。接下来,我们分两种情况来讨论。
一、任务级切换时堆栈和处理(OSCtxSw)
uCOS-II的最小运行单位为任务,而任务的运行过程中不会主动放弃CPU的使用权,除非遇到以下情况之一。主动调用系统延时函数OSTimeDly()/OSTimeDlyHMSM()、等待一个事件的发生(包括OSSemPend(), OSMutexPend, OSFlagPend, OSMboxPend(), OSQPend(),以下涉及的OS???Pend()即为上述几个等待/挂起函数之一)以及有中断打断了当前任务的运行且有更高优先级任务进入就绪态。我们把中断导致任务切换以外的任务切换称为任务级切换,而中断导致的任务的任务切换称为中断级任务切换。
uCOS-II总是运行就绪态中优先级最高的任务,即任务切换实际上是更高优先级任务进入了就绪态。而任务切换的实际上可分两步完成,1)将被挂起任务的处理器寄存器推入堆栈;2)将较高优先级任务的寄存器值从栈中恢复到寄存器中。在uCOS-II中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有处理器的寄存器都保存在堆栈中。我们对此作一下说明:
void TaskA (void * pdata)//优先级2 void TaskB (void *pdata)//优先级3
{ {
while(1) while(1)
{ {
… …
… …
… …
OS???Pend();// (1) OS???Pend(); // (2)
… …
… …
… …
OS???Post(); OS???Post();
} }
} }
假如任务(TaskA)在(1)处期待某一事件发生,而此事件恰又没有发生,那么TaskA就要被挂起,让其它就绪态更高优先级的任务如TaskB运行,即运行就绪态最高优先级任务。然而,TaskA等待的事件一旦到来,TaskA便进入就绪态。当TaskA再次获得CPU的使用权(假如TaskB挂起),我们希望TaskA从(1)处接着往下执行,而不是从头开始。那么在任务切换(如:从TaskA切换到TaskB)时就要保存TaskA任务的信息,如当前的PC指针、程序状态字等保存到用户堆栈中。而对于即将运行的TaskB则要从用户堆栈中恢复到系统堆栈,这样就可以保证TaskB从中断处继续运行。我们将其分成两步,
1)先保存TaskA的信息,如下图所示:
http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_480045.png
(原文件名:图1.png)
图1 把当前任务栈保存到TaskA的用户栈
2)把TaskB任务的用户堆栈恢复到系统堆栈
http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_480046.png
(原文件名:图2.png)
图2 把TaskB任务的堆栈恢复到系统栈中
这样的话,整个任务切换过程就完成了。 未完待续,其实我已经写到日记本中了,只是还没有录入罢了。 顶,期待后续!! 期待,学习了。 glen_cao
顶,期待后续!! 由于编辑贴子时有诸多不便,比如在WORD下编辑正常的文档,复制到这里会出问题,因此
把本人的原始版发给大家。但愿能为初学者提供些许帮助,不胜欣慰。
ourdev_482327.doc(文件大小:52K) (原文件名:uCOS-II学习心得(一).doc) 哈哈,我也在学uC/OS-II.支持一下. 谢谢楼主,希望能够继续传授经验 >>>>>>> 【7楼】 barryyan2007 谢谢楼主,希望能够继续传授经验
更多的心得会在日后的学习过程中贴出, 呵呵!
心得第一部分已经写完了,欢迎批评指导! 支持
谢谢 在51内核移植的几个关键文件贴上来,其实是根据杨屹先生的版本改的,由于本人移植的是2.52版本,
减缩了杨先生的版本的复杂度,由于个人不是很乐意他的函数注解及书写格式,故把他的名字及其它无用信
息删去,在此谨明。
点击此处下载 OS_CPU.H(文件大小:3K) (原文件名:OS_CPU.H)
点击此处下载 OS_CPU_A.ASM(文件大小:11K) (原文件名:OS_CPU_A.ASM)
点击此处下载 OS_CPU_C.c(文件大小:12K) (原文件名:OS_CPU_C.c) 顶 正想学习UCOS 顶!!!! mark mark MARK! 顶,期待后续!! 支持一下 强烈支持楼主。
顶!!!! 学习了。期待后续,一定要哦!! 支持! 借此题发一文件《嵌入式系统构件》,UCOS的作者写的,现在绝版了。或许可以给学习UCOS的朋友们一点帮助
嵌入式系统构件.part1.rar(文件大小:6.25M) (原文件名:嵌入式系统构件 .part1.rar)
嵌入式系统构件.part2.rar(文件大小:5.14M) (原文件名:嵌入式系统构件 .part2.rar) 谢谢楼主分享,学习一下
另外,楼上的附件无法下载,显示网页不存在。不知道什么问题 顶一下,以前看过,哎,不搞这个了
我也在南京 点击此处下载 ourdev_490623.pdf(文件大小:13.16M) (原文件名:嵌入式系统构件.pdf) 感谢楼主, 等待楼主后续 ddddddddddd 支持一把.... 要学习楼主的奉献精神 值得学习。。。 很不错,这段话可以节省我几天时间的,谢谢噢! 学习了,谢谢楼主! 非常感谢 感谢楼主 支持原创!! 谢谢楼主的辛勤劳动!! 这个要顶,正想了解一下 看完此贴,感觉楼主对任务切换认识深刻,最近小弟也在看任务切换,不过遇到几个问题,不能理解,还望大哥给予指教。我给一个链接如下(关于任务切换的问题):
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4452318&bbs_page_no=1&bbs_id=3004 ZHICHI 支持啊 不错 看完了,楼主的分析很明了! mark mark MARK 学习中,真的很感激! 不知道论坛上的朋友有没有在DSP上移植ucos代码的经历,有的话大家讨论下! mark! mark!!51移植 好东西啊 支持楼主!!!!谢谢楼主分享!!!! 楼主讲的真的不错啊!看了这个,让我也想到要自己写好笔记啊!
MARK {:biggrin:}mark,最近也在研究任务系统。
页:
[1]