第1章 线程
1.1 线程定义
线程是操作系统内核调度任务的一种处理方式,通常用于处理由于执行时间太长或者太复杂而不能在中断( ISR) 内执行的任务。在zephyr中,系统线程是由内核定义且完成特定功能的必须线程,而应用线程则由用户应用程序根据需要而创建,数量不限。
每个线程都拥有自已独立的栈空间、处理函数、优先级等。要想让内核调度该线程之前,必须先创建这个线程。线程创建时可以定义为立即启动,或者延时一段时间后启动。
1.2 动态创建线程
1) 声明线程堆栈以及处理函数
#define STACKSIZE 4096
K_THREAD_STACK_DEFINE(stack_area, STACKSIZE)
static struct k_thread task_id;
static void producer_thread(void)
{
while(1)
{
k_sleep(10);
}
}
k_thread_create(&task_id, stack_area, K_THREAD_STACK_SIZEOF(stack_area),
(k_thread_entry_t)producer_thread,NULL,NULL,NULL,
K_PRIO_PREEMPT(1), 0, K_NO_WAIT);
1.3 结束线程
线程一旦创建且启动后就会由内核调度一直运行下去,要想结束一个线程有三种办法:
1) 正常结束
从线程处理函数中正常返回。在返回前,应释放它所曾占用的资源(例如动态分配的内存等)。
2) 异常结束
线程触发一个致命的异常错误(有异常中断的处理器,例如Cortex ARM),将导致内核终止该线程。
3) 调用API结束
可以由线程自身或者其它线程调用k_thread_abort()来终止该线程。但不建议这么做,最好的方式是发送一个信号给到该线程,让其自已正常结束。
线程结束后,应用程序还可以重新创建该线程。
1.5 线程选项字
在创建线程时内核支持选项字定义,使得内核能够特殊处理线程。选项字为整型,目前使用了三个选项BIT位:K_ESSENTIAL、K_FP_REGS、K_SSE_REGS。
1) K_ESSENTIAL
必须线程,表明线程是不可以被终止的。否则内核视为产生了一个致命的系统错误。
2) K_FP_REGS、K_SSE_REGS
这些选项表示线程分别使用CPU的浮点寄存器和SSE寄存器(例如x86架构处理器)。默认情况下,内核在处理线程时不会处理这些寄存器。用该选项可以指示内核在调度线程时采取额外的步骤来保存和恢复这些寄存器的内容。