OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12434|回复: 6

关于stm8开关全局中断的问题

[复制链接]

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
发表于 2013-9-4 10:55:30 | 显示全部楼层 |阅读模式
最近在搞stm8,发现stm8开关全局中断和其他片子不太一样,他是靠CC寄存器的I1:0这两位来控制的,上电时这两位都为高,实际是stm8初始化的时候关闭了全局中断,等外设都设置好了以后,用RIM()开全局中断,片子开始响应中断了。
问题来了,现在有3段软中断优先级不同的中断历程:IT0、IT1、IT2,软中断级别分别为1、2、3,IT2最高,如果系统已经响应了IT1中断,且在执行中IT0挂起,这时因为要处理临界区数据所以SIM(),处理完后RIM(),请问这时是执行完IT1后去响应IT0,还是发生IT0嵌套IT1的优先级翻转事件?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-9-4 11:38:26 | 显示全部楼层
回复【楼主位】whjambo:
---------------------------------
写代码实际测试下,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1350
金钱
1350
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-9-4 13:42:04 | 显示全部楼层
回复【2楼】whjambo:
---------------------------------
执行完T1,响应T0,硬件还没有处理 中断嵌中断的能力,一般指的中断嵌中断是OS中的概念。
1-1
回复 支持 反对

使用道具 举报

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
 楼主| 发表于 2013-9-4 15:34:35 | 显示全部楼层
回复【4楼】mygod:

回复【2楼】whjambo:
---------------------------------
执行完T1,响应T0,硬件还没有处理 中断嵌中断的能力,一般指的中断嵌中断是OS中的概念。

---------------------------------
个人觉得应该是马上会响应IT0,因为STM8的中断只要满足2个条件就能得到响应:
1.需要响应的中断被使能且中断标志位没有清除,可以理解成中断等待响应的状态;
2.需要响应的中断优先级大于程序当前优先级,也就是中断的软优先级比当前CC寄存器I1:0的级别高。
当然,3个不可屏蔽的中断源除外。
系统响应某个级别中断的同时,会将他的中断等级赋值给CC寄存器的I1:0,比如主程序级别为0,I1:0为1:0;当一个2级中断响应后,I1:0为0:0;当在这个2级中断里使用RIM()后,I1:0又被赋值成1:0,程序级别降至0级,如果这时有等待响应的1级中断,应该马上去响应1级中断。
纯属个人意见,供大家讨论。
回复 支持 反对

使用道具 举报

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
 楼主| 发表于 2013-9-5 11:50:26 | 显示全部楼层
定义全局变量系统程序级别SystemPRI
#define SHUT_IT() {SystemPRI = CPU_CCR & 0x28; sim();}      //关中断;
#define OPEN_IT() {asm("push SystemPRI"); asm("pop cc");}   //开中断;
但是这样会清除当前CPU_CCR其他位的值(V,H,N,Z,C); 不知道会不会影响计算。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-11-1
在线时间
2 小时
发表于 2015-12-14 13:52:26 | 显示全部楼层
你的问题不全面,你的问题在手册里面已经提到了,如下:
注意: 在中断被响应时如果位 I1 和 I0 被修改,那么设备将作如下处理: 如果一个中断 X仍然处在悬
起状态(新的中断或者中断标志没有被清除)同时该新的优先级又比先前的优先级高的话,那
么该中断 X会被重新响应。否则该中断的软件优先级在下一个中断请求( X中断的IRET之后)来
之前保持不变。
在中断子程序的执行过程中,执行 HALT, OP CC, RIM , SIM 和 WFI指令会改变当前的软件优
先级直到下一条IRET指令被执行或者先前提到的指令之一被执行。详见 10.7。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-11-1
在线时间
2 小时
发表于 2015-12-14 13:55:58 | 显示全部楼层
你的问题在手册已经给你解决,现在是有别的问题要理清下,运行sim();是设为3级,那么每个中断初始化复位也是3级,根据以下硬件中断优先级,那么运行为什么能sim();为什么能够屏蔽软件优先级呢?没道理啊!
硬件的中断优先级按如下顺序排列,从低到高的优先级是: MAIN, IT4, IT3, IT2, IT1, IT0,
TRAP/TLI(同等优先级)以及RESET。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表