UcOs-III 源码阅读: os_type.h、os.h

os_type.h:

/*
*********************************************************************************************************
*                                              uC/OS-III
*                                        The Real-Time Kernel
*
*                    Copyright 2009-2022 Silicon Laboratories Inc. www.silabs.com
*
*                                 SPDX-License-Identifier: APACHE-2.0
*
*               This software is subject to an open source license and is distributed by
*                Silicon Laboratories Inc. pursuant to the terms of the Apache License,
*                    Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/

/*
*********************************************************************************************************
* File    : os_type.h
* Version : V3.08.02
*********************************************************************************************************
*/

#ifndef   OS_TYPE_H
#define   OS_TYPE_H

#ifdef    VSC_INCLUDE_H_FILE_NAMES
const     CPU_CHAR  *os_type__h = "$Id: $";
#endif

/*
************************************************************************************************************************
*                                                 包含头文件
************************************************************************************************************************
*/

                                                       /*       描述                                    # 位数 */
                                                       /*                                               <推荐值> */
                                                       /* ----------------------------------------------------------- */

typedef   CPU_INT16U      OS_CPU_USAGE;                /* CPU 使用率 0..10000                                  <16>/32 */

typedef   CPU_INT32U      OS_CTR;                      /* 计数器,                                                 32 */

typedef   CPU_INT32U      OS_CTX_SW_CTR;               /* 上下文切换计数器,                                     32 */

typedef   CPU_INT32U      OS_CYCLES;                   /* CPU 时钟周期,                                   <32>/64 */

typedef   CPU_INT32U      OS_FLAGS;                    /* 事件标志,                                      8/16/<32> */

typedef   CPU_INT32U      OS_IDLE_CTR;                 /* 保存空闲任务运行的次数,                           <32>/64 */

typedef   CPU_INT16U      OS_MEM_QTY;                  /* 内存块的数量,                                    <16>/32 */
typedef   CPU_INT16U      OS_MEM_SIZE;                 /* 内存块的大小(字节),                            <16>/32 */

typedef   CPU_INT16U      OS_MSG_QTY;                  /* 消息池中的 OS_MSG 数量,                          <16>/32 */
typedef   CPU_INT16U      OS_MSG_SIZE;                 /* 消息的大小(字节数),                            <16>/32 */

typedef   CPU_INT08U      OS_NESTING_CTR;              /* 中断和调度嵌套,                                <8>/16/32 */

typedef   CPU_INT16U      OS_OBJ_QTY;                  /* 内核对象数量计数器,                              <16>/32 */
typedef   CPU_INT32U      OS_OBJ_TYPE;                 /* 用于确定对象类型的特殊标志,                           32 */

typedef   CPU_INT16U      OS_OPT;                      /* 保存函数选项,                                    <16>/32 */

typedef   CPU_INT08U      OS_PRIO;                     /* 任务的优先级,                                 <8>/16/32 */

typedef   CPU_INT16U      OS_QTY;                      /* 数量,                                            <16>/32 */

typedef   CPU_INT32U      OS_RATE_HZ;                  /* 频率(赫兹),                                        32 */

#if (CPU_CFG_ADDR_SIZE == CPU_WORD_SIZE_64)            /* 任务寄存器,                                   8/16/<32/64> */
typedef   CPU_INT64U      OS_REG;
#else
typedef   CPU_INT32U      OS_REG;
#endif
typedef   CPU_INT08U      OS_REG_ID;                   /* 任务寄存器索引,                                <8>/16/32 */

typedef   CPU_INT32U      OS_SEM_CTR;                  /* 信号量值,                                          16/<32> */

typedef   CPU_INT08U      OS_STATE;                    /* 状态变量,                                       <8>/16/32 */

typedef   CPU_INT08U      OS_STATUS;                   /* 状态,                                           <8>/16/32 */

typedef   CPU_INT32U      OS_TICK;                     /* 时钟滴答计数器,                                   <32>/64 */

#endif

os.h:

/*
*********************************************************************************************************
*                                              uC/OS-III
*                                        The Real-Time Kernel
*
*                    Copyright 2009-2022 Silicon Laboratories Inc. www.silabs.com
*
*                                 SPDX-License-Identifier: APACHE-2.0
*
*               This software is subject to an open source license and is distributed by
*                Silicon Laboratories Inc. pursuant to the terms of the Apache License,
*                    Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/

/*
*********************************************************************************************************
* 文件    : os.h
* 版本    : V3.08.02
*********************************************************************************************************
* 备注     : (1) 假设项目构建中包含以下版本(或更新)的软件模块:
*
*               (a) uC/CPU V1.31.00
*********************************************************************************************************
*/

#ifndef   OS_H
#define   OS_H

/*
************************************************************************************************************************
*                                               uC/OS-III 版本号
************************************************************************************************************************
*/

#define  OS_VERSION  30802u                       /* Version of uC/OS-III (Vx.yy.zz mult. by 10000)                   */

/*
************************************************************************************************************************
*                                                 包含头文件
************************************************************************************************************************
*/

#include <os_cfg.h>
#include <os_cfg_app.h>
#include <cpu_core.h>
#include "os_type.h"
#include <os_cpu.h>
#include "os_trace.h"


#ifdef __cplusplus
extern "C" {
#endif

/*
************************************************************************************************************************
*                                              兼容性配置
************************************************************************************************************************
*/

#ifndef OS_CFG_TASK_IDLE_EN
#define  OS_CFG_TASK_IDLE_EN             1u
/*
************************************************************************************************************************
* OS_CFG_TASK_IDLE_EN 配置项用于启用或禁用空闲任务。
* 设置为 1u 表示启用空闲任务,设置为 0u 表示禁用空闲任务。
************************************************************************************************************************
*/
#endif

#ifndef OS_CFG_TASK_STK_REDZONE_EN
#define  OS_CFG_TASK_STK_REDZONE_EN      0u
/*
************************************************************************************************************************
* OS_CFG_TASK_STK_REDZONE_EN 配置项用于启用或禁用堆栈红区检测。
* 设置为 1u 表示启用堆栈红区检测,设置为 0u 表示禁用堆栈红区检测。
************************************************************************************************************************
*/
#endif

#ifndef OS_CFG_INVALID_OS_CALLS_CHK_EN
#define  OS_CFG_INVALID_OS_CALLS_CHK_EN  0u
/*
************************************************************************************************************************
* OS_CFG_INVALID_OS_CALLS_CHK_EN 配置项用于启用或禁用无效操作系统调用检查。
* 设置为 1u 表示启用无效操作系统调用检查,设置为 0u 表示禁用无效操作系统调用检查。
************************************************************************************************************************
*/
#endif


/*
************************************************************************************************************************
*                                               关键段处理
************************************************************************************************************************
*/


#if      (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u) && defined(CPU_CFG_INT_DIS_MEAS_EN)
#define  OS_SCHED_LOCK_TIME_MEAS_START()    OS_SchedLockTimeMeasStart()
#else
#define  OS_SCHED_LOCK_TIME_MEAS_START()
#endif
/*
************************************************************************************************************************
* OS_SCHED_LOCK_TIME_MEAS_START 宏用于启动调度锁定时间测量。
* 如果启用了调度锁定时间测量 (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u) 并且 CPU 支持中断禁用时间测量 (CPU_CFG_INT_DIS_MEAS_EN 定义了),
* 则调用 OS_SchedLockTimeMeasStart 函数;否则,该宏为空操作。
************************************************************************************************************************
*/


#if      (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u) && defined(CPU_CFG_INT_DIS_MEAS_EN)
#define  OS_SCHED_LOCK_TIME_MEAS_STOP()     OS_SchedLockTimeMeasStop()
#else
#define  OS_SCHED_LOCK_TIME_MEAS_STOP()
#endif
/*
************************************************************************************************************************
* OS_SCHED_LOCK_TIME_MEAS_STOP 宏用于停止调度锁定时间测量。
* 如果启用了调度锁定时间测量 (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u) 并且 CPU 支持中断禁用时间测量 (CPU_CFG_INT_DIS_MEAS_EN 定义了),
* 则调用 OS_SchedLockTimeMeasStop 函数;否则,该宏为空操作。
************************************************************************************************************************
*/


/*
************************************************************************************************************************
*                                                     各种杂项
************************************************************************************************************************
*/

#ifdef   OS_GLOBALS
#define  OS_EXT
#else
#define  OS_EXT  extern
#endif
/*
************************************************************************************************************************
* OS_EXT 宏用于定义全局变量的外部声明。
* 如果定义了 OS_GLOBALS,则 OS_EXT 宏为空,表示这些变量在当前文件中定义;否则,OS_EXT 宏为 extern,表示这些变量在其他文件中定义。
************************************************************************************************************************
*/

#ifndef  OS_FALSE
#define  OS_FALSE                       0u
#endif
/*
************************************************************************************************************************
* OS_FALSE 宏定义了布尔值假 (false)。
* 如果未定义 OS_FALSE,则将其定义为 0u。
************************************************************************************************************************
*/

#ifndef  OS_TRUE
#define  OS_TRUE                        1u
#endif
/*
************************************************************************************************************************
* OS_TRUE 宏定义了布尔值真 (true)。
* 如果未定义 OS_TRUE,则将其定义为 1u。
************************************************************************************************************************
*/

#define  OS_PRIO_TBL_SIZE          (((OS_CFG_PRIO_MAX - 1u) / ((CPU_CFG_DATA_SIZE * 8u))) + 1u)
/*
************************************************************************************************************************
* OS_PRIO_TBL_SIZE 宏计算优先级表的大小。
* 该宏根据最大优先级数 (OS_CFG_PRIO_MAX) 和数据类型大小 (CPU_CFG_DATA_SIZE) 计算优先级表的大小。
************************************************************************************************************************
*/

#define  OS_MSG_EN                 (((OS_CFG_TASK_Q_EN > 0u) || (OS_CFG_Q_EN > 0u)) ? 1u : 0u)
/*
************************************************************************************************************************
* OS_MSG_EN 宏用于确定是否启用消息队列功能。
* 如果任务队列 (OS_CFG_TASK_Q_EN) 或普通队列 (OS_CFG_Q_EN) 启用,则 OS_MSG_EN 为 1u,表示启用消息队列功能;否则为 0u,表示不启用消息队列功能。
************************************************************************************************************************
*/

#define  OS_OBJ_TYPE_REQ           (((OS_CFG_DBG_EN > 0u) || (OS_CFG_OBJ_TYPE_CHK_EN > 0u)) ? 1u : 0u)
/*
************************************************************************************************************************
* OS_OBJ_TYPE_REQ 宏用于确定是否需要对象类型检查。
* 如果调试模式 (OS_CFG_DBG_EN) 或对象类型检查 (OS_CFG_OBJ_TYPE_CHK_EN) 启用,则 OS_OBJ_TYPE_REQ 为 1u,表示需要对象类型检查;否则为 0u,表示不需要对象类型检查。
************************************************************************************************************************
*/

/*
************************************************************************************************************************
************************************************************************************************************************
*                                                   # 定 义
************************************************************************************************************************
************************************************************************************************************************
*/

/*
========================================================================================================================
*                                                     任务状态
========================================================================================================================
*/

#define  OS_STATE_OS_STOPPED                    (OS_STATE)(0u)  // 操作系统停止
#define  OS_STATE_OS_RUNNING                    (OS_STATE)(1u)  // 操作系统运行

#define  OS_STATE_NOT_RDY                    (CPU_BOOLEAN)(0u)  // 未准备好
#define  OS_STATE_RDY                        (CPU_BOOLEAN)(1u)  // 准备好

/* ------------------- 任务状态 ------------------ */
#define  OS_TASK_STATE_BIT_DLY               (OS_STATE)(0x01u)  //  /-------- 暂停位
                                                               //   |
#define  OS_TASK_STATE_BIT_PEND              (OS_STATE)(0x02u)  //  | /-----  等待位
                                                               //   | |
#define  OS_TASK_STATE_BIT_SUSPENDED         (OS_STATE)(0x04u)  //  | | /---  延迟/超时位
                                                               //   | | |
                                                               //   V V V

#define  OS_TASK_STATE_RDY                    (OS_STATE)(  0u)  //   0 0 0     就绪
#define  OS_TASK_STATE_DLY                    (OS_STATE)(  1u)  //   0 0 1     延迟或超时
#define  OS_TASK_STATE_PEND                   (OS_STATE)(  2u)  //   0 1 0     等待
#define  OS_TASK_STATE_PEND_TIMEOUT           (OS_STATE)(  3u)  //   0 1 1     等待 + 超时
#define  OS_TASK_STATE_SUSPENDED              (OS_STATE)(  4u)  //   1 0 0     暂停
#define  OS_TASK_STATE_DLY_SUSPENDED          (OS_STATE)(  5u)  //   1 0 1     暂停 + 延迟或超时
#define  OS_TASK_STATE_PEND_SUSPENDED         (OS_STATE)(  6u)  //   1 1 0     暂停 + 等待
#define  OS_TASK_STATE_PEND_TIMEOUT_SUSPENDED (OS_STATE)(  7u)  //   1 1 1     暂停 + 等待 + 超时
#define  OS_TASK_STATE_DEL                    (OS_STATE)(255u)  //   删除

/* ----------------- 等待于 ... ----------------- */
#define  OS_TASK_PEND_ON_NOTHING              (OS_STATE)(  0u)  // 等待于无
#define  OS_TASK_PEND_ON_FLAG                 (OS_STATE)(  1u)  // 等待于事件标志组
#define  OS_TASK_PEND_ON_TASK_Q               (OS_STATE)(  2u)  // 等待于发送给任务的消息
#define  OS_TASK_PEND_ON_COND                 (OS_STATE)(  3u)  // 等待于条件变量
#define  OS_TASK_PEND_ON_MUTEX                (OS_STATE)(  4u)  // 等待于互斥信号量
#define  OS_TASK_PEND_ON_Q                    (OS_STATE)(  5u)  // 等待于队列
#define  OS_TASK_PEND_ON_SEM                  (OS_STATE)(  6u)  // 等待于信号量
#define  OS_TASK_PEND_ON_TASK_SEM             (OS_STATE)(  7u)  // 等待于发送给任务的信号

/*
------------------------------------------------------------------------------------------------------------------------
*                                                    任务等待状态
*                                      (用于 OS_TCB 结构体字段 .PendStatus 的状态码)
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_STATUS_PEND_OK                   (OS_STATUS)(  0u)  /* 等待状态正常,未等待或等待完成 */
#define  OS_STATUS_PEND_ABORT                (OS_STATUS)(  1u)  /* 等待已中止 */
#define  OS_STATUS_PEND_DEL                  (OS_STATUS)(  2u)  /* 等待对象已删除 */
#define  OS_STATUS_PEND_TIMEOUT              (OS_STATUS)(  3u)  /* 等待超时 */

/*
========================================================================================================================
*                                                   操作系统对象类型
*
* 注意:(1) OS_OBJ_TYPE_&&& #define 值特意选择为内核对象类型的 ASCII 表示。在内存中显示内核对象时,这些对象的类型将显示为其选择的 ASCII 名称。
========================================================================================================================
*/

#define  OS_OBJ_TYPE_NONE                    (OS_OBJ_TYPE)CPU_TYPE_CREATE('N', 'O', 'N', 'E')  /* 无对象类型 */
#define  OS_OBJ_TYPE_FLAG                    (OS_OBJ_TYPE)CPU_TYPE_CREATE('F', 'L', 'A', 'G')  /* 事件标志对象类型 */
#define  OS_OBJ_TYPE_MEM                     (OS_OBJ_TYPE)CPU_TYPE_CREATE('M', 'E', 'M', ' ')  /* 内存对象类型 */
#define  OS_OBJ_TYPE_MUTEX                   (OS_OBJ_TYPE)CPU_TYPE_CREATE('M', 'U', 'T', 'X')  /* 互斥量对象类型 */
#define  OS_OBJ_TYPE_COND                    (OS_OBJ_TYPE)CPU_TYPE_CREATE('C', 'O', 'N', 'D')  /* 条件变量对象类型 */
#define  OS_OBJ_TYPE_Q                       (OS_OBJ_TYPE)CPU_TYPE_CREATE('Q', 'U', 'E', 'U')  /* 队列对象类型 */
#define  OS_OBJ_TYPE_SEM                     (OS_OBJ_TYPE)CPU_TYPE_CREATE('S', 'E', 'M', 'A')  /* 信号量对象类型 */
#define  OS_OBJ_TYPE_TMR                     (OS_OBJ_TYPE)CPU_TYPE_CREATE('T', 'M', 'R', ' ')  /* 定时器对象类型 */

/*
========================================================================================================================
*                                           'opt' 参数的可能值
========================================================================================================================
*/

#define  OS_OPT_NONE                         (OS_OPT)(0x0000u)  /* 无选项 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                    删除选项
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_OPT_DEL_NO_PEND                  (OS_OPT)(0x0000u)  /* 不等待删除完成 */
#define  OS_OPT_DEL_ALWAYS                   (OS_OPT)(0x0001u)  /* 总是等待删除完成 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                     等待选项
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_OPT_PEND_FLAG_MASK               (OS_OPT)(0x000Fu)  /* 等待标志掩码 */
#define  OS_OPT_PEND_FLAG_CLR_ALL            (OS_OPT)(0x0001u)  /* 等待所有指定的位被清除 */
#define  OS_OPT_PEND_FLAG_CLR_AND            (OS_OPT)(0x0001u)  /* 等待所有指定的位被清除 */

#define  OS_OPT_PEND_FLAG_CLR_ANY            (OS_OPT)(0x0002u)  /* 等待任何指定的位被清除 */
#define  OS_OPT_PEND_FLAG_CLR_OR             (OS_OPT)(0x0002u)  /* 等待任何指定的位被清除 */

#define  OS_OPT_PEND_FLAG_SET_ALL            (OS_OPT)(0x0004u)  /* 等待所有指定的位被设置 */
#define  OS_OPT_PEND_FLAG_SET_AND            (OS_OPT)(0x0004u)  /* 等待所有指定的位被设置 */

#define  OS_OPT_PEND_FLAG_SET_ANY            (OS_OPT)(0x0008u)  /* 等待任何指定的位被设置 */
#define  OS_OPT_PEND_FLAG_SET_OR             (OS_OPT)(0x0008u)  /* 等待任何指定的位被设置 */

#define  OS_OPT_PEND_FLAG_CONSUME            (OS_OPT)(0x0100u)  /* 如果条件满足则消耗标志 */

#define  OS_OPT_PEND_BLOCKING                (OS_OPT)(0x0000u)  /* 阻塞等待 */
#define  OS_OPT_PEND_NON_BLOCKING            (OS_OPT)(0x8000u)  /* 非阻塞等待 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                  等待中止选项
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_OPT_PEND_ABORT_1                 (OS_OPT)(0x0000u)  /* 中止单个等待任务 */
#define  OS_OPT_PEND_ABORT_ALL               (OS_OPT)(0x0100u)  /* 中止所有等待任务 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                     发送选项
------------------------------------------------------------------------------------------------------------------------
*/


#define  OS_OPT_POST_NONE                    (OS_OPT)(0x0000u)  /* 无选项 */

#define  OS_OPT_POST_FLAG_SET                (OS_OPT)(0x0000u)  /* 设置标志 */
#define  OS_OPT_POST_FLAG_CLR                (OS_OPT)(0x0001u)  /* 清除标志 */

#define  OS_OPT_POST_FIFO                    (OS_OPT)(0x0000u)  /* 默认为先进先出 (FIFO) */
#define  OS_OPT_POST_LIFO                    (OS_OPT)(0x0010u)  /* 后进先出 (LIFO),发送给最高优先级的等待任务 */
#define  OS_OPT_POST_1                       (OS_OPT)(0x0000u)  /* 发送消息给最高优先级的等待任务 */
#define  OS_OPT_POST_ALL                     (OS_OPT)(0x0200u)  /* 广播消息给所有等待任务 */

#define  OS_OPT_POST_NO_SCHED                (OS_OPT)(0x8000u)  /* 如果选择此选项,则不调用调度器 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                     任务选项
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_OPT_TASK_NONE                    (OS_OPT)(0x0000u)  /* 无选项 */
#define  OS_OPT_TASK_STK_CHK                 (OS_OPT)(0x0001u)  /* 为任务启用堆栈检查 */
#define  OS_OPT_TASK_STK_CLR                 (OS_OPT)(0x0002u)  /* 在创建任务时清空堆栈 */
#define  OS_OPT_TASK_SAVE_FP                 (OS_OPT)(0x0004u)  /* 保存任何浮点寄存器的内容 */
#define  OS_OPT_TASK_NO_TLS                  (OS_OPT)(0x0008u)  /* 指定任务不需要线程本地存储 (TLS) 支持 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                     时间选项
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_OPT_TIME_DLY                             0x00u  /* 延迟 */
#define  OS_OPT_TIME_TIMEOUT                ((OS_OPT)0x02u)  /* 超时 */
#define  OS_OPT_TIME_MATCH                  ((OS_OPT)0x04u)  /* 匹配时间 */
#define  OS_OPT_TIME_PERIODIC               ((OS_OPT)0x08u)  /* 周期性 */

#define  OS_OPT_TIME_HMSM_STRICT            ((OS_OPT)0x00u)  /* 严格的时间格式 (小时:分钟:秒:毫秒) */
#define  OS_OPT_TIME_HMSM_NON_STRICT        ((OS_OPT)0x10u)  /* 非严格的时间格式 (小时:分钟:秒:毫秒) */

#define  OS_OPT_TIME_MASK                   ((OS_OPT)(OS_OPT_TIME_DLY      | \
                                                      OS_OPT_TIME_TIMEOUT  | \
                                                      OS_OPT_TIME_PERIODIC | \
                                                      OS_OPT_TIME_MATCH))  /* 时间选项掩码 */

#define  OS_OPT_TIME_OPTS_MASK              ((OS_OPT)(OS_OPT_TIME_DLY            | \
                                                      OS_OPT_TIME_TIMEOUT        | \
                                                      OS_OPT_TIME_PERIODIC       | \
                                                      OS_OPT_TIME_MATCH          | \
                                                      OS_OPT_TIME_HMSM_NON_STRICT))  /* 时间选项组合掩码 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                    定时器选项
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_OPT_TMR_NONE                          (OS_OPT)(0u)  /* 无选项 */

#define  OS_OPT_TMR_ONE_SHOT                      (OS_OPT)(1u)  /* 定时器到期后不会自动重启 */
#define  OS_OPT_TMR_PERIODIC                      (OS_OPT)(2u)  /* 定时器到期后会自动重启 */

#define  OS_OPT_TMR_CALLBACK                      (OS_OPT)(3u)  /* OSTmrStop() 选项,调用带有定时器参数的回调函数 */
#define  OS_OPT_TMR_CALLBACK_ARG                  (OS_OPT)(4u)  /* OSTmrStop() 选项,调用带有新参数的回调函数 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                     定时器状态
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_TMR_STATE_UNUSED                    (OS_STATE)(0u)  /* 未使用 */
#define  OS_TMR_STATE_STOPPED                   (OS_STATE)(1u)  /* 已停止 */
#define  OS_TMR_STATE_RUNNING                   (OS_STATE)(2u)  /* 运行中 */
#define  OS_TMR_STATE_COMPLETED                 (OS_STATE)(3u)  /* 已完成 */
#define  OS_TMR_STATE_TIMEOUT                   (OS_STATE)(4u)  /* 已超时 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                       优先级
------------------------------------------------------------------------------------------------------------------------
*/
/* 初始化任务 TCB 的默认优先级 */
#define  OS_PRIO_INIT                       (OS_PRIO)(OS_CFG_PRIO_MAX)  /* 初始化任务 TCB 的默认优先级设置为最大优先级 */

/*
------------------------------------------------------------------------------------------------------------------------
*                                                     堆栈红区
------------------------------------------------------------------------------------------------------------------------
*/

#define  OS_STACK_CHECK_VAL                 0x5432DCBAABCD2345UL  /* 堆栈检查值,用于检测堆栈溢出 */
#define  OS_STACK_CHECK_DEPTH               8u  /* 堆栈检查深度,即检查的堆栈区域大小 */


/*
************************************************************************************************************************
************************************************************************************************************************
*                                                枚举类型
************************************************************************************************************************
************************************************************************************************************************
*/

/*
------------------------------------------------------------------------------------------------------------------------
*                                                      错误代码
------------------------------------------------------------------------------------------------------------------------
*/

typedef  enum  os_err {
    OS_ERR_NONE                      =     0u,  /* 无错误 */

    OS_ERR_A                         = 10000u,  /* A 类错误 */
    OS_ERR_ACCEPT_ISR                = 10001u,  /* 在 ISR 中接受错误 */

    OS_ERR_B                         = 11000u,  /* B 类错误 */

    OS_ERR_C                         = 12000u,  /* C 类错误 */
    OS_ERR_CREATE_ISR                = 12001u,  /* 在 ISR 中创建错误 */

    OS_ERR_D                         = 13000u,  /* D 类错误 */
    OS_ERR_DEL_ISR                   = 13001u,  /* 在 ISR 中删除错误 */

    OS_ERR_E                         = 14000u,  /* E 类错误 */

    OS_ERR_F                         = 15000u,  /* F 类错误 */
    OS_ERR_FATAL_RETURN              = 15001u,  /* 致命返回错误 */
    OS_ERR_FLAG_GRP_DEPLETED         = 15101u,  /* 标志组耗尽错误 */
    OS_ERR_FLAG_NOT_RDY              = 15102u,  /* 标志未准备好错误 */
    OS_ERR_FLAG_PEND_OPT             = 15103u,  /* 标志挂起选项错误 */
    OS_ERR_FLUSH_ISR                 = 15104u,  /* 在 ISR 中刷新错误 */

    OS_ERR_G                         = 16000u,  /* G 类错误 */

    OS_ERR_H                         = 17000u,  /* H 类错误 */

    OS_ERR_I                         = 18000u,  /* I 类错误 */
    OS_ERR_ILLEGAL_CREATE_RUN_TIME   = 18001u,  /* 运行时非法创建错误 */
    OS_ERR_ILLEGAL_DEL_RUN_TIME      = 18007u,  /* 运行时非法删除错误 */

    OS_ERR_J                         = 19000u,  /* J 类错误 */

    OS_ERR_K                         = 20000u,  /* K 类错误 */

    OS_ERR_L                         = 21000u,  /* L 类错误 */
    OS_ERR_LOCK_NESTING_OVF          = 21001u,  /* 锁嵌套溢出错误 */

    OS_ERR_M                         = 22000u,  /* M 类错误 */
    OS_ERR_MEM_CREATE_ISR            = 22201u,  /* 在 ISR 中创建内存错误 */
    OS_ERR_MEM_FULL                  = 22202u,  /* 内存已满错误 */
    OS_ERR_MEM_INVALID_P_ADDR        = 22203u,  /* 无效的地址指针错误 */
    OS_ERR_MEM_INVALID_BLKS          = 22204u,  /* 无效的块数错误 */
    OS_ERR_MEM_INVALID_PART          = 22205u,  /* 无效的分区错误 */
    OS_ERR_MEM_INVALID_P_BLK         = 22206u,  /* 无效的块指针错误 */
    OS_ERR_MEM_INVALID_P_MEM         = 22207u,  /* 无效的内存指针错误 */
    OS_ERR_MEM_INVALID_P_DATA        = 22208u,  /* 无效的数据指针错误 */
    OS_ERR_MEM_INVALID_SIZE          = 22209u,  /* 无效的大小错误 */
    OS_ERR_MEM_NO_FREE_BLKS          = 22210u,  /* 没有可用的块错误 */

    OS_ERR_MSG_POOL_EMPTY            = 22301u,  /* 消息池为空错误 */
    OS_ERR_MSG_POOL_NULL_PTR         = 22302u,  /* 消息池空指针错误 */

    OS_ERR_MUTEX_NOT_OWNER           = 22401u,  /* 不是互斥锁所有者错误 */
    OS_ERR_MUTEX_OWNER               = 22402u,  /* 互斥锁所有者错误 */
    OS_ERR_MUTEX_NESTING             = 22403u,  /* 互斥锁嵌套错误 */
    OS_ERR_MUTEX_OVF                 = 22404u,  /* 互斥锁溢出错误 */

    OS_ERR_N                         = 23000u,  /* N 类错误 */
    OS_ERR_NAME                      = 23001u,  /* 名称错误 */
    OS_ERR_NO_MORE_ID_AVAIL          = 23002u,  /* 没有更多的 ID 可用错误 */

    OS_ERR_O                         = 24000u,  /* O 类错误 */
    OS_ERR_OBJ_CREATED               = 24001u,  /* 对象已创建错误 */
    OS_ERR_OBJ_DEL                   = 24002u,  /* 对象删除错误 */
    OS_ERR_OBJ_PTR_NULL              = 24003u,  /* 对象指针为空错误 */
    OS_ERR_OBJ_TYPE                  = 24004u,  /* 对象类型错误 */

    OS_ERR_OPT_INVALID               = 24101u,  /* 无效的选项错误 */

    OS_ERR_OS_NOT_RUNNING            = 24201u,  /* 操作系统未运行错误 */
    OS_ERR_OS_RUNNING                = 24202u,  /* 操作系统正在运行错误 */
    OS_ERR_OS_NOT_INIT               = 24203u,  /* 操作系统未初始化错误 */
    OS_ERR_OS_NO_APP_TASK            = 24204u,  /* 没有应用任务错误 */

    OS_ERR_P                         = 25000u,  /* P 类错误 */
    OS_ERR_PEND_ABORT                = 25001u,  /* 挂起中止错误 */
    OS_ERR_PEND_ABORT_ISR            = 25002u,  /* 在 ISR 中挂起中止错误 */
    OS_ERR_PEND_ABORT_NONE           = 25003u,  /* 没有挂起中止错误 */
    OS_ERR_PEND_ABORT_SELF           = 25004u,  /* 自身挂起中止错误 */
    OS_ERR_PEND_DEL                  = 25005u,  /* 挂起删除错误 */
    OS_ERR_PEND_ISR                  = 25006u,  /* 在 ISR 中挂起错误 */
    OS_ERR_PEND_LOCKED               = 25007u,  /* 挂起锁定错误 */
    OS_ERR_PEND_WOULD_BLOCK          = 25008u,  /* 挂起会阻塞错误 */

    OS_ERR_POST_NULL_PTR             = 25101u,  /* 发送空指针错误 */
    OS_ERR_POST_ISR                  = 25102u,  /* 在 ISR 中发送错误 */

    OS_ERR_PRIO_EXIST                = 25201u,  /* 优先级已存在错误 */
    OS_ERR_PRIO                      = 25202u,  /* 优先级错误 */
    OS_ERR_PRIO_INVALID              = 25203u,  /* 无效的优先级错误 */

    OS_ERR_PTR_INVALID               = 25301u,  /* 无效的指针错误 */

    OS_ERR_Q                         = 26000u,  /* Q 类错误 */
    OS_ERR_Q_FULL                    = 26001u,  /* 队列已满错误 */
    OS_ERR_Q_EMPTY                   = 26002u,  /* 队列为空错误 */
    OS_ERR_Q_MAX                     = 26003u,  /* 队列最大值错误 */
    OS_ERR_Q_SIZE                    = 26004u,  /* 队列大小错误 */

    OS_ERR_R                         = 27000u,  /* R 类错误 */
    OS_ERR_REG_ID_INVALID            = 27001u,  /* 无效的注册 ID 错误 */
    OS_ERR_ROUND_ROBIN_1             = 27002u,  /* 轮转调度 1 错误 */
    OS_ERR_ROUND_ROBIN_DISABLED      = 27003u,  /* 轮转调度禁用错误 */

    OS_ERR_S                         = 28000u,  /* S 类错误 */
    OS_ERR_SCHED_INVALID_TIME_SLICE  = 28001u,  /* 无效的时间片错误 */
    OS_ERR_SCHED_LOCK_ISR            = 28002u,  /* 在 ISR 中调度锁定错误 */
    OS_ERR_SCHED_LOCKED              = 28003u,  /* 调度已锁定错误 */
    OS_ERR_SCHED_NOT_LOCKED          = 28004u,  /* 调度未锁定错误 */
    OS_ERR_SCHED_UNLOCK_ISR          = 28005u,  /* 在 ISR 中调度解锁错误 */

    OS_ERR_SEM_OVF                   = 28101u,  /* 信号量溢出错误 */
    OS_ERR_SET_ISR                   = 28102u,  /* 在 ISR 中设置错误 */

    OS_ERR_STAT_RESET_ISR            = 28201u,  /* 在 ISR 中重置统计错误 */
    OS_ERR_STAT_PRIO_INVALID         = 28202u,  /* 无效的统计优先级错误 */
    OS_ERR_STAT_STK_INVALID          = 28203u,  /* 无效的统计堆栈错误 */
    OS_ERR_STAT_STK_SIZE_INVALID     = 28204u,  /* 无效的统计堆栈大小错误 */
    OS_ERR_STATE_INVALID             = 28205u,  /* 无效的状态错误 */
    OS_ERR_STATUS_INVALID            = 28206u,  /* 无效的状态错误 */
    OS_ERR_STK_INVALID               = 28207u,  /* 无效的堆栈错误 */
    OS_ERR_STK_SIZE_INVALID          = 28208u,  /* 无效的堆栈大小错误 */
    OS_ERR_STK_LIMIT_INVALID         = 28209u,  /* 无效的堆栈限制错误 */
    OS_ERR_STK_OVF                   = 28210u,  /* 堆栈溢出错误 */

    OS_ERR_T                         = 29000u,  /* T 类错误 */
    OS_ERR_TASK_CHANGE_PRIO_ISR      = 29001u,  /* 在 ISR 中更改任务优先级错误 */
    OS_ERR_TASK_CREATE_ISR           = 29002u,  /* 在 ISR 中创建任务错误 */
    OS_ERR_TASK_DEL                  = 29003u,  /* 删除任务错误 */
    OS_ERR_TASK_DEL_IDLE             = 29004u,  /* 删除空闲任务错误 */
    OS_ERR_TASK_DEL_INVALID          = 29005u,  /* 无效的任务删除错误 */
    OS_ERR_TASK_DEL_ISR              = 29006u,  /* 在 ISR 中删除任务错误 */
    OS_ERR_TASK_INVALID              = 29007u,  /* 无效的任务错误 */
    OS_ERR_TASK_NO_MORE_TCB          = 29008u,  /* 没有更多的 TCB 可用错误 */
    OS_ERR_TASK_NOT_DLY              = 29009u,  /* 任务未延迟错误 */
    OS_ERR_TASK_NOT_EXIST            = 29010u,  /* 任务不存在错误 */
    OS_ERR_TASK_NOT_SUSPENDED        = 29011u,  /* 任务未挂起错误 */
    OS_ERR_TASK_OPT                  = 29012u,  /* 任务选项错误 */
    OS_ERR_TASK_RESUME_ISR           = 29013u,  /* 在 ISR 中恢复任务错误 */
    OS_ERR_TASK_RESUME_PRIO          = 29014u,  /* 恢复任务优先级错误 */
    OS_ERR_TASK_RESUME_SELF          = 29015u,  /* 恢复自身任务错误 */
    OS_ERR_TASK_RUNNING              = 29016u,  /* 任务正在运行错误 */
    OS_ERR_TASK_STK_CHK_ISR          = 29017u,  /* 在 ISR 中检查任务堆栈错误 */
    OS_ERR_TASK_SUSPENDED            = 29018u,  /* 任务已挂起错误 */
    OS_ERR_TASK_SUSPEND_IDLE         = 29019u,  /* 挂起空闲任务错误 */
    OS_ERR_TASK_SUSPEND_INT_HANDLER  = 29020u,  /* 在中断处理程序中挂起任务错误 */
    OS_ERR_TASK_SUSPEND_ISR          = 29021u,  /* 在 ISR 中挂起任务错误 */
    OS_ERR_TASK_SUSPEND_PRIO         = 29022u,  /* 挂起任务优先级错误 */
    OS_ERR_TASK_WAITING              = 29023u,  /* 任务正在等待错误 */
    OS_ERR_TASK_SUSPEND_CTR_OVF      = 29024u,  /* 任务挂起计数器溢出错误 */

    OS_ERR_TCB_INVALID               = 29101u,  /* 无效的 TCB 错误 */

    OS_ERR_TLS_ID_INVALID            = 29120u,  /* 无效的 TLS ID 错误 */
    OS_ERR_TLS_ISR                   = 29121u,  /* 在 ISR 中使用 TLS 错误 */
    OS_ERR_TLS_NO_MORE_AVAIL         = 29122u,  /* 没有更多的 TLS 可用错误 */
    OS_ERR_TLS_NOT_EN                = 29123u,  /* TLS 未启用错误 */
    OS_ERR_TLS_DESTRUCT_ASSIGNED     = 29124u,  /* 已分配的 TLS 销毁错误 */

    OS_ERR_TICK_PRIO_INVALID         = 29201u,  /* 无效的滴答优先级错误 */
    OS_ERR_TICK_STK_INVALID          = 29202u,  /* 无效的滴答堆栈错误 */
    OS_ERR_TICK_STK_SIZE_INVALID     = 29203u,  /* 无效的滴答堆栈大小错误 */
    OS_ERR_TICK_WHEEL_SIZE           = 29204u,  /* 无效的滴答轮大小错误 */
    OS_ERR_TICK_DISABLED             = 29205u,  /* 滴答禁用错误 */

    OS_ERR_TIME_DLY_ISR              = 29301u,  /* 在 ISR 中延迟时间错误 */
    OS_ERR_TIME_DLY_RESUME_ISR       = 29302u,  /* 在 ISR 中恢复延迟时间错误 */
    OS_ERR_TIME_GET_ISR              = 29303u,  /* 在 ISR 中获取时间错误 */
    OS_ERR_TIME_INVALID_HOURS        = 29304u,  /* 无效的小时错误 */
    OS_ERR_TIME_INVALID_MINUTES      = 29305u,  /* 无效的分钟错误 */
    OS_ERR_TIME_INVALID_SECONDS      = 29306u,  /* 无效的秒错误 */
    OS_ERR_TIME_INVALID_MILLISECONDS = 29307u,  /* 无效的毫秒错误 */
    OS_ERR_TIME_NOT_DLY              = 29308u,  /* 时间未延迟错误 */
    OS_ERR_TIME_SET_ISR              = 29309u,  /* 在 ISR 中设置时间错误 */
    OS_ERR_TIME_ZERO_DLY             = 29310u,  /* 零延迟时间错误 */

    OS_ERR_TIMEOUT                   = 29401u,  /* 超时错误 */

    OS_ERR_TMR_INACTIVE              = 29501u,  /* 定时器不活动错误 */
    OS_ERR_TMR_INVALID_DEST          = 29502u,  /* 无效的定时器目标错误 */
    OS_ERR_TMR_INVALID_DLY           = 29503u,  /* 无效的定时器延迟错误 */
    OS_ERR_TMR_INVALID_PERIOD        = 29504u,  /* 无效的定时器周期错误 */
    OS_ERR_TMR_INVALID_STATE         = 29505u,  /* 无效的定时器状态错误 */
    OS_ERR_TMR_INVALID               = 29506u,  /* 无效的定时器错误 */
    OS_ERR_TMR_ISR                   = 29507u,  /* 在 ISR 中使用定时器错误 */
    OS_ERR_TMR_NO_CALLBACK           = 29508u,  /* 没有回调函数错误 */
    OS_ERR_TMR_NON_AVAIL             = 29509u,  /* 没有更多的定时器可用错误 */
    OS_ERR_TMR_PRIO_INVALID          = 29510u,  /* 无效的定时器优先级错误 */
    OS_ERR_TMR_STK_INVALID           = 29511u,  /* 无效的定时器堆栈错误 */
    OS_ERR_TMR_STK_SIZE_INVALID      = 29512u,  /* 无效的定时器堆栈大小错误 */
    OS_ERR_TMR_STOPPED               = 29513u,  /* 定时器已停止错误 */
    OS_ERR_TMR_INVALID_CALLBACK      = 29514u,  /* 无效的定时器回调函数错误 */

    OS_ERR_U                         = 30000u,  /* U 类错误 */

    OS_ERR_V                         = 31000u,  /* V 类错误 */

    OS_ERR_W                         = 32000u,  /* W 类错误 */

    OS_ERR_X                         = 33000u,  /* X 类错误 */

    OS_ERR_Y                         = 34000u,  /* Y 类错误 */
    OS_ERR_YIELD_ISR                 = 34001u,  /* 在 ISR 中让出控制权错误 */

    OS_ERR_Z                         = 35000u  /* Z 类错误 */
} OS_ERR;


/*
************************************************************************************************************************
************************************************************************************************************************
*                                                  数据类型
************************************************************************************************************************
************************************************************************************************************************
*/

typedef  struct  os_flag_grp         OS_FLAG_GRP;  /* 信号量组类型 */

typedef  struct  os_mem              OS_MEM;       /* 内存池类型 */

typedef  struct  os_msg              OS_MSG;       /* 消息类型 */
typedef  struct  os_msg_pool         OS_MSG_POOL;  /* 消息池类型 */
typedef  struct  os_msg_q            OS_MSG_Q;     /* 消息队列类型 */

typedef  struct  os_mutex            OS_MUTEX;     /* 互斥锁类型 */

typedef  struct  os_cond             OS_COND;      /* 条件变量类型 */

typedef  struct  os_q                OS_Q;         /* 队列类型 */

typedef  struct  os_sem              OS_SEM;       /* 信号量类型 */

typedef  void                      (*OS_TASK_PTR)(void *p_arg);  /* 任务函数指针类型 */

typedef  struct  os_tcb              OS_TCB;       /* 任务控制块类型 */

#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
typedef  void                       *OS_TLS;       /* 线程局部存储类型 */
typedef  CPU_DATA                    OS_TLS_ID;    /* 线程局部存储ID类型 */
typedef  void                      (*OS_TLS_DESTRUCT_PTR)(OS_TCB    *p_tcb,
                                                          OS_TLS_ID  id,
                                                          OS_TLS     value);  /* 线程局部存储销毁函数指针类型 */
#endif

typedef  struct  os_rdy_list         OS_RDY_LIST;  /* 就绪任务列表类型 */

typedef  struct  os_tick_list        OS_TICK_LIST; /* 节拍列表类型 */

typedef  void                      (*OS_TMR_CALLBACK_PTR)(void *p_tmr, void *p_arg);  /* 定时器回调函数指针类型 */
typedef  struct  os_tmr              OS_TMR;       /* 定时器类型 */

typedef  struct  os_pend_list        OS_PEND_LIST; /* 挂起任务列表类型 */
typedef  struct  os_pend_obj         OS_PEND_OBJ;  /* 挂起对象类型 */

#if (OS_CFG_APP_HOOKS_EN > 0u)
typedef  void                      (*OS_APP_HOOK_VOID)(void);  /* 应用程序钩子函数指针类型(无参数) */
typedef  void                      (*OS_APP_HOOK_TCB)(OS_TCB *p_tcb);  /* 应用程序钩子函数指针类型(带任务控制块参数) */
#endif


/*
************************************************************************************************************************
************************************************************************************************************************
*                                          数据结构
************************************************************************************************************************
************************************************************************************************************************
*/

/*
------------------------------------------------------------------------------------------------------------------------
*                                                      就绪列表
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_rdy_list {
    OS_TCB              *HeadPtr;                           /* 指向选定优先级下将运行的任务 */
    OS_TCB              *TailPtr;                           /* 指向选定优先级下的最后一个任务 */
#if (OS_CFG_DBG_EN > 0u)
    OS_OBJ_QTY           NbrEntries;                        /* 选定优先级下的条目数量 */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                      挂起列表
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_pend_list {
    OS_TCB              *HeadPtr;                           /* 指向挂起列表中的第一个任务 */
    OS_TCB              *TailPtr;                           /* 指向挂起列表中的最后一个任务 */
#if (OS_CFG_DBG_EN > 0u)
    OS_OBJ_QTY           NbrEntries;                        /* 挂起列表中的条目数量 */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                       挂起对象
*
* 注意(s) : (1) 'os_pend_obj' 结构数据类型是特定内核对象数据类型的模板/子集:
*               'os_flag_grp', 'os_mutex', 'os_q' 和 'os_sem'。每个特定的内核对象数据类型必须定义
*               所有通用的 OS 挂起对象参数,并且这些参数的顺序和数据类型必须同步。
*
*               因此,对 OS 挂起对象参数的顺序或数据类型的任何修改都必须在通用的 OS 挂起对象数据类型和所有特定内核对象的数据类型之间适当同步。
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_pend_obj {
#if (OS_OBJ_TYPE_REQ > 0u)
    OS_OBJ_TYPE          Type;                              /* 对象类型 */
#endif
#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           /* 对象名称指针 */
#endif
    OS_PEND_LIST         PendList;                          /* 挂起在该对象上的任务列表 */
#if (OS_CFG_DBG_EN > 0u)
    void                *DbgPrevPtr;                        /* 调试前一个对象指针 */
    void                *DbgNextPtr;                        /* 调试下一个对象指针 */
    CPU_CHAR            *DbgNamePtr;                        /* 调试对象名称指针 */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                     事件标志
*
* 注意(s) : 参见  PEND OBJ  注意 #1。
------------------------------------------------------------------------------------------------------------------------
*/


struct  os_flag_grp {                                       /* 事件标志组 */
                                                            /* ------------------ 通用成员 ------------------ */
#if (OS_OBJ_TYPE_REQ > 0u)
    OS_OBJ_TYPE          Type;                              /* 应设置为 OS_OBJ_TYPE_FLAG */
#endif
#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           /* 指向事件标志名称的指针(以 NUL 结尾的 ASCII 字符串) */
#endif
    OS_PEND_LIST         PendList;                          /* 等待事件标志组的任务列表 */
#if (OS_CFG_DBG_EN > 0u)
    OS_FLAG_GRP         *DbgPrevPtr;                        /* 调试前一个事件标志组指针 */
    OS_FLAG_GRP         *DbgNextPtr;                        /* 调试下一个事件标志组指针 */
    CPU_CHAR            *DbgNamePtr;                        /* 调试事件标志名称指针 */
#endif
                                                            /* ------------------ 特定成员 ------------------ */
    OS_FLAGS             Flags;                             /* 8、16 或 32 位标志 */
#if (OS_CFG_TS_EN > 0u)
    CPU_TS               TS;                                /* 最后一次发布的时间戳 */
#endif
#if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN > 0u))
    CPU_ADDR             FlagID;                            /* 用于第三方调试器和跟踪器的唯一 ID */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                   内存分区
------------------------------------------------------------------------------------------------------------------------
*/


struct os_mem {                                             /* 内存控制块 */
#if (OS_OBJ_TYPE_REQ > 0u)
    OS_OBJ_TYPE          Type;                              /* 应设置为 OS_OBJ_TYPE_MEM */
#endif
#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           /* 指向内存分区名称的指针(以 NUL 结尾的 ASCII 字符串) */
#endif
    void                *AddrPtr;                           /* 指向内存分区起始地址的指针 */
    void                *FreeListPtr;                       /* 指向空闲内存块列表的指针 */
    OS_MEM_SIZE          BlkSize;                           /* 每个内存块的大小(以字节为单位) */
    OS_MEM_QTY           NbrMax;                            /* 该分区中的总块数 */
    OS_MEM_QTY           NbrFree;                           /* 该分区中剩余的内存块数 */
#if (OS_CFG_DBG_EN > 0u)
    OS_MEM              *DbgPrevPtr;                        /* 调试前一个内存分区指针 */
    OS_MEM              *DbgNextPtr;                        /* 调试下一个内存分区指针 */
#endif
#if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN > 0u))
    CPU_ADDR             MemID;                             /* 用于第三方调试器和跟踪器的唯一 ID */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                       消息
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_msg {                                            /* 消息控制块 */
    OS_MSG              *NextPtr;                           /* 指向下一个消息的指针 */
    void                *MsgPtr;                            /* 实际消息 */
    OS_MSG_SIZE          MsgSize;                           /* 消息的大小(以字节为单位) */
#if (OS_CFG_TS_EN > 0u)
    CPU_TS               MsgTS;                             /* 消息发送的时间戳 */
#endif
};




struct  os_msg_pool {                                       /* 消息池 */
    OS_MSG              *NextPtr;                           /* 指向下一个消息的指针 */
    OS_MSG_QTY           NbrFree;                           /* 该池中可用的消息数量 */
    OS_MSG_QTY           NbrUsed;                           /* 当前使用的消息数量 */
#if (OS_CFG_DBG_EN > 0u)
    OS_MSG_QTY           NbrUsedMax;                        /* 使用消息的最大峰值数量 */
#endif
};



struct  os_msg_q {                                          /* 消息队列 */
    OS_MSG              *InPtr;                             /* 指向将要插入队列的下一个消息的指针 */
    OS_MSG              *OutPtr;                            /* 指向将要从队列中提取的下一个消息的指针 */
    OS_MSG_QTY           NbrEntriesSize;                    /* 队列中允许的最大条目数 */
    OS_MSG_QTY           NbrEntries;                        /* 队列中当前的条目数 */
#if (OS_CFG_DBG_EN > 0u)
    OS_MSG_QTY           NbrEntriesMax;                     /* 队列中条目的最大峰值数 */
#endif
#if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN > 0u))
    CPU_ADDR             MsgQID;                            /* 用于第三方调试器和跟踪器的唯一 ID */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                              互斥信号量
*
* 注意(s) : 参见  PEND OBJ  注意 #1。
------------------------------------------------------------------------------------------------------------------------
*/

// 互斥信号量结构体定义
struct os_mutex {                                           // 互斥信号量
                                                            // ------------------ 通用成员 ------------------
#if (OS_OBJ_TYPE_REQ > 0u)
    OS_OBJ_TYPE          Type;                              // 应设置为 OS_OBJ_TYPE_MUTEX
#endif
#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           // 指向互斥信号量名称的指针(以 NUL 结尾的 ASCII 字符串)
#endif
    OS_PEND_LIST         PendList;                          // 等待互斥信号量的任务列表
#if (OS_CFG_DBG_EN > 0u)
    OS_MUTEX            *DbgPrevPtr;                        // 调试前一个互斥信号量指针
    OS_MUTEX            *DbgNextPtr;                        // 调试下一个互斥信号量指针
    CPU_CHAR            *DbgNamePtr;                        // 调试名称指针
#endif
                                                            // ------------------ 特定成员 ------------------
    OS_MUTEX            *MutexGrpNextPtr;                   // 互斥信号量组中的下一个互斥信号量指针
    OS_TCB              *OwnerTCBPtr;                       // 拥有该互斥信号量的任务控制块指针
    OS_NESTING_CTR       OwnerNestingCtr;                   // 计数器为 0 时表示互斥信号量可用
#if (OS_CFG_TS_EN > 0u)
    CPU_TS               TS;                                // 时间戳
#endif
#if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN > 0u))
    CPU_ADDR             MutexID;                           // 用于第三方调试器和跟踪器的唯一 ID
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                  条件变量
*
* 注意:参见  PEND OBJ  注释 #1。
------------------------------------------------------------------------------------------------------------------------
*/

struct os_cond {                                            /* 条件变量结构体                                         */
                                                            /* ------------------ 通用成员 ------------------ */
#if (OS_OBJ_TYPE_REQ > 0u)
    OS_OBJ_TYPE          Type;                              /* 应设置为 OS_OBJ_TYPE_COND                              */
#endif
#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           /* 指向条件变量名称的指针(以 NUL 结尾的 ASCII 字符串)   */
#endif
    OS_PEND_LIST         PendList;                          /* 等待条件变量的任务列表                                 */
#if (OS_CFG_DBG_EN > 0u)
    void                *DbgPrevPtr;                        /* 调试用前一个节点指针                                   */
    void                *DbgNextPtr;                        /* 调试用下一个节点指针                                   */
    CPU_CHAR            *DbgNamePtr;                        /* 调试用名称指针                                         */
#endif
                                                            /* ------------------ 特定成员 ------------------ */
    OS_MUTEX            *Mutex;                             /* 绑定到条件变量的互斥锁                                 */
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                   消息队列
*
* 注意:参见 PEND OBJ 注释 #1。
------------------------------------------------------------------------------------------------------------------------
*/

struct os_q {                                               /* 消息队列结构体                                         */
                                                            /* ------------------ 通用成员 ------------------ */
#if (OS_OBJ_TYPE_REQ > 0u)
    OS_OBJ_TYPE          Type;                              /* 应设置为 OS_OBJ_TYPE_Q                                 */
#endif
#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           /* 指向消息队列名称的指针(以 NUL 结尾的 ASCII 字符串)   */
#endif
    OS_PEND_LIST         PendList;                          /* 等待消息队列的任务列表                                 */
#if (OS_CFG_DBG_EN > 0u)
    OS_Q                *DbgPrevPtr;                        /* 调试用前一个节点指针                                   */
    OS_Q                *DbgNextPtr;                        /* 调试用下一个节点指针                                   */
    CPU_CHAR            *DbgNamePtr;                        /* 调试用名称指针                                         */
#endif
                                                            /* ------------------ 特定成员 ------------------ */
    OS_MSG_Q             MsgQ;                              /* 消息列表                                               */
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                   信号量
*
* 注意:参见 PEND OBJ 注释 #1。
------------------------------------------------------------------------------------------------------------------------
*/

struct os_sem {                                             /* 信号量结构体                                           */
                                                            /* ------------------ 通用成员 ------------------ */
#if (OS_OBJ_TYPE_REQ > 0u)
    OS_OBJ_TYPE          Type;                              /* 应设置为 OS_OBJ_TYPE_SEM                               */
#endif
#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           /* 指向信号量名称的指针(以 NUL 结尾的 ASCII 字符串)     */
#endif
    OS_PEND_LIST         PendList;                          /* 等待信号量的任务列表                                   */
#if (OS_CFG_DBG_EN > 0u)
    OS_SEM              *DbgPrevPtr;                        /* 调试用前一个节点指针                                   */
    OS_SEM              *DbgNextPtr;                        /* 调试用下一个节点指针                                   */
    CPU_CHAR            *DbgNamePtr;                        /* 调试用名称指针                                         */
#endif
                                                            /* ------------------ 特定成员 ------------------ */
    OS_SEM_CTR           Ctr;                               /* 信号量计数器                                           */
#if (OS_CFG_TS_EN > 0u)
    CPU_TS               TS;                                /* 时间戳                                                 */
#endif
#if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN > 0u))
    CPU_ADDR             SemID;                             /* 第三方调试器和跟踪器的唯一 ID                           */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                  任务控制块
------------------------------------------------------------------------------------------------------------------------
*/

struct os_tcb {
    CPU_STK             *StkPtr;                            /* 指向当前堆栈顶部的指针                                 */

    void                *ExtPtr;                            /* 指向用户定义的数据,用于 TCB 扩展                     */

    CPU_STK             *StkLimitPtr;                       /* 用于设置堆栈“水印”限制的指针                         */

#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           /* 指向任务名称的指针                                    */
#endif

    OS_TCB              *NextPtr;                           /* 指向 TCB 列表中下一个 TCB 的指针                      */
    OS_TCB              *PrevPtr;                           /* 指向 TCB 列表中上一个 TCB 的指针                      */

#if (OS_CFG_TICK_EN > 0u)
    OS_TCB              *TickNextPtr;                       /* 指向时间片轮转列表中下一个 TCB 的指针                  */
    OS_TCB              *TickPrevPtr;                       /* 指向时间片轮转列表中上一个 TCB 的指针                  */
#endif

#if ((OS_CFG_DBG_EN > 0u) || (OS_CFG_STAT_TASK_STK_CHK_EN > 0u) || (OS_CFG_TASK_STK_REDZONE_EN > 0u))
    CPU_STK             *StkBasePtr;                        /* 指向堆栈基地址的指针                                  */
#endif

#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
    OS_TLS               TLS_Tbl[OS_CFG_TLS_TBL_SIZE];      /* 线程局部存储表                                         */
#endif

#if (OS_CFG_DBG_EN > 0u)
    OS_TASK_PTR          TaskEntryAddr;                     /* 指向任务入口地址的指针                                */
    void                *TaskEntryArg;                      /* 创建任务时传递的参数                                  */
#endif

    OS_TCB              *PendNextPtr;                       /* 指向挂起列表中下一个 TCB 的指针                       */
    OS_TCB              *PendPrevPtr;                       /* 指向挂起列表中上一个 TCB 的指针                       */
    OS_PEND_OBJ         *PendObjPtr;                        /* 指向挂起对象的指针                                    */
    OS_STATE             PendOn;                            /* 表示任务正在等待的对象                                */
    OS_STATUS            PendStatus;                        /* 挂起状态                                              */

    OS_STATE             TaskState;                         /* 任务状态(参见 OS_TASK_STATE_xxx)                    */
    OS_PRIO              Prio;                              /* 任务优先级(0 表示最高优先级)                        */
#if (OS_CFG_MUTEX_EN > 0u)
    OS_PRIO              BasePrio;                          /* 基础优先级(未继承)                                  */
    OS_MUTEX            *MutexGrpHeadPtr;                   /* 拥有的互斥锁组头指针                                  */
#endif

#if ((OS_CFG_DBG_EN > 0u) || (OS_CFG_STAT_TASK_STK_CHK_EN > 0u) || (OS_CFG_TASK_STK_REDZONE_EN > 0u))
    CPU_STK_SIZE         StkSize;                           /* 任务堆栈大小(以堆栈元素数量为单位)                  */
#endif
    OS_OPT               Opt;                               /* 任务选项(由 OSTaskCreate() 传递)                    */

#if (OS_CFG_TS_EN > 0u)
    CPU_TS               TS;                                /* 时间戳                                                */
#endif
#if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN > 0u))
    CPU_ADDR             SemID;                             /* 第三方调试器和跟踪器的唯一 ID                          */
#endif
    OS_SEM_CTR           SemCtr;                            /* 任务特定的信号量计数器                                */

                                                            /* 延迟 / 超时                                           */
#if (OS_CFG_TICK_EN > 0u)
    OS_TICK              TickRemain;                        /* 剩余的 tick 数量                                      */
    OS_TICK              TickCtrPrev;                       /* 在周期模式下由 OSTimeDlyXX() 使用                     */
#endif

#if (OS_CFG_SCHED_ROUND_ROBIN_EN > 0u)
    OS_TICK              TimeQuanta;                        /* 时间片大小                                            */
    OS_TICK              TimeQuantaCtr;                     /* 时间片计数器                                          */
#endif

#if (OS_MSG_EN > 0u)
    void                *MsgPtr;                            /* 接收到的消息                                           */
    OS_MSG_SIZE          MsgSize;                           /* 消息大小                                               */
#endif

#if (OS_CFG_TASK_Q_EN > 0u)
    OS_MSG_Q             MsgQ;                              /* 与任务关联的消息队列                                  */
#if (OS_CFG_TASK_PROFILE_EN > 0u)
    CPU_TS               MsgQPendTime;                      /* 接收信号所需的时间                                     */
    CPU_TS               MsgQPendTimeMax;                   /* 接收信号所需的最大时间                                 */
#endif
#endif

#if (OS_CFG_TASK_REG_TBL_SIZE > 0u)
    OS_REG               RegTbl[OS_CFG_TASK_REG_TBL_SIZE];  /* 任务特定寄存器                                         */
#endif

#if (OS_CFG_FLAG_EN > 0u)
    OS_FLAGS             FlagsPend;                         /* 要等待的事件标志                                      */
    OS_FLAGS             FlagsRdy;                          /* 使任务就绪的事件标志                                  */
    OS_OPT               FlagsOpt;                          /* 选项(参见 OS_OPT_FLAG_xxx)                          */
#endif

#if (OS_CFG_TASK_SUSPEND_EN > 0u)
    OS_NESTING_CTR       SuspendCtr;                        /* OSTaskSuspend() 的嵌套计数器                          */
#endif

#if (OS_CFG_TASK_PROFILE_EN > 0u)
    OS_CPU_USAGE         CPUUsage;                          /* 任务的 CPU 使用率(0.00-100.00%)                     */
    OS_CPU_USAGE         CPUUsageMax;                       /* 任务的 CPU 使用率峰值(0.00-100.00%)                 */
    OS_CTX_SW_CTR        CtxSwCtr;                          /* 任务被切换进来的次数                                  */
    CPU_TS               CyclesDelta;                       /* OS_TS_GET() - .CyclesStart 的值                       */
    CPU_TS               CyclesStart;                       /* 任务恢复时的周期计数器快照                            */
    OS_CYCLES            CyclesTotal;                       /* 任务运行的总周期数                                     */
    OS_CYCLES            CyclesTotalPrev;                   /* 上一次的周期数快照                                     */

    CPU_TS               SemPendTime;                       /* 接收信号所需的时间                                     */
    CPU_TS               SemPendTimeMax;                    /* 接收信号所需的最大时间                                 */
#endif

#if (OS_CFG_STAT_TASK_STK_CHK_EN > 0u)
    CPU_STK_SIZE         StkUsed;                           /* 已使用的堆栈元素数量                                   */
    CPU_STK_SIZE         StkFree;                           /* 堆栈中剩余的空闲元素数量                               */
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN
    CPU_TS               IntDisTimeMax;                     /* 最大中断禁用时间                                       */
#endif
#if (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u)
    CPU_TS               SchedLockTimeMax;                  /* 最大调度器锁定时间                                     */
#endif

#if (OS_CFG_DBG_EN > 0u)
    OS_TCB              *DbgPrevPtr;                        /* 调试用前一个节点指针                                   */
    OS_TCB              *DbgNextPtr;                        /* 调试用下一个节点指针                                   */
    CPU_CHAR            *DbgNamePtr;                        /* 调试用名称指针                                         */
#endif
#if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN > 0u))
    CPU_ADDR             TaskID;                            /* 第三方调试器和跟踪器的唯一 ID                          */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                    Tick 数据类型
------------------------------------------------------------------------------------------------------------------------
*/

struct os_tick_list {
    OS_TCB              *TCB_Ptr;                           /* 指向时间片轮转列表中的任务列表                        */
#if (OS_CFG_DBG_EN > 0u)
    OS_OBJ_QTY           NbrEntries;                        /* 当前时间片轮转列表中的条目数量                        */
    OS_OBJ_QTY           NbrUpdated;                        /* 更新的条目数量                                        */
#endif
};


/*
------------------------------------------------------------------------------------------------------------------------
*                                                   定时器数据类型
------------------------------------------------------------------------------------------------------------------------
*/

struct os_tmr {
#if (OS_OBJ_TYPE_REQ > 0u)
    OS_OBJ_TYPE          Type;                              /* 应设置为定时器的类型                                   */
#endif
#if (OS_CFG_DBG_EN > 0u)
    CPU_CHAR            *NamePtr;                           /* 定时器的名称                                           */
#endif
    OS_TMR_CALLBACK_PTR  CallbackPtr;                       /* 定时器到期时调用的函数                                 */
    void                *CallbackPtrArg;                    /* 定时器到期时传递给函数的参数                           */
    OS_TMR              *NextPtr;                           /* 双向链表指针                                           */
    OS_TMR              *PrevPtr;                           /* 双向链表指针                                           */
    OS_TICK              Remain;                            /* 定时器到期前剩余的时间                                 */
    OS_TICK              Dly;                               /* 重复开始前的延迟                                       */
    OS_TICK              Period;                            /* 定时器的重复周期                                       */
    OS_OPT               Opt;                               /* 选项(参见 OS_OPT_TMR_xxx)                           */
    OS_STATE             State;                             /* 定时器的状态                                           */
#if (OS_CFG_DBG_EN > 0u)
    OS_TMR              *DbgPrevPtr;                        /* 调试用前一个节点指针                                   */
    OS_TMR              *DbgNextPtr;                        /* 调试用下一个节点指针                                   */
#endif
};


/*
************************************************************************************************************************
************************************************************************************************************************
*                                           全局变量
************************************************************************************************************************
************************************************************************************************************************
*/
                                                                        /* 应用程序钩子 ------------------------ */
#if (OS_CFG_APP_HOOKS_EN > 0u)
#if (OS_CFG_TASK_STK_REDZONE_EN > 0u)
OS_EXT           OS_APP_HOOK_TCB            OS_AppRedzoneHitHookPtr;    /* 堆栈红区命中钩子函数指针                */
#endif
OS_EXT           OS_APP_HOOK_TCB            OS_AppTaskCreateHookPtr;    /* 任务创建钩子函数指针                    */
OS_EXT           OS_APP_HOOK_TCB            OS_AppTaskDelHookPtr;       /* 任务删除钩子函数指针                    */
OS_EXT           OS_APP_HOOK_TCB            OS_AppTaskReturnHookPtr;    /* 任务返回钩子函数指针                    */

OS_EXT           OS_APP_HOOK_VOID           OS_AppIdleTaskHookPtr;      /* 空闲任务钩子函数指针                    */
OS_EXT           OS_APP_HOOK_VOID           OS_AppStatTaskHookPtr;      /* 统计任务钩子函数指针                    */
OS_EXT           OS_APP_HOOK_VOID           OS_AppTaskSwHookPtr;        /* 任务切换钩子函数指针                    */
OS_EXT           OS_APP_HOOK_VOID           OS_AppTimeTickHookPtr;      /* 时间滴答钩子函数指针                    */
#endif

                                                                        /* 空闲任务 ------------------------------- */
#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_IDLE_CTR               OSIdleTaskCtr;              /* 空闲任务计数器                           */
#endif
#if (OS_CFG_TASK_IDLE_EN > 0u)
OS_EXT            OS_TCB                    OSIdleTaskTCB;              /* 空闲任务的TCB                            */
#endif

                                                                        /* 杂项 ----------------------------------- */
OS_EXT            OS_NESTING_CTR            OSIntNestingCtr;            /* 中断嵌套级别                             */
#ifdef CPU_CFG_INT_DIS_MEAS_EN
#if (OS_CFG_TS_EN > 0u)
OS_EXT            CPU_TS                    OSIntDisTimeMax;            /* 总中断禁用时间                           */
#endif
#endif

OS_EXT            OS_STATE                  OSRunning;                  /* 标志表示内核正在运行                     */
OS_EXT            OS_STATE                  OSInitialized;              /* 标志表示内核已初始化                     */

#if (OS_CFG_STAT_TASK_STK_CHK_EN > 0u) && (OS_CFG_ISR_STK_SIZE > 0u)
OS_EXT            CPU_INT32U                OSISRStkFree;               /* 空闲的ISR堆栈条目数量                    */
OS_EXT            CPU_INT32U                OSISRStkUsed;               /* 已使用的ISR堆栈条目数量                  */
#endif

                                                                        /* 标志 ----------------------------------- */
#if (OS_CFG_FLAG_EN > 0u)
#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_FLAG_GRP              *OSFlagDbgListPtr;           /* 标志调试列表指针                         */
OS_EXT            OS_OBJ_QTY                OSFlagQty;                  /* 创建的标志数量                           */
#endif
#endif

                                                                        /* 内存管理 ------------------------------- */
#if (OS_CFG_MEM_EN > 0u)
#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_MEM                   *OSMemDbgListPtr;            /* 内存分区调试列表指针                     */
OS_EXT            OS_OBJ_QTY                OSMemQty;                   /* 创建的内存分区数量                       */
#endif
#endif

                                                                        /* 消息池 --------------------------------- */
#if (OS_MSG_EN > 0u)
OS_EXT            OS_MSG_POOL               OSMsgPool;                  /* 消息池                                   */
#endif

                                                                        /* 互斥量管理 ----------------------------- */
#if (OS_CFG_MUTEX_EN > 0u)
#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_MUTEX                 *OSMutexDbgListPtr;          /* 互斥量调试列表指针                       */
OS_EXT            OS_OBJ_QTY                OSMutexQty;                 /* 创建的互斥量数量                         */
#endif
#endif

                                                                        /* 优先级 --------------------------------- */
OS_EXT            OS_PRIO                   OSPrioCur;                  /* 当前任务的优先级                         */
OS_EXT            OS_PRIO                   OSPrioHighRdy;              /* 最高优先级任务的优先级                   */
OS_EXT            CPU_DATA                  OSPrioTbl[OS_PRIO_TBL_SIZE];/* 优先级表                                 */

                                                                        /* 队列 ----------------------------------- */
#if (OS_CFG_Q_EN > 0u)
#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_Q                     *OSQDbgListPtr;              /* 消息队列调试列表指针                     */
OS_EXT            OS_OBJ_QTY                OSQQty;                     /* 创建的消息队列数量                       */
#endif
#endif

                                                                        /* 就绪列表 ------------------------------- */
OS_EXT            OS_RDY_LIST               OSRdyList[OS_CFG_PRIO_MAX]; /* 就绪任务表                               */

#ifdef OS_SAFETY_CRITICAL_IEC61508
OS_EXT            CPU_BOOLEAN               OSSafetyCriticalStartFlag;  /* 标志表示所有初始化已完成                 */
#endif

                                                                        /* 调度器 --------------------------------- */
#if (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u)
OS_EXT            CPU_TS_TMR                OSSchedLockTimeBegin;       /* 调度器锁定时间测量                       */
OS_EXT            CPU_TS_TMR                OSSchedLockTimeMax;
OS_EXT            CPU_TS_TMR                OSSchedLockTimeMaxCur;
#endif

OS_EXT            OS_NESTING_CTR            OSSchedLockNestingCtr;      /* 锁定嵌套级别                             */
#if (OS_CFG_SCHED_ROUND_ROBIN_EN > 0u)
OS_EXT            OS_TICK                   OSSchedRoundRobinDfltTimeQuanta; /* 默认时间片大小                    */
OS_EXT            CPU_BOOLEAN               OSSchedRoundRobinEn;        /* 启用/禁用轮询调度                        */
#endif

                                                                        /* 信号量 --------------------------------- */
#if (OS_CFG_SEM_EN > 0u)
#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_SEM                   *OSSemDbgListPtr;            /* 信号量调试列表指针                       */
OS_EXT            OS_OBJ_QTY                OSSemQty;                   /* 创建的信号量数量                         */
#endif
#endif

                                                                        /* 统计 ----------------------------------- */
#if (OS_CFG_STAT_TASK_EN > 0u)
OS_EXT            CPU_BOOLEAN               OSStatResetFlag;            /* 强制重置计算的统计信息                   */
OS_EXT            OS_CPU_USAGE              OSStatTaskCPUUsage;         /* CPU 使用率(百分比)                     */
OS_EXT            OS_CPU_USAGE              OSStatTaskCPUUsageMax;      /* CPU 使用率(峰值)                       */
OS_EXT            OS_TICK                   OSStatTaskCtr;              /* 统计任务计数器                           */
OS_EXT            OS_TICK                   OSStatTaskCtrMax;
OS_EXT            OS_TICK                   OSStatTaskCtrRun;
OS_EXT            CPU_BOOLEAN               OSStatTaskRdy;              /* 统计任务就绪标志                         */
OS_EXT            OS_TCB                    OSStatTaskTCB;              /* 统计任务的TCB                            */
#if (OS_CFG_TS_EN > 0u)
OS_EXT            CPU_TS                    OSStatTaskTime;             /* 统计任务时间                             */
OS_EXT            CPU_TS                    OSStatTaskTimeMax;          /* 统计任务时间(最大值)                   */
#endif
#endif

                                                                        /* 任务 ----------------------------------- */
#if ((OS_CFG_TASK_PROFILE_EN > 0u) || (OS_CFG_DBG_EN > 0u))
OS_EXT            OS_CTX_SW_CTR             OSTaskCtxSwCtr;             /* 上下文切换次数                           */
#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_TCB                   *OSTaskDbgListPtr;           /* 任务调试列表指针                         */
#endif
#endif

OS_EXT            OS_OBJ_QTY                OSTaskQty;                  /* 创建的任务数量                           */

#if (OS_CFG_TASK_REG_TBL_SIZE > 0u)
OS_EXT            OS_REG_ID                 OSTaskRegNextAvailID;       /* 下一个可用的任务寄存器ID                 */
#endif

                                                                        /* 时间滴答 -------------------------------- */
#if (OS_CFG_TICK_EN > 0u)
OS_EXT            OS_TICK                   OSTickCtr;                  /* 自启动或上次设置以来的滴答数             */
#if (OS_CFG_DYN_TICK_EN > 0u)
OS_EXT            OS_TICK                   OSTickCtrStep;              /* 到下一次滴答任务调用的滴答数             */
#endif
OS_EXT            OS_TICK_LIST              OSTickList;                 /* 滴答列表                                 */
#if (OS_CFG_TS_EN > 0u)
OS_EXT            CPU_TS                    OSTickTime;                 /* 滴答时间                                 */
OS_EXT            CPU_TS                    OSTickTimeMax;              /* 滴答时间(最大值)                       */
#endif
#endif

#if (OS_CFG_TMR_EN > 0u)                                                /* 定时器 ----------------------------------- */
#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_TMR                   *OSTmrDbgListPtr;            /* 定时器调试列表指针                       */
OS_EXT            OS_OBJ_QTY                OSTmrListEntries;           /* 双向链表中的定时器数量                   */
#endif
OS_EXT            OS_TMR                   *OSTmrListPtr;               /* 定时器列表指针                           */
OS_EXT            OS_COND                   OSTmrCond;                  /* 定时器条件变量                           */
OS_EXT            OS_MUTEX                  OSTmrMutex;                 /* 定时器互斥量                             */

#if (OS_CFG_DBG_EN > 0u)
OS_EXT            OS_OBJ_QTY                OSTmrQty;                   /* 创建的定时器数量                         */
#endif
OS_EXT            OS_TCB                    OSTmrTaskTCB;               /* 定时器任务的TCB                          */
#if (OS_CFG_TS_EN > 0u)
OS_EXT            CPU_TS                    OSTmrTaskTime;              /* 定时器任务时间                           */
OS_EXT            CPU_TS                    OSTmrTaskTimeMax;           /* 定时器任务时间(最大值)                 */
#endif
OS_EXT            OS_TICK                   OSTmrTaskTickBase;          /* 定时器延迟的基准滴答                     */
OS_EXT            OS_TICK                   OSTmrToTicksMult;           /* 将定时器时间转换为滴答的乘数             */
#endif

                                                                        /* TCBs ------------------------------------- */
OS_EXT            OS_TCB                   *OSTCBCurPtr;                /* 指向当前运行的TCB                         */
OS_EXT            OS_TCB                   *OSTCBHighRdyPtr;            /* 指向最高优先级的TCB                       */

/*
************************************************************************************************************************
************************************************************************************************************************
*                                                   外部变量
************************************************************************************************************************
************************************************************************************************************************
*/

// 空闲任务堆栈基地址指针
extern CPU_STK * const OSCfg_IdleTaskStkBasePtr;

// 空闲任务堆栈限制大小
extern CPU_STK_SIZE const OSCfg_IdleTaskStkLimit;

// 空闲任务堆栈大小
extern CPU_STK_SIZE const OSCfg_IdleTaskStkSize;

// 空闲任务堆栈在RAM中的大小
extern CPU_INT32U const OSCfg_IdleTaskStkSizeRAM;

// 中断服务例程堆栈基地址指针
extern CPU_STK * const OSCfg_ISRStkBasePtr;

// 中断服务例程堆栈大小
extern CPU_STK_SIZE const OSCfg_ISRStkSize;

// 中断服务例程堆栈在RAM中的大小
extern CPU_INT32U const OSCfg_ISRStkSizeRAM;

// 消息池大小
extern OS_MSG_SIZE const OSCfg_MsgPoolSize;

// 消息池在RAM中的大小
extern CPU_INT32U const OSCfg_MsgPoolSizeRAM;

// 消息池基地址指针
extern OS_MSG * const OSCfg_MsgPoolBasePtr;

// 统计任务优先级
extern OS_PRIO const OSCfg_StatTaskPrio;

// 统计任务执行频率(Hz)
extern OS_RATE_HZ const OSCfg_StatTaskRate_Hz;

// 统计任务堆栈基地址指针
extern CPU_STK * const OSCfg_StatTaskStkBasePtr;

// 统计任务堆栈限制大小
extern CPU_STK_SIZE const OSCfg_StatTaskStkLimit;

// 统计任务堆栈大小
extern CPU_STK_SIZE const OSCfg_StatTaskStkSize;

// 统计任务堆栈在RAM中的大小
extern CPU_INT32U const OSCfg_StatTaskStkSizeRAM;

// 最小堆栈大小
extern CPU_STK_SIZE const OSCfg_StkSizeMin;

// 系统时钟频率(Hz)
extern OS_RATE_HZ const OSCfg_TickRate_Hz;

// 定时器任务优先级
extern OS_PRIO const OSCfg_TmrTaskPrio;

// 定时器任务执行频率(Hz)
extern OS_RATE_HZ const OSCfg_TmrTaskRate_Hz;

// 定时器任务堆栈基地址指针
extern CPU_STK * const OSCfg_TmrTaskStkBasePtr;

// 定时器任务堆栈限制大小
extern CPU_STK_SIZE const OSCfg_TmrTaskStkLimit;

// 定时器任务堆栈大小
extern CPU_STK_SIZE const OSCfg_TmrTaskStkSize;

// 定时器任务堆栈在RAM中的大小
extern CPU_INT32U const OSCfg_TmrTaskStkSizeRAM;

// 数据在RAM中的大小
extern CPU_INT32U const OSCfg_DataSizeRAM;

#if (OS_CFG_TASK_IDLE_EN > 0u)
// 空闲任务堆栈数组
extern CPU_STK OSCfg_IdleTaskStk[OS_CFG_IDLE_TASK_STK_SIZE];
#endif

#if (OS_CFG_ISR_STK_SIZE > 0u)
// 中断服务例程堆栈数组
extern CPU_STK OSCfg_ISRStk[OS_CFG_ISR_STK_SIZE];
#endif

#if (OS_MSG_EN > 0u)
// 消息池数组
extern OS_MSG OSCfg_MsgPool[OS_CFG_MSG_POOL_SIZE];
#endif

#if (OS_CFG_STAT_TASK_EN > 0u)
// 统计任务堆栈数组
extern CPU_STK OSCfg_StatTaskStk[OS_CFG_STAT_TASK_STK_SIZE];
#endif

#if (OS_CFG_TMR_EN > 0u)
// 定时器任务堆栈数组
extern CPU_STK OSCfg_TmrTaskStk[OS_CFG_TMR_TASK_STK_SIZE];
#endif

/*
************************************************************************************************************************
************************************************************************************************************************
*                                        函数原型声明
************************************************************************************************************************
************************************************************************************************************************
*/

/* ================================================================================================================== */
/*                                                    事件标志                                                      */
/* ================================================================================================================== */

#if (OS_CFG_FLAG_EN > 0u)

// 创建事件标志组
void OSFlagCreate(OS_FLAG_GRP *p_grp, CPU_CHAR *p_name, OS_FLAGS flags, OS_ERR *p_err);

#if (OS_CFG_FLAG_DEL_EN > 0u)
// 删除事件标志组
OS_OBJ_QTY OSFlagDel(OS_FLAG_GRP *p_grp, OS_OPT opt, OS_ERR *p_err);
#endif

// 等待事件标志
OS_FLAGS OSFlagPend(OS_FLAG_GRP *p_grp, OS_FLAGS flags, OS_TICK timeout, OS_OPT opt, CPU_TS *p_ts, OS_ERR *p_err);

#if (OS_CFG_FLAG_PEND_ABORT_EN > 0u)
// 中止等待事件标志
OS_OBJ_QTY OSFlagPendAbort(OS_FLAG_GRP *p_grp, OS_OPT opt, OS_ERR *p_err);
#endif

// 获取已就绪的事件标志
OS_FLAGS OSFlagPendGetFlagsRdy(OS_ERR *p_err);

// 发送事件标志
OS_FLAGS OSFlagPost(OS_FLAG_GRP *p_grp, OS_FLAGS flags, OS_OPT opt, OS_ERR *p_err);

/* ------------------------------------------------ 内部函数 ------------------------------------------------ */

// 清除事件标志组
void OS_FlagClr(OS_FLAG_GRP *p_grp);

// 阻塞等待事件标志
void OS_FlagBlock(OS_FLAG_GRP *p_grp, OS_FLAGS flags, OS_OPT opt, OS_TICK timeout);

#if (OS_CFG_DBG_EN > 0u)
// 将事件标志组添加到调试列表
void OS_FlagDbgListAdd(OS_FLAG_GRP *p_grp);

// 从调试列表中移除事件标志组
void OS_FlagDbgListRemove(OS_FLAG_GRP *p_grp);
#endif

// 就绪任务并设置已就绪的事件标志
void OS_FlagTaskRdy(OS_TCB *p_tcb, OS_FLAGS flags_rdy, CPU_TS ts);
#endif


/* ================================================================================================================== */
/*                                          固定大小内存块管理                                                      */
/* ================================================================================================================== */

#if (OS_CFG_MEM_EN > 0u)

// 创建固定大小内存块
void OSMemCreate(OS_MEM *p_mem, CPU_CHAR *p_name, void *p_addr, OS_MEM_QTY n_blks, OS_MEM_SIZE blk_size, OS_ERR *p_err);

// 获取内存块
void *OSMemGet(OS_MEM *p_mem, OS_ERR *p_err);

// 释放内存块
void OSMemPut(OS_MEM *p_mem, void *p_blk, OS_ERR *p_err);

/* ------------------------------------------------ 内部函数 ------------------------------------------------ */

#if (OS_CFG_DBG_EN > 0u)
// 将内存块添加到调试列表
void OS_MemDbgListAdd(OS_MEM *p_mem);
#endif

// 初始化内存管理
void OS_MemInit(OS_ERR *p_err);

#endif


/* ================================================================================================================== */
/*                                             互斥信号量                                                            */
/* ================================================================================================================== */

#if (OS_CFG_MUTEX_EN > 0u)

// 创建互斥信号量
void OSMutexCreate(OS_MUTEX *p_mutex, CPU_CHAR *p_name, OS_ERR *p_err);

#if (OS_CFG_MUTEX_DEL_EN > 0u)
// 删除互斥信号量
OS_OBJ_QTY OSMutexDel(OS_MUTEX *p_mutex, OS_OPT opt, OS_ERR *p_err);
#endif

// 等待互斥信号量
void OSMutexPend(OS_MUTEX *p_mutex, OS_TICK timeout, OS_OPT opt, CPU_TS *p_ts, OS_ERR *p_err);

#if (OS_CFG_MUTEX_PEND_ABORT_EN > 0u)
// 中止等待互斥信号量
OS_OBJ_QTY OSMutexPendAbort(OS_MUTEX *p_mutex, OS_OPT opt, OS_ERR *p_err);
#endif

// 释放互斥信号量
void OSMutexPost(OS_MUTEX *p_mutex, OS_OPT opt, OS_ERR *p_err);

/* ------------------------------------------------ 内部函数 ------------------------------------------------ */

// 清除互斥信号量
void OS_MutexClr(OS_MUTEX *p_mutex);

#if (OS_CFG_DBG_EN > 0u)
// 将互斥信号量添加到调试列表
void OS_MutexDbgListAdd(OS_MUTEX *p_mutex);

// 从调试列表中移除互斥信号量
void OS_MutexDbgListRemove(OS_MUTEX *p_mutex);
#endif

// 将互斥信号量添加到任务的互斥信号量组
void OS_MutexGrpAdd(OS_TCB *p_tcb, OS_MUTEX *p_mutex);

// 从任务的互斥信号量组中移除互斥信号量
void OS_MutexGrpRemove(OS_TCB *p_tcb, OS_MUTEX *p_mutex);

// 查找任务互斥信号量组中优先级最高的互斥信号量
OS_PRIO OS_MutexGrpPrioFindHighest(OS_TCB *p_tcb);

// 释放任务互斥信号量组中的所有互斥信号量
void OS_MutexGrpPostAll(OS_TCB *p_tcb);
#endif


/* ================================================================================================================== */
/*                                                   消息队列                                                       */
/* ================================================================================================================== */

#if (OS_CFG_Q_EN > 0u)

// 创建消息队列
void OSQCreate(OS_Q *p_q, CPU_CHAR *p_name, OS_MSG_QTY max_qty, OS_ERR *p_err);

#if (OS_CFG_Q_DEL_EN > 0u)
// 删除消息队列
OS_OBJ_QTY OSQDel(OS_Q *p_q, OS_OPT opt, OS_ERR *p_err);
#endif

#if (OS_CFG_Q_FLUSH_EN > 0u)
// 清空消息队列
OS_MSG_QTY OSQFlush(OS_Q *p_q, OS_ERR *p_err);
#endif

// 从消息队列中接收消息
void *OSQPend(OS_Q *p_q, OS_TICK timeout, OS_OPT opt, OS_MSG_SIZE *p_msg_size, CPU_TS *p_ts, OS_ERR *p_err);

#if (OS_CFG_Q_PEND_ABORT_EN > 0u)
// 中止从消息队列中接收消息
OS_OBJ_QTY OSQPendAbort(OS_Q *p_q, OS_OPT opt, OS_ERR *p_err);
#endif

// 向消息队列中发送消息
void OSQPost(OS_Q *p_q, void *p_void, OS_MSG_SIZE msg_size, OS_OPT opt, OS_ERR *p_err);

/* ------------------------------------------------ 内部函数 ------------------------------------------------ */

// 清除消息队列
void OS_QClr(OS_Q *p_q);

#if (OS_CFG_DBG_EN > 0u)
// 将消息队列添加到调试列表
void OS_QDbgListAdd(OS_Q *p_q);

// 从调试列表中移除消息队列
void OS_QDbgListRemove(OS_Q *p_q);
#endif

#endif


/* ================================================================================================================== */
/*                                                     信号量                                                        */
/* ================================================================================================================== */

#if (OS_CFG_SEM_EN > 0u)

// 创建信号量
void OSSemCreate(OS_SEM *p_sem, CPU_CHAR *p_name, OS_SEM_CTR cnt, OS_ERR *p_err);

#if (OS_CFG_SEM_DEL_EN > 0u)
// 删除信号量
OS_OBJ_QTY OSSemDel(OS_SEM *p_sem, OS_OPT opt, OS_ERR *p_err);
#endif

// 等待信号量
OS_SEM_CTR OSSemPend(OS_SEM *p_sem, OS_TICK timeout, OS_OPT opt, CPU_TS *p_ts, OS_ERR *p_err);

#if (OS_CFG_SEM_PEND_ABORT_EN > 0u)
// 中止等待信号量
OS_OBJ_QTY OSSemPendAbort(OS_SEM *p_sem, OS_OPT opt, OS_ERR *p_err);
#endif

// 释放信号量
OS_SEM_CTR OSSemPost(OS_SEM *p_sem, OS_OPT opt, OS_ERR *p_err);

#if (OS_CFG_SEM_SET_EN > 0u)
// 设置信号量计数
void OSSemSet(OS_SEM *p_sem, OS_SEM_CTR cnt, OS_ERR *p_err);
#endif

/* ------------------------------------------------ 内部函数 ------------------------------------------------ */

// 清除信号量
void OS_SemClr(OS_SEM *p_sem);

#if (OS_CFG_DBG_EN > 0u)
// 将信号量添加到调试列表
void OS_SemDbgListAdd(OS_SEM *p_sem);

// 从调试列表中移除信号量
void OS_SemDbgListRemove(OS_SEM *p_sem);
#endif

#endif


/* ================================================================================================================== */
/*                                                 任务管理                                                        */
/* ================================================================================================================== */

#if (OS_CFG_TASK_CHANGE_PRIO_EN > 0u)
// 更改任务优先级
void OSTaskChangePrio(OS_TCB *p_tcb, OS_PRIO prio_new, OS_ERR *p_err);
#endif

// 创建任务
void OSTaskCreate(OS_TCB *p_tcb, CPU_CHAR *p_name, OS_TASK_PTR p_task, void *p_arg, OS_PRIO prio, CPU_STK *p_stk_base, CPU_STK_SIZE stk_limit, CPU_STK_SIZE stk_size, OS_MSG_QTY q_size, OS_TICK time_quanta, void *p_ext, OS_OPT opt, OS_ERR *p_err);

#if (OS_CFG_TASK_DEL_EN > 0u)
// 删除任务
void OSTaskDel(OS_TCB *p_tcb, OS_ERR *p_err);
#endif

#if (OS_CFG_TASK_Q_EN > 0u)
// 清空任务消息队列
OS_MSG_QTY OSTaskQFlush(OS_TCB *p_tcb, OS_ERR *p_err);

// 从任务消息队列中接收消息
void *OSTaskQPend(OS_TICK timeout, OS_OPT opt, OS_MSG_SIZE *p_msg_size, CPU_TS *p_ts, OS_ERR *p_err);

// 中止从任务消息队列中接收消息
CPU_BOOLEAN OSTaskQPendAbort(OS_TCB *p_tcb, OS_OPT opt, OS_ERR *p_err);

// 向任务消息队列中发送消息
void OSTaskQPost(OS_TCB *p_tcb, void *p_void, OS_MSG_SIZE msg_size, OS_OPT opt, OS_ERR *p_err);
#endif

#if (OS_CFG_TASK_REG_TBL_SIZE > 0u)
// 获取任务寄存器值
OS_REG OSTaskRegGet(OS_TCB *p_tcb, OS_REG_ID id, OS_ERR *p_err);

// 获取任务寄存器ID
OS_REG_ID OSTaskRegGetID(OS_ERR *p_err);

// 设置任务寄存器值
void OSTaskRegSet(OS_TCB *p_tcb, OS_REG_ID id, OS_REG value, OS_ERR *p_err);
#endif

#if (OS_CFG_TASK_SUSPEND_EN > 0u)
// 恢复任务
void OSTaskResume(OS_TCB *p_tcb, OS_ERR *p_err);

// 挂起任务
void OSTaskSuspend(OS_TCB *p_tcb, OS_ERR *p_err);
#endif

// 等待任务信号量
OS_SEM_CTR OSTaskSemPend(OS_TICK timeout, OS_OPT opt, CPU_TS *p_ts, OS_ERR *p_err);

#if (OS_CFG_TASK_SEM_PEND_ABORT_EN > 0u)
// 中止等待任务信号量
CPU_BOOLEAN OSTaskSemPendAbort(OS_TCB *p_tcb, OS_OPT opt, OS_ERR *p_err);
#endif

// 释放任务信号量
OS_SEM_CTR OSTaskSemPost(OS_TCB *p_tcb, OS_OPT opt, OS_ERR *p_err);

// 设置任务信号量计数
OS_SEM_CTR OSTaskSemSet(OS_TCB *p_tcb, OS_SEM_CTR cnt, OS_ERR *p_err);

#if (OS_CFG_STAT_TASK_STK_CHK_EN > 0u)
// 检查任务栈使用情况
void OSTaskStkChk(OS_TCB *p_tcb, CPU_STK_SIZE *p_free, CPU_STK_SIZE *p_used, OS_ERR *p_err);
#endif

#if (OS_CFG_TASK_STK_REDZONE_EN > 0u)
// 检查任务栈红区
CPU_BOOLEAN OSTaskStkRedzoneChk(OS_TCB *p_tcb);
#endif

#ifdef OS_SAFETY_CRITICAL_IEC61508
// 开始安全关键操作
void OSSafetyCriticalStart(void);
#endif

#if (OS_CFG_SCHED_ROUND_ROBIN_EN > 0u)
// 设置任务时间片
void OSTaskTimeQuantaSet(OS_TCB *p_tcb, OS_TICK time_quanta, OS_ERR *p_err);
#endif

/* ------------------------------------------------ 内部函数 ------------------------------------------------ */

// 阻塞任务
void OS_TaskBlock(OS_TCB *p_tcb, OS_TICK timeout);

#if (OS_CFG_DBG_EN > 0u)
// 将任务添加到调试列表
void OS_TaskDbgListAdd(OS_TCB *p_tcb);

// 从调试列表中移除任务
void OS_TaskDbgListRemove(OS_TCB *p_tcb);
#endif

// 初始化任务管理
void OS_TaskInit(OS_ERR *p_err);

// 初始化任务控制块
void OS_TaskInitTCB(OS_TCB *p_tcb);

// 任务返回
void OS_TaskReturn(void);

#if (OS_CFG_TASK_STK_REDZONE_EN > 0u)
// 检查任务栈红区
CPU_BOOLEAN OS_TaskStkRedzoneChk(CPU_STK *p_base, CPU_STK_SIZE stk_size);

// 初始化任务栈红区
void OS_TaskStkRedzoneInit(CPU_STK *p_base, CPU_STK_SIZE stk_size);
#endif

// 更改任务优先级
void OS_TaskChangePrio(OS_TCB *p_tcb, OS_PRIO prio_new);


/* ================================================================================================================== */
/*                                                 时间管理                                                        */
/* ================================================================================================================== */

// 延迟指定的时间
void OSTimeDly(OS_TICK dly, OS_OPT opt, OS_ERR *p_err);

#if (OS_CFG_TIME_DLY_HMSM_EN > 0u)
// 延迟指定的小时、分钟、秒和毫秒
void OSTimeDlyHMSM(CPU_INT16U hours, CPU_INT16U minutes, CPU_INT16U seconds, CPU_INT32U milli, OS_OPT opt, OS_ERR *p_err);
#endif

#if (OS_CFG_TIME_DLY_RESUME_EN > 0u)
// 恢复任务的延迟
void OSTimeDlyResume(OS_TCB *p_tcb, OS_ERR *p_err);
#endif

// 获取当前系统时间
OS_TICK OSTimeGet(OS_ERR *p_err);

// 设置系统时间
void OSTimeSet(OS_TICK ticks, OS_ERR *p_err);

// 处理系统时钟滴答
void OSTimeTick(void);

#if (OS_CFG_DYN_TICK_EN > 0u)
// 设置动态时钟滴答
void OSTimeDynTick(OS_TICK ticks);
#endif


/* ================================================================================================================== */
/*                                                 定时器管理                                                        */
/* ================================================================================================================== */

#if (OS_CFG_TMR_EN > 0u)
// 创建定时器
void OSTmrCreate(OS_TMR *p_tmr, CPU_CHAR *p_name, OS_TICK dly, OS_TICK period, OS_OPT opt, OS_TMR_CALLBACK_PTR p_callback, void *p_callback_arg, OS_ERR *p_err);

// 删除定时器
CPU_BOOLEAN OSTmrDel(OS_TMR *p_tmr, OS_ERR *p_err);

// 设置定时器参数
void OSTmrSet(OS_TMR *p_tmr, OS_TICK dly, OS_TICK period, OS_TMR_CALLBACK_PTR p_callback, void *p_callback_arg, OS_ERR *p_err);

// 获取定时器剩余时间
OS_TICK OSTmrRemainGet(OS_TMR *p_tmr, OS_ERR *p_err);

// 启动定时器
CPU_BOOLEAN OSTmrStart(OS_TMR *p_tmr, OS_ERR *p_err);

// 获取定时器状态
OS_STATE OSTmrStateGet(OS_TMR *p_tmr, OS_ERR *p_err);

// 停止定时器
CPU_BOOLEAN OSTmrStop(OS_TMR *p_tmr, OS_OPT opt, void *p_callback_arg, OS_ERR *p_err);

/* ------------------------------------------------ 内部函数 ------------------------------------------------ */

// 清除定时器
void OS_TmrClr(OS_TMR *p_tmr);

#if (OS_CFG_DBG_EN > 0u)
// 将定时器添加到调试列表
void OS_TmrDbgListAdd(OS_TMR *p_tmr);

// 从调试列表中移除定时器
void OS_TmrDbgListRemove(OS_TMR *p_tmr);
#endif

// 初始化定时器管理
void OS_TmrInit(OS_ERR *p_err);

// 链接定时器到时间链表
void OS_TmrLink(OS_TMR *p_tmr, OS_TICK time);

// 从时间链表中移除定时器
void OS_TmrUnlink(OS_TMR *p_tmr, OS_TICK time);

// 定时器任务处理函数
void OS_TmrTask(void *p_arg);

#endif


/* ================================================================================================================== */
/*                                          任务本地存储 (TLS) 支持                                                  */
/* ================================================================================================================== */

#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
// 获取任务本地存储 (TLS) ID
OS_TLS_ID OS_TLS_GetID(OS_ERR *p_err);

// 获取任务本地存储 (TLS) 值
OS_TLS OS_TLS_GetValue(OS_TCB *p_tcb, OS_TLS_ID id, OS_ERR *p_err);

// 初始化任务本地存储 (TLS)
void OS_TLS_Init(OS_ERR *p_err);

// 设置任务本地存储 (TLS) 值
void OS_TLS_SetValue(OS_TCB *p_tcb, OS_TLS_ID id, OS_TLS value, OS_ERR *p_err);

// 设置任务本地存储 (TLS) 析构函数
void OS_TLS_SetDestruct(OS_TLS_ID id, OS_TLS_DESTRUCT_PTR p_destruct, OS_ERR *p_err);

// 在任务创建时初始化任务本地存储 (TLS)
void OS_TLS_TaskCreate(OS_TCB *p_tcb);

// 在任务删除时清理任务本地存储 (TLS)
void OS_TLS_TaskDel(OS_TCB *p_tcb);

// 在任务切换时处理任务本地存储 (TLS)
void OS_TLS_TaskSw(void);
#endif


/* ================================================================================================================== */
/*                                                    杂项                                                            */
/* ================================================================================================================== */

// 初始化操作系统
// @param p_err 错误指针,用于返回错误代码
void OSInit(OS_ERR *p_err);

// 进入中断上下文
void OSIntEnter(void);

// 退出中断上下文
void OSIntExit(void);

#if (OS_CFG_SCHED_ROUND_ROBIN_EN > 0u)
// 配置轮转调度
// @param en 启用或禁用轮转调度
// @param dflt_time_quanta 默认时间片
// @param p_err 错误指针,用于返回错误代码
void OSSchedRoundRobinCfg(CPU_BOOLEAN en, OS_TICK dflt_time_quanta, OS_ERR *p_err);

// 轮转调度让出 CPU
// @param p_err 错误指针,用于返回错误代码
void OSSchedRoundRobinYield(OS_ERR *p_err);

#endif

// 执行任务调度
void OSSched(void);

// 锁定调度器
// @param p_err 错误指针,用于返回错误代码
void OSSchedLock(OS_ERR *p_err);

// 解锁调度器
// @param p_err 错误指针,用于返回错误代码
void OSSchedUnlock(OS_ERR *p_err);

// 启动多任务调度
// @param p_err 错误指针,用于返回错误代码
void OSStart(OS_ERR *p_err);

#if (OS_CFG_STAT_TASK_EN > 0u)
// 重置统计任务
// @param p_err 错误指针,用于返回错误代码
void OSStatReset(OS_ERR *p_err);

// 初始化统计任务的 CPU 使用率
// @param p_err 错误指针,用于返回错误代码
void OSStatTaskCPUUsageInit(OS_ERR *p_err);
#endif

// 获取操作系统版本
// @param p_err 错误指针,用于返回错误代码
// @return 操作系统版本号
CPU_INT16U OSVersion(OS_ERR *p_err);

/* ------------------------------------------------ INTERNAL FUNCTIONS ---------------------------------------------- */

// 空闲任务
// @param p_arg 传递给任务的参数
void OS_IdleTask(void *p_arg);

// 初始化空闲任务
// @param p_err 错误指针,用于返回错误代码
void OS_IdleTaskInit(OS_ERR *p_err);

#if (OS_CFG_STAT_TASK_EN > 0u)
// 统计任务
// @param p_arg 传递给任务的参数
void OS_StatTask(void *p_arg);
#endif

// 初始化统计任务
// @param p_err 错误指针,用于返回错误代码
void OS_StatTaskInit(OS_ERR *p_err);

// 初始化系统滴答定时器
// @param p_err 错误指针,用于返回错误代码
void OS_TickInit(OS_ERR *p_err);

// 更新系统滴答定时器
// @param ticks 需要更新的滴答数
void OS_TickUpdate(OS_TICK ticks);

/*
************************************************************************************************************************
************************************************************************************************************************
*                                    目标特定函数
************************************************************************************************************************
************************************************************************************************************************
*/

void          OSIdleTaskHook            (void);
// 空闲任务钩子函数

void          OSInitHook                (void);
// 初始化钩子函数

#if (OS_CFG_TASK_STK_REDZONE_EN > 0u)
void          OSRedzoneHitHook          (OS_TCB                *p_tcb);
// 栈红区命中钩子函数
#endif

void          OSStatTaskHook            (void);
// 状态任务钩子函数

void          OSTaskCreateHook          (OS_TCB                *p_tcb);
// 任务创建钩子函数

void          OSTaskDelHook             (OS_TCB                *p_tcb);
// 任务删除钩子函数

void          OSTaskReturnHook          (OS_TCB                *p_tcb);
// 任务返回钩子函数

CPU_STK      *OSTaskStkInit             (OS_TASK_PTR            p_task,
                                         void                  *p_arg,
                                         CPU_STK               *p_stk_base,
                                         CPU_STK               *p_stk_limit,
                                         CPU_STK_SIZE           stk_size,
                                         OS_OPT                 opt);
// 任务栈初始化钩子函数

void          OSTaskSwHook              (void);
// 任务切换钩子函数

void          OSTimeTickHook            (void);
// 时间滴答钩子函数

/*
************************************************************************************************************************
************************************************************************************************************************
*                   uC/OS-II 内部函数原型
************************************************************************************************************************
************************************************************************************************************************
*/

void          OSCfg_Init                (void);
// 配置初始化函数

#if (OS_CFG_DBG_EN > 0u)
void          OS_Dbg_Init               (void);
// 调试初始化函数
#endif


/* ----------------------------------------------- 消息管理 ----------------------------------------------- */

void          OS_MsgPoolInit            (OS_ERR                *p_err);
// 消息池初始化函数

OS_MSG_QTY    OS_MsgQFreeAll            (OS_MSG_Q              *p_msg_q);
// 释放所有消息队列中的消息函数

void         *OS_MsgQGet                (OS_MSG_Q              *p_msg_q,
                                         OS_MSG_SIZE           *p_msg_size,
                                         CPU_TS                *p_ts,
                                         OS_ERR                *p_err);
// 从消息队列中获取消息函数

void          OS_MsgQInit               (OS_MSG_Q              *p_msg_q,
                                         OS_MSG_QTY             size);
// 初始化消息队列函数

void          OS_MsgQPut                (OS_MSG_Q              *p_msg_q,
                                         void                  *p_void,
                                         OS_MSG_SIZE            msg_size,
                                         OS_OPT                 opt,
                                         CPU_TS                 ts,
                                         OS_ERR                *p_err);
// 将消息放入消息队列函数


/* ---------------------------------------------- 待处理/已发布管理 ---------------------------------------------- */

void          OS_Pend                   (OS_PEND_OBJ           *p_obj,
                                         OS_TCB                *p_tcb,
                                         OS_STATE               pending_on,
                                         OS_TICK                timeout);
// 等待对象函数

void          OS_PendAbort              (OS_TCB                *p_tcb,
                                         CPU_TS                 ts,
                                         OS_STATUS              reason);
// 中断等待函数

void          OS_Post                   (OS_PEND_OBJ           *p_obj,
                                         OS_TCB                *p_tcb,
                                         void                  *p_void,
                                         OS_MSG_SIZE            msg_size,
                                         CPU_TS                 ts);
// 发布消息给等待对象的线程函数


/* ----------------------------------------------- 优先级管理 ----------------------------------------------- */

void          OS_PrioInit               (void);
// 优先级初始化函数

void          OS_PrioInsert             (OS_PRIO                prio);
// 插入优先级函数

void          OS_PrioRemove             (OS_PRIO                prio);
// 移除优先级函数

OS_PRIO       OS_PrioGetHighest         (void);
// 获取最高优先级函数


/* --------------------------------------------------- 调度 --------------------------------------------------- */

#if (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u)
void          OS_SchedLockTimeMeasStart (void);
void          OS_SchedLockTimeMeasStop  (void);
// 调度锁时间测量开始和结束函数
#endif

#if (OS_CFG_SCHED_ROUND_ROBIN_EN > 0u)
void          OS_SchedRoundRobin        (OS_RDY_LIST           *p_rdy_list);
// 轮转调度函数
#endif


/* --------------------------------------------- 就绪列表管理 --------------------------------------------- */

void          OS_RdyListInit            (void);
// 就绪列表初始化函数

void          OS_RdyListInsert          (OS_TCB                *p_tcb);
// 插入就绪列表函数

void          OS_RdyListInsertHead      (OS_TCB                *p_tcb);
// 在就绪列表头部插入函数

void          OS_RdyListInsertTail      (OS_TCB                *p_tcb);
// 在就绪列表尾部插入函数

void          OS_RdyListMoveHeadToTail  (OS_RDY_LIST           *p_rdy_list);
// 将就绪列表头部元素移动到尾部函数

void          OS_RdyListRemove          (OS_TCB                *p_tcb);
// 移除就绪列表中的元素函数


/* ---------------------------------------------- 待处理列表管理 ---------------------------------------------- */

#if (OS_CFG_DBG_EN > 0u)
void          OS_PendDbgNameAdd         (OS_PEND_OBJ           *p_obj,
                                         OS_TCB                *p_tcb);
void          OS_PendDbgNameRemove      (OS_PEND_OBJ           *p_obj,
                                         OS_TCB                *p_tcb);
// 添加和移除调试名称函数
#endif

void          OS_PendListInit           (OS_PEND_LIST          *p_pend_list);
// 等待列表初始化函数

void          OS_PendListInsertPrio     (OS_PEND_LIST          *p_pend_list,
                                         OS_TCB                *p_tcb);
// 按优先级插入等待列表函数

void          OS_PendListChangePrio     (OS_TCB                *p_tcb);
// 更改等待列表中线程的优先级函数

void          OS_PendListRemove         (OS_TCB                *p_tcb);
// 移除等待列表中的元素函数


/* ---------------------------------------------- 列表项管理 ---------------------------------------------- */

#if (OS_CFG_TICK_EN > 0u)
/*
功能:将任务插入到优先级列表中。
参数:
    p_tcb - 指向要插入的任务控制块(TCB)的指针。
    elapsed - 已经过的时间。
    tick_base - 基础时间刻度。
    time - 要插入的时间。
返回值:CPU_BOOLEAN 类型,表示操作是否成功。
*/
CPU_BOOLEAN   OS_TickListInsert         (OS_TCB                *p_tcb,
                                         OS_TICK                elapsed,
                                         OS_TICK                tick_base,
                                         OS_TICK                time);

/*
功能:将任务延迟插入到优先级列表中。
参数:
    p_tcb - 指向要插入的任务控制块(TCB)的指针。
    time - 要插入的时间。
    opt - 选项,例如插入方式。
    p_err - 指向错误码的指针。
*/
void          OS_TickListInsertDly      (OS_TCB                *p_tcb,
                                         OS_TICK                time,
                                         OS_OPT                 opt,
                                         OS_ERR                *p_err);

/*
功能:从优先级列表中移除任务。
参数:
    p_tcb - 指向要移除的任务控制块(TCB)的指针。
*/
void          OS_TickListRemove         (OS_TCB                *p_tcb);

#if (OS_CFG_DYN_TICK_EN > 0u)                                   /* 动态时间刻度函数必须在 BSP 中实现。 */
/*
功能:获取当前动态时间刻度值。
返回值:当前的动态时间刻度值。
*/
OS_TICK       OS_DynTickGet             (void);

/*
功能:设置新的动态时间刻度值。
参数:
    ticks - 新的时间刻度值。
返回值:新的动态时间刻度值。
*/
OS_TICK       OS_DynTickSet             (OS_TICK                ticks);
#endif
#endif


/*
************************************************************************************************************************
*                                          查找缺失的 #define 常量
*
* 本节用于在编译时生成错误消息,如果某些 #define 常量在 OS_CFG.H 中缺少。这允许你快速确定错误的原因。
*
* 你不应更改此部分,除非你想添加更多关于编译时错误来源的注释。
************************************************************************************************************************
*/

/*
************************************************************************************************************************
*                                                     杂项
************************************************************************************************************************
*/


#ifndef OS_CFG_APP_HOOKS_EN
#error  "OS_CFG.H, 缺少 OS_CFG_APP_HOOKS_EN: 启用(1)或禁用应用程序特定的钩子函数"
#endif

#ifndef OS_CFG_ARG_CHK_EN
#error  "OS_CFG.H, 缺少 OS_CFG_ARG_CHK_EN: 启用(1)或禁用参数检查"
#endif

#ifndef OS_CFG_DBG_EN
#error  "OS_CFG.H, 缺少 OS_CFG_DBG_EN: 允许包含调试变量或不包含"
#endif

#ifndef OS_CFG_CALLED_FROM_ISR_CHK_EN
#error  "OS_CFG.H, 缺少 OS_CFG_CALLED_FROM_ISR_CHK_EN: 启用(1)或禁用检查是否在中断中调用内核服务"
#endif

#ifndef OS_CFG_OBJ_TYPE_CHK_EN
#error  "OS_CFG.H, 缺少 OS_CFG_OBJ_TYPE_CHK_EN: 启用(1)或禁用内核服务中的正确对象类型检查"
#endif

#ifndef OS_CFG_OBJ_CREATED_CHK_EN
#error  "OS_CFG.H, 缺少 OS_CFG_OBJ_CREATED_CHK_EN: 允许包含对象创建检查或不包含"
#else
   #if (OS_CFG_OBJ_CREATED_CHK_EN > 0u) && (OS_OBJ_TYPE_REQ == 0u)
   #error "OS_CFG.H, OS_CFG_DBG_EN 或 OS_CFG_OBJ_TYPE_CHK_EN 必须启用(1)以使用对象创建检查。"
   #endif
#endif

#if     OS_CFG_PRIO_MAX < 8u
#error  "OS_CFG.H, OS_CFG_PRIO_MAX 必须 >= 8"
#endif

#ifndef OS_CFG_SCHED_LOCK_TIME_MEAS_EN
#error  "OS_CFG.H, 缺少 OS_CFG_SCHED_LOCK_TIME_MEAS_EN: 包含测量调度器锁定时间的代码"
#else
   #if    (OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u) && \
          (OS_CFG_TS_EN == 0u)
   #error  "OS_CFG.H, OS_CFG_TS_EN 必须启用(1)以测量调度器锁定时间"
   #endif
#endif

#ifndef OS_CFG_SCHED_ROUND_ROBIN_EN
#error  "OS_CFG.H, 缺少 OS_CFG_SCHED_ROUND_ROBIN_EN: 包含轮转调度代码"
#else
   #if (OS_CFG_SCHED_ROUND_ROBIN_EN > 0u) && (OS_CFG_DYN_TICK_EN > 0u)
   #error "OS_CFG.H, OS_CFG_DYN_TICK_EN 必须禁用(0)以使用轮转调度。"
   #endif
#endif

#ifndef OS_CFG_STK_SIZE_MIN
#error  "OS_CFG.H, 缺少 OS_CFG_STK_SIZE_MIN: 确定任务堆栈的最小大小"
#endif

#ifndef OS_CFG_TS_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TS_EN: 确定时间戳是否启用"
#else
   #if    (OS_CFG_TS_EN > 0u) && \
          (CPU_CFG_TS_EN == 0u)
   #error  "CPU_CFG.H, CPU_CFG_TS_32_EN 必须启用(1)以使用时间戳功能"
   #endif
#endif


/*
************************************************************************************************************************
*                                                     事件标志
************************************************************************************************************************
*/

#ifndef OS_CFG_FLAG_EN
#error  "OS_CFG.H, 缺少 OS_CFG_FLAG_EN: 启用(1)或禁用事件标志的代码生成"
#else
   #ifndef OS_CFG_FLAG_DEL_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_FLAG_DEL_EN: 包含 OSFlagDel() 的代码"
   #endif

   #ifndef OS_CFG_FLAG_MODE_CLR_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_FLAG_MODE_CLR_EN: 包含等待清除事件标志的代码"
   #endif

   #ifndef OS_CFG_FLAG_PEND_ABORT_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_FLAG_PEND_ABORT_EN: 包含从另一个任务中取消挂起的代码"
   #endif
#endif


/*
************************************************************************************************************************
*                                                  内存管理
************************************************************************************************************************
*/

#ifndef OS_CFG_MEM_EN
#error  "OS_CFG.H, 缺少 OS_CFG_MEM_EN: 启用(1)或禁用内存管理器的代码生成"
#endif

/*
************************************************************************************************************************
*                                              共享互斥信号量
************************************************************************************************************************
*/

#ifndef OS_CFG_MUTEX_EN
#error  "OS_CFG.H, 缺少 OS_CFG_MUTEX_EN: 启用(1)或禁用互斥信号量的代码生成"
#else
   #ifndef OS_CFG_MUTEX_DEL_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_MUTEX_DEL_EN: 包含 OSMutexDel() 的代码"
   #endif

   #ifndef OS_CFG_MUTEX_PEND_ABORT_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_MUTEX_PEND_ABORT_EN: 包含 OSMutexPendAbort() 的代码"
   #endif
#endif

/*
************************************************************************************************************************
*                                                    消息队列
************************************************************************************************************************
*/

#ifndef OS_CFG_Q_EN
#error  "OS_CFG.H, 缺少 OS_CFG_Q_EN: 启用(1)或禁用队列的代码生成"
#else
   #ifndef OS_CFG_Q_DEL_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_Q_DEL_EN: 包含 OSQDel() 的代码"
   #endif

   #ifndef OS_CFG_Q_FLUSH_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_Q_FLUSH_EN: 包含 OSQFlush() 的代码"
   #endif

   #ifndef OS_CFG_Q_PEND_ABORT_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_Q_PEND_ABORT_EN: 包含 OSQPendAbort() 的代码"
   #endif
#endif

/*
************************************************************************************************************************
*                                                      调度器
************************************************************************************************************************
*/

#ifndef OS_CFG_SEM_EN
#error  "OS_CFG.H, 缺少 OS_CFG_SEM_EN: 启用(1)或禁用信号量的代码生成"
#else
   #ifndef OS_CFG_SEM_DEL_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_SEM_DEL_EN: 包含 OSSemDel() 的代码"
   #endif

   #ifndef OS_CFG_SEM_PEND_ABORT_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_SEM_PEND_ABORT_EN: 包含 OSSemPendAbort() 的代码"
   #endif

   #ifndef OS_CFG_SEM_SET_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_SEM_SET_EN: 包含 OSSemSet() 的代码"
   #endif
#endif

/*
************************************************************************************************************************
*                                                   任务管理
************************************************************************************************************************
*/

#ifndef OS_CFG_STAT_TASK_EN
#error  "OS_CFG.H, 缺少 OS_CFG_STAT_TASK_EN: 启用(1)或禁用统计任务"
#endif

#ifndef OS_CFG_STAT_TASK_STK_CHK_EN
#error  "OS_CFG.H, 缺少 OS_CFG_STAT_TASK_STK_CHK_EN: 从统计任务检查任务堆栈"
#endif

#ifndef OS_CFG_TASK_CHANGE_PRIO_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TASK_CHANGE_PRIO_EN: 包含 OSTaskChangePrio() 的代码"
#endif

#ifndef OS_CFG_TASK_DEL_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TASK_DEL_EN: 包含 OSTaskDel() 的代码"
#endif

#ifndef OS_CFG_TASK_Q_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TASK_Q_EN: 包含 OSTaskQxxx() 的代码"
#endif

#ifndef OS_CFG_TASK_Q_PEND_ABORT_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TASK_Q_PEND_ABORT_EN: 包含 OSTaskQPendAbort() 的代码"
#endif

#ifndef OS_CFG_TASK_PROFILE_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TASK_PROFILE_EN: 包含任务性能分析的代码"
#else
#if    (OS_CFG_TASK_PROFILE_EN  > 0u) && \
      (OS_CFG_TASK_IDLE_EN    == 0u)
#error  "OS_CFG.H, OS_CFG_TASK_IDLE_EN 必须启用(1)以使用任务性能分析功能"
#endif
#endif

#ifndef OS_CFG_TASK_REG_TBL_SIZE
#error  "OS_CFG.H, 缺少 OS_CFG_TASK_REG_TBL_SIZE: 包含对特定任务寄存器的支持"
#endif

#ifndef OS_CFG_TASK_SEM_PEND_ABORT_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TASK_SEM_PEND_ABORT_EN: 包含 OSTaskSemPendAbort() 的代码"
#endif

#ifndef OS_CFG_TASK_SUSPEND_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TASK_SUSPEND_EN: 包含 OSTaskSuspend() 和 OSTaskResume() 的代码"
#endif

/*
************************************************************************************************************************
*                                                  滴答时钟管理
************************************************************************************************************************
*/

#ifndef OS_CFG_TICK_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TICK_EN: 启用(1)或禁用内核时钟节拍"
#else
   #if ((OS_CFG_TICK_EN > 0u) && (OS_CFG_TICK_RATE_HZ == 0u))
   #error "OS_CFG_APP.h, OS_CFG_TICK_RATE_HZ 必须大于 0"
   #endif

   #if ((OS_CFG_TICK_EN == 0u) && (OS_CFG_DYN_TICK_EN > 0u))
   #error "OS_CFG.H, OS_CFG_TICK_EN 必须启用(1)以使用动态时钟节拍功能"
   #endif
#endif

/*
************************************************************************************************************************
*                                                  时间管理
************************************************************************************************************************
*/

#ifndef OS_CFG_TIME_DLY_HMSM_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TIME_DLY_HMSM_EN:请包含代码以支持 OSTimeDlyHMSM()"
#endif

#ifndef OS_CFG_TIME_DLY_RESUME_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TIME_DLY_RESUME_EN:请包含代码以支持 OSTimeDlyResume()"
#endif

/*
************************************************************************************************************************
*                                                  定时器管理
************************************************************************************************************************
*/

#ifndef OS_CFG_TMR_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TMR_EN:当启用计时器管理代码生成时需要定义"
#else
#if (OS_CFG_TMR_EN > 0u)
   #if (OS_CFG_TICK_EN == 0u)
   #error "OS_CFG.H, OS_CFG_TICK_EN 必须设置为 (1) 才能使用计时器功能"
   #endif

   #if (OS_CFG_MUTEX_EN == 0u)
   #error "OS_CFG.H, OS_CFG_MUTEX_EN 必须设置为 (1) 才能使用计时器功能"
   #endif

   #if (OS_CFG_TMR_TASK_RATE_HZ == 0u)
   #error "OS_CFG_APP.h, OS_CFG_TMR_TASK_RATE_HZ 必须大于 0"
   #endif

   #if (OS_CFG_TICK_RATE_HZ < OS_CFG_TMR_TASK_RATE_HZ)
   #error "OS_CFG_APP.h, OS_CFG_TICK_RATE_HZ 必须大于或等于 OS_CFG_TMR_TASK_RATE_HZ"
   #endif

   #ifndef OS_CFG_TMR_DEL_EN
   #error  "OS_CFG.H, 缺少 OS_CFG_TMR_DEL_EN:启用(1)或禁用(0)用于 OSTmrDel() 的代码"
   #endif
#endif
#endif

/*
************************************************************************************************************************
*                                                       跟踪
************************************************************************************************************************
*/

#ifndef OS_CFG_TRACE_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TRACE_EN:当设置为 (1) 时,用于跟踪分析启用内核事件记录"
#else
   #if (OS_CFG_TRACE_EN > 0u) && (OS_CFG_DBG_EN == 0u)
   #error "OS_CFG.H, OS_CFG_DBG_EN 必须启用以使用跟踪功能"
   #endif
#endif

#ifndef OS_CFG_TRACE_API_ENTER_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TRACE_API_ENTER_EN:启用(1)或禁用(0),用于跟踪分析的内核 API 进入事件记录"
#endif

#ifndef OS_CFG_TRACE_API_EXIT_EN
#error  "OS_CFG.H, 缺少 OS_CFG_TRACE_API_EXIT_EN:启用(1)或禁用(0),用于跟踪分析的内核 API 离开事件记录"
#endif

/*
************************************************************************************************************************
*                                             库配置错误
************************************************************************************************************************
*/
                                                               /* See 'os.h  Note #1a'.                              */
#if CPU_CORE_VERSION < 13103u
#error  "cpu_def.h, CPU_CORE_VERSION 应该 >= V1.31.03"
#endif

/*
************************************************************************************************************************
*                                                 uC/OS-III 模块结束
************************************************************************************************************************
*/

#ifdef __cplusplus
}
#endif
#endif

posted @   炽杨  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示