Zephyr之线程睡眠与原地等待
什么是线程睡眠?
线程可以调用k_sleep()来延迟它的处理过程,直到指定的时间段。在线程休眠期间,CPU被放弃以允许其他准备好的线程执行。一旦指定的延迟时间过了,线程就会准备好,并有资格再次被调度。
典型应用:周期性的对物联网传感器需要采样的物理量进行采集。比如,对当前电流每秒采集1次,则可以k_sleep(1)函数调用实现。
沉睡的线程可以被另一个线程用k_wakeup()提前唤醒。这种技术有时可以用来允许辅助线程向沉睡的线程发出信号,告诉它有事情发生了,而不需要线程定义内核同步对象,比如semaphore。唤醒没有睡眠的线程是允许的,但没有任何效果。
什么是原地等待?
线程可以调用k_busy_wait()来执行繁忙等待,在指定的时间段内延迟其处理,而不把CPU让给其他准备好的线程。
当所需的延迟时间太短,以至于调度器的上下文从当前线程切换到另一个线程,然后再返回时,通常会使用原地等待来代替线程睡眠。
典型应用:在硬件外设模块初始化时,我们需要等待外设模块的ready信号,才能进行下一步的初始化操作。则此时,使用k_busy_wait()来实现延迟效果最佳。