OpenEdv-开源电子网

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

ucosII 中断开关问题????求解

[复制链接]

49

主题

110

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2012-9-17
在线时间
0 小时
发表于 2012-10-22 11:51:14 | 显示全部楼层 |阅读模式
 

最近学习ucos的移植代码。看到开关中断处。有点问题

fficeffice" /> 

首先ucos支持三种开关中断方式

下面是pc移植的代码(ucos官方)

#define  OS_CRITICAL_METHOD    2

 

#if      OS_CRITICAL_METHOD == 1

#define  OS_ENTER_CRITICAL()  asm  CLI                    /* Disable interrupts                        */

#define  OS_EXIT_CRITICAL()   asm  STI                    /* Enable  interrupts                        */

#endif

 

#if      OS_CRITICAL_METHOD == 2

#define  OS_ENTER_CRITICAL()  asm {PUSHF; CLI}            /* Disable interrupts                        */

#define  OS_EXIT_CRITICAL()   asm  POPF                   /* Enable  interrupts                        */

#endif

 

#if      OS_CRITICAL_METHOD == 3

#define  OS_ENTER_CRITICAL()  (cpu_sr = OSCPUSaveSR())    /* Disable interrupts                        */

#define  OS_EXIT_CRITICAL()   (OSCPURestoreSR(cpu_sr))    /* Enable  interrupts                        */

第一种方式最简单,就不再说了。

问题是后面两种方式,这两种方式都是为了解决如下情况,逻辑一样,只是一个存到栈,一个存到变量cpu_sr中了

 

1.OS_ENTER_CRITICAL()

2.。。。。。。。。。。。代码

3.           OS_ENTER_CRITICAL()

4.           。。。。。。。。用户代码

5.           OS_EXIT_CRITICAL()

6.。。。。。。。。。。代码

7.OS_EXIT_CRITICAL()

 

如果这种情况用 第一种方式不能保证 1-7行中断都是关着的,因为第5行调用了开中断指令

所以用后两种方式就很好的解决了这个问题

!!!!!!!

这才有我的问题。问题处在(比如第二种方式)

#if      OS_CRITICAL_METHOD == 2

#define  OS_ENTER_CRITICAL()  asm {PUSHF; CLI}            /* Disable interrupts                        */

#define  OS_EXIT_CRITICAL()   asm  POPF                   /* Enable  interrupts                        */

这样的话 pushf实现了保存状态标志,在退出 关中断的时候popf出栈恢复 标志寄存器内容

但是pushf不仅会将中断允许标志压入栈,同时会将其他标志,比如ZFOF压入。那么问题就来了。调用popf恢复的中断状态标志就变成了代码第 3行执行处的标志状态了。。。。。。。。。

里面的ZF OF等标志也会恢复到了第三行的状态,正常的话那么第6行以后的代码执行应该用第5行执行后的状态标志,但是因为pushf popf的调用,那么ZF OF等的标志只是第三行的标志态。。。。岂不是执行程序就不对了

 

想了很久,很纠结,希望高手指教

QQ1183557534,有知道的请回帖或联系我

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-10-22 14:52:19 | 显示全部楼层
这个没研究了,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 15:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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