打印

STM32F051,请教香主:中断优先级问题

[复制链接]
6041|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxm19820916|  楼主 | 2013-4-28 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用到了外部中断(EXTI5),管脚PA5每10ms触发一次(每次都能触发),NVIC配置中优先级配置为0(最高)。
还有个TIM14,作为7us定时器使用,每7us产生一个溢出中断,优先级配置为1。
在7us中断中,一个volatile无符号全局变量timCount++;
在10ms中断中,将timCount存储到一个数组中(100个元素),然后复位timCount。

查看数组,发现大部分元素为1420多,但有少部分是2800多。证明有时候10ms中断复位timCount不成功。为什么?
对于这种慢中断中需要改变快中断中使用到的变量,有没有什么好的处理方法?请指点,谢谢!

我目前是在10ms中断中置位一个标记,在7us中断中判断这个标记是否置位,置位了则复位标记和复位timCount。
沙发
zxm19820916|  楼主 | 2013-5-6 11:22 | 只看该作者
不解释?

使用特权

评论回复
板凳
cushawzsw| | 2013-5-6 17:55 | 只看该作者
将EXTI5 和 TIM4的抢占优先级设置为一致,子优先级EXTI5高于TIM4,防止中断嵌套,试试看

使用特权

评论回复
地板
hawksabre| | 2013-5-6 19:09 | 只看该作者
将中断标志及时清除   应该问题不大   仔细查一查   呵呵

使用特权

评论回复
5
zxm19820916|  楼主 | 2013-5-17 11:05 | 只看该作者
cushawzsw 发表于 2013-5-6 17:55
将EXTI5 和 TIM4的抢占优先级设置为一致,子优先级EXTI5高于TIM4,防止中断嵌套,试试看 ...

M0芯片只有一个优先级。

使用特权

评论回复
6
zxm19820916|  楼主 | 2013-5-17 11:07 | 只看该作者
本帖最后由 zxm19820916 于 2013-5-17 11:08 编辑
hawksabre 发表于 2013-5-6 19:09
将中断标志及时清除   应该问题不大   仔细查一查   呵呵

中断一进入立即清除标记位。
而且TIM14是在EXTI5的中断函数里先失能,然后再使能的。

使用特权

评论回复
7
香水城| | 2013-5-17 15:55 | 只看该作者
两个不同的ISR都要修改某个变量值,一般要采用PV保护;否则存在以下可能,导致修改的值不能按照预期:

TIM14_ISR:正在对timCount++操作的过程中,具体展开应该是个“读-修改-写”的过程。如果在修改和写回之间,EXTI5_ISR到来,由于EXTI中断优先级更高,可以打断当前TIM14 ISR的执行,在EXTI5中把timCount清零,然后返回到TIM14_ISR中继续执行刚才的写操作,那么岂不是清零的操作就被覆盖了。

LZ现在的workaround,由于是在同一个ISR中对timCount又++,又清零,因此不会有以上错误发生。

使用特权

评论回复
8
zxm19820916|  楼主 | 2013-5-20 14:51 | 只看该作者
香水城 发表于 2013-5-17 15:55
两个不同的ISR都要修改某个变量值,一般要采用PV保护;否则存在以下可能,导致修改的值不能按照预期:

TIM ...

按照分析,确实有可能是这个原因导致的清零不成功。
再请教香主:PV保护是什么?应该怎么操作?

使用特权

评论回复
9
shuimubai| | 2013-9-4 21:13 | 只看该作者
zxm19820916 发表于 2013-5-20 14:51
按照分析,确实有可能是这个原因导致的清零不成功。
再请教香主:PV保护是什么?应该怎么操作?
...

应该是临界保护吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

299

帖子

2

粉丝