01 - K_TMO与K_IVL的区别
调用os_wait() / os_wait2()
指定K_TMO / K_IVL
参数都能让任务进入waiting状态,然后等待一段时间后恢复到ready状态,K_TMO和K_IVl
的区别有:
1、计算的起点:K_TMO
是以当前调用wait / wait2
的时间为起点,K_IVL
是以上一次任务结束为起点。
2、是否包含任务本身执行时间:K_TMO
不包含,K_IVl
包含。
通过一个时序图说明情况,如下图,有3个任务,分别是task_0/1/2
,假设3个任务的自身执行时间task_x code = 1ms
:
task_0
没有调用任何阻塞API。
task_1
使用K_TMO
参数等待3ms超时。
task_2
使用K_IVL
等待3ms间隔。
并假设调度器先按照task_0、task_1、task_2
的顺序调度任务:
- task_0先执行1ms,SysTick=1
- task_1执行1ms,然后等待3ms超时,SysTick=2
- task_2执行1ms,然后等待3ms间隔,SysTick=3
- task_0执行2ms,此时只有task_0可执行,故连续执行2ms,SysTick=5
- task_2执行1ms,注意,由于K_IVL包含任务自身执行时间,离上一次task_2结束已经过去2ms,所以接下来要执行task_2,SysTick=6
- task_1执行1ms,task_1等待的时间已经到了并且超时,所以执行task_1,SysTick=7
- task_0执行1ms,SysTick=8
- task_2执行1ms,离上一次task_2结束已经过去2ms,接下来执行task_2,SysTick=9
……
能够观察到,K_TMO是超时的意思,它能够保证一定会等到足够的时间,但是不一定准确,时间轴上可能是不连续的,比如上图而言,task_1
只在SysTick=11
的时候准确等待了3ms,而前面SysTick=6
的时候等待了4ms。
K_IVL保证间隔的时间是准确的,在时间轴上是连续的。对于code = x(ms),wait() / wait2() = y(ms)
,调用API后,K_TMO
将在 >=(x+y) 的时间执行完成,K_IVL
将在 y 时间执行完成。
想超时等待一段时间,用K_TMO,想做周期性动作,用K_IVL(官网文档:http://www.keil.com/support/docs/451.htm)。
02 - 总结
- 想超时等待一段时间,用
K_TMO
,想做周期性动作,用K_IVL
- 01-【RTX51 Tiny入门】-RTX51 Full & Tiny简介
- 02-【RTX51 Tiny入门】-资源占用情况
- 03-【RTX51 Tiny入门】-内核组成
- 04-【RTX51 Tiny入门】-任务和调度器
- 05-【RTX51 Tiny入门】-OS API函数
- 06-【RTX51 Tiny入门】-查看RTX51 Tiny官方例程
- 07-【RTX51 Tiny入门】-使用RTX51 Tiny
- 08-【RTX51 Tiny入门】-Conf_tny.A51配置文件
- 09-【RTX51 Tiny初级】-K_TMO与K_IVL的区别和使用场合
- 10-【RTX51 Tiny初级】-os_send_signal()和os_set_ready()的区别和使用场合
- 11-【RTX51 Tiny初级】-os_wait和os_switch_task区别和使用场合
- 12-【RTX51 Tiny初级】-解决多重调用问题(MULTPLE CALL TOSEGMENT)
- 13-【RTX51 Tiny高级】-进行Task的划分与拆分
- 14-【RTX51 Tiny高级】-修改默认产生时间片的定时器T0为其它定时器
- 15-【RTX51 Tiny高级】-考虑Round-Robin的开启与关闭
- 16-【RTX51 Tiny高级】-解决Task之间的通讯和耦合问题
- 17-【RTX51 Tiny高级】-Task ID隐藏的优先级问题
- 18-【RTX51 Tiny高级】-系统架构的设计