Информационный портал технической поддержки Центра проектирования интегральных микросхем |
После запуска сессии отладки выполнение программы обычно происходит в начале функции main(). Однако перед тем, как остановиться в main(), среда разработки выполняет различные действия и настройки, которые не видны пользователю. В данной статье мы рассмотрим подробный запуск отладки в среде Keil и IAR.
Подробный процесс запуска режима отладки описан на сайте 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...
Подробный процесс запуска отладки описан в хэлпе среды: 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.
Сайт: | https://support.milandr.ru |
E-mail: | support@milandr.ru |
Телефон: | +7 495 221-13-55 |