aa520520 发表于 2024-9-10 16:05:21

1ms的定时器中断函数返回的值有时候会不对

我每次获取currenttime,极少数的情况,获取的currenttime值反而小于一开始获取的计数值,现在定时器中断调成10ms,这样的频率减少了,但是偶尔还是会有

aa520520 发表于 2024-9-10 16:06:17

void Timer4_Isr(void) interrupt 20
{
    tim_runing_time++;
}

aa520520 发表于 2024-9-10 16:19:55

刚在论坛里也看到了同样的问题https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3230&highlight=%E7%B3%BB%E7%BB%9F%E6%BB%B4%E7%AD%94%E8%AE%A1%E6%97%B6%E5%99%A8&page=1&extra=#pid21673

liuzonggong 发表于 2024-9-10 17:08:39

你要在程序里写上,如果后读入的值小于前读入的值,后面的值要加上进制,这样,后面的值就会永远大于前面的值了。问题就是,变量是循环的,int型到了65535,再来一次就变成0了。我的办法就是在中断中看看次数到了30000吗,到了30000就清零,这样如果后面读到的数小于前面的数,直接加30000,总数也没有超过int的范围。

Lkck8210 发表于 2024-9-10 17:21:47

盲猜你用的是8位单片机
8位机要避免同时在中断和主循环"运算"和"比较"多于8位的变量

aa520520 发表于 2024-9-10 17:33:01

liuzonggong 发表于 2024-9-10 17:08
你要在程序里写上,如果后读入的值小于前读入的值,后面的值要加上进制,这样,后面的值就会永远大于前面的 ...

我定义的uint32_t的值 ,也就是unsigned long,上限很大

aa520520 发表于 2024-9-10 17:33:28

Lkck8210 发表于 2024-9-10 17:21
盲猜你用的是8位单片机
8位机要避免同时在中断和主循环"运算"和"比较"多于8位的变量 ...

是8位的,8H8K,

soma 发表于 2024-9-10 19:14:43

Lkck8210 发表于 2024-9-10 17:21
盲猜你用的是8位单片机
8位机要避免同时在中断和主循环"运算"和"比较"多于8位的变量 ...

avr也是8位单片机啊。就可以,难道因为是risc吗?

Lkck8210 发表于 2024-9-11 11:38:11

wnagming 发表于 2024-9-11 07:33
这个不太理解,能详细说说吗?

主程序在处理32位的变量,
处理了其中的8位,
这个时候中断打断,
改写了整个32位,
这个时候返回主程序,
主程序继续处理剩下没处理的24位(这24位已经是新的数据了),
那么这个结果会错的离谱。

Lkck8210 发表于 2024-9-11 11:39:30

soma 发表于 2024-9-10 19:14
avr也是8位单片机啊。就可以,难道因为是risc吗?

这个不太清楚{:tongue:}
页: [1] 2
查看完整版本: 1ms的定时器中断函数返回的值有时候会不对