Внутрисхемная эмуляция ( ICE ) — это использование аппаратного устройства или внутрисхемного эмулятора, используемого для отладки программного обеспечения встроенной системы . Он работает с использованием процессора с дополнительной возможностью поддержки отладочных операций, а также для выполнения основной функции системы. В частности, для старых систем с ограниченными процессорами это обычно включало временную замену процессора на аппаратный эмулятор: более мощную, хотя и более дорогую версию. Исторически он был в форме процессора bond-out , который имеет много внутренних сигналов, выводимых для целей отладки. Эти сигналы предоставляют информацию о состоянии процессора.
В последнее время этот термин также охватывает аппаратные отладчики на основе JTAG , которые обеспечивают эквивалентный доступ с использованием встроенного отладочного оборудования со стандартными производственными чипами. Использование стандартных чипов вместо пользовательских версий bond-out делает технологию повсеместной и недорогой, а также устраняет большинство различий между средой разработки и средой выполнения. В этом распространенном случае термин «внутрисхемный эмулятор» является неправильным , иногда даже сбивающим с толку, поскольку эмуляция больше не задействована.
Встроенные системы представляют особые проблемы для программистов, поскольку они обычно не имеют клавиатур , мониторов , дисководов и других пользовательских интерфейсов, которые присутствуют на компьютерах. Эти недостатки делают инструменты отладки программного обеспечения внутри схемы необходимыми для многих общих задач разработки.
Внутрисхемный эмулятор (ICE) обеспечивает окно во встроенную систему. Программист использует эмулятор для загрузки программ во встроенную систему, запуска их, медленного пошагового выполнения , а также просмотра и изменения данных, используемых программным обеспечением системы.
Эмулятор получил свое название потому, что он эмулирует (имитирует) центральный процессор (ЦП) компьютера встроенной системы. Традиционно он имел штекер, который вставлялся в гнездо, где обычно размещалась микросхема интегральной схемы ЦП . Большинство современных систем напрямую используют ЦП целевой системы со специальным отладочным доступом на основе JTAG. Эмуляция процессора или прямой доступ к нему через JTAG позволяет ICE делать все, что может делать процессор, но под контролем разработчика программного обеспечения.
ICE подключают компьютерный терминал или персональный компьютер (ПК) к встроенной системе. Терминал или ПК предоставляет интерактивный пользовательский интерфейс для программиста, чтобы исследовать и контролировать встроенную систему. Например, обычно имеется отладчик исходного кода с графическим оконным интерфейсом, который взаимодействует через адаптер JTAG (эмулятор) со встроенной целевой системой, не имеющей графического пользовательского интерфейса.
Примечательно, что когда их программа дает сбой, большинство встроенных систем просто становятся кирпичными . Встроенным системам часто не хватает базовых функций для обнаружения признаков сбоя программного обеспечения , таких как блок управления памятью (MMU) для обнаружения ошибок доступа к памяти. Без ICE разработка встроенных систем может быть чрезвычайно сложной, поскольку обычно нет способа определить, что пошло не так. С ICE программист обычно может протестировать фрагменты кода, затем изолировать ошибку в определенном разделе кода, а затем проверить неисправный код и переписать его, чтобы решить проблему.
При использовании ICE предоставляет программисту контрольные точки выполнения , отображение и мониторинг памяти, а также управление вводом/выводом. Помимо этого, ICE можно запрограммировать на поиск любого диапазона соответствующих критериев для остановки в попытке определить источник сбоя.
Большинство современных микроконтроллеров используют ресурсы, предоставляемые в готовой версии микроконтроллера для функций программирования, эмуляции и отладки устройства, вместо необходимости в другой специальной версии эмуляции (то есть, bond-out) целевого микроконтроллера. [1] Несмотря на то, что это экономически эффективный метод, поскольку блок ICE только управляет эмуляцией, а не фактически эмулирует целевой микроконтроллер, необходимо идти на компромиссы, чтобы удерживать цены на низком уровне во время производства, но при этом предоставлять достаточно функций эмуляции для (относительно немногих) приложений эмуляции.
Практически все встроенные системы имеют аппаратный элемент и программный элемент, которые являются отдельными, но тесно взаимозависимыми. ICE позволяет запускать и тестировать программный элемент на оборудовании, на котором он должен работать, но при этом предоставляет программисту удобства для изоляции неисправного кода, такие как отладка на уровне исходного кода (которая показывает программу в том виде, в котором она была изначально написана) и пошаговое выполнение (что позволяет программистам запускать программы шаг за шагом для поиска ошибок).
Большинство ICE состоят из блока адаптера, который находится между хост-компьютером ICE и тестируемой системой. Штыревой разъем и кабельная сборка подключают адаптер к гнезду, где фактический центральный процессор (ЦП) или микроконтроллер монтируется во встроенной системе. Последние ICE позволяют программистам получать доступ к встроенной схеме отладки, которая интегрирована в ЦП через JTAG или интерфейс фонового режима отладки (BDM), для отладки программного обеспечения встроенной системы. Эти системы часто используют стандартную версию микросхемы ЦП и могут просто подключаться к порту отладки в производственной системе. Иногда их называют внутрисхемными отладчиками или ICD, чтобы выделить тот факт, что они не копируют функциональность ЦП, а вместо этого управляют уже существующим стандартным ЦП. Поскольку ЦП не нужно заменять, они могут работать на производственных блоках, где ЦП впаян и не может быть заменен. На x86 Pentiums специальный «режим зонда» используется ICE для помощи в отладке. [2]
В контексте встраиваемых систем ICE не эмулирует аппаратное обеспечение. Скорее, он обеспечивает прямой отладочный доступ к реальному ЦП. Тестируемая система находится под полным контролем, что позволяет разработчику загружать, отлаживать и тестировать код напрямую.
Большинство хост-систем — это обычные коммерческие компьютеры, не имеющие отношения к ЦП, используемому для разработки. Например, ПК с Linux может использоваться для разработки программного обеспечения для системы, использующей чип Freescale 68HC11 , процессор, который не может запускать Linux.
Программист обычно редактирует и компилирует код встроенной системы на хост-системе. Хост-система будет иметь специальные компиляторы, которые производят исполняемый код для встроенной системы, называемые кросс-компиляторами или кросс- ассемблерами .
Отладка на кристалле является альтернативой внутрисхемной эмуляции. Она использует другой подход для решения схожей задачи.
Отладка на кристалле, часто свободно называемая Joint Test Action Group (JTAG), использует предоставление дополнительного интерфейса отладки для работающего оборудования в производственной системе. Она обеспечивает те же функции, что и внутрисхемная отладка, такие как проверка внутреннего состояния или переменных, и может иметь возможность устанавливать контрольные точки, точки останова и точки наблюдения. Разница в том, что это обеспечивается дополнительным кремнием в производственном процессоре, а не заменой процессора на внешний эмулятор отладки. По этой причине некоторые функции ICE изменяются спецификациями процессора. Дополнительный интерфейс JTAG добавляется к плате контроллера, и это требуется в каждой производственной системе, но поскольку для этого требуется всего несколько сигнальных контактов, дополнительные затраты минимальны. Интерфейсы JTAG изначально были разработаны для тестирования на этапе завершения производства и по-прежнему полезны для него.
Для поддержки отладки внутрисхемного эмулятора (ICE) на Intel 286 на процессоре было доступно пять дополнительных контактов: один входной контакт для внешней принудительной установки точки останова ICE ( ICEBP#
) и две альтернативные пары выходных контактов для выбора операций через шину ICE вместо пользовательской памяти. [3] На 80286 существуют две инструкции ( 0F 04
, 0F 05
) для сброса/восстановления полного состояния ЦП в смещение памяти 0x800, а также однобайтовый префикс переопределения ( F1
) для включения режима ICE для доступа к пользовательской памяти.