zephyr笔记 2.1.4 系统线程

2020-04-17 10:56:08 浏览数 (1)

1 前言

系统线程是内核在系统初始化时自动产生的线程。

http://docs.zephyrproject.org/kernel/threads/system_threads.html

2 概念

内核产生以下系统线程。

2.1 主线程

该线程执行内核初始化,然后调用应用程序的 main() 函数(如果已定义)。

默认情况下,主线程使用最高配置的可抢占线程优先级(即0)。如果内核未配置为支持可抢占线程,则主线程使用配置的最低协作线程优先级(即-1)。

主线程是执行内核初始化或执行应用程序的 main() 函数时的基本线程;这意味着如果线程中止,则会引发致命的系统错误。如果没有定义 main() ,或者如果它执行然后执行正常返回,主线程会正常终止并且不会引发错误。

2.2 空闲线程

此线程在系统没有其他工作要执行时执行。如果可能,空闲线程激活板子上的电源管理支持以节省电量;否则,空闲线程只是执行一个“无所事事”循环。只要系统正在运行并且永不终止,空闲线程就会一直存在。

空闲线程始终使用最低配置的线程优先级。如果这使它成为一个合作的线程,空闲线程会重复产生CPU以允许应用程序的其他线程在需要时运行。

空闲线程是一个重要的线程,这意味着如果线程中止,会引发致命的系统错误。

额外的系统线程也可能被派生,这取决于应用程序指定的内核和板配置选项。例如,启用系统工作队列会产生一个系统线程来为提交给它的工作项提供服务。 (请参阅工作队列线程。)

3 操作

3.1 写个 main() 函数

内核初始化完成后,应用程序提供的 main() 函数开始执行。 内核不会将任何参数传递给该函数。

以下代码概述了一个简单的 main() 函数。 实际应用使用的功能可以根据需要尽可能地复杂。

代码语言:javascript复制
void main(void)
{
    /* initialize a semaphore */
    ...

    /* register an ISR that gives the semaphore */
    ...

    /* monitor the semaphore forever */
    while (1) {
        /* wait for the semaphore to be given by the ISR */
        ...
        /* do whatever processing is now needed */
        ...
    }
}

4 建议用法

使用主线程在仅需单个线程的应用程序中执行基于线程的处理,而不是定义额外的应用程序特定线程。

5 配置选项

  • CONFIG_MAIN_THREAD_PRIORITY
  • CONFIG_MAIN_STACK_SIZE
  • CONFIG_IDLE_STACK_SIZE

6 API

End

0 人点赞