• 194查看
  • 0回复

[底层软件] Autosar OS和freeRTOS的任务运行时间监测机制

[复制链接]


该用户从未签到

发表于 25-4-2024 19:50:23 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


在<<盘点Autosar OS和其他OS的栈监测机制>>一文中我们介绍了AutosarOS和μcos-II、freertos对于栈监测的机制,本篇文章我们介绍一下Autosar OS和freertos监测任务运行时间的机制。由于单片机的操作系统都是抢占式的,任务在运行过程中可能自己放弃CPU使用权(调用OSWaitEvent)、被其他高优先级的任务或者中断抢占,我们在计算任务运行时长时需要考虑到上述任务放弃或者被剥夺CPU使用权的时间。因此不能简单的在任务运行前后分别计时后计算时间差来统计运行时间(如下伪代码)监测任务运行时长。StartExcutionTime();UserTask();EndExcutionCalcExcutionTime();考虑到系统任务调度是以OS的滴答时钟为单位的(Systick中断中进行任务切换),因此计算任务运行时间得用一个频率更高的时钟(至少是系统时钟频率的10倍以上。假如系统时钟是1Khz,任务运行时间的base时钟是10Khz,那么它统计的误差就是100μs)。在<<玩转μcos-II(一)之基础介绍>>一文中我们介绍了μcos-II有个任务控制块(TCB)来保证任务按需运行,在freertos和autosar os中同样也存在任务控制块,为了计算任务运行时间,任务块中需要包含任务运行时间的结构成员。因此我们可以得到在任务切换中如下计算本次运行时间的伪代码:voidTaskSwitchContext(void){/*currentTCB表示当前正在运行的任务*/ now = Os_GetTimeStatisticBase();/*获取任务运行时间统计的时钟的当前时间*/ currenTcb->elpased += now - currenTcb->previous; /*计算累计运行时间*/ currenTcb->previous = now;}freertos由于和autosaros的调度方式 (详见<<玩转Autosar OS任务调度机制>>一文)和实现机制不同,freertos统计的是一段时间内任务运行的总时间(通过调用vTaskGetRunTimeStats函数获取),其结果如下图所示。
Autosar OS和freeRTOS的任务运行时间监测机制w1.jpg

需要注意vTaskGetRunTimeStats函数比较耗时,因此调度不能频繁,同时其统计的时间单位是统计运行任务的时间基,因此任务实际运行时间需要乘以时间基的周期(如时间基的频率是20Khz,那么上述的运行时间乘以50μs才是真实时间)。而autosar os可以统计任务执行的时间,其实现的伪代码如下:void TaskSwitch(void){/*currentTCB表示当前正在运行的任务*/ currenTcb->taskCode();/*任务运行结束,统计任务运行时间*/ now = Os_GetTimeStatisticBase();/*获取任务运行时间统计的时钟的当前时间*/ currenTcb->elapsed += now - currenTcb->previous; /*计算累计运行时间*/ currenTcb->previous = now; if (currenTcb->elapsed > currenTcb->userConfigMaxRunTime) {/*任务运行时间超过用户设置时间,触发钩子函数*/   TaskExcutionTimeOverHook(); } currenTcb->elapsed = 0;}

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 07:48 , Processed in 0.334874 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.