• 516查看
  • 0回复

[底层软件] Os的Task简单监控

[复制链接]


该用户从未签到

发表于 21-1-2024 11:17:19 | 显示全部楼层 |阅读模式

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


01

CPU Load计算

正常的cpu使用率计算公式为:

CPU使用率=(总时间-空闲时间)/总时间*100
那么在autosar os中如何使用这个公式呢?

首先介绍下OS中部分函数,可以在《RTA-OS User Guide.pdf》查阅具体的介绍。

Os_GetTaskActivationTime()
获取task近一次激活的时间戳;

Os_GetIdleElapsedTime()
获取指定cpu的空闲执行时间。
Os_Cbk_TaskStart()
task开始执行时的回调函数。

可以在task开始执行时的回调中,通过记录2次cpu中优先级最低的task激活时间和空闲时间的差值计算出cpu load。

Os的Task简单监控w1.jpg

02

Task执行时间计算

一开始小编使用的是比较愚蠢的方式去计算,软件毫无移植性可言。

Os的Task简单监控w2.jpg

在task的开头和结束去计算Mcal_DelayGetTick()的差值,以此作为task的执行时间,然后加了一些最大、最小执行事件的记录数组。

唯一有用的点可能就是发现trace32的string功能吧。

由于task的个数较多,单纯用数组下标比较难看明白,在结构体加了task_name的成员,并在初始化的时候赋值:

Os的Task简单监控w3.jpg

那么在变量的view界面,把数字再转化回字符,而不改变其他变量的属性,trace32是有方法做到的:

Os的Task简单监控w4.jpg

然后os是提供task执行时间函数的:
Os_GetExecutionTime();
需要提高移植性的话,也可以手写代码,在task的开始结束回调中去调用处理的函数,不用在生成的代码里去改。

03

栈区监控

首先看下memmap

Os的Task简单监控w5.jpg

Os的Task简单监控w6.jpg

....

Os的Task简单监控w7.jpg

需要在ld文件中去设置栈区和上下文的大小:

LCF_CSA0_SIZE = 8k;LCF_USTACK0_SIZE = 24k;LCF_ISTACK0_SIZE = 0k;
设置栈区的起始和结束地址:

  CORE_ID = CPU0 ;  SECTIONS  {    CORE_SEC(.ustack) (LCF_DSPR0_START + LCF_USTACK0_OFFSET):    { PROVIDE(__USTACK0_END = .);  . = . + LCF_USTACK0_SIZE;  PROVIDE(__USTACK0 = .); } > ustack0CORE_SEC(.istack) (LCF_DSPR0_START + LCF_ISTACK0_OFFSET):    { PROVIDE(__ISTACK0_END = .);  . = . + LCF_ISTACK0_SIZE;  PROVIDE(__ISTACK0 = .); }     CORE_SEC(.csa) (LCF_DSPR0_START + LCF_CSA0_OFFSET):    { PROVIDE(__CSA0 = .);  . = . + LCF_CSA0_SIZE;  PROVIDE(__CSA0_END = .); } > csa0  }
我们可在OS的main函数中调用栈区监控的初始化代码:

对栈区做一些类似0x5aa5的赋值;

之后在每个核的task中去周期性调用监控函数即可,计算出非0x5aa5的区间大小。

快速发帖

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

本版积分规则

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

GMT+8, 1-2-2025 12:47 , Processed in 0.243506 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.