Zephyr OS之线程

第1章    线程

1.1    线程定义

       线程是操作系统内核调度任务的一种处理方式,通常用于处理由于执行时间太长或者太复杂而不能在中断( ISR) 内执行的任务。在zephyr中,系统线程是由内核定义且完成特定功能的必须线程,而应用线程则由用户应用程序根据需要而创建,数量不限。

       每个线程都拥有自已独立的栈空间、处理函数、优先级等。要想让内核调度该线程之前,必须先创建这个线程。线程创建时可以定义为立即启动,或者延时一段时间后启动。

1.2    动态创建线程

    1) 声明线程堆栈以及处理函数

#define USER_STACK_SIZE    (K_THREAD_SIZEOF + 100)
char __noinit __stack user_stack_area[USER_STACK_SIZE];

void user_task(void*, void*, void*) // zephyr线程处理函数原型
{
    // user application code
    ...
}
zephyr符号定义zephyr源码位置功能描述
K_THREAD_SIZEOFkernel\include\kernel_offsets.hzephyr线程控制块大小
__noinitinclude\section_tags.h非初始化段修饰符
__stackinclude\toolchain\common.h4字节对齐修饰符

    2) 调用创建线程API

k_tid_t user_task_tid = k_thread_spawn(user_stack_area, USER_STACK_SIZE, // 线程堆栈指针及栈大小
                                       user_task, NULL, NULL, NULL, // 线程处理函数和入参
                                       1, // 线程优先级 
                                       0, // 不使用选项字
                                       K_NO_WAIT); // 立即启动
zephyr符号定义zephyr源码位置功能描述
k_tid_tinclude\kernel.h线程标识
k_thread_spawninclude\kernel.h创建线程并初始化

1.3    静态创建线程

        zephyr允许代码里以宏定义方式静态地在代码编译时创建一个线程。

#define USER_STACK_SIZE    (K_THREAD_SIZEOF + 100)

extern void user_task(void*, void*, void*);

K_THREAD_DEFINE(user_task_tid, // 线程标识命名
                USER_STACK_SIZE, // 线程堆栈大小
                user_task, NULL, NULL, NULL, // 线程处理函数和入参
                1, // 线程优先级
                0, // 不使用选项字
                1000); // 延时1000毫秒后启动
zephyr符号定义zephyr源码位置功能描述
K_THREAD_DEFINEinclude\kernel.h宏定义创建线程

1.4    结束线程 

       线程一旦创建且启动后就会由内核调度一直运行下去,要想结束一个线程有三种办法:

1) 正常结束
       从线程处理函数中正常返回。在返回前,应释放它所曾占用的资源(例如动态分配的内存等)。

2) 异常结束
       线程触发一个致命的异常错误(有异常中断的处理器,例如Cortex ARM),将导致内核终止该线程。

3) 调用API结束
       可以由线程自身或者其它线程调用k_thread_abort()来终止该线程。但不建议这么做,最好的方式是发送一个信号给到该线程,让其自已正常结束。

       线程结束后,应用程序还可以重新创建该线程。

1.5    线程选项字

       在创建线程时内核支持选项字定义,使得内核能够特殊处理线程。选项字为整型,目前使用了三个选项BIT位:K_ESSENTIALK_FP_REGSK_SSE_REGS

 1) K_ESSENTIAL
       必须线程,表明线程是不可以被终止的。否则内核视为产生了一个致命的系统错误。

 2) K_FP_REGSK_SSE_REGS
       这些选项表示线程分别使用CPU的浮点寄存器和SSE寄存器(例如x86架构处理器)。默认情况下,内核在处理线程时不会处理这些寄存器。用该选项可以指示内核在调度线程时采取额外的步骤来保存和恢复这些寄存器的内容。

转载于:https://my.oschina.net/feigec/blog/884491

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值