Как реализовать аппаратные прерывания в микроконтроллерах uCOS II и TM4C123G (ARM M4)? - PullRequest
0 голосов
/ 15 апреля 2020

Справочная информация:

Я использую uCOS II , Keil uVision 5 и плату TIVA с микроконтроллером TM4C123GH6PM . Мне дали порт для uCOS II, а также пустой файл проекта для начала. Я написал необходимые задачи, и программа работает правильно, но теперь я заинтересован в реализации прерываний и попытке понять, как они могут сосуществовать с ОСРВ. Это все сделано в C.

Проблема:

Прерывания не работают; они просто не запускаются. Есть случаи, когда другие задачи также не будут выполняться. Основная проблема заключается в том, что я не совсем понимаю, как прерывания могут сосуществовать с ОСРВ. Я написал код (как в сборке, так и в C) для baremetal, где прерывания работают отлично, и я полностью понимаю, как они работают, когда между кодом и процессором нет слоя.

What I ' ve Пробовал:

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

    • bsp_int - это библиотека, которая работает с прерываниями. BSP расшифровывается как Board Support Package и предназначен для облегчения взаимодействия между программным обеспечением и кодом
    • . В библиотеке есть функции для регистрации прерывания и его включения. Rtos использует свою собственную таблицу обработчиков ISR, сопоставленных с NVI C процессора. Все обработчики фильтруются через обобщенный обработчик c. Две полезные функции из этой библиотеки:
      • bsp_intVectSet, который принимает идентификатор триггера прерывания (т.е. bsp_int_id_gpiof) и указатель на обработчик прерывания и регистрирует его
      • bsp_intEn, который принимает идентификатор прерывания и включает it
  • Библиотека bsp_int включена в bsp. c, которая вызывает функцию инициализации (из bsp_int) для прерываний (bsp_IntInit ())
  • Файл bsp.h включен в основной файл приложения (приложение. c)
  • приложение. c main - точка входа в программу. Основное отключает прерывание, инициализирует uCOS (то есть ядро), создает первую / запускающую задачу с именем AppTaskStart и запускает многозадачность (т.е. дает управление rtos, и функция никогда не возвращается). Я предполагаю, что ядро ​​повторно активирует прерывания, так как оно нуждается в них для запуска
  • . Таким образом, способ работы rtos (насколько я понимаю) состоит в том, что он перехватывает таймер systick, поэтому при каждом такте ядра вызывается и может планировать задачи.
  • AppTaskStart, которая является первой задачей, выполняемой в домене ядра, вызывает bsp_init (в котором bsp_IntInit вызывается для инициализации таблицы прерываний и т. д.) и выполняет другие задачи инициализации
  • Способ, которым я настраивал прерывания без ядра прежде, использовал библиотеку Tivaware (в C), предоставленную TI. Он имеет функции для создания прерываний, задания триггера (т. Е. Нарастания / спадающего фронта, переполнения таймера и т. Д. c.) И их включения. Этот метод работает, и я подумал, что мне следует использовать для установки нужного прерывания
  • Поэтому я использовал библиотеку tivaware для настройки прерываний на одном из портов gpio (к которому подключены механические переключатели) на переднем крае. Код для этого, а также другой код для запуска периферийного порта f, установки выводов коммутаторов на вход и включения подтягиваний, включен в bsp_init (bsp. c), который вызывается из AppTaskStart, который вызывается из главный. Пока все работает отлично, rtos инициализируется, и все его задачи выполняются соответственно. Когда я пытаюсь переместить код непосредственно в основную программу и установить sh программу на плату, rtos инициализируется (мигают светодиоды), но затем задачи не выполняются. Любые идеи, почему это может быть?
  • Если я добавлю код, чтобы также включить и зарегистрировать прерывание, когда коммутатор замкнут в той же функции, используя код из библиотеки tivaware, rtos не инициализируется.
  • Нужно ли настраивать / регистрировать / включать прерывания с помощью библиотеки tivaware, а также регистрировать и включать их с помощью библиотеки пакета поддержки платы (bsp)? Насколько я понимаю, до сих пор это то, что bsp регистрирует / разрешает прерывания только для ядра, тогда как код tivaware разрешает их, напрямую записывая в регистры, поэтому последний необходим для настройки процессорной части прерываний, а первый - Нужно настроить OS часть прерываний. Но я не знаю. Я действительно не понимаю, как они разработали включение прерываний в uCOS II. Они определяют, как должен быть написан обработчик прерываний и какие макросы использовать, но не более того.

Что мне попробовать дальше? У кого-нибудь есть опыт работы с этими двумя компонентами (rtos и плата)?

Я просто застрял в этой точке, и я играл с кодом, перемещая вещи, пытаясь найти подсказка / привести к решению этой проблемы. Я даже не могу отладить rtos, потому что uVision не поддерживает uCOS, и я не могу использовать пошаговую отладку, потому что прерывания срабатывают при каждом такте, а P C постоянно меняется, поэтому IDE не может им следовать ,

Я знаю, что IAR Embedded Workbench поддерживает uCOS-II, и у меня есть приложение на моем ноутбуке, и я попытался настроить проект, но мне дали только проект порта / стартера для Keil, и я не знаю как настроить IAR для EW. Единственные порты на веб-сайте Micrium предназначены для серии TM4C129, и я попытался использовать это для запуска проекта IAR EW, но не смог заставить его работать (библиотеки не связаны / отсутствуют файлы).

Спасибо!

1 Ответ

0 голосов
/ 01 мая 2020

У кого-нибудь есть опыт работы с этими двумя компонентами (rtos и плата)?

Боюсь, я не работал с uCos (но с другими операционными системами). в основном SysB ios и FreeRTOS), и я еще не работал с Tiva (но с Sitara AM335x). Тем не менее, я думаю, что некоторые советы, приведенные ниже, могут быть полезны для вас (и применяются несмотря на различные реализации, которые вы используете).

Что мне следует попробовать дальше?

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

  • приоритеты прерываний ISR, которые вызывают API-интерфейсы библиотеки RTOS, не должны быть выше уровня, который учитывается RTOS, в противном случае Внутренние состояния ОСРВ могут быть повреждены, и может произойти все что угодно. Пожалуйста, проверьте документацию вашей ОС.

  • Пожалуйста, проверьте положение таблицы векторов прерываний и ее содержимое: указывает ли каждая запись таблицы векторов на один из обработчиков оболочки ISR, предоставляемых ОСРВ, или Вы также находите "независимые" реализации ISR? Если так, что делают последние? Если вы найдете указатели на сторонние библиотеки, для которых у вас нет кода, не сдавайтесь. Это может быть очень важно ... Еще важнее, чем включение правильного заголовка в API bsp_Int..., является то, что управление прерываниями всех компонентов программного обеспечения выполняется через один уникальный API, например, bsp_Int... one.

  • Ваши предположения о app.c / main() звучат разумно. Убедитесь, что вы также знаете о каждом компоненте, который косвенно обращается к прерываниям.

    • AppTaskStart, который является первой задачей, выполняемой в домене ядра, вызывает bsp_init (в котором bsp_IntInit вызывается для инициализации таблицы прерываний и т. д.) и выполняет другие задачи инициализации

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

    • То, как я настраивал прерывания без ядра раньше, использовало библиотека Tivaware (в C), предоставленная TI. Он имеет функции для создания прерываний, указания триггера (т. Е. Нарастания / спада фронта, переполнения таймера и т. Д. c.) И их включения. Этот метод работает, и я подумал, что я должен использовать это для установки нужного прерывания

    Вы должны убедиться, что библиотека Tivaware использует прерывания только таким образом, который совместим с вашим RTOS. Это можно сделать с помощью RTM или чтения источников.

    • Поэтому я использовал библиотеку tivaware для настройки прерываний на одном из портов gpio (для которого механический переключатели подключены) по переднему фронту. Код для этого, а также другой код для запуска периферийного порта f, установки выводов коммутаторов на вход и включения подтягиваний, включен в bsp_init (bsp. c), который вызывается из AppTaskStart, который вызывается из главный. Пока все работает отлично, rtos инициализируется, и все его задачи выполняются соответственно. Когда я пытаюсь переместить код прямо в основную программу и установить sh программу на плату, rtos инициализируется (мигают светодиоды), но затем задачи не выполняются. Любые идеи, почему это может быть?

    Может ли быть так, что проблема с электронами c на одном из выводов контроллера, подключенных к прерыванию, начинает вызывать это прерывание все время?

    • Если я добавлю код в [...]

    Вы пытались создать минимальный воспроизводимый пример ? Когда вы сделаете это, вы можете усилить эффект, одновременно выполняя отладку резиновой утки .

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

    Это звучит опасно. Я еще не работал с Tiva, но вместо этого с другим чипом TI (AM335x). Там у нас была похожая ситуация: разные библиотеки обращались к разным / перекрывающимся частям одного и того же системного ресурса с помощью разных уровней абстракции. Ситуация только начала улучшаться, когда мы привели в порядок беспорядок слоев абстракции, игнорируя друг друга, и портировали некоторый код в общую схему уровней абстракции.

И некоторые PS:

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