背景:
我需要在 Arduino 环境中为我自己的 ISR 提供非常可重复的中断执行时序。 Arduino 核心库使用 Timer0 溢出中断来提供 millis()。有时,在执行 Timer0 溢出中断时满足触发我的中断的条件。默认情况下,AVR 不允许一个中断“中断”另一个中断。看这个Nested interrupts question .
Timer0 ISR 阻止我的 ISR 执行,直到它完成。此延迟最多可能需要 7 微秒,这在我的应用程序中是 Not Acceptable 。 (我知道!)
我的应用程序中不需要 millis(),所以我尝试在 void setup()
中禁用 Timer0 溢出中断:
TIMSK0 = 0;
陷阱:不幸的是,这破坏了硬件串行功能。我查看了核心库源代码,但我不明白硬件串行方法如何依赖于定时器 0。
约束:我希望我的草图能够编译并使用标准的 Arduino 发行版,所以我只能控制我的草图目录(不是 Arduino 目录)中的内容,而 Arduino 草图隐藏“包含”来自您,所以我不确定我是否可以避免包含“HardwareSerial.h”。
确切问题:
- Serial 类如何依赖于 Timer0?
- 有没有办法在不修改核心库的情况下再次调用“Serial”类?
- 一般来说,我可以重新定义在别处定义的类(或整个类)的方法吗?
最佳答案
虽然您禁用了定时器 0,但串行工作。这个简单的实验得出结论。
#include "avr/pgmspace.h"
#include "avr/io.h"
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
void setup() {
Serial.begin(9600);
cbi (TIMSK0, TOIE0); // disable Timer0 !!! delay() is now not available
}
void loop() {
if (Serial.available()){
Serial.write(Serial.read());
}
delay(1000); // this is not working since Timer 0 disabled
}
关于c++ - 在不破坏串行的情况下禁用 Arduino 上的定时器 0 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29312239/