我认为没有办法保证它,但这个解决方案可能会提供一个可接受的替代方案。
我可以建议不要设置标志而是修改值吗?
这是它的工作原理。
1/ 从零开始一个值。
2/ 每 10ms 中断,在 ISR(中断服务程序)中将该值增加 10。
3/ 在主循环中,如果值 >= 500,则从该值中减去 500 并执行 500 毫秒的活动。
在修改值时,您必须小心注意计时器和主程序之间的竞争条件。
这样做的好处是,无论延迟或持续时间如何,函数都尽可能接近 500ms 边界运行。
如果由于某种原因,您的函数在一次迭代中延迟了 20 毫秒,则该值已经是 520,因此您的函数会将其设置为 20,这意味着它只会在下一次迭代之前等待 480 毫秒。
在我看来,这似乎是实现您想要的最佳方式。
我已经很多年没有接触过 8051(假设这是 C51 的目标,考虑到您的描述,这似乎是一个安全的赌注),但它可能有一条指令可以减去 50 而不会出现中断。但是,我似乎记得架构非常简单,因此您可能必须在它执行加载/修改/存储操作时禁用或延迟中断。
volatile int xtime = 0;
void isr_10ms(void) {
xtime += 10;
}
void loop(void) {
while (1) {
/* Do all your regular main stuff here. */
if (xtime >= 500) {
xtime -= 500;
/* Do your 500ms activity here */
}
}
}