欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Zephyr 操作系统主题

最编程 2024-04-30 13:38:45
...
开源中国 APP,启动!这是你从没见过的全新版本”

第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_SIZEOF kernel\include\kernel_offsets.h zephyr线程控制块大小
__noinit include\section_tags.h 非初始化段修饰符
__stack include\toolchain\common.h 4字节对齐修饰符

    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_t include\kernel.h 线程标识
k_thread_spawn include\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_DEFINE include\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架构处理器)。默认情况下,内核在处理线程时不会处理这些寄存器。用该选项可以指示内核在调度线程时采取额外的步骤来保存和恢复这些寄存器的内容。