在上几个章节中我们介绍了MM32相关的IEC60730-1 B类认证启动自检与运行自检的相关的流程,本章节我们将会介绍一下ClassB认证的程序流程控制,栈溢出检测以及MCU通用检测的相关文件,以方便客户移植到自己的代码中,从而提高产品的可靠性。
1. 程序流程控制
程序流程控制是在认证中我们建议加入的一种检测手段,这是因为它能确保所有特定代码能正确执行并按照一定的流程执行。
为了确保所有特定代码能正确执行并通过,代码流程中的所有关键点(组件测试块)能够按照程序设计思路正确执行,应定义独特的标签进行标记,从而确保不跳过任何块,并且所有流程均按照程序设计思路能够正常执行。
其实现原理是在每次处理任何重要的测试块时,两个互补计数器的值(增加或减去独特的标签值)发生对称的四步变化,其中两个检查步骤安排在调用程序(主流程)层的调用块外。这确保了块从主流程层级被成功调用(在调用前及从调用程序返回后处理)。下两个步骤是在调用程序内执行,以确保块正确完成(在进入程序后及从程序返回前处理)。
按控制流程顺序调用执行组件测试的例程,显示四步检查服务。因为所有的点都通过计算一组互补计数对来检查,所以该方法可降低CPU的负载。由于有些调用/返回编号及进入/退出点始终相同,在每个块完全通过后,储存在计数对内的值必须始终互补。检查计数对完整性时,对几个执行流程检查点进行评估并放入代码流程。如果任何检查点的计数器不互补或其不包含预期值,应调用故障保护例程。
当程序计数器丢失或终止时,两个不同的看门狗可复位设备,它们在两个独立的时钟源运行。窗口看门狗由主振荡器驱动,可执行时隙监控,独立看门狗由内部低速RC振荡器驱动。程序控制流程可采用专用软件方法监控。
在MM32的ClassB认证的函数库中的程序控制流程检查函数如下:
ErrorStatus control_flow_check_point(uint32_t chck)
{ ErrorStatus Result= SUCCESS;
if ((CtrlFlowCnt != (chck)) || ((CtrlFlowCnt ^ CtrlFlowCntInv) != 0xFFFFFFFFuL))
{
Result= ERROR;
}
return(Result);
}
2. 栈边界检测
该测试主要用来检测MCU在运行的过程中是否出现栈溢出的问题。
根据IEC60730-1 B类认证标准,栈溢出检测不是强制性的。它们可在用于间接测试某些功能时添加,如果用户喜欢使用其它方法,也可将其禁用或跳过。
其实现原理为:通常采用的做法是在stack创建之初就填充满固定的字符(比如0x5a5a5a5a),如果发生了“上溢”,那么stack末端(最低地址处)的填充字符则有可能会被更改。
在MM32自检库中也是采用这一个实现方式,在栈底设定特定的数值,在每次进行检测的时候检测栈底的数值,当栈底的数值发生变化的时候就判断栈溢出了。具体的流程图如下所示:
在栈底地址填写数据:
control_flow_call(STACK_OVERFLOW_TEST);
aStackOverFlowPtrn[0] = 0xEEEEEEEEuL;
aStackOverFlowPtrn[1] = 0xCCCCCCCCuL;
aStackOverFlowPtrn[2] = 0xBBBBBBBBuL;
aStackOverFlowPtrn[3] = 0xDDDDDDDDuL;
control_flow_resume(STACK_OVERFLOW_TEST);
堆栈溢出判断函数如下:
/******************************************************************************/
ErrorStatus STL_CheckStack(void)
{
ErrorStatus result = SUCCESS;
CtrlFlowCnt += STACK_OVERFLOW_CALLEE;
if ( aStackOverFlowPtrn[0] != 0xEEEEEEEEuL )
{
result = ERROR;
}
if ( aStackOverFlowPtrn[1] != 0xCCCCCCCCuL )
{
result = ERROR;
}
if ( aStackOverFlowPtrn[2] != 0xBBBBBBBBuL )
{
result = ERROR;
}
if ( aStackOverFlowPtrn[3] != 0xDDDDDDDDuL )
{
result = ERROR;
}
CtrlFlowCntInv -= STACK_OVERFLOW_CALLEE;
return (result);
}
3. B类安全方案软体结构
3.1 用户应用的集成
在上面的几个章节中我们可以了解到,ClassB类认证分为启动自检和运行自检,在系统复位完成以后然后进行ClassB相关的启动自检,启动自检完成以后用户可以进行相应的用户应用初始化操作,然后会进行到主循环进行运行自检以及客户任务的处理操作,具体的启动以及定期运行时自检结构框图如下:
用户需要做ClassB认证时候,仅仅需要将MM32提供的官方例程中的启动自检与运行自检加入到相应的代码段即可。
3.2 自检驱动接口文件
用户在参考MM32-ClassB的例程的时候可以参考下面的表格来进行文件的移植操作。
4. 符合IEC标准
IEC60730标准涵盖了交流电器的机械、电气、电子、EMC和交流电器的异常操作,包括自动电子控制定义的三种软件分类:A类认证,B类认证,C类认证。
在前面的几个章节中介绍的关于MCU自检认证属于B类认证操作,在电子应用领域经常需要MCU做各种自检来保证产品安全可靠的运行。在家用电器方面,家用电器制造商必须采取相关的安全措施来保证其产品安全可靠的运行,以符合IEC60730标准。
MM32的ClassB例程有相应的故障处理函数,其基本原则是,如果出现任何组件故障,家用电器必须保证安全,严格遵守以上原则,微控制器的通用检测一般分为内核诊断、易失和非易失内存完整性检查,时钟系统测试等,目前,MM32已包含了上述所有的通用性检测功能。