前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zephyr笔记 2.1.4 系统线程

zephyr笔记 2.1.4 系统线程

作者头像
twowinter
发布2020-04-17 10:56:08
4640
发布2020-04-17 10:56:08
举报
文章被收录于专栏:twowinter

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 前言
  • 2 概念
    • 2.1 主线程
      • 2.2 空闲线程
      • 3 操作
        • 3.1 写个 main() 函数
        • 4 建议用法
        • 5 配置选项
        • 6 API
        • End
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档