打印
[STM8]

手工调高软件优先级后,同级别优先级的中断还能产生?

[复制链接]
3117|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huhuhu_1|  楼主 | 2009-10-30 18:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我主程序中的一段代码运行时修改软件优先级由Level 0(I1=1,I0=0)到Level 1(I1=0,I0=1),把外部端口PB1的优先级设置为Level 1(I1=0,I0=1),希望这样可以在执行该段代码时不被外部中断PB1打断。可调试中发现PB1中断还是能够打断该段代码的运行。请问版主,怎么会这样?
如果MCU的设计就是这样的,那我该如何在主程序中简单的实现一段代码不被部分中断打断,还能被其它的中断打断?
沙发
香水城| | 2009-10-30 18:19 | 只看该作者
CPU是否要响应一个具有软件优先级的中断,要看CPU当前的软件优先级是多少;CPU当前的软件优先级与正在响应的中断的软件优先级相同,CPU当前软件优先级的设置是在响应中断的哪个时刻完成的。

比如,CPU正在响应一个软件优先级1的中断请求,则CPU的当前软件优先级即为1,即使在中断处理程序中修改了这个中断源的软件优先级,也不会修改CPU的当前软件优先级,只有在下次CPU响应这个中断时,CPU的当前软件优先级才会是新的设置。

使用特权

评论回复
板凳
xsgy123| | 2009-10-30 21:24 | 只看该作者
把每个中断的优先级理顺就可以了

使用特权

评论回复
地板
huhuhu_1|  楼主 | 2009-10-31 08:37 | 只看该作者
楼上的可能没有理解我的意思。我是在主程序中修改CPU的“当前”软件优先级,而不是“在中断程序中”修改“某个中断“的软件优先级。

使用特权

评论回复
5
vigia| | 2009-11-2 10:31 | 只看该作者
ST提供的库函数里有三个函数,可以用来实现这样的需求。

1, __set_BASEPRI
这个函数修改的是BASEPRI寄存器
0:没有影响
非0:当前程序不能被低于此优先级的中断打断

2, __set_PRIMASK
这个函数修改PRIMASK寄存器
0:没有影响
1:当前程序不能被除了RESET, NMI, HARDFAULT之外的其他中断打断

3, __set_FAULTMASK
这个函数修改FAULTMASK寄存器
0:没有影响
1:当前程序不能被除了RESET和NMI之外的其他中断打断

具体请参考PM0056 STM32F10xxx Cortex-M3 programming manual
http://www.st.com/stonline/products/literature/pm/15491.pdf

使用特权

评论回复
6
huhuhu_1|  楼主 | 2009-11-2 14:40 | 只看该作者
楼上的大侠,你说的STM32F的知识,我问的是STM8S的,不相干的。
STM32F上我已经实现了该功能。

使用特权

评论回复
7
香水城| | 2009-11-2 15:04 | 只看该作者
楼上的可能没有理解我的意思。我是在主程序中修改CPU的“当前”软件优先级,而不是“在中断程序中”修改“某个中断“的软件优先级。
huhuhu_1 发表于 2009-10-31 08:37


请问你是如何修改的?

使用特权

评论回复
8
huhuhu_1|  楼主 | 2009-11-10 10:22 | 只看该作者
我在程序中(注意:不是中断内部)通过push和pop指令来修改I1 I0的内容,来达到调整当前软件优先级的目的。希望这样能够避免低级别或同级别的中断打断后面将要执行的特定程序块(注意:不是中断程序),在该特定程序块执行完后,再通过同样的方式把当前软件优先级调整到最低级别。

使用特权

评论回复
9
tieguanyin2008| | 2010-9-22 23:12 | 只看该作者
直接调好象不可以

使用特权

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

本版积分规则

23

主题

62

帖子

0

粉丝