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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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函数里面的局部变量应该是不可能的。追问

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

追答

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

追问

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

参考技术A 会的,有中断保护

STM32 抢占优先级和响应优先级

一、抢占优先级和响应优先级

    STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号

越小,表明它的优先级别越高

    抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断

服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数

A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。

    而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,

如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由

NVIC_IRQChannelSubPriority 参数配置。例如,现在有三个中断向量,如下表。

技术分享图片

    若内核正在执行C 的中断服务函数,则它能被抢占优先级更高的中断A 打断,由于B

和C 的抢占优先级相同,所以C 不能被B 打断。但如果B 和C 中断是同时到达的,内核

就会首先响应响应优先级别更高的B 中断。

二、NVIC 的优先级组

    在配置优先级的时候,还要注意一个很重要的问题,即中断种类的数量。NVIC 只可

以配置16 种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4 位的

数字来决定,把这个4 位数字的位数分配成抢占优先级部分和响应优先级部分。有5 组分

配方式:

? 第0 组: 所有4 位用来配置响应优先级。即16 种中断向量具有都不相同的响应优先

级。
? 第1 组:最高1 位用来配置抢占优先级,低3 位用来配置响应优先级。表示有2 种

级别的抢占优先级(0 级,1 级),有8 种响应优先级,即在16 种中断向量之中,有

8 种中断,其抢占优先级都为0 级,而它们的响应优先级分别为0~7,其余8 种中断向

量的抢占优先级则都为1 级,响应优先级别分别为0~7。

? 第2 组:2 位用来配置抢占优先级,2 位用来配置响应优先级。即4 种抢占优先

级,4 种响应优先级。

? 第3 组:高3 位用来配置抢占优先级,最低1 位用来配置响应优先级。即有8 种抢占

优先级,2 种响应2 优先级。

? 第4组:所有4 位用来配置抢占优先级,即NVIC 配置的16 种中断向量都是只有

抢占属性,没有响应属性。

 

    要配置这些优先级组,可以采用库函数NVIC_PriorityGroupConfi g(),可输入的参

数为NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的5 种分配组。

    于是,有读者觉得疑惑了,如此强大的STM32,所有GPIO都能够配置成外部中断,

USART、ADC 等外设也有中断,而NVIC 只能配置16 种中断向量,那么在某个工程中

使用超过16 个中断怎么办呢?注意NVIC 能配置的是16 种中断向量,而不是16 个,当

工程中有超过16 个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,

而具有相同中断种类的中断向量不能互相嵌套

 

(转自野火《零死角玩转STM32》)






以上是关于stm32开发,C语言, 跳转执行中断函数,会保存原来函数的局部变量吗的主要内容,如果未能解决你的问题,请参考以下文章

STM32的中断处理流程是怎样的?与ARM7 ARM9相同吗?

STM32F407关闭总中断

stm32程序执行完main函数然后去干嘛了?之后的中断为何不能响应???

中断为啥跳到startup_stm32f40xx.s里面的而不是stm32f4xx_it.c的大神们帮帮忙

STM32 抢占优先级和响应优先级

STM32的RTC中断标志只能手动清除