zh874176706 发表于 2017-6-15 07:26:35

stm8 halt指令缺陷

本帖最后由 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岂不是继续休眠。

zh874176706 发表于 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()看做延时比较好理解。

zh874176706 发表于 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

zh874176706 发表于 2017-6-15 21:49
halt()是休眠指令

应该是根据f_sleep来判断的,所谓休眠就是f_sleep=1持续一段时间,否则一休眠就醒不来了:P

Inc_brza 发表于 2017-6-16 09:18:50

这根hal指令本身有啥关系~

zh874176706 发表于 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();
}

zh874176706 发表于 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

指令并没有缺陷,需要根据具体应用处理好逻辑先后
页: [1] 2
查看完整版本: stm8 halt指令缺陷