stm32开发,C语言, 跳转执行中断函数,会保存原来函数的局部变量吗

uint8_t Camera_ReceiveRes(uint8_t size)
{
uint16_t timeout=0;
CameraCmdBuff.ReceiveNum = 0;
USART_ITConfig (USART3,USART_IT_RXNE,ENABLE);
while((CameraCmdBuff.ReceiveNum < size) && (timeout<0x3fff))
timeout++;
if(timeout==0x3fff) return 0;
else
{
CameraCmdBuff.ReceiveNum = 0;
USART_ITConfig (USART3,USART_IT_RXNE,DISABLE);
return 1;
}
这个是我写的函数,MCU与一个模块进行串口“发送-应答”对话,这个是我发送完信息后立刻调用,用来接受模块的回应的,CameraCmdBuff.ReceiveNum是一个变量,记录中断函数里接受到了几个字节,timeout是我定义用来防超时的一个局部变量,我嵌入式刚入门,看到有人说这个应该是存放在栈,在该函数执行过程中都不释放,ARM汇编不太会,只看出来 MOVS r4 #00,没看出来怎么在栈怎么没释放,求解。
现在情况是:串口接受中断函数里面累加的CameraCmdBuff.ReceiveNum回到这个函数就还是0, timeout也是,从中断函数回来后还是0,串口接受中断接受到的数据始终是第一个数据,其实应该是12个不同的字节。
如果我把这个函数改下,去掉超时timeout处理,没有上述问题,但是我不懂为什么,求大神指点啊。

CameraCmdBuff.ReceiveNum 是全局变量如果也为0你要查看下你的程序,其次对于中断来说是可以打断程序运行的,如果这样导致局部变量清零,整个程序就没法运行了,这种事情肯定不会出现的。所以你怀疑中断回来后改变了Camera_ReceiveRes函数里面的局部变量应该是不可能的。追问

是啊,按理不会出错的,请问您关于防超时处理或者串口的通信设计有改进的方法吗

追答

防超时和你思路一样,发送之后起个定时器,时间到了可以放弃。
串口通信你可以先用缓冲区接收数据,然后轮询看有没有接收到数据,不需要堵塞起来。

追问

谢谢了,我试了很多方法稍微改下都能通过,但是我太钻牛角,我觉得原始的这个理论上可行,心里实在硌得难受,这个我暂且放一下吧,以后再解决。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-04
会的,有中断保护

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网