8位单片机尽量不要使用%mod取模

发布时间:2026/6/6 13:32:57

8位单片机尽量不要使用%mod取模 结论因为会耗费大量时间除几十次也少用int 16位变量能用就用char 8位今天在调板子的时候发现定时器卡住了特别慢排查后是我用了这一行常用代码来把125us定时器计时1秒i(i1)%8000;每次暂停都在这个函数定时器的时序也乱了原因原因是因为大部分8位单片机没有硬件除法器取模mod只能靠二进制恢复除法多次除法或长除法实现一次需要50-100条指令相当于几十us在定时器里是灾难级的解决方法用if (i 8000) i 0;代替规避了多次除法的操作只需要对比一下用i i % 82的次方倍编译器能直接优化成移位操作以及少用int多用char因为8位单片机一次处理数据一般8位意味着16位的运算要拆成2次3次的预算性能对比AI估算实际会快一点操作数据类型典型周期数时间16MHz相对耗时i % 8(2的幂)char 8位10.25μs 极快i % 3char 8位28671.5μs 极慢j % 8(2的幂)int 16位30.75μs 极快j % 3int 16位28671.5μs 极慢j % 8000int 16位571142.75μs 极慢if(j8000)j0int 16位51.25μs 极快算法源码这是单片机官方的底层mod源码可以学习参考一下unsignedint__lwmod(unsignedintdivisor,unsignedintdividend){unsignedcharcounter;if(divisor!0){counter1;while((divisor0x8000)0){divisor1;counter;}do{if(divisordividend)dividend-divisor;divisor1;}while(--counter!0);}returndividend;}

相关新闻