zcl201207 发表于 2017-6-20 20:41:43

zh874176706 发表于 2017-6-20 11:18
这没区别呀,在else与halt之间照样可以产生中断。导致中断产生的标志位不能被主循环处理就进入休眠。 ...

是你想多了。。。
如果你觉得这个地方很重要,那么就用汇编啊,过滤你觉得多余的指令。。。

zh874176706 发表于 2017-6-26 09:49:18

zcl201207 发表于 2017-6-20 20:41
是你想多了。。。
如果你觉得这个地方很重要,那么就用汇编啊,过滤你觉得多余的指令。。。 ...

也许只能用汇编解决这个问题了,所以我觉得这是stm8的一个缺陷

zh874176706 发表于 2017-6-26 09:49:39

zcl201207 发表于 2017-6-20 20:41
是你想多了。。。
如果你觉得这个地方很重要,那么就用汇编啊,过滤你觉得多余的指令。。。 ...

也许只能用汇编解决这个问题了,所以我觉得这是stm8的一个缺陷。

qinyunti 发表于 2019-6-24 16:51:43

确实有缺陷,理论上HALT之前要应该能禁止中断,HALT指令能自动使能中断

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指令会自动使能中断允许唤醒

qinyunti 发表于 2019-6-24 17:04:09

zh874176706 发表于 2017-6-15 07:29
不知道如何解决这种临界点bug

为了避免HALT指令前进入中断破坏逻辑,可以将临界段先关中断保护__diabale_interrupt();
HALT指令会自动使能中断,允许外部中断唤醒。

fubinfeng 发表于 2019-7-26 10:42:04

我觉得这个根本就没必要去规避,因为概率实在太小了。

butterflyspring 发表于 2019-7-30 16:07:46

同意qinyunti 的观点。如果预见有这种情况发生就要通过软件逻辑避免。并且测试的HALT指令的功能是正确的。这个功能在手册上也是这样描述滴:)

yuanhaiys 发表于 2019-8-6 09:28:33

看你怎么唤醒了。
页: 1 [2]
查看完整版本: stm8 halt指令缺陷