c++ - 在不破坏串行的情况下禁用 Arduino 上的定时器 0 中断

标签 c++ arduino embedded interrupt

背景:

我需要在 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”。

确切问题:

  1. Serial 类如何依赖于 Timer0?
  2. 有没有办法在不修改核心库的情况下再次调用“Serial”类?
  3. 一般来说,我可以重新定义在别处定义的类(或整个类)的方法吗?

最佳答案

虽然您禁用了定时器 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/

相关文章:

c++ - 如何从文件中识别数据类型

c++ - 如何使用 boost 进行成员(member)访问复制

c++ - 从 uint8_t* 到 uint8_t fpermissive c++ 的无效转换

mysql - 使用 Arduino 和 GPS/GPRS 模块的 GPS 数据不准确

c - 在 C 中,我应该将所有这些类似函数的#defines 放在哪里?

C++ 标准特性和二进制大小

python - 如何在 C 代码中返回 pyrun_simplefile 的输出

c++ - 在以下情况下,我可以避免在 C++ 中复制 unordered_map 吗?

c++ - Arduino 上运行时速度汇编与 C/C++ 的差异

c - 从 EEPROM 读取每个字符到字符串