hw_timer_t, timerAttachInterrupt, portENTER_CRITICAL и т. д. не определены для ESP8266

У меня есть плата разработки ESP8266 NodeMCU 12E. Я пытаюсь реализовать ISR, использующий аппаратный таймер, как описано в этот блог здесь. Сообщение в блоге изначально предназначалось для ESP32, и в нем представлен окончательный демонстрационный код, который я не могу скомпилировать в Arduino IDE для ESP8266.

volatile int interruptCounter;
int totalInterruptCounter;

hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR onTimer() {
  portENTER_CRITICAL_ISR(&timerMux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&timerMux);

}

void setup() {

  Serial.begin(115200);

  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 1000000, true);
  timerAlarmEnable(timer);

}

void loop() {

  if (interruptCounter > 0) {

    portENTER_CRITICAL(&timerMux);
    interruptCounter--;
    portEXIT_CRITICAL(&timerMux);

    totalInterruptCounter++;

    Serial.print("An interrupt as occurred. Total number: ");
    Serial.println(totalInterruptCounter);

  }
}

Когда я пытаюсь скомпилировать, я получаю сообщения об ошибках hw_timer_t, portENTER_CRITICAL, portEXIT_CRITICAL, timerAttachInterrupt, timerAlarmWrite и т. д. ... все они не существуют.

Должен ли я импортировать некоторую библиотеку для поддержки этого демонстрационного кода?

Кажется, я не могу найти разговоры об аппаратном таймере для ESP8266. Кажется, все говорят об аппаратном таймере для ESP32.


person John    schedule 09.02.2019    source источник


Ответы (1)


Они не определены, потому что они находятся в ESP32 SDK, который полностью отделен (другой процессор, другой набор инструкций, другая ОС) от ESP8266. Документация по ESP32 не применима к ESP8266.

Взгляните на ESP8266 "NONOS SDK" - это "ОС", которую ESP8266 Arduino SDK построен на. Он включает вызовы аппаратных таймеров (hw_timer_init(), hw_timer_arm(), hw_timer_set_func()). Документацию по нему можно найти здесь.

Осторожно, для ESP8266 также есть «бесплатная RTOS». Когда вы ищете пример кода, люди часто не понимают, предназначен ли их код для NONOS SDK или Free RTOS SDK.

Бесплатная RTOS как отдельная программа; вы не сможете использовать его функции в программе Arduino SDK. Некоторые люди получили части Arduino SDK, работающие с ним, но это глубокая кроличья нора, которая может потратить много вашего времени. Если вы решите пойти по этому пути, вам лучше отказаться от вызовов Arduino SDK и просто написать правильную программу FreeRTOS.

person romkey    schedule 09.02.2019
comment
В моем файле C:\Users\john\Documents\ArduinoData\library.json я вижу ссылку на файл http://downloads.arduino.cc/libraries/github.com/feilipu/FreeRTOS-10.0.0-1.zip. Я не вижу ссылки на NONOS SDK в этом файле. Также мой компилятор жалуется на то, что hw_timer_init(),FRC1_SOURCE etc... не определен. Как вы думаете, это означает, что моя плата — FreeRTOS? Легко ли перейти на nonos SDK? - person John; 09.02.2019
comment
Нет, это для Arduino, а не для ESP8266. NONOS-SDK не является отдельной библиотекой, вам не нужно его загружать, и он не будет указан в library.json. На его основе построен фреймворк ESP8266 Arduino. Вы не используете бесплатную RTOS. - person romkey; 10.02.2019
comment
ох, хорошо. На данный момент я все еще получаю сообщения об ошибках, когда hw_timer_init(), FRC1_SOURCE и т. д. не объявлены или не определены, когда я пытаюсь скомпилировать в Arduino IDE. Кажется, я не могу найти в Интернете упоминаний о других, столкнувшихся с той же проблемой. Вы знаете, как я могу решить эту проблему? Спасибо - person John; 10.02.2019