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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)