Хорошие подходы для реализации более одной критичной по времени функции с помощью микроконтроллера?

8

Какова философия или подход, применяемый для реализации чрезвычайно важных по времени функций в микроконтроллерах, если они есть?

Я работаю над проектом, предусматривающим вывод точного прямоугольного сигнала различной частоты. Я сделал это, используя таймер и функцию прерывания. Однако даже для правильной реализации мне пришлось откалибровать смещение по числу тактов, взятых во время процедуры обслуживания прерывания. Я предполагаю, что эта точность будет нарушена из-за наличия другой такой формы волны (скажем, частота должна быть изменена в одно и то же время). Наличие каждого микроконтроллера для каждой такой критически важной функции кажется расточительным.

Возьмем другой пример реализации функции часов (как в чч: мм: сс). Я не могу себе представить, что у каждого микроконтроллера / компьютера высокого уровня есть специальная микросхема часов реального времени, предназначенная исключительно для отслеживания времени. Однако мне трудно представить, чтобы его точно измеряли с помощью основного процессора, который занят обслуживанием множества функций, которые тем временем выполняются с асинхронными интервалами. Я полагаю, что при подсчете времени возникнут ошибки смещения, которые меняются в зависимости от выполняемых функций.

Существует ли процесс проектирования или подход к сдерживанию или предоставлению допуска к достижимой точности? Или у кого-нибудь есть какие-либо указатели или предложения, где я мог бы найти больше информации по этому поводу?

темно-синий
источник
Вещи, которые требуют точного RTC, часто имеют специальный чип или подфункцию со своей собственной мощностью и кристаллом, чтобы отслеживать время, когда устройство выключено. Время - это огромные хлопоты.
pjc50
Прекратите использовать такую ​​ужасную архитектуру (или начните использовать ее правильно) - аппаратные таймеры не должны зависеть от времени, затрачиваемого на обслуживание ISR, до тех пор, пока перезагрузки выполняются «вовремя», это не должно иметь значения.
Спехро Пефхани
Какой микроконтроллер? Это позволило бы получить более качественные ответы.
StainlessSteelRat
@SpehroPefhany Должен сказать, я в этом совершенно неопытен. Проблема, с которой я сталкиваюсь с прямоугольной волной, состоит в том, что я хотел бы, чтобы частота менялась при каждом выходном переходе (который для 2 разных прямоугольных волн имел бы асинхронные интервалы и потенциально мог даже совпадать). Прямоугольная волна была меньшей частью более крупного вопроса, который я имел в виду. В генерации сигналов, как бы вы реализовали более 1 произвольного аналогового сигнала? Будет ли жертва ради общей частоты дискретизации?
полночьBlue
@StainlessSteelRat Я специально не указал конкретный микроконтроллер, так как мне показалось, что вопрос довольно широкий. Для меня, кажется, это может относиться к архитектуре процессора в больших компьютерах через микроконтроллеры. Частично, я хочу знать, есть ли какие-либо ресурсы, чтобы узнать о создании хороших проектов / ограничении ошибки при реализации более чем одной функции, которая чувствительна ко времени.
полночьBlue

Ответы:

10

Для вывода точных прямоугольных волн используйте оборудование. Большинство микроконтроллеров имеют встроенные генераторы ШИМ, которые могут сделать это. Вы устанавливаете период и время в тактах, а оборудование делает все остальное. Чтобы изменить его на новую частоту, запишите новый период в регистр периодов и половину периода в регистр рабочего цикла.

Что касается часов реального времени, теряющих время из-за другой загрузки процессора, они не будут работать таким образом, если они не очень плохо написаны. Обычно аппаратное обеспечение используется для создания периодического прерывания, кратного нескольким секундам, и микропрограмма делится дальше. Это работает независимо от того, насколько занят процессор, так как прерывание запускается, когда это необходимо. Пока подпрограмма прерывания занимает небольшую долю от общего числа циклов, большая часть процессора все еще применяется для выполнения задачи переднего плана.

Есть также способы сохранить время, опрашивая через несколько неизвестных интервалов. У вас есть оборудование, которое ведет подсчет, и всякий раз, когда вам удается обновить часы, вы обновляете их на основе общего числа прошедших тактов. Пока эта подпрограмма выполняется достаточно часто, так что, какой бы счетчик ни использовался, между циклами не происходит перенос, не теряется время.

Олин Латроп
источник
Сожалею! Я должен был быть более широким с моим вопросом. Прямоугольная волна была лишь частным примером критического по времени приложения, которое я имел в виду. С упомянутым вами методом генератора ШИМ, сможет ли он (при необходимости) обновлять частоту при каждом прямоугольном переходе? Что если бы вам пришлось сделать это для двух асинхронных прямоугольных волн? Как насчет десяти? Мне интересно, есть ли какие-то общие подходы к дизайну таких вещей. Методы, которые вы упоминаете о периодических прерываниях и опросах для обновления часов, безусловно, проливают некоторый свет.
полночьBlue
1
@mid: большинство микросхем могут прерываться в начале периода ШИМ. Некоторые из них имеют регистры с двойной буферизацией, так что вы можете обновить параметры в течение одного периода, а затем применить их в начале следующего периода. Некоторые микроэлементы могут питать ШИМ через DMA. Я использовал это один раз, чтобы аппаратное обеспечение автоматически сменилось.
Олин Латроп
3

Ключевое слово здесь - «аппаратная поддержка». Для чего-либо серьезного вам понадобится поддержка оборудования в микроконтроллере. Наиболее распространенной встроенной периферией является схема таймера, которая работает относительно точно и без помех от других операций процессора.

Опираясь на это, вы можете иметь много функций, выполняющихся со среднесрочным временем, точно так же, как источник синхронизации вашего контроллера.

Но: Как вы, возможно, уже испытали, помимо среднесрочной или долгосрочной точности, в программной обработке аппаратных событий (включая такие вещи, как переполнение таймера) всегда присутствует дрожание синхронизации . Это вызвано различными возможными состояниями выполнения в то время, когда происходит событие, которое приводит к различным задержкам, пока не произойдет фактический ответ на событие.

Таким образом, суть заключается в следующем: для всего, что связано с требованиями к высокоскоростному или почти нулевому джиттеру, необходима аппаратная поддержка. Многие аппаратные периферийные устройства включены в большинство микроконтроллеров, например, UART и т. Д. Чем мощнее и дороже микроконтроллер, тем больше встроенного аппаратного обеспечения. Если ваш микроконтроллер не предоставляет необходимого вам оборудования, вам действительно придется подумать о внешнем выделенном оборудовании для этой задачи.

JimmyB
источник
Понимание джиттера является ключевым моментом - у вас может быть несколько аппаратных таймеров, и они все будут отслеживать независимо друг от друга, но если все они запускают прерывание одновременно, то не все из них могут быть обслужены одновременно.
pjc50
2

Делайте как можно больше с оборудованием, особенно для критически важных функций. Все микроконтроллеры имеют таймеры / счетчики, специально созданные для подсчета и учета времени событий.

Кроме того, это действительно очень широкий вопрос. Так что нет хорошего ответа.

Единственный верный ответ - опыт. Попробуйте, профилируйте, подчеркните, исправьте. Вы должны определить области кода с высоким уровнем использования. 20% программного обеспечения работает 90% времени, означает, что каждая удаленная инструкция повышает производительность.

Хороший дизайн всегда сбалансирован аппаратно, программно и памятью. Это относится ко всем микропроцессорам, но особенно к микроконтроллерам. Максимум один или неэффективно использовать один, и у вас будет плохой продукт. По мере увеличения плотности кремния все больше и больше функций включается в аппаратные средства микроконтроллеров. Но больше возможностей означает больше ожиданий. Удвойте встроенную память, и вы добавите функцию, которая ее использует.

Все ISR имеют служебные данные, которые зависят от регистров, используемых ISR. Если задержка для сохранения состояния машины значительна по сравнению с обслуживанием ISR для функций, критичных ко времени, ваша конструкция может не масштабироваться. Отсюда и общее согласие с ответами на использование оборудования.

Использование программных прерываний может уменьшить раздувание состояния машины ISR.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    call Inc_Seconds()

Все регистры для Inc_Seconds () должны быть отправлены, когда они используются только один раз каждые 150 циклов.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    _Software_Interrupt
...
// Software_Interrupt ISR
    call Inc_Seconds()

Теперь задержка срабатывает только один раз каждые 150 циклов.

Если вы применяете часы реального времени в формате чч: мм: сс, имеет ли значение, что они отключены на 50 мс. Никто не обнаружит ошибку. Это, конечно, не оперативная задача в реальном времени.

Что касается событий, которые должны произойти одновременно. Должны ли они? Если они должны, то аппаратный дизайн должен заботиться об этом. В противном случае должен произойти некоторый программный компромисс. Если вы не можете установить два бита одновременно, установите один бит. Следующая инструкция задает другой. Точность одного такта на процессорах RISC. Я бы сказал, что это было достаточно хорошо.

StainlessSteelRat
источник
0

Для прямоугольного сигнала вам следует использовать периферийное устройство ШИМ, которое подключено к вашему XTAL с использованием какого-либо счетчика, чтобы знать, когда нужно циклически (для установки частоты). Каждый лист данных расскажет вам, как это сделать :)

Да, для сохранения времени вам понадобится RTC, чтобы делать это близко к точному, если вы не идете ассемблером и автором кодов операций, чтобы вручную знать точное время выполнения каждой команды в любом пути выполнения. Это, вероятно, также проливает новый свет на проверенное и верное утверждение «goto считается вредным».

AlexanderBrevig
источник
3
Ваши комментарии о программном обеспечении RTC будут применимы только к самым небрежно реализованным решениям. Разумный и надежный способ сделать это - использовать аппаратный таймер для генерации прерывания один раз каждые 1 мс (или 10 мс). В подпрограмме обслуживания есть статическая переменная-счетчик, которая подсчитывает количество прерываний до 1000 (или 100). Когда полный счет достигнут, сбросьте счетчик и затем увеличьте свой счетчик секунд. Каждые 60 секунд вы будете сбрасывать переменную счетчика секунд до нуля и увеличивать переменную счетчика минут. Продлите это до месяцев и лет, если это необходимо.
Майкл Карас