调度
内核的基于优先级的调度程序允许应用程序的线程共享CPU。
概念
调度程序确定允许在任何时间点执行哪个线程;此线程称为当前线程。
当调度程序有机会更改当前线程的身份时,会有不同的时间点。这些点被称为重新调度点。一些可能的重新调度点有:
- 线程从运行状态到挂起或等待状态的转换,例如通过
k_sem_take()
或k_sleep()
。 - 将线程转换到就绪状态,例如通过
k_sem_give()
或k_thread_start()
- 在处理了一个中断后,将返回到线程上下文
- 当一个正在运行的线程调用
k_yield()
时 - 当线程主动启动将自身转换为挂起或等待状态时,它会休眠。
每当调度程序更改当前线程的标识时,或者当当前线程的执行被ISR替换时,内核将首先保存当前线程的CPU寄存器值。当线程稍后恢复执行时,这些寄存器值将被恢复。
调度算法
内核的调度程序选择最高优先级的准备线程作为当前线程。当存在多个具有相同优先级的已就绪线程时,调度程序将选择等待时间最长的线程。
线程的相对优先级主要由其静态优先级决定。但是,当启用了最早期限优先调度(CONFIG_SC