uCOS/ii 学习心得及体会,如果搞明白了这些问题,对uCos-II的理解就会上一个层次。但是
1、首先发布 任哲的《嵌入式实时操作系统uCOS-II原理及应用》这本书非常适合初学者学习 uCOS-ii
2、 请问:空闲任务和统计任务是否建立任务控制块呢?
任务块链表中是否存在空闲任务和统计任务的任务控制块呢?如果没有的话,操作系统如何调度呢?
标准答案:
在uCOS/ii内核中,调用OSInit()函数中会首先创建空闲任务,同时当用户“允许”统计任务时,也会接着创建统计任务。
因此任务块链表中存在空闲任务和统计任务的任务控制块。
3、 请问:为什么有了正在使用任务控制块链表OSTCBList和空闲任务控制块链表OSTCBFreeList,还要再定义OSTCBPrioTbl[]呢?
标准答案:
数组OSTCBPrioTbl[]是以任务号为索引,里面保存的任务0到最大任务的任务控制块(TCB)的首地址,据此可以通过任务优先级号(任务号)快速找到当前任务在任务控制块中的首指针,而不必到任务控制块链表中一步一步的查找,加快访问时间。加快任务切换时间。
4、 uCOS/II中,能够引起任务调度的系统函数有哪些?
(1)、OSStart() uCOS/II启动
(2)、OSTaskSuspend()挂起任务
(3)、OSTaskResume()恢复任务
OSTimeDly()/OSTimeDlyHMSM()、等待一个事件的发生(包括OSSemPend(), OSMutexPend, OSFlagPend, OSMboxPend(), OSQPend(),
5、 请问:既然有了任务就绪表INT8U OSRdyTbl[64],为什么还要再定义
INT8UOSRdyGrp[8]呢?这样做的好处是什么?
标准答案:
OSRdyTbl[64]是任务就绪表,当表中 元素的值=1时,表示 任务处于就绪状态。 例如: OSRdyTbl[0]= 1,则表示:任务级别号=0的任务处于就绪状态,可以被调度器立即置于“运行态”。
为了节省查找时间(如果让操作系统每次查找处于就绪状态的最高优先级别的任务时,都从下标0开始查找,有点太浪费时间了),因此又专门定义了一个数组OSRdyGrp[8]。
其中:
(1)、OSRdyGrp对应OSRdyTb~OSRdyTbl
(2)、OSRdyGrp对应OSRdyTb~OSRdyTbl
(3)、OSRdyGrp对应OSRdyTb~OSRdyTbl
这样,每次查找就绪表中最高优先级别的任务,就可以这样查找,首先查找依次从OSRdyGrp~OSRdyGrp开始查找不等于0的项,假如OSRdyGrp >=1,则表示任务号8到任务号15有级别最高的就绪任务。
最终查找范围从0-64缩小到8-15。最终节省了查找时间。
6、 请问:任务调度的核心是什么?
标准答案:
在多任务操作系统中,命令CPU中止当前正在运行的任务转而去运行另外一个任务的工作叫做任务切换。
任务调度主要完成两个工作:
(1)、在任务就绪表中查找具有最高优先级别的就绪任务。
(2)、实现任务切换
说的更明白一些,就是将找到的的最高优先级别的任务的“任务号”---> “当前任务的任务号OSPrioCur”;从OSTCBPrioTbl[]取出最高优先级别任务的任务控制块首地址---> “当前任务的任务控制块指针OSTCBCur”
最后调用OS_TASK_SW()完成现场切换(即将CPU的寄存器信息保存到当前正运行任务的私栈中,然后从待运行的高优先级别的任务私栈中弹出原先保存寄存器信息到CPU)。
//-----------------------------------
OSPrioCur 是全局变量,用于保存当前正在运行任务的任务号
OSTCBCur是全局变量,用于指向当前正在运行任务的任务控制块首地址。
7、任务切换的关键:其实是堆栈的切换。
切换时:
(1)、第一步:将当前CPU的SP寄存器的值保存到“待中止任务”的任务控制块中。即保存到结构体OS_TCB的OSTCBStkPtr成员中。
(2)、第二步:从“待运行任务”的任务控制块的OSTCBStkPtr成员中取出待运行任务的堆栈指针,然后送给CPU的SP寄存器。
8、(OSTCB *)1 是什么意思
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_601575S913JU.JPG
(原文件名:OSTCB_1是什么意思.JPG)
9、 启动任务函数OSStart()之前必须遵守的约定:
uCOS/II运行之前,必须调用系统函数OSStart()。▲▲▲此时切记:
调用系统函数OSStart()之前,“必须”已经创建了一个任务,并赋予它最高优先级别,从而使它成为起始任务;然后在这个起始任务中,再创建其它“低优先级别”的任务。
10、 什么时候开启全局中断?
(1)、由于启动任务函数OSStart()之前必须遵守的约定:
在调用系统函数OSStart()之前,先创建一个任务,并赋予它最高优先级别,从而使它成为起始任务;然后在这个起始任务中,再创建其它任务。
(2)、因此执行系统函数OSStart()后,uCOS/II会自动调度用户创建的最高优先级别的任务,所有在这个“最高优先级别的任务”中开启全局中断最合适。
例如:下面的例子为:在系统函数OSStart()之前,创建了一个“最高优先级别的任务”TaskStart()--->
OSTaskCreate(TaskStart,......)
因此在TaskStart()任务首次被调度时,开启全局中断。
注意:千万不要在系统函数OSStart()之前开启全局中断,否则操作系统会崩溃。因为此时uCOS/II内部环境还没有完全初始化完成。
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_601579BAYW4A.JPG
(原文件名:什么时候开启全局中断.JPG)
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_601580POISZ1.JPG
(原文件名:OS_EXIT_CRITICAL()就是开启全局中断.JPG)
11、 执行系统函数OSStart()的时候,为什么还要增加如下的条件:
if (OSRunning == FALSE)
{
,,,,,,,,,,,,,,,,
}
此时应该没有任务被调度呀(即:OSRunning 应该等于 FALSE)!
只有当执行了系统函数OSStartHighRdy()的时候,即调度最高优先级别任务的时候,才置 OSRunning = TRUE。
难道我的理解错了吗?
为什么呀!
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_601581OPD2C7.JPG
(原文件名:执行OSStart()的时候,为什么需要判断 if (OSRunning == FALSE) 呢?.JPG)
12、uCOS/II中所说的中断服务程序调度,是否仅仅是指时钟节拍中断服务程序呢?
例如:是否仅仅时钟节拍中断服务程序中才能调用OSIntExit(),串口中断服务中不允许调用OSIntExit()进行任务调度呢?
一般用户程序,例如:串口中断服务程序是否
(1)、不能调用系统函数 : OSIntExit()进行任务调度
(2)、可以调用系统函数 : OSIntExit()进行任务调度,也可以不调用系统函数 : OSIntExit()进行任务调度。 沙发 mark 问题11和问题12 请帮忙完善 mark mark ba_wang_mao ,可以告知QQ号码吗?我是初学,想交流交流,谢谢 回复【3楼】ba_wang_mao
问题11和问题12 请帮忙完善
-----------------------------------------------------------------------
对于问题11:我觉得它这样检查是因为防止你在任务启动前已经开启了全局中断!
还有对于这个问题,我补充一点,并非在多任务启动之前开启了全局中断OS就一定会崩溃!而是可能!这个我做过实验!
问题12:其他中断中也可以放入OSIntExit()进行任务调度 ,因为你的中断可能使优先级更高的任务进入就绪状态!比如发送一个信号量、消息邮箱、消息队列之类的!所以退出中断需要调用任务调度函数! mark 希望楼主分享下 注释了的版本 哈哈 回复【9楼】ksniper
希望楼主分享下 注释了的版本 哈哈
-----------------------------------------------------------------------
注释的版本,论坛里不是有吗?你可以搜索一下 钟常慰 第5个不敢苟同,ucos优先级的查找根本不是顺序查找,只需要2个周期就可以找到最高优先级任务,而不是8-15,之所以分组有两个用途,第一,优先级可以分成8类大优先级,每个下面分成8个小优先级;第二,也是比较主要的原因,节省rom空间。如果用64的话,如果全部映射优先级索引的话,在64位机上面还是比分组更快的,但是,一般都用8,16,32位单片机,所以还是分成组更加快速。这样只需要增加256字节的rom空间来做优先级映射了,2次寻址即可得到最高优先级任务id 回复【11楼】lixivip
第5个不敢苟同,ucos优先级的查找根本不是顺序查找,只需要2个周期就可以找到最高优先级任务,而不是8-15,之所以分组有两个用途,第一,优先级可以分成8类大优先级,每个下面分成8个小优先级;第二,也是比较主要的原因,节省rom空间。如果用64的话,如果全部映射优先级索引的话,在64位机上面还是比分组更快的,但是,一般都用8,16,32位单片机,所以还是分成组更加快速。这样只需要增加256字节的rom空间来做优先级映射了,2次寻址即可得到最高优先级任务id
-----------------------------------------------------------------------
楼上分析的对,UCOS建立一个存放在ROM的256字节的表,只需要两次查询此表就可以得到就绪表中最高的优先级! 6、嵌入式实时操作系统μCOS-II原理及应用 任哲编著
非常适合UCOSII没有入门的初学者
点击此处下载 ourdev_601952XL8KX2.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part01.rar)
点击此处下载 ourdev_601953GZ7KDJ.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part02.rar)
点击此处下载 ourdev_601954YRUE2W.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part03.rar)
点击此处下载 ourdev_601955TFDROX.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part04.rar)
点击此处下载 ourdev_601956GXJ5YW.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part05.rar)
点击此处下载 ourdev_601958VGC8OX.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part06.rar)
点击此处下载 ourdev_601959KGVHXL.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part07.rar)
点击此处下载 ourdev_601960AOS7EJ.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part08.rar)
点击此处下载 ourdev_601961KBRX0W.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part09.rar)
点击此处下载 ourdev_601962LBEKRO.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part10.rar)
点击此处下载 ourdev_602016V5P4KS.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part11.rar)
点击此处下载 ourdev_602025DUXDC9.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part12.rar)
点击此处下载 ourdev_602030D5K1VO.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part13.rar)
点击此处下载 ourdev_602027UOKNMN.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part14.rar)
点击此处下载 ourdev_602028ZZDTGE.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part15.rar)
点击此处下载 ourdev_602029M8AOOM.rar(文件大小:1.39M) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part16.rar)
点击此处下载 ourdev_602026QJW72Q.rar(文件大小:826K) (原文件名:难点标记-嵌入式实时操作系统μCOS-II原理及应用 任哲编著.part17.rar)
7、基于嵌入式实时操作系统的程序设计技术 第四章 周航慈 编著
如果能找到这本书,如果ucOSii入门后,这本书可以引领你快速掌握ucosii编程技巧。
这本书着重介绍如何编写uCOSii应用程序(网上的其它书着重介绍ucOSii原理)
点击此处下载 ourdev_601938EOEZK3.pdf(文件大小:441K) (原文件名:基于嵌入式实时操作系统的程序设计技术 第四章 周航慈 编著.pdf) 谢谢7楼和11楼的解释。
学习uCOS/II已经有一段时间了,基本上对uCOS/II有了一些认识(原先有操作系统原理的基础,因此学习uCOS/II时比较容易上手)。但是由于工作上的原因。至今还没有用uCOS/II编写过实际工程。
这段时间,决心再深入到uCOS/II内核对它有一个更全面的认识,包括运行过程中的每个细节。
还有如何把前后台程序的实现过程搬到多任务环境下,也需要一个磨合期。 基于嵌入式实时操作系统的程序设计技术这本书很便宜的才十几元钱,我也打算买一本! mark 回复【13楼】ba_wang_mao
6、嵌入式实时操作系统μcos-ii原理及应用 任哲编著
非常适合ucosii没有入门的初学者
点击此处下载(原文件名:难点标记-嵌入式实时操作系统μcos-ii原理及应用 任哲编著.part01.rar)
点击此处下载(原文件名:难点标记-嵌入式实时操作系统μcos-ii原理及应用 任哲编著.part02.rar)
点击此处下载(原文件名:难点标记-嵌入式实时操作系统μcos-ii原理及应用 任哲编著.part03.rar)
点击此处下载(原文件名:难点标记-嵌入式实时操作系统μcos-ii原理及应用 任哲编著.part04.rar)
点击此处下载......
-----------------------------------------------------------------------
已经拍了一本在淘宝上!
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_602770SKC4C2.jpg
(原文件名:QQ截图未命名.jpg) mark 楼主说的没错,是应该认真看看每个细节。我研究也不深交流下:
1.楼主第5点,真的理解有错,建议赶紧看原代码,没有INT8UOSRdyGrp[8],和INT8UOSRdyTbl[64],OSRdyGrp没有数组,只是一个变量,类型看任务数。OSRdyTbl这个也根据任务数,且跟OSRdyGrp匹配的。
2.调用OSStart之前,没有说不能开中断的,可以开,且同时可以中断,就看你中断你怎么写,只要这时候中断用得是公共堆栈就没问题,就跟裸奔一样的。之所以会崩溃时因为,这个时候函数不属于哪个任务,没有独立堆栈。
3.OSStart之前可以建N个任务,并非一个。
4.中断推出需不需要调用IntExit是看你这个中断服务有没有就绪哪个任务,假如没有,当然不要去调用,浪费时间。当然这是IntEnter也不要了。 dddddddddd mark 正在学习 4、 uCOS/II中,能够引起任务调度的系统函数有哪些?
OSTaskCreate()也会造成任务调度 markhh 好贴,标记。 任哲扫描版的效果实在不清析,像是看雾。有机会还是买本纸版吧。 支持了 mark 回复【楼主位】ba_wang_mao
-----------------------------------------------------------------------
对于第9条,为什么说:
/*调用系统函数OSStart()之前,“必须”已经创建了一个任务,并赋予它最高优先级别,从而使它成为起始任务;然后在这个起始任务中,再创建其它“低优先级别”的任务。”*/
任务里面创建任务,那么第一个外围的任务岂不是一直在做创建任务的工作? mark 不错 好贴,感谢! mark mark 回复【2楼】wenfeiexe
mark
----------------------------------------------------------------------- 以上的12个问题我都明白
可是要我做一个产品我不知道怎么下手 mark 回复【28楼】wangxj_nemo 嘿嘿,,,
-----------------------------------------------------------------------
你可以在循环外面做啊 mark 谢谢分享 感谢楼主分享了注释的版本,那个任哲的《嵌入式实时操作系统uCOS-II原理及应用》可以去百度文库去下
呵呵 mark 好! mark mark mark!不錯! 太好了,谢谢分享 mark 好贴 好贴 mark 果断mark 谢谢分享 学习,感谢分享 回复【楼主位】ba_wang_mao
-----------------------------------------------------------------------
12、uCOS/II中所说的中断服务程序调度,是否仅仅是指时钟节拍中断服务程序呢?
(2)、可以调用系统函数 : OSIntExit()进行任务调度,也可以不调用系统函数 : OSIntExit()进行任务调度。
一:
如果在ISR中调用了和OSIntNesting相关的uCOS函数,就必须在ISR开始OSIntNesting++,
在ISR结尾OSIntNesting--或者OSIntExit()。
二:
如果在ISR中没有用到和OSIntNesting相关的uCOS函数(所有的ISR,除节拍器外),就可要可不要了。
不要的话ISR程序反而更加简洁。在ISR末尾执行OSIntExit()从而进行的任务切换并不是必须的。
三:
节拍器的ISR必须OSIntExit(),优先级设置为最低。 remind mark 在参考17楼所言周航慈的书 mark mark 回复【28楼】wangxj_nemo嘿嘿,,,
-----------------------------------------------------------------------
可以在建立完任务之后把自己给删除,或者只是在任务的for(;;)前面建立任务,这样的话就不会一直在建立任务了。 12:我觉得应该调用OSIntExit()来进行退出中断程序,因为有可能在中断的时候是一个更高的优先级的任务处于就绪态,这样的话中断结束之后就可以去执行优先级更高的任务了。 路过,支持一把 MARK mark 下 OSStart之前最好要建立一个任务
还有建立的第一个任务最好就是专门管理任务建立的,然后用完就吧自己删了
这是任哲老师书上建议的 挺好!学习了!! 学习了! mark! 看了一下,觉得受益颇多,感谢!同时觉得ucos真是不大适合RAM紧张的机子使用~ mark 学习! 正在看邵贝贝的那本书,准备看完了再买本周航慈的看看。
现在还懵懵懂懂的,希望看完了能有个较为清晰的理解。 虽然我的板子上uCOS-II已经一致成功了,感觉还没入门,这下好了 mark mark mark mark 好贴,顶 Mark!! mark 时间啊,TCP搞了之后上这个,MARK下 mark 看源代码最好了,ucos内核源代码还比较小的, mark 太好了,谢谢分享 这本书以前看过,非常的好! mark!!!! mark mark 楼主能把你的嵌入式实时操作系统μCOS-II原理及应用发给我吗,上面链接下载来的不完全,解压不了,谢谢啦423286565@qq.com mark 谢谢,顶! 收藏。 标记下 慢慢看 mark 慢慢理解 学习了.. 好东西。。
帮不上。。没搞明白 还不会,等学习了再来讨论吧…… mark MARK
页:
[1]
2