Комментарии 5
Scheduler?
Если есть задачи с точной привязкой ко времени, то их, да, приходится расставлять по сетке вручную. Но обычно таких задач немного, и моё нестрогое решение соседствует со строгим, с прерываниями.
Не понял я только, почему в вашей задаче нельзя одновременно вычислять и сохранять. Первая задача - программная, вторая - аппаратная. И их вполне можно, и даже нужно делать параллельно, тем более при дефиците времени.
я припоминаю, и в это теперь наверно трудно теперь поверить, но там SPI был программный :) ! То есть буквально, выставляешь пин клока в ноль, выставляешь бит данных на пин данных, выставляешь бит клока в единицу - сформировали фронт на клоке передали бит данных. Это хороший-правильный вопрос, коллега! Мне сейчас и не в разум были эти детали, но на ваш вопрос простая логика достала мне из моей же памяти этот ответ.
Это было больше 20-ти лет назад, я честно говоря не уверен, что это был именно SPI, но передача точно выполнялась прямым управлением пинами и клок там точно был! Это был 16-битный Техас-Инструмент (TI) DSP процессор, который наверно и не предназначен был для таких фокусов, для работы с последовательной шиной. Просто когда плату делали кто-то очень умный сказал, что главное, что нужно от процессора - это поддержка DSP операций, а то что надо с последовательной шиной работать, а там соответствующей периферии нет - это ерунда, об этом никто не думал. А когда плату серийно уже выпускали вариантов не было - пришлось выкручиваться. Оно в таком виде уже до меня работало, только с галлюцинациями.
При мне, потом, начинались обсуждения о переходе на новый (тогда) 16-битный тоже MSP- микроконтроллер, относительно новый, для лучшей привязки ко времени.
Глянул иллюстрации к прошлой статье. Получается, что (Тацп + Тсохр) всегда меньше того периода, в который требовалось уложиться. И мешал только вклинивающийся между этих операций процесс вычислений, верно?
А возможна ли была такая реализация, когда мы разделяем приоритеты задач: опрос АЦП и сохранение в EEPROM выполняются с высоким, а обработка данных - с низким? Сейчас поясню.
Нам понадобится два программных неблокирующих FIFO буфера. В один прерывание складывает данные от АЦП, а в другой функция обработки данных помещает результат.
Обработчик прерываний:
• В начале каждого цикла опрашиваем АЦП и помещаем данные во входной буфер.
• Если в выходном буфере есть данные для записи, стартуем цикл записи в EEPROM, иначе сразу выходим - пусть работает основная функция.
Функция вычислений (крутится в poll-цикле):
• Если во входном буфере появились данные, извлекаем их и обрабатываем.
• Если в результате получили полезные данные для записи, помещаем их в выходной буфер. Они будут записаны в EEPROM при старте очередного цикла.
Если какой-либо из буферов у нас переполнился при записи, делаем аварийный останов - у нас явно ошибка либо в логике, либо при подсчёте таймингов.


Сам себе шедулер (scheduler) — планировщик