• zephyr线程生命周期


    ephyr中线程是使用CPU的最小单位,线程从创建后由zephyr内核进行调度,根据运行和等待资源的状况在几个状态中切换,直到线程终止退出生命周期。

    线程状态

    线程在其生命周期中有下面6种状态:

    • New 创建:线程被创建起来但还没有运行,thread_state对应_THREAD_PRESTART

    • Ready 就绪:线程处于就绪状态,等待被调度执行,thread_state对应_THREAD_QUEUED

    • Running 运行:线程占用CPU运行中,thread_state为0

    • Waiting 等待:线程等待IO或者内核事件,thread_state对应_THREAD_PENDING

    • Suspended 挂起:线程被挂起,thread_state对应_THREAD_QUEUED

    • Terminated 终止:线程终止退出生命周期,thread_state对应_THREAD_QUEUED
      在实现中线程的状态记录在struct k_thread的base.thread_state中,线程的状态定义在kernel_structs.h中

    状态转换

    Zephyr线程的6种状态的转换图如下


    从状态转换图可以看到一共有8种动作会引起Thread的状态转换,说明如下:

    • create 创建一个线程,创建线程时会指定一个延时,线程将在延时之后执行,由下面行为引起:
      k_thread_create

    • start 开始执行一个线程,由下面行为引起:
      k_thread_start
      创建线程指定的delay时间到

    • dispatch 线程被调度执行,由下面行为引起:
      引发调度时,例如正在运行的线程时间片用完或者等待IO,或者是高优先级线程等待资源结束抢占当前线程

    • interrupt 当前线程被中断,由下面行为引起:
      引发调度时,例如当前运行的线程时间片用完,或者被高优先级线程抢占CPU

    • IO or Event wait,等待事件,由下面行为引起:
      等待mutex,sem,mailbox,msg等内核对象时

    • suppend 线程被挂起,由下面行为引起:
      k_thread_suspend,被其它thread suspend
      k_sleep,自己进入睡眠

    • resume 恢复挂起线程,由下面行为引起:
      k_thread_resume
      k_wakeup
      k_sleep的时间到了

    • abort 中止线程,由下面行为引起:
      k_thread_abort 中止掉指定线程
      线程函数返回

       

  • 相关阅读:
    如何在 uniapp 里面使用 pinia 数据持久化 (pinia-plugin-persistedstate)
    龙蜥anolis8.9安装hadoop3.3.6伪分布环境
    Thread的使用、线程的几个重要操作和状态【JavaEE初阶】
    c++ libevent demo
    测试基础——数据库及数据库表的SQL操作(了解即可)
    消除卡顿 mac MATLAB2022b m1/m2原生下载安装 教程
    使用CPR库和Python编写程序
    Selenium+JQuery定位方法及应用
    VSCode常用插件
    TouchGFX之二进制字体
  • 原文地址:https://blog.csdn.net/lbaihao/article/details/126920073