抢占式调度
每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,比如 os_dly_wait
在 RTX 的配置向导中禁止使用时间片调度,那么每个任务必须配置不同的优先级。
当 RTX多任务启动执行后:
- 首先执行的最高优先级的任务 Task1,Task1 会一直运行直到遇到系统阻塞式的 API 函数,比如延迟,事件标志等待,信号量等待,Task1 任务会被挂起,也就是释放 CPU 的执行权,让低优先级的任务得到执行。
- RTX 操作系统继续执行任务就绪列表中下一个最高优先级的任务 Task2,Task2 执行过程中有两种情况:
- Task1 延迟时间到,接收到信号量消息等方面的原因,在抢占式调度器的作用下,Task2 的执行会被 Task1 抢占。
- Task2 会一直运行直到遇到系统阻塞式的 API 函数,比如延迟,事件标志等待,信号量等待,Task2任务会被挂起,继而执行就绪列表中下一个最高优先级的任务。
- 如果用户创建了多个任务并且采用抢占式调度器的话,基本都是按照上面两条来执行。根据抢占式调度器,当前的任务要么被高优先级任务抢占,要么通过调用阻塞式 API 来释放 CPU 使用权让低优先级任务执行,没有用户任务执行时就执行空闲任务。
时间片调度
每个任务都有相同的优先级,任务会运行固定的时间片个数直到遇到系统阻塞式的 API 函数,比如os_dly_wait
在小型的嵌入式 RTOS 中,最常用的的时间片调度算法就是 Round-robin 调度算法。这种调度算法可以用于抢占式或者合作式的多任务中,时间片调度适合用于不要求任务实时响应的情况下。
实现 Round-robin 调度算法需要给同优先级的任务分配一个专门的列表,用于记录当前就绪的任务,并为每个任务分配一个时间片(也就是需要运行的时间长度,时间片用完了就进行任务切换)。
合作式调度
每个任务都有相同的优先级,而且时间片调度要被禁止。任务会一直的运行直到遇到阻塞式的 API 函数,比如 os_dly_wait
或者用户调用函数 os_tsk_pass
对于同优先级的任务,如果用户将 RTX 系统配置向导中时间片调度关闭后,这些同优先级的任务就是在合作式调度器的作用下运行。其表现出来的效果就是这些同优先级的任务会依次执行,每个任务会一直执行直到遇到阻塞式 API 函数或者函数 os_tsk_pass ()
就会切换到下个任务,这就是 RTX 中所说的合作式调度器。