Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование микроконтроллеров семейства CORTEX-M. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
51
52
Программная память
0х08000000
Указатель стека
0х08000004
Адрес п/п Reset и программы пользователя
0х08000008
Адрес п/п обработки прерывания NMI
0х0800000C
…
Адрес п/п обработки прерывания IRQ31
…
Переход к п/п Reset_Handler
Переход к программе пользователя __main
…
Программа Reset_Handler
Программа __main
…
NMI_Handler
…
HardFault_Handler
…
Память данных
стек
0х20000000
Heap
MDR
Stack_Size
Stack_Mem __initial_sp
EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 SPACE Stack_Size
…
Heap_Size
__heap_base Heap_Mem __heap_limit
EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3
SPACE Heap_Size …
AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size
__Vectors
DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
…
…
DCD EXT_INT3_IRQHandler ; IRQ30
DCD EXT_INT4_IRQHandler ; IRQ31
…
Reset_Handler
AREA |.text|, CODE, READONLY ;Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0 , =__main BX R0 ENDP
…
NMI_Handler
HardFault_Handler\
PROC EXPORT NMI_Handler [WEAK] B . ENDP PROC EXPORT HardFault_Handler [WEAK] B . ENDP
…
Рис. 4.1. Организация программы MDR32F9Qx.s
53
Директива SPACE выделяет пространство памяти заданного размера 400 байт для размещения стека. В последней строке задана метка __initial_sp, кото­рая в дальнейшем будет использоваться в таблице векторов. Метка приравни­вается следующему адресу после области стека, так как стек обратный и запол­няет в сторону младших адресов. Метка задает начальное значение указателя стека.
Секция HEAP (куча), строки 22-27
Сформирована так же, как и секция стека. Heap_size - объем кучи. Отли­чие заключается в том, что у кучи есть две метки, которые указывают на начало и на конце кучи.
Секция таблицы векторов прерываний (строки 34-91)
Секция открывает начальный блок программной памяти с адреса 0x08000000 (атрибут READONLY), в котором размещаются данные, а не ко-
манды (атрибут DATA). Данный блок предшествует программам и предназна­чен для хранения следующей информации.
Начальное значение указателя стека. Адрес обработчика сброса микроконтроллера в начальное состояние
(программа reset handler), после исполнения которой запускается про­грамма пользователя.
Адреса обработчиков всех остальных исключений и прерываний.
В строке с меткой __initial_sp директива DCD сохраняет значение указа-
теля стека. При запуске процессор заносит это значение в регистр стека MSP
(Main Stack Pointer). В следующей строке задается адрес программы reset
handler. При запуске процессор переписывает этот адрес в регистр счетчика
программы PC (Program Counter). Дальнейшие строки формируют адреса пре-
рывающих программ для внутренних и внешних прерываний.
Секция обработчика сброса (reset handler) и запуска программы
пользователя (строки 93 - 104).
Секция объявляет память для размещения вызова программы reset handler и запуска исполнения программы пользователя. Командами LDR R0, SystemI-
54
nit и BLX R0 вызывается функция SystemInit, которая выполняет начальную
инициализацию процессора. Затем вызывается функция main программы поль­зователя и управление передается основной программе.
Обработчики прерываний (строки 108 - 201)
После процедуры запуска пользовательской программы в секции обработчика сброса (reset handler) и запуска программы пользователя объяв­ляются процедуры обработчиков прерываний. Каждая процедура открывается директивой PROC, после которой дирек­тива EXPORT делает метку процедуры доступной для остальной части про­граммы. Атрибут [WEAK] предназначен для указания возможности переопре­деления функции в другом месте проекта, что позволяет определять свои соб­ственные обработчики прерываний. Процедура содержит только одну команду –заглушку перехода на свой же адрес. Директива ENDP обозначает конец функции.
4.2. Средства отладки программ и их применение
После ввода исходного текста программы в окне менеджера проекта
нажатием кнопки Build или F7запускается режим компиляции. При отсутствии ошибок в окне результатов компиляции можно начинать процесс отладки. Для перехода в режим отладки необходимо во вкладке Debug нажать кнопку
Start/Stop Debug Session:
Возникнет предупреждение о том, что у Lite-версии среды MDK есть
ограничение на размер программ. Для гашения предупреждения нажимаем ОК:
Открывается главное окно встроенного в среду отладчика:
55
В окне 1 выводится исходный текст программы на языке ассемблера. Ок-
но 2 содержит дизассемблированный код двоичного файла с расширением .axf. В окне 3 выводится содержимое регистров микроконтроллера на момент останова программы. В окне 4 отображаются команды, выполняемые отладчи­ком, а окно 5 отображает состояние стека.
4.2.1. Основные опции, доступные в режиме отладки
Кнопка Reset . При выборе этой опции выполняется сброс ЦП. Все ре­гистры специальных функций сбрасываются до значений по умолчанию. Целе­вая программа остается загруженной вместе со всей отладочной информацией.
Кнопка Run . При выборе этой опции программа выполняется до пер­вой встреченной точки останова (breakpoint), либо до принудительной останов­ки выполнения – этот режим полезен при проверке функционирования про­граммы в целом.
Кнопка Stop . При выборе этой опции прекращается выполнение про­граммы.
Кнопка Step . При выборе этой опции осуществляется выполнение те­кущей инструкции и переход к выполнению следующей. В случае если текущей
56
командой является команда вызова подпрограммы (например: call), то указа­тель переместится на первую инструкцию в этой подпрограмме.
Кнопка Step Over . При выборе этой опции происходят те же действия, что и у предыдущей опции, но вместо останова на первой команде подпро­граммы осуществляется ее исполнение и возврат в основную программу с остановом на следующей команде после команды call.
Кнопка Step Out . При выборе этой опции происходит доисполнение текущей подпрограммы и возврат в основную программу с остановом на сле­дующей команде после команды call..
Кнопка Run to Cursor Line . При выборе этой опции программа испол­няется до инструкции, выбранной курсором в окне исходного текста.
Кнопка Show Next Statement . При выборе этой опции показывается ин­струкция, которая будет выполняться следующей.
4.2.2. Управление точками останова
Точками останова можно управлять одним из следующих способов:
При создании или редактировании исходного кода программы, при
нажатии на серый край окна исходного текста или окна дизассем­блера.
При помощи кнопок управления точками останова на панели ин-
струментов: Кнопка Insert/Remove Breakpoint . При выборе этой опции
устанавливается или удаляется точка останова в выбранном ме­сте.
Кнопка Enable/Disable Breakpoint . При выборе этой опции
включается или выключается точка останова. Эта функция по­лезна, когда точка останова в данный момент не нужна, но может пригодиться в дальнейшем.
57
кнопка Disable All Breakpoints . При выборе этой опции вы-
ключаются все существующие точки останова.
кнопка Kill All Breakpoints . При выборе этой опции убираются
все существующие точки останова.
При выборе опции Breakpoints в меню Debug. Ввод соответствующих команд в командной строке в окне команд
(см. окно 4 в главном окне). Для получения доступа к справочной информации нажать F1.
Использование контекстного меню дизассемблерного окна или окна
исходного кода.
4.2.3. Мониторинг областей памяти с использованием окна Memory
Для открытия окон с содержимым памяти начала необходимо панели ин­струментов открыть меню View и выбрать опцию Memory Windows. В выпа­дающем меню выбрать одно из четырех возможных окон:
В открывшемся окне памяти выполнить прокрутку до нужного адреса или ввести адрес в адресное поле окна и нажать Enter:
Содержимое памяти можно редактировать в данном окне, но изменения не выполняются для программной памяти.
58
4.2.4. Окно регистров
Как уже говорилось ранее, окно регистров отображает содержимое реги­стров микроконтроллера на момент останова программы.
Данное окно открыто по умолчанию, но его можно открыть вручную, ес­ли оно было случайно закрыто. Для этого нужно открыть меню View и вы­брать опцию Registers Window.
Содержимое регистров можно редактировать путем двойного нажатия мыши на содержимое регистра или кнопки F2 на клавиатуре. При редактирова­нии значения в регистре оно выделяется синим цветом:
Окно обновляет значения, когда выполнение программы останавливается.
4.2.5. Пример отладки программы
Для работы с программой необходимо настроить среду Keil MDK для ра­боты в режиме симулятора (см. раздел 2). После этого в главном окне управле­ния проектом вводится исходный текст программы. Будем использовать исход­ный текст программы с именем 122.s , приведенный в разделе 4.1.5.
Чтобы скомпилировать данную программу, написанную на языке ассем­блера, необходимо нажать клавишу F7 или кнопку Build Target в меню
Project:
59
После компиляции в окне Build Output убеждаемся в отсутствии ошибок, что позволяет перейти в режим отладки.
Запуск отладки осуществляется нажатием кнопки Start/Stop Debug Ses- sion в меню Debug. После этого открывается окно дизассемблера:
60
Для запуска программы в окне исходного текста устанавливаем останов на первой команде программы 122.s и нажимаем исполнение программы в не­прерывном режиме. После остановки, используя кнопки пошагового и непре­рывного режимов, исполняем программу и в окнах регистров и памяти (стек) фиксируем результаты.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]