线程的创建,挂起和恢复等操作。
原文地址链接:
http://docs.zephyrproject.org/kernel/threads/lifecycle.html#thread-termination
zephyr线程操作的接口:
K_THREAD_DEFINE
k_thread_create();
k_thread_abort();
k_thread_suspend();
k_thread_resume();
K_THREAD_STACK_DEFINE
K_THREAD_STACK_ARRAY_DEFINE
K_THREAD_STACK_MEMBER
K_THREAD_STACK_SIZEOF
K_THREAD_STACK_BUFFER
线程的调度接口:
http://docs.zephyrproject.org/kernel/threads/scheduling.html
- 线程的优先级。
线程的优先级是一个整数,可以为正,可以是负。数值低的优先级为高,调度器基于线程的优先级区分两类线程(优先级为正的(preemptible thread)和优先级为负的(cooperative thread))。
Cooperative thread:优先级为负,一旦成为当前执行的线程,就会一直运行,直到执行了是它未就绪的操作。
Preemptible thread:优先级为正,成为当前可执行的线程时,在运行中随时可能被其他线程(优先级高的或者优先级相同的,亦或优先级为负的cooperative thread)强占。
线程运行后,他的初始优先级也可以更改。因此,cooperative thread和preemptiable thread可以相互更改。
宏CONFIG_NUM_COOP_PRIORITIES 和CONFIG_NUM_PREEMPT_PRIORITIES可以分别设置这两类线程的数目。
- 调度算法
内核调度器在就绪队列中选择优先级最高的线程成为当前执行的线程,如果有多个优先级形同的线程,就选择等待时间最长的线程。
- 调度器上锁
一个正在执行关键任务的抢占式线程在执行时,不希望线程被强占,可以通过调度k_sched_lock()接口使调度器将这个线程作为cooperative线程,这样就可以保护当前正在执行的关键操作。一旦关键部分执行完成,就可以调用k_sched_unlock()接口,是线程恢复正常的强占式线程。
抑制preemptible thread被其他的preemptiblethread,使用强占锁定调度器的方法比将线程的优先级改为负值的方法更加高效。
- 线程的睡眠
k_sleep()。
一个线程可以通过调用k-sleep()接口使当前线程延迟执行,在延迟的这段时间中CPU可以从就绪的线程中选择一个线程执行。一旦延时完成,就可以处于就绪状态,从新被调度。
一个处于睡眠的线程可以被其他线程调用k_wakeup()接口唤醒。此操作可以用来,一个线程想另一个线程发送信号,而不需要通过信号量的方法。唤醒一个没有休眠的线程时可以的,但是没有效果。
- 忙等待
k_busy_wait()
一个线程可以调用k_busy_wait ()接口用以延迟一些操作在一些特定的时间周期内,而不是让CPU去执行另外一个就绪的线程。
当线程需要执行一个很短时间的休眠时候,如果时间太短以至于不能等到调度器从其他线程切回到当前线程时,可以使用这个方法。
- cooperative time slicing
当cooperative thread成为当前执行的线程时,会一直执行直到执行到使这个线程处于未就绪状态时,才会释放CPU,如果在这类线程中要执行很长的指令,就很容易造成其他的高优先级或者是同等优先级的线程无法接受的等待时间。