一,前言
之前os设置为了sc3后,为了仅配置内存保护,所以把timing保护关闭了。那么内存保护源码看完了,就打开时间保护看下。
二,分析
- 我把时间保护使能改成TRUE,就这一个变化就看到代码中结构体对象成员的主要增加了如下结构体,然后一个是task,一个是isr中都增加了此元素。但是c代码就是赋值max,没有判断max和阈值及最后的行为。
/* Metering */
typedef struct Os_MeterInfoType_s {
Os_StopwatchTickType elapsed;
Os_StopwatchTickType previous;
Os_StopwatchTickType max;
} Os_MeterInfoType;
========
now = Os_Cbk_GetStopwatch();
Os_CurrentMeteredObject->elapsed += (now - Os_CurrentMeteredObject->previous);
Os_CurrentMeteredObject->previous = now;
if (Os_CurrentMeteredObject->elapsed > Os_CurrentMeteredObject->max) {
Os_CurrentMeteredObject->max = Os_CurrentMeteredObject->elapsed;
}
-
想了下阈值应该是我自己设置了,但是我没有设置呀。怎么代码就生成了。原因是Omit Timing Protection之前被我配置为了TRUE,忽略掉时间保护功能。设置为FALSE开启时间保护就提示每个task任务中的Timing保护进行执行时间,任务上下文切换时间需要进行配置。至于这些时间应该如何设置,timer frame一般就是设置的比周期时间小点,Execution budget按代码执行时间来设计。关于start和end的时机可以参考下图
image.png - 配置完后就多了如下存储逻辑用的结构体成员,task和isr中也多了4个成员。
typedef struct Os_TimeTokenType_s {
Os_TimeLimitType budget;
Os_TimeLimitType remaining;
Os_TimeTokenRefType prev;
StatusType locktype;
} Os_TimeTokenType;
===========
Os_TimeLimitType execution_limit;
Os_TimeLimitType lock_os_limit;
Os_TimeLimitType lock_all_limit;
Os_TimeLimitType timeframe;
Os_Cfg.c中task和isr也多了我配置的成员,阈值300000就是1ms的意思,所以都是这个值的倍数。还专门多了TimeProtection.c文件。出错就调用Os_ProtectionLog(E_OS_PROTECTION_TIME);连全局中断中也判断了,出错就调用Os_ProtectionLog(Os_CurrentTimeToken->locktype)。
- 顺便配置下CallTrustedFunction,用于nontrustedApp中的task要调用trustedApp中的一个函数,否则程序设计变成只能trusted去调用nontrusted app中的函数了。看了os手册包括传参数理解起来也都容易。就是加一层代理函数进行提升权限。
FUNC(StatusType, OS_CODE) Os_CallTrustedFunction(TrustedFunctionIndexType FunctionIndex, TrustedFunctionParameterRefType FunctionParams) {
StatusType api_retval = E_OK;
const Os_TrustedFunctionType *os_function;
Os_tmaskType previous_tmask = OS_MFCR(0xfe04);
if (0U == (previous_tmask & 0x800U)) { OS_SYSCALL(0); }
…… // 执行函数
api_retval = (StatusType)Os_setjmp(*(Os_CurrentTerminator)); //保存下上问
if (E_OK == api_retval) {
function_entry = os_function->function; /* [$EHI 417525] */
OS_MTCR(0xFE2C, previous_imask); OS_SEQ_POINT();
function_entry(FunctionIndex, FunctionParams);
OS_DISABLE(); OS_MTCR(0xFE2C, 0x8001U); OS_SEQ_POINT();
} else { api_retval = Os_LastProtectionFault; }
三,小结
有些比较好理解的配置项生成的代码我就不细看了,理解下设计原理为主,另外了解下它对应的功能变量,将来若出问题了便于调试。
网友评论