Сколько инструкций требуется ядру Linux для обработки прерывания на коре головного мозга A9?

Я хотел бы оценить количество кодов операций, которое требуется ARM cortex A9 одному ядру для обработки IRQ.

Предполагая, что я работаю с ядром Linux 3.4, сколько кодов операций требуется для вызова irq и выполнения irq_handler?


person 0x90    schedule 03.02.2013    source источник
comment
Почему опкоды? Вы имеете в виду инструкции или тактовые циклы?   -  person Turbo J    schedule 03.02.2013
comment
Почему вы спрашиваете? Разве допустимая частота прерывания или задержка (от аппаратного импульса прерывания до запуска обработчика либо в ядре, либо обработчика сигнала в приложении) не важнее?   -  person Basile Starynkevitch    schedule 03.02.2013
comment
@BillPringlemeir stackoverflow.com/questions/14698229/ пожалуйста, заполните бесплатно, чтобы добавить темы к вопросу и ответить на него   -  person 0x90    schedule 05.02.2013
comment
@TurboJ, можете ли вы указать разницу между кодами операций и инструкциями?   -  person 0x90    schedule 19.02.2013
comment
@ 0x90 Код операции, код операции — это всего лишь двоичный код для кодирования конкретной операции, чтобы ЦП знал, какую операцию выполнять. Например, инструкция представляет собой код операции + другие биты, кодирующие параметры.   -  person Étienne    schedule 10.08.2013
comment
Привет, у тебя получилось? Я также работаю над аналогичной проблемой и пытаюсь смоделировать наихудший сценарий, когда приложение без операционной системы работает на процессоре ARM cortex A9. Любые указатели будут очень признательны   -  person Nuetrino    schedule 11.11.2013
comment
@Nuetrino Узким местом является контроллер. время, необходимое процессору для обработки прерывания, незначительно. около 20 наносекунд. если вы делаете некоторые исследования, пожалуйста, поделитесь ими с нами. Спасибо   -  person 0x90    schedule 11.11.2013
comment
Удалось ли вам теоретически привязать количество тактовых циклов (в худшем случае), которое потребуется для ответа на прерывание? Я изучаю, каким будет дрожание в случаях, когда i) задача выполняется как программа на «голом железе» ii) когда она работает как БЕСПЛАТНАЯ часть Rtos. Итак, для моего первого сценария мое прерывание проходит через GIC, и я пытаюсь рассчитать количество инструкций/циклов (в худшем случае), которое оно выполняет, прежде чем оно достигнет ISR. У вас есть указатели, чтобы проверить это? здесь есть что-то подобное для Arm9 infocenter.arm.com/help/ index.jsp?topic=/com.arm.doc.ddi0164a/   -  person Nuetrino    schedule 11.11.2013
comment
Я добавлю сюда результаты, как только закончу свой проект.   -  person Nuetrino    schedule 11.11.2013
comment
@ 0x90 вы уверены, что узким местом является контроллер? потому что, насколько теоретические знания идут (согласно документации от ARM), кажется, что задержка в контроллере может быть связана (2-3 gclks, что составляет 1/4 clk)? Не могли бы вы поделиться, как вы пришли к такому выводу? Я еще не сделал реализацию, хотя. Кстати, я предполагаю, что вы говорите о контроллере прерываний pl190 в ARM-Cortex A9.   -  person Nuetrino    schedule 27.11.2013
comment
также есть 2 устаревших прерывания в pl190, которые обходят логику распределителя и процессорного интерфейса, которые жестко связаны с процессором (я предполагаю). Я думаю, что это может быть использовано для проверки узкого места из-за самого контроллера. Как вы думаете?   -  person Nuetrino    schedule 27.11.2013
comment
@0x90, не могли бы вы рассказать мне, как вы пришли к выводу, что узкое место находится в контроллере?. Я провел свои эксперименты, и я получаю около 500 наносекунд (с разбросом 200 наносекунд), когда я запускаю приложение Bare metal. Это добавление задержки, связанной с интерфейсом дистрибьютора и ЦП GIC (работает на 1/4 тактовой частоты ЦП) + время, затрачиваемое на обработку исключений в ARM. Так что мне очень любопытно, как вы узнали горлышко бутылки из-за контроллера. Я думаю об использовании устаревших прерываний (которые обходят дистрибьютора) для проверки. Вы сделали то же самое?   -  person Nuetrino    schedule 20.12.2013


Ответы (2)


Ваш вопрос связан с тем, как рассчитать прерывание задержка Linux. По крайней мере, вам может быть интересно, сколько времени потребуется, прежде чем ваше прерывание начнется. Мы проигнорируем этот аспект irqs здесь.

Простой способ - переключить GPIO и использовать осциллограф для измерения прерывания. Вы даже можете несколько раз переключать GPIO, чтобы увидеть, сколько времени занимают разные фазы. Эта ссылка Window CE показывает пример измерения задержки. Некоторые контроллеры прерываний (такие как IMX) имеют режимы мультиплексирования ввода/вывода, в которых номер прерывания будет повышать/понижать конкретную линию ввода/вывода. Кроме того, вы можете добавить код для переключения строки (подпрограммы см. ниже).

Исходный код основной обработки прерываний находится в entry-armv.S. Существуют макросы, определенные для используемого вами контроллера прерываний, и они зависят от файла .config. Например, существуют упреждающие прерывания, контроллеры множественных прерываний, SMP и т. д. основные векторы определяются в нижней части entry-armv.S. Общий смысл в том, что проверяется текущий режим работы, а затем берется либо __irq_usr, либо __irq_svc. Эти подпрограммы имеют разные преамплы для сохранения состояния, но обе они заканчиваются вызовом макроса irq_handler. В _irq_usr есть сведения о cmpxchg, но если вы укажете и ARM cortex в своем .config, это не будет применяться. Основное отличие будет заключаться в возможном переключении контекста после IRQ в пользовательском режиме. Ваша машина определяет mach/entry-macro.S, которые являются макросами ассемблера для доступа к контроллеру прерываний и получения номера прерывания. Затем он переходит к общему irq код обработки в каталоге kernel верхнего уровня.

Таким образом, второй способ - проверить код и вычислить его напрямую. Вероятно, это будет проще, если вы посмотрите на исходный код, скомпилируете ядро, а затем сделаете objdump --disassemble на образе vmlinux и найдёте эти символы. Вы увидите развернутый макрос irq_handler, и в конце концов он должен перейти к вашему коду IRQ.

Как видно из исходного кода, есть также TRACE_IRQFLAGS. Вы можете проверить, доступно ли это на Cortex A9, который вы используете с make menuconfig (и введите /TRACE_IRQFLAGS). Не знаю есть в наличии или нет.

Существуют такие вариации, как

  1. Прерывание из режима User/SVC.
  2. В настоящее время выполняется другое прерывание.
  3. Прерванный код (например, stm/ldm) может занять некоторое время для завершения.
  4. Ошибки страницы в вашем ISR. Некоторые драйверы Alsa могут давать сбои из-за нераспределенных страниц, по крайней мере, в некоторых версиях Linux.
  5. Условные операторы в вашем ISR.

Измерение области действия покажет джиттер в IRQ обслуживании. Изучение инструкций обычно показывает, что IRQ может никогда не обслуживаться; например, если прерывания с более высоким приоритетом постоянно упреждают/предотвращают IRQ. Вероятно, вам нужно сделать и то, и другое, чтобы полностью оптимизировать работу в условиях жесткого дедлайна.

Часто вас не волнует, сколько времени занимает весь IRQ, но время между поднятием строки IRQ и записью/чтением некоторого периферийного регистра. Например, FIFO может иметь ограниченную глубину, и если задержка между IRQ и чтением регистра FIFO больше, чем FIFO_Size x BPS, то у вас проблемы с переполнением FIFO.

Инфраструктура FIQ намного быстрее, но возможности ядра, которые вы можете использовать, гораздо меньше!

Изменить: Cortex A9 Технический справочник содержит количество инструкций в приложении B. Большинство инструкций ARM представляют собой один цикл на большинстве архитектур, за исключением загрузки/сохранения памяти, кратных команд и ветвей. Следуйте 3-му и 4-му абзацам выше, чтобы найти полный путь инструкций для обработки прерывания Linux для вашей конфигурации, и просто добавьте его; для оценки (как задает исходный вопрос) вы можете просто подсчитать инструкции, поскольку они обычно представляют собой один цикл.

person artless noise    schedule 03.02.2013

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

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

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

person marko    schedule 03.02.2013
comment
Не могли бы вы объяснить более подробно, как теоретически измерить наихудший случай из исходного кода? Спасибо - person 0x90; 04.02.2013
comment
Я не вижу никакого способа сделать это без точного моделирования на уровне регистров всего процессора и подсистемы памяти (например, дизайна в Verilog или VHDL) и рабочей нагрузки для запуска на нем, чтобы вы могли моделировать эффекты различные кэши в устройстве. Опять же, я думаю, вам придется измерить это и сделать некоторые предположения. - person marko; 04.02.2013
comment
вы, конечно, можете грубо связать его. если вы можете ограничить количество частиц на планете, я думаю, вы можете ограничить работу процессора ARM в лучшем худшем случае - person 0x90; 04.02.2013
comment
Абсолютно - разница будет заключаться в нечетном промахе кеша здесь и некоторой задержке памяти там. Я подозреваю, что мы рассматриваем десятые доли микросекунды. Ядро Linux само несет ответственность за намного большую задержку. Что будет тяжелой работой, так это оценка этих эффектов на основе справочных руководств и схем для вашей системы. - person marko; 04.02.2013
comment
В худшем случае все промахи кеша, не так ли? - person artless noise; 04.02.2013