Timer avr中的循环定时器功能?
最近,我不得不使用avr库,毫不延迟地创建一个Arduino项目。因此,我必须创建延迟函数的实现 在网上搜索之后,我在很多地方都找到了这个特殊的代码。 我得到的唯一解释是它以一种刻板的方式消磨时间Timer avr中的循环定时器功能?,timer,arduino,avr,avr-gcc,atmel,Timer,Arduino,Avr,Avr Gcc,Atmel,最近,我不得不使用avr库,毫不延迟地创建一个Arduino项目。因此,我必须创建延迟函数的实现 在网上搜索之后,我在很多地方都找到了这个特殊的代码。 我得到的唯一解释是它以一种刻板的方式消磨时间 void delay_ms(int ms) { int delay_count = F_CPU / 17500;//Where is this 17500 comming from volatile int i; while (ms != 0) { for (i=0; i
void delay_ms(int ms) {
int delay_count = F_CPU / 17500;//Where is this 17500 comming from
volatile int i;
while (ms != 0) {
for (i=0; i != delay_count; i++);
ms--;
}
}
我无法理解以下内容是如何工作的(尽管它确实完成了工作),即我们如何确定延迟计数为F_cpu/17500。这个数字来自哪里。延迟函数最好在汇编中完成,因为您必须知道代码需要多少指令周期才能知道如何重复它以实现总延迟 我没有测试你的代码,但是这个值(17500)被设计为达到1ms的延迟 例如,如果
F_CPU=1000000
sodelay_count=57
,要达到1ms,it count 57 count一个简单的计算,您可以发现每个计数将花费17us,该值是编译到汇编时循环花费的时间
当然,不同的编译器版本会产生不同的汇编代码,这意味着不准确的延迟
我给你们的建议是使用标准图书馆。我看不出你为什么不能用它?但如果你必须创建另一个,那么你应该学习汇编