我正在使用嵌入式IAR在C中维护一些用于STM8的代码。如何测量代码的一个部分和另一个部分之间的执行时间?(考虑到如果可能的话,我不想停止代码的执行(一个断点)或写入控制台(因为我发现这严重影响了程序的时间)。
我发现了类似于这个测量运行时间的技术的东西
但是这通常是针对ARM处理器的,所以很多方法都不适用于我的设置。我在想像第三种技术可能适用.
具体来说,我是问我能不能做些类似的事情
unsigned int cnt1 = 0;
unsigned int cnt2 = 0;
cnt1 = TIM3->CNT;
func();
cnt2 = TIM3->CNT;
printf("cnt1:%u cnt2:%u diff:%u \n",cnt1,cnt2,cnt2-cnt1);对于这个微控制器
任何帮助都非常感谢
发布于 2016-12-05 12:06:04
您不能在8位微处理器中调用每个100 no的printf,因为它没有吞吐量。相反,每次发生意外行为时都会增加状态变量。
unsigned int cnt1 = 0;
unsigned int cnt2 = 0;
cnt1 = TIM3->CNT;
func();
cnt2 = TIM3->CNT;
if ((cnt2 - cnt1) > MAX_DURATION_ALLOWED)
global_error_func_duration ++;(确保TIM3计数以微秒为单位)
CLK_PeripheralClockConfig (CLK_PERIPHERAL_TIMER3 , ENABLE);
TIM3_DeInit();
TIM3_TimeBaseInit(/* Fill these parameters to get 1us counts at your CPU clock */);
TIM3_Cmd(ENABLE); 现在,您可以创建一个控制台函数来打印这个变量,因此您可以不时地检查单个循环是否占用了10 so以上。
在开发的后期,您将希望监视这些状态变量,以评估系统运行时的完整性,并在发生不当行为时采取一些措施。
发布于 2016-12-05 00:53:34
有很多解决方案,但是简单的解决方案是在你想开始/停止测量时间的地方使用硬件引脚和切换引脚,使用示波器或一些廉价的逻辑分析器。正如有人提到的,软件有一些可变的开始和结束,给它们分配当前的计时器,并在调试中读取它们。您可以在运行时使用i.UART打印它们,但这会减慢它们的速度。
https://stackoverflow.com/questions/40965356
复制相似问题