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

uint8_tCamera_ReceiveRes(uint8_tsize){uint16_ttimeout=0;CameraCmdBuff.ReceiveNum=0;US... 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处理,没有上述问题,但是我不懂为什么,求大神指点啊。
展开
 我来答
jay8830095
2013-03-04
知道答主
回答量:45
采纳率:0%
帮助的人:25.2万
展开全部
CameraCmdBuff.ReceiveNum 是全局变量如果也为0你要查看下你的程序,其次对于中断来说是可以打断程序运行的,如果这样导致局部变量清零,整个程序就没法运行了,这种事情肯定不会出现的。所以你怀疑中断回来后改变了Camera_ReceiveRes函数里面的局部变量应该是不可能的。
更多追问追答
追问
是啊,按理不会出错的,请问您关于防超时处理或者串口的通信设计有改进的方法吗
追答
防超时和你思路一样,发送之后起个定时器,时间到了可以放弃。
串口通信你可以先用缓冲区接收数据,然后轮询看有没有接收到数据,不需要堵塞起来。
C语言110
2013-03-04 · 超过14用户采纳过TA的回答
知道答主
回答量:81
采纳率:0%
帮助的人:42.8万
展开全部
会的,有中断保护
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式