Робототехника и интеллектуальные системы
Как использовать регистры для повышения производительности в реальном времени в робототехнике
Table of Contents
Почему производительность в реальном времени имеет значение в современной робототехнике
Роботы работают в условиях, когда время — это всё. Робот, который слишком долго обрабатывает данные датчиков или вычисляет команду двигателя, может пропустить критическое событие, столкнуться с препятствием или не выполнить точное движение. Производительность в реальном времени — это не роскошь в робототехнике, это жёсткое требование к безопасности, надёжности и эффективности.
Системы реального времени должны гарантировать, что ответы происходят в ограниченные сроки. Это особенно сложно в робототехнике, где управляющая петля должна считывать датчики, обрабатывать данные, вычислять команды и приводить в действие двигатели в течение микросекунд. Любая задержка в этой петле может ухудшить производительность или вызвать прямой сбой. Чтобы удовлетворить эти строгие требования к срокам, инженеры должны использовать каждый уровень вычислительной архитектуры, и одним из самых мощных инструментов является скромный регистр.
Что такое регистры и почему они важны?
Регистры являются самыми быстрыми местами хранения в компьютерном процессоре. Они встроены непосредственно в ядро ЦП и работают с той же тактовой частотой, что и сам процессор. В отличие от основной памяти (ОЗУ), доступ к которой может занять десятки или сотни тактовых циклов, регистры обеспечивают данные в одном цикле. Это преимущество скорости делает их незаменимыми для роботизированного управления в реальном времени.
В типичной роботизированной системе регистры содержат промежуточные результаты арифметических операций, счетчики циклов, данные датчиков, на которые необходимо немедленно реагировать, и управляющие переменные, которые изменяют каждый цикл управления. Поскольку регистры настолько быстры, они позволяют процессору сохранять свои трубопроводы полными и избегать ожидания памяти, что часто является основным узким местом в системах реального времени.
Каждый современный процессор имеет ограниченное количество регистров, обычно от 16 до 32 регистров общего назначения в типичном микроконтроллере, хотя некоторые архитектуры, такие как ARM, имеют больше. Этот дефицит означает, что распределение регистров, процесс принятия решения о том, какие переменные живут в регистрах в любой момент времени, является критической проблемой оптимизации. Плохое распределение регистров может заставить процессор передавать данные в память, нарушая гарантии в реальном времени.
Роль регистров в иерархии памяти
Чтобы в полной мере оценить влияние регистров на производительность в реальном времени, помогает понять, где они вписываются в иерархию памяти. Иерархия, от самой быстрой до самой медленной, заключается в следующем:
- Регистры: На чипе, доступ в один цикл, очень ограниченная емкость (всего несколько сотен байт).
- Кэш (L1, L2, L3): На кристалле или очень близко, несколько циклов задержки доступа, большая емкость (килобайт к мегабайтам).
- Основная память (RAM): Вне чипа, от десятков до сотен циклов задержки, большая емкость (гигабайт).
- Вторичное хранение (Flash, SSD, HDD): Вне чипа, задержка миллионов циклов, массивная емкость (терабайты).
Регистры — это единственный уровень хранения, который может идти в ногу со скоростью выполнения процессора. Каждая инструкция, которая работает с данными, обычно считывает свои операнды из регистров и записывает результаты обратно в регистры. Когда данные не находятся в регистре, процессор должен выполнить команду загрузки или хранения, которая вводит переменную задержку, которая может нарушить поведение в реальном времени.
Количественная оценка влияния регистров на результаты деятельности
Разница в производительности между доступом к регистру и доступом к памяти ошеломляет. Для типичного микроконтроллера, работающего на частоте 100 МГц:
- Регистрация доступа: один тактовый цикл (10 наносекунд).
- Доступ к кэшу L1: два-четыре тактовых цикла (20-40 наносекунд).
- Доступ к оперативной памяти: 20-50 тактовых циклов (200-500 наносекунд).
В цикле управления в реальном времени, работающем на частоте 1 кГц, бюджет цикла составляет 1 миллисекунду. Если каждая итерация требует 100 доступов к памяти, и каждый доступ к памяти стоит в 10 раз больше, чем доступ к регистру, общие накладные расходы от задержки памяти могут потреблять 500 микросекунд, половина всего бюджета. Сохраняя часто используемые данные в регистрах, эти накладные расходы падают до 10 микросекунд, освобождая 490 микросекунд для дополнительных вычислений или обработки датчиков.
Типы регистров, используемых в робототехнике
Регистры общего назначения
Это рабочие лошадочные регистры, используемые для арифметических, логических и операций перемещения данных. Они содержат переменные, промежуточные результаты и адреса. В роботизированном коде реального времени счетчики критических циклов, временные значения синтеза датчиков и переменные состояния контроллера PID должны в идеале занимать регистры общего назначения на протяжении цикла управления.
Регистры специальных целей
Большинство процессоров включают в себя регистры с выделенными функциями, которые непосредственно связаны с управлением роботами в режиме реального времени.
- Программный счетчик (PC): Удерживает адрес следующей инструкции.В системах реального времени обработчики прерываний модифицируют ПК для реагирования на критически важные для времени события.
- Указатель стека (SP): Указывает на верхнюю часть стека вызовов. Системы реального времени должны тщательно управлять стеком, чтобы избежать переполнения во время вложенных прерываний.
- Регистр состояния (SR): Содержит флаги состояния (нулевой, несущий, переливной, прерывающий). Код управления в реальном времени часто проверяет эти флаги на принятие решений в доли секунды.
- Link Register (LR): На архитектурах ARM удерживает обратный адрес для вызовов функций. Быстрое обращение с прерыванием зависит от эффективного использования LR.
Картированные регистры памяти для периферийных устройств
В встроенной робототехнике многие периферийные устройства (таймеры, ADC, генераторы PWM, кодеры) управляются через регистры, нарисованные на памяти. Это специальные адреса, которые при чтении или записи напрямую взаимодействуют с аппаратным обеспечением. Доступ к этим регистрам так же быстр, как доступ к памяти, но часто намного быстрее, чем через стек драйверов. Роботизированная прошивка в реальном времени часто обходит абстракции операционной системы для доступа к регистрам, нарисованным на памяти, напрямую, отрезая микросекунды от цикла управления.
Стратегии эффективного использования регистра в реальном времени
Выявление и определение приоритетов критически важных данных
Не все данные в роботизированной системе нуждаются в доступе на уровне регистра. Ключ заключается в идентификации подмножества переменных, к которым обращается каждый цикл управления и задержка которых непосредственно влияет на производительность системы. Типичные кандидаты включают:
- Сенсорные показания от кодеров, ИДУ, датчиков силы и камер.
- Задачи и траектории отсчета для контроллера.
- Термины ошибок и интегральные аккумуляторы в PID-петлях.
- Переменные состояния в фильтрах Калмана или других алгоритмах оценки.
- Буферные указатели связи для протоколов реального времени, таких как EtherCAT или CAN FD.
Если процессор не может удерживать все из них одновременно из-за давления регистрации, следующим лучшим вариантом является организация кода так, чтобы наиболее часто используемые переменные всегда находились в регистрах, когда это необходимо.
Встроенные функции и уменьшение функций Call Overhead
Функциональные вызовы нарушают распределение регистров, потому что соглашение вызовов обычно требует сохранения и восстановления регистров. Для контуров управления в реальном времени наложение критических функций устраняет эти накладные расходы. Например, матрица умножения для якобианского робота или обновление кватерниона для оценки ориентации могут быть включены, чтобы сохранить все промежуточные результаты в регистрах, а не разливать их в стек.
Используйте оптимизацию компиляторов разумно
Современные компиляторы имеют сложные пропуски распределения регистров. Флаги, такие как и , позволяют агрессивную оптимизацию, но они также могут вводить недетерминированное поведение, если компилятор переупорядочения инструкций способами, нарушающими временные ограничения. Для жесткого кода в реальном времени рассмотрите возможность использования (оптимизировать для размера) с тщательным ручным распределением регистра через ключевое слово (которое является подсказкой, а не гарантией) или встроенную сборку для самых горячих путей.
Наборы реестров, выделенных для прерывающих операторов
Многие процессоры, в частности серии ARM Cortex-M, имеют набор регистров для обработчиков прерываний. Это означает, что при срабатывании прерывания процессор может переключаться на новый набор регистров без сохранения текущего контекста. Эта аппаратная функция резко снижает задержку прерывания и имеет важное значение для прерываний высокочастотных датчиков. Инженеры должны разрабатывать свои процедуры обслуживания прерываний, чтобы работать полностью в пределах регистров, находящихся в банке, избегая любого доступа к памяти, за исключением минимального необходимого для передачи данных.
Распределение реестра вручную с помощью Inline Assembly
Когда выделение регистра, генерируемого компилятором, недостаточно для гарантий реального времени, ручная встроенная сборка дает инженерам полный контроль. Например, на ARM Cortex-M4, выполняющем 32-битный PID-расчет, можно связать термин ошибки с R0, интегральный термин с R1, а производный термин с R2 и выполнить все вычисления без какой-либо нагрузки на память или хранилища. Этот метод распространен в высокопроизводительных контроллерах управления двигателем и полетом дрона.
Практический пример: оптимизация реестра в четвероногих роботах
Рассмотрим четвероногого робота, выполняющего динамическое рычание на 3 м/с. Каждая нога имеет три сустава, и система управления должна вычислять обратную кинематику, совместные крутящие моменты и силы реакции на земле на 500 Гц. Контур управления обрабатывает 12 суставов, каждый из которых требует обновления PID, проверки предела крутящего момента и преобразования текущей команды.
В неоптимизированной версии все переменные хранятся в оперативной памяти. Контур управления занимает 520 микросекунд, оставляя только 480 микросекунд для считывания датчиков и связи в цикле 1 кГц. Это не оставляет погрешности, а любая промах кэша или прерывание вызывает переполнение контура.
После оптимизации регистра:
- Все коэффициенты PID и переменные состояния для каждого соединения отображаются в специальный набор регистров, обновляемых на каждом цикле.
- Критические математические операции (син/косин для кинематики) используют быстрое приближение, которое работает полностью в регистрах.
- Внутренняя сборка используется для внутренней петли матричных операций.
- Основная функция управления выстроена, устраняя функцию вызова накладных расходов.
Оптимизированный цикл работает со скоростью 180 микросекунд, освобождая 820 микросекунд для обработки и связи датчиков. Робот теперь может обрабатывать дополнительные входы датчиков (LiDAR, камера глубины) без ущерба для скорости управления. Улучшение произошло почти полностью за счет сокращения задержки доступа к памяти за счет хранения данных в регистрах.
Общие ошибки в использовании регистра для систем реального времени
Чрезмерная зависимость от оптимизации компилятора
Компиляторы хороши в оптимизации общего назначения, но они не могут полностью понять ограничения роботизированной системы в реальном времени. Компилятор может разлить реестр в память только потому, что видит путь кода с низкой вероятностью, не подозревая, что этот разлив вызовет нарушение синхронизации в обычном случае. Всегда профилируйте и проверяйте сгенерированную сборку на код в реальном времени.
Регистрировать голод в сложных петлях
Сложные алгоритмы управления, такие как модель предиктивного управления или динамика всего тела, требуют многих переменных состояния. При ограниченных регистрах компилятор должен выплескивать некоторые в память. Это может вызвать непредсказуемое время, если шаблоны разливов изменяются с входными данными. Решение состоит в том, чтобы упростить алгоритм, разбить его на более мелкие фазы, которые вписываются в регистры, или использовать процессор с большим количеством регистров.
Игнорирование эффектов прерывания задержки
При появлении прерывания процессор должен сохранять и восстанавливать регистры. Если основной цикл управления использует все доступные регистры, сохранение контекста прерывания занимает больше времени, увеличивая задержку. Общая стратегия заключается в резервировании нескольких регистров исключительно для обработчиков прерываний, гарантируя, что рутина обслуживания прерываний может начаться немедленно, не сохраняя полный файл регистра.
Cache-Related Prefetch Interference (недоступная ссылка)
В системах с кэшами плохо синхронизированный доступ к памяти может вызвать промах кэша, который запускает прививку памяти, мешающую поведению в реальном времени. Регистры, находясь на вершине иерархии, не имеют промахов кэша. Сохраняя как можно больше данных в регистрах, инженеры избегают недетерминизма поведения кэша в целом.
Инструменты и методы анализа использования реестра
Анализ выходных данных компилятора
Большинство компиляторов могут выводить списки сборки с аннотациями распределения регистров. Для GCC используйте , чтобы увидеть, какие переменные назначены, к каким регистрам. Это наиболее прямой способ проверить, что критические переменные остаются в регистрах на протяжении всего цикла управления.
Цикл-точные симуляторы
Такие инструменты, как QEMU или симуляторы для конкретных поставщиков (например, ARM Fast Models), могут подсчитывать циклы и выявлять события разлива регистров. Запуск цикла управления в симуляторе с включенным профилированием регистров может точно определить, когда и почему регистры разливаются в память.
Производительность Counters
Современные микроконтроллеры имеют встроенные счетчики производительности, которые могут измерять промахи кэша, неверные прогнозы ветвей и ларьки трубопроводов. Сопоставляя эти события с решениями о распределении регистров, инженеры могут точно настраивать свой код для детерминированной работы в реальном времени.
Будущие тенденции: регистрация файлов и робототехника в реальном времени
Большие файлы регистра
Архитектура процессоров имеет тенденцию к увеличению регистровых файлов. RISC-V, например, позволяет настраивать расширения, которые могут добавлять больше регистров. По мере того, как мягкие процессоры на основе FPGA становятся все более распространенными в робототехнике, инженеры могут проектировать пользовательские регистровые файлы, адаптированные к их конкретным рабочим нагрузкам в реальном времени, таким как выделенный набор регистров для каждой оси роботизированной руки.
Зарегистрируйте Windows для быстрого переключения контекста
Некоторые архитектуры, такие как SPARC и RISC-V с расширением Zcmp, поддерживают окна регистров. Они позволяют использовать несколько вызовов функций для использования свежих регистров без явного сохранения / восстановления, уменьшая накладные расходы в глубоко вложенном коде реального времени. Это особенно полезно для трубопроводов синтеза датчиков, которые вызывают множество небольших функций в последовательности.
Распределение реестров с помощью ИИ
Методы машинного обучения применяются для принятия решений о распределении регистров, особенно для сложного кода с непредсказуемыми путями.В будущем компиляторы могут изучать модели роботизированной системы в реальном времени и распределять регистры для минимизации времени выполнения в худшем случае, а не в среднем, что напрямую приносит пользу жесткой производительности в реальном времени.
Интеграция оптимизации реестра в рабочий процесс развития
Оптимизация реестра не должна быть запоздалой мыслью в проектировании роботизированной системы. Она должна быть интегрирована в рабочий процесс разработки с самого начала:
- Профиль на ранней стадии: Перед написанием оптимизированного кода измерьте время базового цикла управления и определите узкие места доступа к памяти.
- Определить горячие пути: Определить, какие кодовые пути выполняют каждый цикл управления и какие данные доступны на каждой итерации.
- Выделите регистры вручную: Для самых горячих путей используйте встроенную сборку или привязку к регистру для конкретного компилятора, чтобы гарантировать быстрый доступ.
- Проверить детерминизм: Использовать счетчики циклов и анализ времени исполнения в наихудшем случае (WCET) для подтверждения того, что оптимизированный для реестра код соответствует гарантиям в реальном времени при любых условиях.
- Использование регистра документов: Ведение четкой документации о том, какие регистры зарезервированы для каких целей, особенно если код будет поддерживаться несколькими инженерами.
Заключение
Регистры — это не просто абстрактная концепция компьютерной архитектуры. Они являются практичным инструментом с высоким уровнем использования для достижения производительности в реальном времени в робототехнике. Понимая, как работают регистры, идентифицируя данные, которые больше всего нуждаются в их скорости, и применяя методы ручной оптимизации, когда компиляторы не дотягивают, инженеры могут значительно уменьшить задержку петли управления и повысить надежность системы.
Разница между роботом, который управляет собой в регистрах, и роботом, который распространяется на память на каждом цикле, заключается в разнице между системой, которая просто соответствует своему бюджету времени, и системой, которая имеет передовые возможности для инноваций.По мере того, как роботы становятся более автономными и должны обрабатывать больше данных датчиков при сохранении критически важного времени, оптимизация уровня регистра станет все более важным навыком для инженеров-робототехников.
Для дальнейшего чтения по этой теме рассмотрите возможность изучения ресурсов по разработке встроенных систем для робототехники, таких как Встроенное руководство по распределению регистров в системах реального времени , архитектурная документация ARM для использования регистров в процессорах Cortex-M и спецификация RISC-V для пользовательских расширений, относящихся к робототехнике . Эти ссылки обеспечивают более глубокие архитектурные идеи, которые могут информировать о реальных решениях по оптимизации регистров в роботизированных системах управления.