
运行中的检测部分 在主循环中周期进行,在STL_DoRunTimeChecks中,通过检查TimeBaseFlag标识的值来决定是否要进行检测,TimeBaseFlag在SysTick_Handler中根据需要的时间间隔进行设置。 除了RAM检测在SysTick中断中进行,时钟周期计算在Timer中断中进行以外,其他的检测都在主循环中完成。 在运行STL_DoRunTimeChecks函数之前,必须进行runtime检测模块的一些初始化工作。 所以代码中需要修改的地方有:
01 Flash检测 在运行中对Flash的检测分块进行,每次检测一小部分。每次检测的块(block)的大小由FLASH_BLOCK_WORDS定义,默认是16个字的长度。检测的范围应该是多个FLASH_BLOCK_WORDS的大小,必须是对齐的。 存放CRC值的位置是应该排除在计算的范围内的。 02 RAM检测 在运行过程中只检测和安全相关的变量,这些变量都被放在同一个连续的区域,也就是CLASS_B_RAM区域。CLASS_B_RAM区域的大小可以在分散加载文件中进行调整。 这个区域的变量包括所有定义在stm32fxx_STLclassBvar.h中的变量,如果应用程序中有和安全相关的变量也可以定义在这个区。检测范围也是在stm32fxx_STLparam.h中定义: ![]() 需要注意在stm32fxx_STLparam.h中定义的CLASS_B变量的范围,也要和sct文件中的定义一致: ![]() 03 堆栈边界检测 堆栈边界检测由STL_CheckStack函数完成,在启动的时候STL_StartUp结束时向位于栈底边界的aStackOverFlowPtrn数组写入了特殊的数值,运行时,再在STL_CheckStack函数中对其进行检查来发现是否有堆栈溢出的情况。 移植的时候需要注意的是aStackOverFlowPtrn的位置是必须指定的。这个通过在分散加载文件定义STACK_BOTTOM域指定位于栈底边界。再在代码中定义aStackOverFlowPtrn并指定位置: ![]() 04 Watchdog 例程中运行时,是在STL_DoRunTimeChecks的末尾进行“喂狗”。那在我们自己的代码中需要尽量保证只有一个地方“喂狗”,并保证“喂狗”的时间间隔。 那么可以根据应用需要,调整STL_InitRunTimeChecks中有关初始化IWDG,WWDG的参数,以保障“喂狗”的时间间隔和应用程序相适应。 例程中默认IWDG的“喂狗”时间设置为约50ms ![]() IWDG的timeout时间计算公式(STM32F2x5): ![]() WWDG的初始化: ![]() WWDG的timeout时间计算公式(STM32F2x5): ![]() |