本文将详细介绍 uC/OS-III 提供的主要运行时统计数据,帮助开发者了解系统性能和诊断潜在问题。
1. 通用统计运行时数据(General Statistics Run-Time)
通用统计数据提供了系统级别的一些重要信息,用于整体了解系统的运行情况。
1.1 中断统计
- OSIntNestingCtr:该变量包含中断嵌套级别。值为1表示正在处理第一级中断嵌套,值为2表示中断被另一个中断中断,依此类推。
- OSIntDisTimeMax:该变量包含最大中断禁用时间(以CPU_TS单位表示)。
1.2 内核对象数量
- OSFlagQty:该变量表示创建的事件标志组的数量。仅当 os_cfg.h 中 OS_CFG_FLAG_EN 设置为 DEF_ENABLED 时声明该变量。
- OSMemQty:该变量表示应用程序创建的固定大小内存分区的数量。仅当 os_cfg.h 中 OS_CFG_MEM_EN 设置为 DEF_ENABLED 时声明该变量。
- OSMutexQty:该变量表示应用程序创建的互斥信号量的数量。仅当 os_cfg.h 中 OS_CFG_MUTEX_EN 设置为 DEF_ENABLED 时声明该变量。
- OSSemQty:该变量表示应用程序创建的信号量数量。仅当 os_cfg.h 中 OS_CFG_SEM_EN 设置为 DEF_ENABLED 时声明该变量。
- OSTaskQty:该变量包含应用程序中创建的任务总数。
- OSTmrQty:该变量表示应用程序创建的定时器数量。仅当 os_cfg.h 中 OS_CFG_TMR_EN 设置为 DEF_ENABLED 时声明该变量。
1.3 消息池
- OSMsgPool.NbrFree:该变量表示消息池中空闲 OS_MSG 的数量。这个数字不应该为零,因为这表明应用程序无法再发送消息。仅当 os_cfg.h 中 OS_CFG_Q_EN 或 OS_CFG_TASK_Q_EN 设置为 DEF_ENABLED 时声明该变量。
- OSMsgPool.NbrUsed:该变量表示当前应用程序使用的 OS_MSG 数量。仅当 os_cfg.h 中 OS_CFG_Q_EN 或 OS_CFG_TASK_Q_EN 设置为 DEF_ENABLED 时声明该变量。
- OSMsgPool.NbrUsedMax:该变量表示应用程序曾经使用的 OS_MSG 的最大数量。该值由 OSStatReset() 重置。仅当 os_cfg.h 中 OS_CFG_Q_EN 或 OS_CFG_TASK_Q_EN 设置为 DEF_ENABLED 时声明该变量。
1.4 就绪列表
- OSRdyList[i].NbrEntries:这些变量用于检查每个优先级的就绪列表中的条目数。当 os_cfg.h 中 OS_CFG_DBG_EN 设置为 DEF_ENABLED 时启用这些变量。
1.5 调度器
- OSSchedLockTimeMax:该变量表示调度器被锁定的最大时间,无论是哪个任务进行了锁定。该值以 CPU_TS 单位表示。仅当 os_cfg.h 中 OS_CFG_SCHED_LOCK_TIME_MEAS_EN 设置为 DEF_ENABLED 时声明该变量。
- OSSchedLockTimeMaxCur:该变量表示调度器被锁定的最大时间。该值以 CPU_TS 单位表示,并由上下文切换代码重置,以便按任务跟踪调度器锁定时间。仅当 os_cfg.h 中 OS_CFG_SCHED_LOCK_TIME_MEAS_EN 设置为 DEF_ENABLED 时声明该变量。
- OSSchedLockNestingCtr:该变量跟踪调度器锁定的嵌套级别。
- OSSchedRoundRobinEn:当设置为1时,该变量表示启用了时间片轮转调度。
1.6 统计任务
- OSStatTaskCPUUsage:该变量表示应用程序的 CPU 使用率,以百分比乘以100表示。值为1000表示使用了10.00%的CPU,90.00%的时间CPU处于空闲状态。仅当 os_cfg.h 中 OS_CFG_STAT_TASK_EN 设置为 DEF_ENABLED 时声明该变量。
- OSStatTaskCPUUsageMax:该变量表示应用程序的最大 CPU 使用率,以百分比乘以100表示。该值由 OSStatReset() 重置。仅当 os_cfg.h 中 OS_CFG_STAT_TASK_EN 设置为 DEF_ENABLED 时声明该变量。
- OSStatTaskCtr:该变量包含一个计数器,每次空闲任务的无限循环运行时递增。仅当 os_cfg.h 中 OS_CFG_STAT_TASK_EN 设置为 DEF_ENABLED 时声明该变量。
- OSStatTaskCtrMax:该变量包含空闲任务循环在0.1秒内运行的最大次数。该值用于测量应用程序的 CPU 使用率。仅当 os_cfg.h 中 OS_CFG_STAT_TASK_EN 设置为 DEF_ENABLED 时声明该变量。
- OSStatTaskTimeMax:该变量包含统计任务的最大执行时间(以 CPU_TS 单位表示)。该值包括统计任务运行时发生的任何 ISR 的时间。仅当 os_cfg.h 中 OS_CFG_STAT_TASK_EN 设置为 DEF_ENABLED 时声明该变量。
1.7 时钟任务
- OSTickCtr:每次时钟任务执行时,该变量递增。
- OSTickTaskTimeMax:该变量包含时钟任务的最大执行时间(以 CPU_TS 单位表示)。该值包括时钟任务运行时发生的任何 ISR 的时间。
- OSTickListDly.NbrEntries:该变量表示当前在等待时间到期的任务列表中的任务数量。该字段仅在 os_cfg.h 中 OS_CFG_DBG_EN 设置为 DEF_ENABLED 时可用。
- OSTickListDly.NbrUpdated:该变量表示最后由 OS_TickTask() 更新的任务列表中等待时间到期的 OS_TCB 数量。该字段仅在 os_cfg.h 中 OS_CFG_DBG_EN 设置为 DEF_ENABLED 时可用。
- OSTickListTimeout.NbrEntries:该变量表示当前在等待对象并指定了非零超时值的任务列表中的任务数量。该字段仅在 os_cfg.h 中 OS_CFG_DBG_EN 设置为 DEF_ENABLED 时可用。
- OSTickListTimeout.NbrUpdated:该变量表示最后由 OS_TickTask() 更新的任务列表中等待对象并指定了非零超时值的 OS_TCB 数量。该字段仅在 os_cfg.h 中 OS_CFG_DBG_EN 设置为 DEF_ENABLED 时可用。
1.8 定时器任务
- OSTmrCtr:每次定时器任务执行时,该变量递增。
- OSTmrListEntries:该变量包含当前在定时器列表中的定时器数量。仅当 os_cfg.h 中 OS_CFG_TMR_EN 设置为 DEF_ENABLED 时声明该变量。
- OSTmrTaskTimeMax:该变量包含定时器任务的最大执行时间(以 CPU_TS 单位表示)。该值包括定时器任务运行时发生的任何 ISR 的时间。仅当 os_cfg.h 中 OS_CFG_TMR_EN 设置为 DEF_ENABLED 时声明该变量。
1.9 其他
- OSIdleTaskCtr:该变量包含一个计数器,每次空闲任务的无限循环运行时递增。
- OSRunning:当非零时,该变量表示多任务已启动。
- OSTaskCtxSwCtr:该变量累计由 μC/OS-III 执行的上下文切换次数。
2. 任务运行时数据统计(Per-Task Statistics Run-Time)
uC/OS-III 在运行时维护每个任务的统计信息,这些信息保存在任务的 OS_TCB 中
2.1 .CPUUsage
- 作用:该变量跟踪任务的 CPU 使用率(乘以100)。例如,如果任务的 .CPUUsage 为200,则该任务消耗了总 CPU 使用率的2.00%。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_PROFILE_EN 设置为 DEF_ENABLED 时声明该变量。
2.2 .CPUUsageMax
- 作用:该变量跟踪任务的最大(即峰值)CPU 使用率(乘以100)。例如,如果任务的 .CPUUsageMax 为571,则该任务在任何给定时间点消耗的最大 CPU 使用率为5.71%。该变量由 OSStatReset() 重置。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_PROFILE_EN 设置为 DEF_ENABLED 时声明该变量。
2.3 .CtxSwCtr
- 作用:该变量跟踪任务被上下文切换进的次数。该变量应递增。如果不递增,则表示任务未运行。最低情况下,计数器应至少为1,因为任务总是创建为就绪运行。然而,如果高优先级任务阻止该任务运行,则值可能为0。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_PROFILE_EN 设置为 DEF_ENABLED 时声明该变量。
2.4 .IntDisTimeMax
- 作用:该变量跟踪任务的最大中断禁用时间(以 CPU_TS 单位表示)。该变量显示每个任务如何影响中断延迟。
- 声明条件:仅当 cpu_cfg.h 中 CPU_CFG_INT_DIS_MEAS_EN 设置为 DEF_ENABLED 时声明该变量。
2.5 .MsgQ.NbrEntries
- 作用:该变量表示当前在任务的消息队列中等待的条目数量。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_Q_EN 设置为 DEF_ENABLED 时声明该变量。
2.6 .MsgQ.NbrEntriesMax
- 作用:该变量表示放置在任务消息队列中的最大条目数量。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_Q_EN 设置为 DEF_ENABLED 时声明该变量。
2.7 .MsgQ.NbrEntriesSize
- 作用:该变量表示任务消息队列能够接受的最大条目数量。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_Q_EN 设置为 DEF_ENABLED 时声明该变量。
2.8 .MsgQPendTime
- 作用:该变量表示任务或 ISR 向任务发送消息所花费的时间(以 CPU_TS 单位表示)。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_PROFILE_EN 设置为 DEF_ENABLED 时声明该变量。
2.9 .MsgQPendTimeMax
- 作用:该变量表示任务或 ISR 向任务发送消息所花费的最长时间(以 CPU_TS 单位表示)。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_PROFILE_EN 设置为 DEF_ENABLED 时声明该变量。
2.10 .PendOn
- 作用:该变量表示如果任务处于挂起状态,则任务正在等待的对象。可能的值包括:
2.11 .Prio
- 作用:表示任务的优先级。根据任务是否拥有互斥信号量,或用户通过调用 OSTaskChangePrio() 更改任务优先级,可能会在运行时发生变化。
2.12 .SchedLockTimeMax
- 作用:该变量跟踪任务锁定调度器的最长时间(以 CPU_TS 单位表示)。该变量允许应用程序查看每个任务如何影响任务延迟。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_SCHED_LOCK_TIME_MEAS_EN 设置为 DEF_ENABLED 时声明该变量。
2.13 .SemPendTime
- 作用:该变量表示任务或 ISR 向任务发送信号所花费的时间(以 CPU_TS 单位表示)。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_PROFILE_EN 设置为 DEF_ENABLED 时声明该变量。
2.14 .SemPendTimeMax
- 作用:该变量表示任务或 ISR 向任务发送信号所花费的最长时间(以 CPU_TS 单位表示)。
- 声明条件:仅当 os_cfg.h 中 OS_CFG_TASK_PROFILE_EN 设置为 DEF_ENABLED 时声明该变量。
2.15 .State
- 作用:该变量表示任务的当前状态。
2.16 .StkFree
- 作用:该变量表示任务未使用的堆栈空间量(以堆栈条目数表示)。如果 os_cfg.h 中 OS_CFG_TASK_STAT_STK_CHK_EN 设置为 DEF_ENABLED,则由统计任务确定该值。
2.17 .StkUsed
- 作用:该变量表示任务的最大堆栈使用量(以堆栈条目数表示)。如果 os_cfg.h 中 OS_CFG_TASK_STAT_STK_CHK_EN 设置为 DEF_ENABLED,则由统计任务确定该值。
2.18 .TickRemain
- 作用:该变量表示任务时间延迟到期或任务在等待内核对象(如信号量、消息队列等)超时前剩余的时间(以时钟滴答表示)。该值实际上是基于 OS_TCB 在增量列表中的位置的“相对”值。换句话说,.TickRemain 不包含实际剩余计数。
3. 内核对象运行时数据(Kernel Object Run-Time)
uC/OS-III 提供了对某些内核对象运行时值的检查功能,具体如以下主题所述。
3.1 信号量
- .NamePtr:这是一个指向 ASCII 字符串的指针,用于为信号量提供名称。ASCII 字符串可以有任意长度,只要以 NUL 终止。
- .PendList.NbrEntries:每个信号量包含一个等待列表,列出等待信号量被发送信号的任务。该变量表示等待列表中的条目数量。
- .Ctr:该变量表示信号量的当前计数。
- .TS:该变量包含信号量最后一次被发送信号的时间戳。
3.2 互斥信号量
- .NamePtr:这是一个指向 ASCII 字符串的指针,用于为互斥信号量提供名称。ASCII 字符串可以有任意长度,只要以 NUL 终止。
- .PendList.NbrEntries:每个互斥信号量包含一个等待列表,列出等待信号量被释放的任务。该变量表示等待列表中的条目数量。
- .OwnerOriginalPrio:该变量保存拥有互斥信号量的任务的原始优先级。
- .OwnerTCBPtr->Prio:取消引用指向互斥信号量所有者的 OS_TCB 的指针,允许应用程序确定任务优先级是否已更改。
- .OwnerNestingCtr:该变量表示互斥信号量所有者请求信号量的次数。
- .TS:该变量包含互斥信号量最后一次被释放的时间戳。
3.3 内存分区
- .NamePtr:这是一个指向 ASCII 字符串的指针,用于为内存分区提供名称。ASCII 字符串可以有任意长度,只要以 NUL 终止。
- .BlkSize:该变量包含内存分区的块大小(以字节为单位)。
- .NbrMax:该变量包含属于内存分区的最大内存块数。
- .NbrFree:该变量包含内存分区中可用的内存块数。
3.4 消息队列
- .NamePtr:这是一个指向 ASCII 字符串的指针,用于为消息队列提供名称。ASCII 字符串可以有任意长度,只要以 NUL 终止。
- .PendList.NbrEntries:每个消息队列包含一个等待列表,列出等待将消息发送到队列的任务。该变量表示等待列表中的条目数量。
- .MsgQ.NbrEntries:该变量表示当前在消息队列中的消息数量。
- .MsgQ.NbrEntriesMax:该变量表示曾经放置在消息队列中的最大消息数量。
- .MsgQ.NbrEntriesSize:该变量表示可以放置在消息队列中的最大消息数量。
3.5 事件标志
- .NamePtr:这是一个指向 ASCII 字符串的指针,用于为事件标志组提供名称。ASCII 字符串可以有任意长度,只要以 NUL 终止。
- .PendList.NbrEntries:每个事件标志组包含一个等待列表,列出等待设置或清除事件标志的任务。该变量表示等待列表中的条目数量。
- .Flags:该变量包含事件标志组中事件标志的当前值。
- .TS:该变量包含事件标志组最后一次发布时的时间戳。