1ms的定时器中断函数返回的值有时候会不对
我每次获取currenttime,极少数的情况,获取的currenttime值反而小于一开始获取的计数值,现在定时器中断调成10ms,这样的频率减少了,但是偶尔还是会有void Timer4_Isr(void) interrupt 20
{
tim_runing_time++;
} 刚在论坛里也看到了同样的问题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 你要在程序里写上,如果后读入的值小于前读入的值,后面的值要加上进制,这样,后面的值就会永远大于前面的值了。问题就是,变量是循环的,int型到了65535,再来一次就变成0了。我的办法就是在中断中看看次数到了30000吗,到了30000就清零,这样如果后面读到的数小于前面的数,直接加30000,总数也没有超过int的范围。
盲猜你用的是8位单片机
8位机要避免同时在中断和主循环"运算"和"比较"多于8位的变量 liuzonggong 发表于 2024-9-10 17:08
你要在程序里写上,如果后读入的值小于前读入的值,后面的值要加上进制,这样,后面的值就会永远大于前面的 ...
我定义的uint32_t的值 ,也就是unsigned long,上限很大 Lkck8210 发表于 2024-9-10 17:21
盲猜你用的是8位单片机
8位机要避免同时在中断和主循环"运算"和"比较"多于8位的变量 ...
是8位的,8H8K, Lkck8210 发表于 2024-9-10 17:21
盲猜你用的是8位单片机
8位机要避免同时在中断和主循环"运算"和"比较"多于8位的变量 ...
avr也是8位单片机啊。就可以,难道因为是risc吗? wnagming 发表于 2024-9-11 07:33
这个不太理解,能详细说说吗?
主程序在处理32位的变量,
处理了其中的8位,
这个时候中断打断,
改写了整个32位,
这个时候返回主程序,
主程序继续处理剩下没处理的24位(这24位已经是新的数据了),
那么这个结果会错的离谱。 soma 发表于 2024-9-10 19:14
avr也是8位单片机啊。就可以,难道因为是risc吗?
这个不太清楚{:tongue:}
页:
[1]
2