2 - 任务中断,延时,空闲任务(钩子函数)
定时器每隔1ms(间隔tick【/tɪk/ 活动】)发生一次中断,tick中断切换程序
创建任务,启动调度器,后创建的任务先运行(源码里有,新任务优先级>=旧优任务先级则新任务先运行)
可以配置这个间隔时间
也可以指定每个任务每次执行的tick数量
任务 运行态 就绪态 阻塞态(等待某事件发生才能继续) - 暂停(主动或被动)
P11, 使用仿真,对比了实验7和实验8,就是把魔术棒里面的仿真配置频率从12改成了8
P12 vTaskDelay 任务执行时间不定,间隔tick数固定。等待过后成为就绪态
vTaskDelayUntil(T,S) 从某个T时刻开始,延迟S数量的时间 (后成为就绪态),并更新T为当前最新时间 ;
可以指定终点达成周期性执行某任务: 比如从0开始,固定延迟10S,但是任务只执行了4秒就完成了,就得等到10秒后才能进入就绪态,然后不管它执行5秒还是1秒,都会等到下一个10秒周期,才执行
若是执行时间超过10S怎样呢?
=
空闲任务的重要性 (在启动调度器的时候创建空闲任务)
任务A【创建任务B(优先级更高)&杀死任务B{同时负责给B收尸}】,然后任务B开始执行(延迟2tick),两个任务轮流执行,可以无限循环
任务A【创建任务B(优先级更高)】,然后任务B开始执行(自杀)),执行几轮后溢出
原因:自己杀死自己无法给自己收尸(必须由空闲任务完成清理工作释放内存),任务A杀死B后还可以帮B收尸(清理B占用的空间)
空闲任务的钩子函数 , 空闲任务常态:运行&就绪 【这里要注意空闲任务的优先级,不能最低,不然的话永无出头之日】
前面的任务A不给B收尸,任务B又自杀了,可以安排一个“空闲人员” (空闲任务的钩子函数),专门清理那些没人管的实体
//这个钩子函数只是RTOS空闲任务预留的可以自定义内容的一部分,其余工作(清理实体等)核心代码完成了。