15
0
0

OS解决内容

2026-07-14
2026-07-24

尝试实现EB自带的SC2时间监控功能,使用标准接口计算负载率。

EB中配置参数

OsTimestampTimer选择用于时间戳的 timer

这里从配置文件中可以看到采用了内部硬件计时器STM0,属于长周期定时器

OsCpuLoadIntervalDuration 决定多久统计一次CPU负载,单位为秒

然后和下面一个参数结合,一块统计平均CPU负载与MAX负载

OsCpuLoadNumIntervals 用多少个间隔计算一次负载

则统计窗口长度 = OsCpuLoadIntervalDuration × OsCpuLoadNumIntervals

若Duration为0.1s,即100ms统计一次CPU负载

IntervalsNum为10,则统计窗口长度为0.1x10=1s

即每1秒统计1次负载结果,通过GetCpuLoad()返回数据

OsCpuLoadRounding 负载率以整数形式计算和返回时,小数部分的截取方式

DOWN 向下取整
UP 向上取整
NEAREST 按四舍五入取最接近的整数

这里从xdm文件中截取的配置

可以看出OsCpuLoadMeaurement 为 false,表示未启用CPU负载计算

Duration=0.1s,Interval=10,取整方式为四舍五入

实践

2026-07-24 补充:

由于项目开启了MicroKernel 导致CPU load measurement不可用,后续查看修改配置,关闭MicroKernel在进行尝试,希望不会出现项目跑飞。

该项目为什么要开启MircoKernel呢?

需要添加函数对应的头文件 Os_salsa.h

添加全局变量用于监控cpu占用率

在InitTask中初始化

在APP1_Task_10ms中添加每100次调用一次

即每隔1s调用一次占用率

但其具体占用率计算时间是在EB中配置

问题

  1. 函数未定义

编译时发现

说明EB中未配置OsCpuLoadMeasurement,所以裁剪了对应的函数实现

  1. 是否需要切换到SC4?

目前项目环境为SC3模式,是带有内存保护的,但没有时序保护Timing Protection

在手册中 CPU-load measurement 是放在Timing Protection章节中的

后续需要验证在SC3下OsCpuLoadMeasurement是否能够启动

栈使用率测量实践

确定是否有os自带的栈使用率计算函数,确定英飞凌芯片是否有栈溢出保护机制,并实践栈使用率测量

前情提要

栈增长方向

大多数嵌入式 CPU 的栈是向低地址增长,也就是“向下增长(down-growing stack)

即,栈使用越多,SP(stack pointer) 越小


os idle 不是手动配置,如何自动调用

当多个任务同时放到同一个EP点触发,会造成什么后果

3、以alarm方式触发的task如何配置,和调度表有什么区别,利弊。

4、了解os counter配置的作用,HW counter、SW couter、alarm关联的过程,为什么不直接用HW counter。(以长城项目为例说明)

5、一类中断和二类中断的区别,中断之间是否可打断。

6、不同的hook在什么情况下被触发,一般要进行什么操作。

7、进入不同Trap原因,并实践

Support

If this article helped you, feel free to share it or give support!