Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Продвинутые методы отладки

 

 

676

 

 

Таблица 1: Возможные значения EXC_RETURN и их интерпретация

 

Режим после

Стек после

 

 

EXC_RETURN

возврата

возврата

FPU включен

Описание

 

 

 

 

 

 

0xFFFF FFF1

0

(Обработчик)

MSP

Нет

Возврат в режиме обработ-

 

 

 

 

 

чика (с использованием MSP)

0xFFFF FFF9

1

(Поток)

MSP

Нет

Возврат в режиме потока (с

 

 

 

 

 

использованием MSP)

0xFFFF FFFD

1

(Поток)

PSP

Нет

Возврат в режиме потока (с

 

 

 

 

 

использованием PSP)

0xFFFF FFE1

0

(Обработчик)

MSP

Да

Возврат в режиме обработ-

 

 

 

 

 

чика (с использованием MSP)

0xFFFF FFE9

0xFFFF FFED

1 (Поток)

MSP

Да

Возврат в режиме потока (с

 

 

 

использованием MSP)

1 (Поток)

PSP

Да

Возврат в режиме потока (с

 

 

 

использованием PSP)

Например, если ЦПУ выполняло «обычный код» (т. е. ЦПУ находилось в режиме потока) до перехода в исключение, если использовался стек MSP и если модуль FPU был отключен, то регистр LR будет содержать значение 0xFFFF FFF9. Если вместо этого ЦПУ обслуживало другое исключение (возможно, прерывание) при переходе в текущее исключение (то есть ЦПУ находилось в режиме обработчика), то содержимое регистра LR будет

равно 0xFFFF FFF1.

Именно благодаря механизму EXC_RETURN обычные функции Си могут использоваться в качестве обработчиков исключений без написания каких-либо строк ассемблерного кода. Это отличается от других архитектур микроконтроллеров, где требуется дополнительная работа от компилятора (или от разработчика) для выполнения операции загрузки в стек/извлечения из стека обработчиков исключений.

Рисунок 5: Как интерпретируется значение EXC_RETURN

На рисунке 5 показана полная структура значения EXC_RETURN. Как видите, четвертый бит указывает, какой стек использовался в момент срабатывания условия отказа. Это четко объясняет использование инструкции tst в предыдущем ассемблерном коде для определения используемого стека.

24.1.2. Исключения отказов и их анализ

Механизм исключений отказов, предоставляемый процессором Cortex-M, достаточно полезен для обнаружения источников отказов. В течение жизненного цикла разработки очень часто возникают условия отказов, особенно если вы новичок в платформе STM32 или во встроенном программировании.

Данный параграф демонстрирует краткий обзор анализа состояний отказов. Он не ставит своей целью заменить официальную документацию ARM или отличные работы

Продвинутые методы отладки

677

Джозефа Ю8. Главная его цель – предоставить необходимые инструменты и концепции для понимания того, что происходит не так, когда возникает одно из четырех исключений отказов.

Ядра Cortex-M3/4/7 предоставляют ряд регистров, которые используются для анализа отказов. Они могут использоваться кодом обработчика отказа, но в большинстве случаев они используются во время сеанса отладки. В таблице 2 перечислены доступные регистры, полезные для анализа отказов.

Таблица 2: Регистры для состояний отказов и информации об адресах

Символ CMSIS

Имя регистра

Описание

 

 

 

SCB->CFSR

Регистр состояния конфигу-

Предоставляет информацию о состоянии

 

рируемых отказов

конфигурируемых исключений (MemFault,

 

 

BusFault, UsageFault)

SCB->HFSR

SCB->DFSR

SCB->MMFAR

SCB->BFAR

Состояние отказа HardFault

Предоставляет информацию о состоянии для

 

исключения HardFault

Регистр состояния отказа

Предоставляет информацию о состоянии для

отладки

исключения Debug Monitor

Регистр адреса отказа

Если доступен, показывает адрес, который

MemManage Fault

вызвал отказ MemManage

Регистр адреса отказа

Если доступен, показывает адрес, который

BusFault

вызвал отказ BusFault

SCB->CFSR – это регистр состояния конфигурируемых отказов (Configurable Fault Status Register), и он предоставляет информацию для тех исключений, которые могут быть разрешены по выбору (MemFault, BusFault, UsageFault). Он, в свою очередь, разделен на три подрегистра, как показано на рисунке 6. Мы собираемся предоставить их полное описание в соответствующих подпунктах.

Рисунок 6: Как SCB->CFSR делится на три подрегистра

24.1.2.1.Исключение Memory Management

Это исключение может быть вызвано из-за нарушения правил доступа, определенных конфигурацией MPU. Например, оно срабатывает при попытке доступа в режиме записи к области, определенной как доступная только для чтения. Это исключение доступно только в ядрах Cortex-M3/4/7, и оно должно быть разрешено. После разрешения отдельные биты регистра SCB->MFSR (который соответствует первому байту регистра SCB->CFSR) могут принимать значения, указанные в таблице 3. Регистр SCB->MFSR при сбросе устанавливается в 0x0, и его значения остаются высокими, пока значение 1 не будет записано в регистр. Проверяя отдельные значения битов, мы можем получить больше информации о причине отказа. Например, если установлен бит DACCVIOL, то исключение вызвало обращение к защищенной области памяти. В этом случае устанавливается бит MMARVALID, а регистр SCB->MMFAR содержит ячейку памяти назначения, которая вызвала отказ. Чтобы увидеть это исключение в работе, попробуйте выполнить пример, приведенный в параграфе об устройстве MPU.

8 http://amzn.to/1P5sZwq

Продвинутые методы отладки

678

 

Таблица 3: Регистр состояния отказа MemManage Fault (SCB->MFSR)

Бит

Имя

Описание

 

 

 

7

MMARVALID

Указывает на корректность содержимого регистра SCB->MMFAR

6

ЗАРЕЗЕРВИРОВАНО

ЗАРЕЗЕРВИРОВАНО

5

MLSPERR

Ошибка отложенной загрузки в стек регистров модуля FPU,

 

 

англ. lazy stacking (доступно только для ядер Cortex-M4F)

4

MSTKERR

Ошибка загрузки данных в стек

3

MUNSTKERR

Ошибка извлечения данных из стека

2

ЗАРЕЗЕРВИРОВАНО

ЗАРЕЗЕРВИРОВАНО

1

DACCVIOL

Нарушение доступа к данным

0

IACCVIOL

Нарушение доступа к инструкции

24.1.2.2.Исключение Bus Fault

Это исключение чаще всего возникает из-за обращения по недопустимому адресу памяти SRAM или памяти программ. Два более частых источника исключения отказа шины Bus Fault – неправильный указатель на недопустимую область памяти SRAM и неверный указатель на функцию. Кроме того, отказ шины Bus Fault также может возникать во время загрузки в/извлечения из стека последовательности обработки исключения:

Если отказ шины Bus Fault произошел во время помещения данных в стек при последовательности перехода в исключение, это называется ошибкой загрузки дан-

ных в стек (stacking error).

Если отказ шины Bus Fault произошел во время извлечения данных из стека при последовательности выхода из исключения, это называется ошибкой извлечения данных из стека (unstacking error).

Обычно ошибка загрузки данных в стек указывает на переполнение стека: стеку не хватает места, и это вызывает отказ шины Bus Fault из-за доступа к неверной ячейке SRAM. Система исключений вызывает исключение отказа, но ЦПУ не может поместить сохраненный регистр ядра в полный стек. Это вызывает ошибку загрузки данных в стек, которая, в свою очередь, вызывает тяжелый отказ Hard Fault. Считав SCB->BFSR, мы увидим, что установлены оба бита 15 и 12. Содержимое SCB->BFAR будет настолько некорректным, что мы увидим нечто похожее на 0x1fff bff8. Это недопустимое расположение SRAM в микроконтроллерах STM32, и поэтому мы можем легко определить, что произошло переполнение стека.

Таблица 4 показывает значение отдельных битов регистра SCB->BFSR.

Таблица 4: Регистр состояния отказа шины Bus Fault (SCB->BFSR)

Бит

Имя

Описание

 

 

 

15

BFARVALID

Указывает на корректность содержимого регистра SCB->BFAR

14

ЗАРЕЗЕРВИРОВАНО

ЗАРЕЗЕРВИРОВАНО

13

LSPERR

Ошибка отложенной загрузки в стек регистров модуля FPU,

 

 

англ. lazy stacking (доступно только для ядер Cortex-M4F)

12

STKERR

Ошибка загрузки данных в стек

11

UNSTKERR

Ошибка извлечения данных из стека

10

IMPRECISERR

«Неточное» нарушение доступа к данным

9

PRECISERR

«Точное» нарушение доступа к данным

8

IBUSERR

Нарушение доступа к инструкции

Продвинутые методы отладки

679

Отказы шины можно классифицировать как:

«Точные» отказы шины (Precise bus faults): исключения отказов произошли сразу при выполнении инструкции доступа к памяти.

«Неточные» отказы шины (Imprecise bus faults): исключения отказов произошли через некоторое время после выполнения инструкции доступа к памяти.

Причина, по которой отказ шины становится «неточным», связана с наличием буферов записи в интерфейсе шин процессора. Когда процессор записывает данные по буферизируемому адресу, процессор может приступить к выполнению следующей инструкции, несмотря на то что передача занимает несколько тактовых циклов до завершения. При возникновении «неточного» отказа доступа к данным регистр SCB->BFAR некорректен. Чтобы определить источник отказа, нам нужно дизассемблировать исходный код на языке Си и определить ассемблерную инструкцию, которая логически предшествует той, на которую указывает загруженный в стек PC.

24.1.2.3.Исключение Usage Fault

Это исключение может быть вызвано очень обширным списком факторов. При разработке приложений на STM32 наиболее распространенными из них являются:

Выполнение неопределенной инструкции (в том числе попытка выполнить инструкции вычислений с плавающей точкой, когда математический сопроцессор отключен). Оно часто происходит, когда у нас указатель на некорректную функцию, который указывает на корректную ячейку памяти (часто это происходит, когда у нас есть некоторые функции в SRAM), но содержимое указанной ячейки не соответствует инструкции ассемблера ARM.

Некорректный код EXC_RETURN во время последовательности возврата из исключения. Например, попытка вернуться в режим потока с исключениями, которые все еще активны (кроме текущего обслуживаемого исключения).

Невыровненный доступ к памяти инструкциями с множественными загрузкой или записью (включая инструкции загрузки и записи чисел формата double, англ. load double and store double instructions).

Выполнение инструкции SVC, когда уровень приоритета SVC такой же или ниже текущего уровня. Оно возникает, когда произошло что-то неприятное с конфигурацией системных исключений FreeRTOS (обычно когда IRQ таймера SysTick не присвоен самый низкий приоритет).

Как только соответствующая конфигурация установлена, также возможно генерировать отказы программы при следующих условиях:

Деление на ноль.

Все невыровненные доступы к памяти.

Таблица 5 показывает значение отдельных битов регистра SCB->UFSR.

Продвинутые методы отладки

680

Таблица 5: Регистр состояния отказа программы Usage Fault (SCB->UFSR)

Бит

Имя

Описание

 

 

 

31-26

ЗАРЕЗЕРВИРОВАНО

ЗАРЕЗЕРВИРОВАНО

25

DIVBYZERO

Указывает на отказ при делении на ноль (может быть установ-

 

 

лен, только если он разрешен)

24

UNALIGNED

Указывает, что произошел отказ при невыровненном доступе

23-20

ЗАРЕЗЕРВИРОВАНО

ЗАРЕЗЕРВИРОВАНО

19

NOCP

Попытка выполнения инструкции вычислений с плавающей

 

 

точкой, когда модуль FPU ядра Cortex-M4F не доступен или не

 

 

был включен.

18

INVPC

Попытка выполнения исключения с неверным значением

 

 

EXC_RETURN

17

INVSTATE

Попытки переключиться в недопустимое состояние (напри-

 

 

мер, из ARM в Thumb)

16

UNDEFINSTR

Попытка выполнить неопределенную инструкцию

По умолчанию микроконтроллеры на базе Cortex-M возвращают значение 0 при делении числа на ноль. Если вместо этого вам нужно перехватить ошибку деления на ноль, то вы можете разрешить данное условие отказа, установив бит DIV_0_TRP в регистре

SCB->CCR:

SCB->CCR |= SCB_CCR_DIV_0_TRP_Msk;

То же самое относится к невыровненному доступу к памяти:

SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;

24.1.2.4.Исключение Hard Fault

Это исключение обычно вызывается эскалацией предыдущих конфигурируемых исключений, если они не разрешены. Кроме того, отказ HardFault может быть вызван:

Отказом шины, полученным во время выборки таблицы векторов. Он происходит потому, что таблица векторов некорректна (в большинстве случаев, когда мы забыли включить в проект ассемблерный файл, предоставленный ST, или забыли изменить его расширение со строчной .s на прописную .S).

Выполнением инструкции точки останова (asm("BKPT #0");) при не подключенном отладчике.

Таблица 6 показывает значение отдельных битов регистра SCB->HFSR.

Таблица 6: Регистр состояния тяжелого отказа Hard Fault (SCB->HFSR)

Бит

Имя

Описание

 

 

 

31

DEBUGEVT

Указывает, что отказ Hard Fault вызван событием отладки

30

FORCED

Указывает, что Hard Fault сгенерирован эскалацией конфигу-

 

 

рируемых исключений отказов, когда они запрещены. В этом

 

 

случае нам нужно проверить содержимое регистров SCB->MFSR,

 

 

SCB->BFSR и SCB->UFSR для определения причины отказа.

29-2

ЗАРЕЗЕРВИРОВАНО

ЗАРЕЗЕРВИРОВАНО

1

VECTBL

Указывает, что отказ Hard Fault вызван неудачной выборкой

 

 

таблицы векторов

0

ЗАРЕЗЕРВИРОВАНО

ЗАРЕЗЕРВИРОВАНО