程序跑飞不知道原因
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
GetAngle();
}
}
void GetAngle(void)
{
LX_Val.Angle+=(LX_Val.Acc)*dt;
Angle_delta=(MZ_Val.Angle-Real_angle)*Tg;
Real_angle+=(LX_Val.Acc+Angle_delta)*dt;
#if 1
SendDate('1',LX_Val.Angle,100) ;
SendDate('2',MZ_Val.Angle,100) ;
SendDate('3',Real_angle,100) ;
#endif
}
运行一次中断处理程序花多少时间?堆栈有没有溢出?
对不起,我接触的很少,怎么去判断堆栈有没有溢出,还有中断程序时间我也不了解怎么测它长度,这两个问题比较白痴,对不起
在中断服务程序入口设断点,然后单步运行。界面里应该有时钟计数器,用这个计数器可以知道运行一段程序所花时间。另外,界面里应该有堆栈观察窗口,可以看堆栈是否溢出。
如果中断处理程序所花时间(包括被其他更高优先级的中断所占时间)太长,那么在中断处理程序还没运行结束的时候就有可能再次进入中断。中断重入的结果就是堆栈溢出,系统崩溃——程序就跑飞了。
谢谢你的耐心解答,你说的中断时间的测试,我只能在simlation下测试,但是不能再 emulation下测试,我想问一下有没有其他的办法实时真正的测量出这段时间,可以用示波器吗?堆栈的问题应该是没有溢出的,我的问题好像找到答案了,应该是我陀螺仪板上的地接触不良引起的。
测试中断运行时间的方法:1) 读单片机内定时器的值,进入中断时读一次,退出中断时读一次,将差值输出。
2) 用一个IO口做指示,进入中断是拉高,退出中断时拉低,用示波器测脉宽。
其实最好的办法还是在Simulation里用时钟计数器,然后根据时钟频率推算时间。
学习喽
感谢你的指导!
顶一下!
解答过程很详细
我是菜鸟,觉得上面的解答很好,就想问下怎么通过堆栈观察窗口观察堆栈是否溢出呢?
这程序值得深入探讨研究一下 这么长 坐等大神来解答
中断调用函数,这样好吗,等待大神的解答
这里有个STM32免费样品申请的链接,需要填个问卷。希望可以帮到你
https://www.sojump.hk/jq/15943942.aspx