Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование микроконтроллеров семейства CORTEX-M. Учебное пособие
.pdf
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 и нажимаем исполнение программы в непрерывном режиме. После остановки, используя кнопки пошагового и непрерывного режимов, исполняем программу и в окнах регистров и памяти (стек)
фиксируем результаты.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
