调度
内核的基于优先级的调度程序允许应用程序的线程共享CPU。
概念
调度程序确定允许在任何时间点执行哪个线程;此线程称为当前线程。
当调度程序有机会更改当前线程的身份时,会有不同的时间点。这些点被称为重新调度点。一些可能的重新调度点有:
- 线程从运行状态到挂起或等待状态的转换,例如通过
k_sem_take()或k_sleep()。 - 将线程转换到就绪状态,例如通过
k_sem_give()或k_thread_start() - 在处理了一个中断后,将返回到线程上下文
- 当一个正在运行的线程调用
k_yield()时 - 当线程主动启动将自身转换为挂起或等待状态时,它会休眠。
每当调度程序更改当前线程的标识时,或者当当前线程的执行被ISR替换时,内核将首先保存当前线程的CPU寄存器值。当线程稍后恢复执行时,这些寄存器值将被恢复。
调度算法
内核的调度程序选择最高优先级的准备线程作为当前线程。当存在多个具有相同优先级的已就绪线程时,调度程序将选择等待时间最长的线程。
线程的相对优先级主要由其静态优先级决定。但是,当启用了最早期限优先调度(CONFIG_SCHED_DEADLINE)和线程选择具有相同的静态优先级时,那么具有较早期限的线程被认为具有更高的优先级。因此,当启用最早截止日期优
Zephyr内核采用基于优先级的调度算法,允许线程共享CPU。调度点包括线程状态转换、中断处理等。线程优先级决定执行顺序,启用EDF时,具有相同优先级的线程按截止日期排序。调度器提供了协作时间切片、可抢占时间切片等机制,以避免长时间计算导致的延迟。线程可通过调用特定函数进行休眠、放弃CPU或锁定调度。
订阅专栏 解锁全文
622

被折叠的 条评论
为什么被折叠?



