А как, чтобы другие прерывания не помешали? Персональные биты сбрасывать? Так общим проще. Потом включить. Вроде так рекомендуется. Или даже обязывается.
Лютый бред.
Вы вообще не понимаете как работает контроллер прерываний МК.
Абисняю.
При взведении любого флага и наличии разрешения этого флага, а так же групповых разрешений PEIE и GIE возникает генерация прерывания. Поскольку вектор прерываний в обсуждаемой архитектуре ОДИН (0х0004), программа уходит на этот единый адрес и глобальное разрешение GIE АВТОМАТИЧЕСКИ ЗАПРЕЩАЕТСЯ. То есть ваши потуги с этим битом в части его выключения абсолютно бессмысленны.
Далее на входе в обработчик должен находится код сохранения контекста ядра (WREG и STATUS, а так же опционально PCLATH), а вслед за ним (при работе с более чем одним источником прерываний) СЕМАФОР обработчика, который ПОСЛЕДОВАТЕЛЬНО опрашивает все возможные используемые флаги прерываний, а при определенных случаях еще и разрешения по этим флагам, и перенаправляет код в обработчик по конкретному флагу, где этот флаг и сбрасывается тем или иным методом. На выходе из общего обработчика контекст восстанавливается и выход в основной код ОБЯЗАН производится инструкцией
retfie, которая в отличии от похожей на неё инструкции
return, ОДНОВРЕМЕННО с возвратом в основной код РАЗРЕШАЕТ ГЛОБАЛЬНЫЕ ПРЕРЫВАНИЯ, то есть попросту устанавливает бит GIE в единицу.
Если бит GIE установить руками перед выходом из прерываний, то если какой то из флагов останется взведенным, немедленно будет сгенерировано ВЛОЖЕННОЕ прерывание, а поскольку стандартное сохранение контекста поддерживает лишь один уровень, то контекст будет испорчен и программа станет неработоспособна в целом.
Период измеряется одним таймером мониторингом, по переполнению на мин оборотах (для определения точки, ниже которой не трогать УОЗ) прерывание.
tож tвкл tзад откладываются другим таймером по прерыванию. И вот ввиду плавания всех этих значений прерывания могут пересечься, и даже однозначно пересекутся.
Херня какая то...
Период измеряют посредством TMR1 в режиме ЗАХВАТА. То есть это аппаратный процесс и ему болт положить на прерывания и задержки, если только код успевает считывать данные захвата между этими захватами. Реальное время измерений всегда будет равно разности нового и прежнего значения захвата.
Если события прерываний будут сгенерированы одновременно от разных источников, то последовательность их обработки зависит от порядка опроса флагов в СЕМАФОРЕ обработчика. При завершении обработки текущего обрабатываемого флага код выйдет из обработчика и, поскольку необработанные флаги остались взведенными, немедленно зайдет снова в прерывание и обработает следующий флаг по порядку семафора. И так до тех пор, пока все флаги не будут обработаны.
Сократить время задержки на все это мероприятие в обсуждаемой платформе ПРИНЦИПИАЛЬНО НЕВОЗМОЖНО.
Если такая необходимость есть, нужно сменить платформу на ту, которая имеет приоритетную архитектуру контроллера прерываний МК, либо имеет нативную вложенность прерываний (например как NVIC в ARM-ах).
Последний раз редактировалось
КРАМ Ср авг 02, 2023 13:06:13, всего редактировалось 1 раз.