UCOSII学习之路1 - 任务创建、删除、挂起、解挂

admin 2018-09-16 阅读


版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u014170207/article/details/72853556

前言

今天看到一年前关于UCOSII的相关博文,原计划是发表整个系列的,但是由于各种原因+作者比较懒,一直拉下了,但是一部分已经完成了初稿,就此发表吧!谬误之处敬请原谅。也提醒自己,做事一定要有始有终。

 

正文

统计任务:用于每秒计算一次CPU单位时间内被使用的时间,并把结果以百分比的形式存放在变量OSCPUsage中。
           用户使用统计任务配置:OS_CFG.H中配置常量OS_TASK_STAT_EN=1,同时程序中调用OSStatInit()对统计任务初始化
空闲任务:UCOSII规定一个用户任务必须存在一个空闲任务OSTaskIdle();其在CPU无任务执行时被执行

:OSTCBFreeList为指向空闲控制块链表的指针。
       OSTTCBList为指向当前任务控制块链表的指针

在创建一个任务及OSTaskCreate()初始化
任务状态存放在任务控制块OSTCB->OSTCBSat中
其状态值有
OS_STAT_RDY       表示任务处于就绪状态
OS_STAT_SEM       表示任务处于等待信号量状态
OS_STAT_MBOX     表示任务处于等待消息邮箱状态
OS_STAT_Q          表示任务处于等待消息队列状态
OS_STAT_SUSPEND  表示任务处于被挂起状态
OS_STAT_MUTEX    表示任务处于等待互斥型信号量状态


            在创建时初始化两个任务块链表:一条为空任务链表和一条任务块链表系统在初始化时以通过OSInit()创建了OS_TCB结构类型的数组OSTCBT1[]空链表长度为OS_MAX_TASKS+OS_N_SYS_TASKS(OS_MAX_TASKS定义在CFG.H指明用户任务的最大数,OS_N_SYS_TASKS定义在UCOS_II.H中指明系统任务数(空闲任务和统计任务))  ,OSTCBPrioTab1[]用于存放优先级任务指针(加快对任务块的访问) ,同时为了方便增加OSTCBCur指向当前运行任务


任务就绪表
任务就绪表其实就是一个INT8U的数组OSRdyTab1[];为了便于查找,定义INT8U OSRdyGrp; 优先级与就绪表的关系图,就绪表登记以及OSMapTb1[]加速机制
 
正常操作:

OSRgyGap |= (prio>>3)+1;
OSRdyGap[prio>>3] |= (prio&0x07)+1;


耗费了计算周期
注销应该为负号改为~

最高优先级查询
采用OSUnMapTal[]查表计算运算
OSUnMapTal[]的由来和查表原理:其实这些数据就是0~255数据字节从低位到高位中(即从右到左)第一个被置1的位的位置。具体过程如下:(大家可以对照源码中OSUnMapTal数组)
0x00 ==00000000b 最低位为1的位数为 bit0==0==OSUnMapTal[0](其实为空,空的情况默认为0,不影响计算)
0x01 ==00000001b 最低位为1的位数为 bit0==0==OSUnMapTal[1]
0x02 ==00000010b 最低位为1的位数为 bit1==1==OSUnMapTal[2]
0x03 ==00000011b 最低位为1的位数为bit0==0==OSUnMapTal[3] (有两个为1的位,bit0,bit1,取最小的,因为OSRdyGrp或OSOSRdyTbl中最小的位数 对应的优先级越大)
0x04 ==00000100b 最低位为1的位数为 bit2==2==OSUnMapTal[4]
0x05 ==00000101b 最低位为1的位数为 bit0==0==OSUnMapTal[5]
0x06 ==00000110b 最低位为1的位数为 bit1==1==OSUnMapTal[6]
0x07 ==00000111b 最低位为1的位数为 bit0==0==OSUnMapTal[7]
0x08 ==00001000b 最低位为1的位数为 bit3==3==OSUnMapTal[8]
0x09 ==00001001b 最低位为1的位数为 bit0==0==OSUnMapTal[9]
0x0A ==00001010b 最低位为1的位数为 bit1==1==OSUnMapTal[10]
0x0B ==00001011b 最低位为1的位数为 bit0==0==OSUnMapTal[11]
0x0C ==00001100b 最低位为1的位数为 bit2==2==OSUnMapTal[12]
0x0D ==00001101b 最低位为1的位数为 bit0==0==OSUnMapTal[13]
0x0E ==00001110b 最低位为1的位数为 bit1==1==OSUnMapTal[14]
0x0F ==00001111b 最低位为1的位数为 bit0==0==OSUnMapTal[15]
……..

直到0XFF,及形成OSUnMapTal[]

UCOSII的调度器:任务级调度器和中断级调度器,分别以OSSched()和OSInitExt()来实现
调度器上锁OSSchedLock()和OSSchedUnLock()解锁
OSLockNesting记录嵌套上锁的次数

任务挂起和恢复
注:任务挂起和恢复不可用于空闲任务
挂起函数:OSTaskSuspend();   恢复函数:OSTaskReSume();
 

任务的创建
原则:
1、 任务调度前必须建立至少一个任务
2、 任务不能再中断服务函数ISR中建立


栈空间检验的条件:
1、 以OSTaskCreateExt函数创建

任务删除
原则:
1、 不能再中断服务函数中删除
2、 OS_PRIO_SELF为宏0XFF,用于任务计算自己的栈空间和删除自己等作用


源码分析:

后期补充吧~~

声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。