48186

[i] Что происходит при запуске отладки в IAR и Keil

Дата последнего изменения: 11.12.2023 12:49:24

После запуска сессии отладки выполнение программы обычно происходит в начале функции main(). Однако перед тем, как остановиться в main(), среда разработки выполняет различные действия и настройки, которые не видны пользователю. В данной статье мы рассмотрим подробный запуск отладки в среде Keil и IAR.

1. Запуск отладки в Keil

Подробный процесс запуска режима отладки описан на сайте Keil, пункт "Sequence of Execution, и состоит из следующих действий:

1) Сброс МК в соответствии с настройками отладчика и остановка ядра, при этом выполнение начального загрузчика (бутовой программы) в МК останавливается.

2) Если установлен пункт Options for Target→Debug "Load application at Startup", то происходит загрузка скомпилированной программы по адресам IROM, указанным в настройках проекта.

3) Восстановление параметров режима отладки, например, конфигурации окон и точек останова из предыдущей отладки.

4) Выполнение команд в файле инициализации (*.ini).

5) Запуск выполнения программы с адреса, указанного в регистре счётчика команд PC.

Таким образом, если в файле инициализации значение PC не изменяется, то МК продолжит выполнение начального загрузчика, и, в соответствии с режимом загрузки, выполнит дальнейший запуск, например, перейдёт к выполнению программы во Flash-памяти. Если задана опция «Run to main()», как показано на рисунке 1, то отладчик остановит ядро, только когда ядро достигнет выполнения первой инструкции из функции main() (на это место отладчик ставит точку останова). 

Рисунок 1 - Keil uVision, окно Options for Target...

2. Запуск отладки в IAR

Подробный процесс запуска отладки описан в хэлпе среды: IAR→Help→C-SPY Debugging Guide, "DEBUGGING CODE IN FLASH", стр. 60. На рисунке 2 приведён процесс запуска отладки программы, записанной во Flash-память:

Рисунок 2 - Алгоритм запуска отладки программы, записанной во Flash-память

Согласно данному документу, после запуска режима отладки среда IAR, так же как и Keil, сбрасывает МК (при соответствующих настройках отладчика) и останавливает ядро. После этого с помощью загрузчика происходит запись программы во Flash-память и установка счётчика команд PC, равным адресу ResetHandler’a, который считывается из загружаемого образа программы. Далее происходит верификация данных, и, соответственно, сам запуск, путём старта с адреса, указанного в PC.

Необходимо отметить важную особенность отладки в IAR: так как среда останавливает ядро сразу после сброса, то начальный загрузчик (бутовая программа) МК не успевает выполниться. После загрузки программы во Flash-память, среда не возвращается к выполнению кода начального загрузчика, а сразу выставляет адрес ResetHandler’a и стартует с него. Таким образом, штатный процесс запуска МК нарушается, так как работа начального загрузчика пропускается.

Здесь кроется одно обстоятельство – после сброса значение в регистре смещения таблицы векторов прерывания VTOR = 0x00000000. Flash-память во многих МК, например, 1986ВЕ9x, начинается не с 0-го адреса, поэтому начальный загрузчик устанавливает при запуске верное значение VTOR. Но так как при отладке в IAR выполнение начального загрузчика пропускается, то VTOR остаётся равен 0x00000000. Это приводит к тому, что вызов прерывания в режиме отладки осуществит переход на неверный вектор, так как процессор считает, что таблица векторов прерываний расположена в 0x00000000, а не во Flash-памяти.

Обойти данное обстоятельство можно несколькими способами:

1) В Startup файле необходимо изменить обработчик Reset_Handler:

Reset_Handler

        LDR     R0, =SystemInit

        BLX     R0

       

        LDR     R0, =__vector_table

        LDR     R1, =0xE000ED08

        STR     R0, [R1]

        

        LDR     R0, =__iar_program_start

        BX      R0

Таким образом в VTOR будет записано значение из настроек проекта (Linker –> Vector Table).

2) В основной программе необходимо установить верное значение таблицы векторов прерываний в VTOR. Так, например, сделано в SPL, где значение VTOR устанавливается в функции SystemInit() при запуске программы.

3) Описать реализацию специальных функций IAR, которые вызываются в процессе запуска отладки. Так, например, при запуске отладки программы, записанной во Flash-память (рисунок 2), в разные моменты времени вызываются функции: execUserFlashInit(), execUserFlashReset(), execUserSetup() и т.д. Данные функции описываются в макро-файле (*.mac). Для установки значения VTOR можно реализовать функцию execUserSetup(), которая вызывается в конце процесса запуска отладки:

execUserSetup()
{
     __writeMemory32(0x08000000, 0xE000ED08, "Memory");
}

Полный список специальных функций IAR описан в хэлпе среды: IAR→Help→C-SPY Debugging Guide, "Reference information on reserved setup macro function names", стр. 425.

4) В настройках отладчика, например, J-Link, можно выставить опцию сброса «Halt after bootloader», как показано на рисунке 3.

Рисунок 3 - IAR, настройки отладчика J-Link

Таким образом, после сброса МК остановка ядра будет произведена не сразу, а после выполнения начального загрузчика, который, в свою очередь, выставит верное значение VTOR.

Сохранить статью в PDF

Теги

Была ли статья полезной?