SylixOS CPU 利用率统计基于 TCB 中的两个变量,TCB_ulCPUUsageTicks 和 TCB_ulCPUUsageKernelTicks。用于记录规定时间内的 CPU 使用 TICK 计数与 Kernel 使用计数。
top 命令首先清空所有的 TCB 的计数统计,然后开启统计数据更新,等待规定时间后(默认 1s)关闭统计数据更新。此时 TCB_ulCPUUsageTicks 与 TCB_ulCPUUsageKernelTicks 变量中就存放了这段时间内的所有线程的执行 TICK 计数。最后整理所有数据后打印出来。
统计数据在 TICK 中断中更新,即在 API_KernelTicksContext() 中。在每个 TICK 中断中会遍历所有的核,并在核当前的 TCB 的统计数据上加一个 TICK,实现统计数据更新。
从这个机制可以看出 CPU 利用率的统计仅是一个粗略的估算,在诸如高频周期执行的情况下可能出现较大的偏差。例如存在一个高优先级线程,周期等待中断信号量。中断 500us 触发一次,即此线程 500us 触发一次,每次执行占用 CPU 最大 200us 左右。可以看出此线程占用 CPU 不会超过 50%。但由于在 TICK 中断触发时只要此线程正在执行则直接加上 1 个 TICK 周期。因此可能出现统计结果远超 50% 的情况。