Справка по таймеру Arduino MEGA

Ник Гаммон опубликовал некоторый код для настройки счетчика на Arduino UNO с использованием timer2 для генерации сигнала 38 кГц, и я использовал его в нескольких проектах IR.

В моем текущем проекте я использую FreeRTOS для Arduino, и источник говорит, что он использует таймеры 0–3 для работы собственного ядра, поэтому код таймера, очевидно, будет мешать работе RTOS.

Для этого проекта я использую Arduino MEGA, и, на мой взгляд, у него также есть таймер4 и таймер5. К сожалению, мои способности программирования для продуктов ATMel недостаточны на этом уровне, поэтому я ищу помощь в создании таймера, который будет генерировать выход 38 кГц, используя таймер 4 или таймер 5 MEGA 2560 на любом выходном контакте. Не следует использовать прерывания, так как это также может вызвать проблемы с RTOS.

Кстати, на Arduino MEGA вы можете выполнять переключение контекста между задачами менее чем за 200 мкс и иметь возможность определять, какую задачу ВЫ хотите выполнить следующей.

, 👍-1

Обсуждение

Можете ли вы показать мне, где я могу прочитать, что freertos использует таймеры 0-3? На мой взгляд, он не использует ни один из этих таймеров., @Jot

На всю жизнь я не могу найти то, что я нашел раньше ..... Я нашел пример кода, который настраивает сторожевой таймер для генерации основного времени функции тика, и код позволяет использовать практически любой из таймеров HW. . Я видел, что в некоторых опубликованных документах говорится, что таймеры RTOS не зависят от какого-либо аппаратного обеспечения, но также говорится, что таймеры SW не используют время процессора ?? Это не имеет смысла. Отсутствие документации в этой области может указывать на то, что HW действительно не используется, особенно потому, что RTOS будет работать практически на любом Arduino, а таймеры сильно различаются по возможностям., @crusader27529

Файл с таймером: \avrfreertos-master\avrfreertos-master\freeRTOS10xx\include\FreeRTOSBoardDefs.h, @crusader27529

Рекомендуется использовать сторожевой таймер, но я вижу, что для arduino mega 2560 используется timer3: https://github.com/feilipu/avrfreertos/blob/master/freeRTOS10xx/include/FreeRTOSBoardDefs.h Это нормально, поскольку timer0, timer1 и timer2 не используются freertos. Менеджер библиотек в arduino ide использует мини-версию freertos, а та использует сторожевой таймер: https://github.com/feilipu/Arduino_FreeRTOS_Library/blob/596a743509309121afcf7fa95c4d17d6d7fdd7ce/src/FreeRTOSVariant.h Почему вы выбрали большую версию из фриртос?, @Jot

Я только что скачал версию, которую показала IDE. Я не знал, что есть другая, уменьшенная версия. Размер кода не важен для проекта, так как будут выполняться только 3 задачи, все из которых зависят от процесса, а просто сканируется во время выполнения в конечном автомате. Все они будут выполняться с одинаковым приоритетом, и при каждом выходе из каждого состояния цикла, в котором они находятся, они будут уступать место следующей задаче. ВСЕ они всегда будут в состоянии готовности. Первоначально я настроил код так, чтобы изменить их собственный приоритет, чтобы он соответствовал всем остальным, а затем повысить приоритет следующей задачи для запуска., @crusader27529

Затем эта задача снижает свой приоритет, а затем повышает приоритет следующей задачи для запуска. Я настроил это с помощью фиктивных задач, чтобы измерить время переключения контекста, и не смог найти никакой разницы между двумя методами. Как я уже говорил выше, время переключения контекста было менее 200 мкс. Мне нужно сделать это, потому что исходный код работал в отдельных модулях Arduino и отслеживает настройку ИК-детекторов в квадратурной конфигурации с расстоянием между ними менее 0,030 дюйма., @crusader27529

Таким образом, конечные автоматы должны быть очень чувствительными, а переключение контекста на 200 мкс сведет к минимуму любую задержку при обнаружении, поскольку конечный автомат остается в цикле оператора switch, а время выполнения очень быстрое, на самом деле во много раз быстрее, чем необходимо для обнаружения. . Таким образом, код должен работать с минимальными изменениями. AFAICT, единственная реальная разница будет состоять в том, чтобы просто переключать контекст прямо перед оператором break для каждого случая., @crusader27529

Я установил «FreeRTOS от Ричарда Барри» из менеджера библиотек и получил мини-версию. Я думаю, что вам не нужен rtos, вы можете поставить три конечных автомата в цикл и убрать все задержки и использовать прерывания для ir-детекторов. Само прерывание использует несколько микросекунд в микроконтроллере avr: https://gammon.com.au/interrupts Код внутри прерывания часто занимает больше микросекунд, потому что одно цифровое чтение использует около 4 микросекунд., @Jot

Конечный автомат сложный, и с двумя работающими в каждой задаче, имея 6 взаимодействующих машин, будет ZOO, пытающийся устранить неполадки. Я действительно не хочу начинать все сначала. В настоящее время код работает нормально, но если у меня возникнут проблемы с производительностью, я передумаю. Кстати, код, который Ник написал для вывода 38 кГц, отлично работает в RTOS, но он выводит данные на контакт 10 на MEGA, а не на контакт данных 11 на UNO. Итак, проект переходит к следующему этапу., @crusader27529

Думаю, мы оба извлекли из этого урок. Я создал ответ (со своим мнением). Я использовал freertos, и он работает хорошо. Тем не менее, я думаю, что недостатков больше, чем преимуществ., @Jot


1 ответ


0

Использование опережающей операционной системы реального времени на плате Arduino с микроконтроллером AVR (Arduino Uno, Leonardo, Mega 2560) – это академическое упражнение.

FreeRTOS надежна и может быть полезна для тех, кто пишет многозадачный код.
На мой взгляд, FreeRTOS не сочетается с простыми платами AVR Arduino:

  • Недостаточно оперативной памяти.
    Каждая задача получает свой собственный стек. Оперативная память на плате AVR ограничена. Это означает, что каждый задача должна быть написана очень осторожно, чтобы ограничить использование стека.
  • Недостаточно оперативной памяти, когда самое интересное вот-вот начнется.
    Когда есть несколько задач и, возможно, несколько подпрограмм прерывания, тогда потребуется несколько буферов и очередей сообщений. Для этого недостаточно оперативной памяти.
  • При разработке Arduino не учитывалась многозадачность.
    Библиотеки Arduino для этого не подходят. Некоторые функции ждут для чего-то (Serial.parseInt, Wire.requestFrom, Wire.endTransmission) из-за этого ОСРВ работает хуже, чем ожидалось.
  • FreeRTOS большая, требует памяти и процессорного времени.

Без FreeRTOS некоторые известные методы очень эффективны для плат AVR Arduino:

  • Конечный автомат использует очень мало оперативной памяти.
    Конечный автомат без delay() который использует millis(), может быть очень отзывчивым.
  • Избегайте подпрограмм прерывания.
    Часто можно избежать процедур прерывания. Чтение кнопок часто можно выполнить путем опроса кнопок. в loop().
  • Избегание объекта String и перемещение текста в PROGMEM может быть использован иметь достаточно памяти для более сложного и надежного скетча.

В настоящий момент «FreeRTOS by Richard Barry» находится в диспетчере библиотек. Это уменьшенная версия FreeRTOS, в которой используется только таймер WatchDog. Он не конфликтует с библиотеками Arduino.

Большую версию FreeRTOS и множество примеров можно найти по адресу https://github.com/feilipu/avrfreertos
Не каждая версия FreeRTOS использует таймер WatchDog. Найдите файл FreeRTOSBoardDefs.h, чтобы узнать, какой таймер используется для вашей конкретной платы Arduino.

crusader27529, я не вижу проблемы в удалении FreeRTOS и последовательном вызове трех задач.

void loop() {
  task1();
  task2();
  task3();
}
,

Природа задач заключается в том, что они никогда не прекращаются, а постоянно контролируют несколько ИК-датчиков, время которых критично, и все они работают в нескольких конечных автоматах. Используя RTOS, я могу использовать функцию YIELD, чтобы перевести текущую задачу в состояние, позволяющее запустить следующую задачу. Поскольку все задачи имеют одинаковый приоритет, результатом является совместная операция переключения задач с чрезвычайно низкими затратами на переключение контекста. AAMOF, я могу последовательно переключаться между 4 задачами менее чем за 200 мкс. На самом деле это составляет около 50 мкс на переключение контекста задачи с минимальными изменениями в старом коде., @crusader27529

@ crusader27529 Теперь я понимаю, вы остаетесь в конечном автомате и выполняете уступку другим. Без RTOS цикл() выполняется снова и снова и проходит через конечные автоматы. Это другой подход., @Jot