你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm8 halt指令缺陷

[复制链接]
矩阵 提问时间:2017-6-15 07:26 /
本帖最后由 zh874176706 于 2017-6-15 09:17 编辑

void main(void)
{
    while (1)
    {
         if(f_sleep==0)
         {
               f_sleep=1;
               //其他需要执行的程序;
         }
         if(f_sleep==1) halt();
    }
}


interrupt()
{
      f_sleep=0;
}


请问如果在上面的if(f_sleep==1)之后且halt()指令之前产生中断,那stm8岂不是继续休眠。
收藏 评论18 发布时间:2017-6-15 07:26

举报

18个回答
qinyunti 回答时间:2019-6-24 17:00:45
qinyunti 发表于 2019-6-24 16:51
确实有缺陷,理论上HALT之前要应该能禁止中断,HALT指令能自动使能中断

经过实测HALT指令确实可以自动使能中断,HALT指令没问题。
在使用HALT指令前要关闭中断,避免HALT前产生中断破坏逻辑。
我的一个使用情况,之前版本
  gHaltWakeFlag=0;
  GPIOC->CR2 |=  (uint8_t)((uint8_t)1<<4);  /*PC4 使能输入中断  */
  __asm("HALT");
存在一定概率使能引脚中断配置之后,HALT指令之前马上进入中断,
而我的中断服务函数是进入中断后关闭引脚中断设置标志,唤醒后去查询该标志。
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
{
  /*关闭中断*/
  GPIOC->CR2 &= (uint8_t)(~(uint8_t)((uint8_t)1<<4));   /*PC4 不使能输入中断*/
  gHaltWakeFlag=1;
}
存在一定概率HALT之前又进入中断服务函数关闭了引脚中断,导致无法唤醒。

修改后如下:  
__disable_interrupt();
  gHaltWakeFlag=0;
  GPIOC->CR2 |=  (uint8_t)((uint8_t)1<<4);  /*PC4 使能输入中断  */
  __asm("HALT");

保证了HALT之前不会产生中断,而HALT指令会自动使能中断允许唤醒
zcl201207 回答时间:2017-6-20 20:41:43
zh874176706 发表于 2017-6-20 11:18
这没区别呀,在else与halt之间照样可以产生中断。导致中断产生的标志位不能被主循环处理就进入休眠。 ...

是你想多了。。。
如果你觉得这个地方很重要,那么就用汇编啊,过滤你觉得多余的指令。。。
qinyunti 回答时间:2019-6-24 17:04:09
zh874176706 发表于 2017-6-15 07:29
不知道如何解决这种临界点bug

为了避免HALT指令前进入中断破坏逻辑,可以将临界段先关中断保护__diabale_interrupt();
HALT指令会自动使能中断,允许外部中断唤醒。
矩阵 回答时间:2017-6-15 07:29:19
不知道如何解决这种临界点bug
ic界中lol打的最好的 回答时间:2017-6-15 09:28:37
不是呀,只有当f_sleep=1 才执行halt(),进入中断f_sleep=0了,返回后执行halt()然后继续判断,发现f_sleep=0了,继续执行其他程序。这里把halt()看做延时比较好理解。
矩阵 回答时间:2017-6-15 21:49:43
ic界中lol打的最好的 发表于 2017-6-15 09:28
不是呀,只有当f_sleep=1 才执行halt(),进入中断f_sleep=0了,返回后执行halt()然后继续判断,发现f_s ...

halt()是休眠指令
ic界中lol打的最好的 回答时间:2017-6-16 09:06:52

应该是根据f_sleep来判断的,所谓休眠就是f_sleep=1持续一段时间,否则  一休眠就醒不来了
Inc_brza 回答时间:2017-6-16 09:18:50
这根hal指令本身有啥关系~
矩阵 回答时间:2017-6-16 20:59:58
Inc_brza 发表于 2017-6-16 09:18
这根hal指令本身有啥关系~

我的意思是就算在halt()指令与上一条指令之间发生中断也不能让单片机休眠,如何做到。
zcl201207 回答时间:2017-6-19 19:59:35
你有这种担心,那就改成这样啊:
if(sleep==0)
{
   xxxx;
}else
{
   halt();
}
矩阵 回答时间:2017-6-20 11:18:59
zcl201207 发表于 2017-6-19 19:59
你有这种担心,那就改成这样啊:
if(sleep==0)
{

这没区别呀,在else与halt之间照样可以产生中断。导致中断产生的标志位不能被主循环处理就进入休眠。
lyfly_away 回答时间:2017-6-20 13:53:38
指令并没有缺陷,需要根据具体应用处理好逻辑先后
矩阵 回答时间:2017-6-26 09:49:18
zcl201207 发表于 2017-6-20 20:41
是你想多了。。。
如果你觉得这个地方很重要,那么就用汇编啊,过滤你觉得多余的指令。。。 ...

也许只能用汇编解决这个问题了,所以我觉得这是stm8的一个缺陷
矩阵 回答时间:2017-6-26 09:49:39
zcl201207 发表于 2017-6-20 20:41
是你想多了。。。
如果你觉得这个地方很重要,那么就用汇编啊,过滤你觉得多余的指令。。。 ...

也许只能用汇编解决这个问题了,所以我觉得这是stm8的一个缺陷。
qinyunti 回答时间:2019-6-24 16:51:43
确实有缺陷,理论上HALT之前要应该能禁止中断,HALT指令能自动使能中断
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版