Вы находитесь на странице: 1из 890

Руководство разработчика

по семейству
процессоров Cortex-M
Эта страница, намеренно
оставленная незаполненный
Руководство разработчика
по семейству
процессоров Cortex-M
Второй выпуск

Trevor Martin

АМСТЕРДАМ • БОСТОН • ГЕЙДЕЛЬБЕРГ • ЛОНДОН


НЬЮ-ЙОРК • ОКСФОРД • ПАРИЖ • САН-ДИЕГО
САН-ФРАНЦИСКО • СИНГАПУР • СИДНЕЙ • ТОКИО
Newnes является отпечатком Elsevier
Newnes является отпечатком Elsevier
Бульвар, Langford Lane, Кидлингтон, Оксфорд OX5 1GB,
Великобритания Хэмпшир Street, 50, 5-й этаж, Cambridge,
Массачусетс 02139, США
Авторское право r 2016, 2013 Elsevier Ltd. Все права защищены.

Никакая часть этой публикации не может быть воспроизведена или передана в любой форме или каким-либо образом,
электронная или механическая, включая фотокопирование, запись, или любую систему хранения информации и
поисковую систему, без разрешения в письменной форме от издателя. Детали о том, как искать разрешение,
дополнительную информацию о политиках полномочий Издателя и наших расположениях с организациями, такими
как Центр по проверке авторских прав и Агентство по Лицензированию Авторского права, могут быть найдены в
нашем веб-сайте: www.elsevier.com/permissions.

Эта книга и отдельные вклады, содержавшиеся в нем, защищены под авторским правом Издателем (кроме того, как
может быть отмечен здесь).
Уведомления
Знание и лучшая практика в этом поле постоянно изменяются. Поскольку новое исследование и опыт расширяют наше
понимание, изменения в методах исследования, профессиональных методах, или лечение может стать необходимым.

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

К полному объему закона, ни Издатель, ни авторы, участники или редакторы, принимают любую ответственность
за любую травму и/или повреждение людям или свойству как ответственность за качество выпускаемой
продукции, небрежность или иначе, или от любого использования или операции любых методов, продуктов,
инструкций или идей, содержавшихся в материале здесь.
Данные каталогизации в публикации Британской библиотеки
Запись каталога для этой книги доступна из Британской библиотеки.

Данные каталогизации в публикации Библиотеки Конгресса


Запись каталога для этой книги доступна из Библиотеки Конгресса.

ISBN: 978-0-08-100629-0

Для получения информации обо всем


Newnes публикации посещают наш веб-
сайт в https://www.elsevier.com/

Издатель: Joe Hayton


Редактор приобретения: Tim Pitts
Редакционный менеджер проектов: Charlotte Kent
Производственный менеджер проектов: Julie-Ann Stansfield
Разработчик: Mark Rogers
Набранный MPS Limited, Ченнаи, Индия
Моей жене Sarah и моим родителям Ann и
Maurice
Эта страница, намеренно
оставленная незаполненный
Содержание
Предисловие ..................................................................................................... xvii
Предисловие ...................................................................................................... xix
Список благодарностей .................................................................................... xxi

Глава 1: введение в семейство процессоров Cortex-M ............................... 1


Профили коры..................................................................................................... 1
Кора-M3 ............................................................................................................. 3
Усовершенствованные архитектурные функции ................................................... 7
Кора-M0 ............................................................................................................ 10
Кора-M01 .......................................................................................................... 13
Кора-M4 ............................................................................................................ 16
Инструкции по DSP ............................................................................................ 18
Кора-M7 ............................................................................................................ 19
Заключение ........................................................................................................ 21

Глава 2: разработка программного обеспечения для семейства Cortex-M


...............................................................................................................................23
Введение ............................................................................................................ 23
Комплект разработчика микроконтроллера Keil .................................................. 23
Программные пакеты ......................................................................................... 24
Учебные упражнения ......................................................................................... 24
Установка .......................................................................................................... 25
Упражнение 2.1 Создание первой программы ..................................................... 27
Проект Blinky..................................................................................................... 28
Конфигурация проекта ....................................................................................... 52
Упражнение 2.2 Аппаратная отладка .................................................................. 65
Заключение ........................................................................................................ 69

Глава 3: архитектура Cortex-M.........................................................................71


Введение ............................................................................................................ 71
Система команд Cortex-M................................................................................... 71
Модель программиста и регистры ЦП ................................................................. 72
Регистр состояния программы ............................................................................ 74

vii
Содержание
viii

Q бит и влажные инструкции по математике ....................................................... 75


Прерывания и инструкции по мультициклу ......................................................... 76
Условное выполнение — если затем блоки.......................................................... 76
Упражнение 3.1 Влажная математика и условное выполнение ............................. 78
Карта распределения памяти Cortex-M и шины ................................................... 84
Буфер записи ...................................................................................................... 87
Инструкции по барьеру памяти ........................................................................... 87
Системный блок управления ............................................................................... 87
Побитовая обработка .......................................................................................... 89
Осуществите соединение на 3,2 бита ................................................................... 91
Специализированные инструкции по побитовой обработке ................................. 92
Таймер SysTick................................................................................................... 93
Контроллер прерываний вложенного вектора ...................................................... 94
Рабочие режимы................................................................................................. 94
Обработка прерываний — запись ........................................................................ 95
Обработка прерываний — выход ........................................................................ 96
Обработка прерываний — важный выход! .......................................................... 97
Упражнение 3.3 Прерывание SysTick .................................................................. 97
Исключения процессора Cortex-M .................................................................... 102
Отказ использования ................................................................................. 103
Отказ шины .............................................................................................. 103
Отказ диспетчера памяти........................................................................... 104
Серьезный отказ........................................................................................ 104
Включение исключений отказа .................................................................. 104
Приоритет и вытеснение ................................................................................... 104
Группы и подгруппа ......................................................................................... 106
Управление приоритетами во время выполнения ............................................... 107
Модель исключения ......................................................................................... 107
Объединение в цепочку хвоста NVIC......................................................... 108
NVIC, поздно прибывающий ..................................................................... 109
NVIC вытеснение POP .............................................................................. 110
Упражнение 3.3 Работа с несколькими прерываниями ....................................... 110
Поддержка загрузчика ...................................................................................... 115
Упражнение 3.4 Загрузчик ................................................................................ 116
Управление питанием ....................................................................................... 121
Переход к режимам низкой мощности ....................................................... 123
Конфигурирование режимов низкой мощности .......................................... 123
Упражнение 3.3 Режимы низкой мощности................................................ 124
Содержание ix

Перемещение от коры-M3 ................................................................................ 126


Кора-M4 .......................................................................................................... 127
Кора-M0 .......................................................................................................... 127
Кора-M01 ........................................................................................................ 129
Заключение ...................................................................................................... 130

Глава 4: стандарт программного интерфейса микроконтроллера коры


............................................................................................................................ 131
Введение .......................................................................................................... 131
Спецификации CMSIS ...................................................................................... 133
CMSIS-ядро ..................................................................................................... 134
CMSIS-RTOS ................................................................................................... 134
CMSIS-DSP ...................................................................................................... 135
CMSIS-драйвер ................................................................................................ 135
CMSIS-SVD и DAP .......................................................................................... 135
CMSIS-пакет .................................................................................................... 136
Основы CMSIS ................................................................................................. 136
Кодирование правил......................................................................................... 137
MISRA-C ......................................................................................................... 137
CMSIS-базовая структура ................................................................................. 139
Код запуска ...................................................................................................... 140
Системный код................................................................................................. 141
Заголовочный файл устройства ......................................................................... 141
CMSIS-базовые заголовочные файлы ................................................................ 143
Прерывания и исключения ............................................................................... 144
Упражнение 4.1 CMSIS и пользовательское сравнение кода .............................. 147
CMSIS-базовый доступ регистра ............................................................... 148
CMSIS-ядро-процессора внутренние инструкции .............................................. 149
Упражнение 4.2 Внутренняя побитовая обработка............................................. 150
CMSIS-SIMD Intrinsics ..................................................................................... 151
CMSIS-базовые функции отладки ..................................................................... 152
Аппаратная точка останова ....................................................................... 152
Трассировка инструментария .................................................................... 152
CMSIS-базовые функции для Corex-M7 ............................................................ 153
Заключение ...................................................................................................... 153

Глава 5: функции передовой архитектуры ................................................. 155


Введение .......................................................................................................... 155
Рабочие режимы процессора коры .................................................................... 155
x
Содержан
ие

Упражнение 5.1 Конфигурация стека ................................................................ 158


Вызов контролера............................................................................................. 161
Упражнение 5.2 Вызов контролера.................................................................... 163
Исключение PEND_SV ..................................................................................... 166
Пример Pend_SV .............................................................................................. 167
Межпроцессорные события .............................................................................. 169
Эксклюзивный доступ ...................................................................................... 169
Упражнение 5.4 Эксклюзивный доступ ............................................................. 172
Единица защиты памяти ................................................................................... 173
Конфигурирование MPU................................................................................... 175
Упражнение 5.5 Конфигурация MPU ................................................................ 178
Подобласти MPU.............................................................................................. 184
Ограничения MPU ............................................................................................ 185
AHB облегченный шинный интерфейс .............................................................. 185
Заключение ...................................................................................................... 187

Глава 6: процессор коры-M7 ......................................................................... 189


Суперскалярная архитектура ............................................................................ 190
Предсказание ветвлений ................................................................................... 191
Упражнение 6.1 Простой цикл .......................................................................... 191
Структура шины............................................................................................... 193
Иерархия памяти .............................................................................................. 195
Упражнение 6.2 Определение местоположения кода и данных в TCM ............... 197
Блоки кэш-памяти ............................................................................................ 199
Операция кэша ................................................................................................. 200
Кэш инструкции ............................................................................................... 203
Упражнение 6.3 Кэш инструкции ...................................................................... 203
Кэш данных ..................................................................................................... 204
Барьеры памяти ................................................................................................ 205
Упражнение 6.4 Кэш данных в качестве примера .............................................. 206
Единица защиты памяти и конфигурация кэша.................................................. 206
Политика кэша ................................................................................................. 207
Управление кэшем данных ............................................................................... 209
Выключите кэш ........................................................................................ 209
Отключите кэширование по региону системной памяти ............................. 209
Измените политику кэша для региона системной памяти ........................... 209
Используйте функции управления кэшем для гарантии когерентности ....... 209
Кси содержания

Упражнение 6.5 Конфигурация кэша данных .................................................... 209


Сопроцессор для операций с плавающей точкой двойной точности ................... 213
Функциональная безопасность.......................................................................... 214
Функции безопасности коры-M7....................................................................... 215
Документация безопасности ............................................................................. 215
Средства разработки ......................................................................................... 216
Заключение ...................................................................................................... 216

Глава 7: отладка с CoreSight ......................................................................... 217


Введение .......................................................................................................... 217
Аппаратные средства CoreSight ........................................................................ 219
Аппаратные средства отладчика ....................................................................... 220
Архитектура отладки CoreSight......................................................................... 221
Упражнение 7.1 Отладка CoreSight ................................................................... 221
Аппаратная конфигурация ................................................................................ 222
Конфигурация программного обеспечения ........................................................ 223
Ограничения отладки ....................................................................................... 229
Трассировка инструментария............................................................................ 229
Упражнение 7.2 Установка ITM ........................................................................ 230
Системная поддержка отладки блока управления .............................................. 233
Отслеживание отказов ...................................................................................... 234
Упражнение 7.3 Исключения отказа процессора................................................ 235
Трассировка инструкции со встроенной макроячейкой трассировки .................. 239
Упражнение 7.4 Использование трассировки ETM ............................................ 241
CMSIS-DAP ..................................................................................................... 244
Кора-M01 MTB................................................................................................ 245
Упражнение 7.5 Микро буфер трассировки ....................................................... 246
Системное описание средства просмотра CMSIS ............................................... 248
Упражнение 7.6 CMSIS-SVD ............................................................................ 249
Сводка функций отладки заключения ............................................................... 254

Глава 8: практический DSP для коры-M4 и коры-M7 ................................ 255


Введение .......................................................................................................... 255
Аппаратные средства FPU ................................................................................ 255
Интеграция FPU ............................................................................................... 256
Регистры FPU................................................................................................... 257
Кора-M7 FPU ................................................................................................... 258
Содержани
е xii

Включение FPU................................................................................................ 258


Исключения и FPU ........................................................................................... 258
Использование FPU .......................................................................................... 259
Упражнение 8.1 Сопроцессор для операций с плавающей точкой ...................... 259
Cortex-M4/M7 DSP и Инструкции SIMD ........................................................... 265
Упражнение 8.2 Инструкции SIMD ................................................................... 269
Упражнение 8.3 Оптимизация алгоритмов DSP ................................................. 272
Библиотека CMSIS-DSP.................................................................................... 279
Библиотечные функции CMSIS-DSP ................................................................. 279
Упражнение 8.3 Пользование библиотекой CMSIS-DSP .................................... 280
Методы обработки данных DSP ........................................................................ 285
Упражнение 8.4 Фильтр FIR с обработкой блока ............................................... 286
DSP фиксированной точки с числами Q ............................................................ 289
Упражнение 8.5 Фиксированная точка FFT преобразовывает ............................. 290
Заключение ...................................................................................................... 292

Глава 9: стандартное реальное время программного интерфейса


микроконтроллера коры
Операционная система ................................................................................... 293
Введение .......................................................................................................... 293
Первые шаги с CMSIS-RTOS ............................................................................ 294
Доступ к API CMSIS-RTOS .............................................................................. 294
Потоки ............................................................................................................. 295
Запуск RTOS .................................................................................................... 296
Упражнение 9.1 первый проект CMSIS-RTOS ................................................... 297
Создание потоков ............................................................................................. 306
Упражнение 9.2 Создание и управление потоками............................................. 307
Управление потоком и приоритет ..................................................................... 310
Упражнение 9.3 Создание и управление потоками II ......................................... 311
Несколько экземпляров .................................................................................... 312
Упражнение 9.4 Несколько экземпляров потока ................................................ 313
Тайм-менеджмент ............................................................................................ 314
Задержка .......................................................................................................... 314
Ожидание события ........................................................................................... 315
Упражнение 9.5 Тайм-менеджмент ................................................................... 315
Виртуальные таймеры ...................................................................................... 316
Упражнение 9.6 Виртуальный таймер ............................................................... 317
Задержки подмиллисекунды ............................................................................. 319
Неактивный демон ........................................................................................... 319
Содержание xiii

Упражнение 9.7 Неактивный поток ................................................................... 320


Коммуникация межпотока ................................................................................ 323
Сигналы ........................................................................................................... 323
Сигналы упражнения 9.8 .................................................................................. 324
Семафоры ........................................................................................................ 325
Упражнение 9.9 Семафорная передача сигналов................................................ 326
Использование семафоров ................................................................................ 328
Передача сигналов ........................................................................................... 328
Мультиплексирование ...................................................................................... 329
Упражнение 9.10 Мультиплексирование ........................................................... 329
Рандеву ............................................................................................................ 330
Упражнение 9.11 Рандеву ................................................................................. 330
Турникет барьера ............................................................................................. 331
Упражнение 9.12 Семафорный барьер............................................................... 332
Семафорные протесты ...................................................................................... 332
Взаимное исключение ...................................................................................... 333
Упражнение 9.13 Взаимное исключение ........................................................... 333
Взаимоисключающие протесты ........................................................................ 335
Обмен данными ............................................................................................... 335
Очередь сообщений .......................................................................................... 337
Упражнение 9.14 Очередь сообщений ............................................................... 338
Пул памяти ...................................................................................................... 339
Упражнение 9.15 Пул памяти ........................................................................... 340
Почтовая очередь ............................................................................................. 341
Упражнение 9.16 Почтовый ящик ..................................................................... 342
Конфигурация .................................................................................................. 343
Определение потока ......................................................................................... 344
Поддержка отладки ядра................................................................................... 344
Системная конфигурация таймера .................................................................... 346
Конфигурация интервала .................................................................................. 346
Планирование опций ........................................................................................ 346
Упреждающее планирование..................................................................... 347
Циклическое планирование ....................................................................... 347
Циклическое упреждающее планирование ................................................. 348
Кооперативная многозадачность ............................................................... 348
Исходный код RTX .......................................................................................... 348
Лицензия RTX.................................................................................................. 349
Заключение ...................................................................................................... 350
Содержани
е xiv

Глава 10: методы RTOS ................................................................................. 351


Введение .......................................................................................................... 351
RTOS и прерывания.......................................................................................... 351
Обработка прерываний RTOS ........................................................................... 352
Упражнение 10.1 Обработка осуществления прерывания RTOS ......................... 354
Пользовательские функции супервизора ........................................................... 355
Упражнение 10.2 RTOS и пользователь исключения SVC .................................. 356
Управление питанием ....................................................................................... 358
Первые шаги управления питанием................................................................... 358
Стратегия управления питанием ....................................................................... 360
Сторожевое управление .................................................................................... 362
Интеграция ISRs............................................................................................... 363
Упражнение 10.3 Питание и сторожевое управление ......................................... 364
Барьер запуска.................................................................................................. 369
Разработка в течение реального времени ........................................................... 370
Буферизация методов — двойной или кольцевой буфер ............................. 370
Буферизация очереди сообщений FIFO методов ......................................... 371
Балансировка загрузки .............................................................................. 375
Упражнение 10.4 Реальное время RTX .............................................................. 375
Взваливание на себя загрузки, контроллера прямого доступа к памяти............... 380
Разработка для отладки..................................................................................... 381
Упражнение 10.5 Диагностика во время выполнения ......................................... 382
Заключение ...................................................................................................... 385

Глава 11: разработка через тестирование ................................................. 387


Введение .......................................................................................................... 387
Цикл разработки TDD ............................................................................... 389
Среда тестирования................................................................................... 389
Автоматизация тестирования..................................................................... 389
Установка платформы единицы ........................................................................ 390
Упражнение 11.1 Разработка через тестирование............................................... 390
Добавление среды тестирования единицы.................................................. 391
Конфигурирование целей сборки проекта .................................................. 393
Добавление тестов .................................................................................... 397
Автоматизация цикла TDD ........................................................................ 399
Тестирование потоков RTOS ............................................................................ 402
Упражнение 11.2 Тестирование потоков RTOS.................................................. 404
Отделение низкоуровневых функций ......................................................... 405
Тестирование прерываний ......................................................................... 406
Содержание xv

Упражнение 11.3 Тестирование с прерываниями ............................................... 407


Заключение ...................................................................................................... 409

Глава 12: компоненты программного обеспечения .................................. 411


Введение .......................................................................................................... 411
Драйвер CMSIS ................................................................................................ 412
Драйвер CMSIS API .................................................................................. 413
Упражнение 12.1 CMSIS-драйвер .............................................................. 414
Проверка драйвера ........................................................................................... 419
Упражнение 12.2 Проверка драйвера ......................................................... 419
Разработка компонента программного обеспечения........................................... 424
Упражнение 12.3 Компонент GPS.............................................................. 424
Создание программного пакета ......................................................................... 427
Структура программного пакета ................................................................ 427
Software Pack Utilities ................................................................................ 428
Мастер конфигурации ...................................................................................... 439
Упражнение 12.4 Мастер конфигурации .................................................... 440
Развертывание компонентов программного обеспечения ................................... 443
Заключение ...................................................................................................... 444

Глава 13: ARMv8-M ......................................................................................... 445


Введение .......................................................................................................... 445
Общие архитектурные улучшения .................................................................... 446
Базовые улучшения ARMv8.............................................................................. 446
Улучшения магистрали ARMv8-M.................................................................... 447
TrustZone ......................................................................................................... 448
Прерывания и исключения ........................................................................ 451
Разработка программного обеспечения ............................................................. 454
Компилятор .............................................................................................. 454
Операционная система реального времени................................................. 454
Отладчик .................................................................................................. 454
Стандарт программного интерфейса микроконтроллера коры .................... 455
Заключение ...................................................................................................... 455

Приложение ...................................................................................................... 457


Индекс................................................................................................................ 461
Эта страница, намеренно
оставленная незаполненный
Предисловие

Когда эта книга была сначала опубликована в 2013, ARM питал тихий оборот
во встроенной промышленности. Во время запуска второго выпуска ARM является
ясно архитектурой победы с более чем 3 000 Коры ARM основанные на процессоре
микроконтроллеры на рынке и непараллельном росте.

ARM внес глубокое изменение в промышленность путем содействия инновациям и


конкуренции. Разработка процессоров трудна, и в прошлых немногих кремниевых
поставщиках были способны к проигрыванию на рынке микроконтроллера. Путем
представления licensable диапазона Cortex-M микроконтроллеров ARM позволил
экосистеме кремниевых компаний, поставщиков инструментов и партнеров по
программному обеспечению выйти на рынок — создание еще более сильной
экосистемы в процессе. Комбинация широкого спектра ARM процессоров Cortex-M в
различной производительности местах подачи питания с возможностями его
нескольких партнеров принесла предпочтительный градус пользователям
микроконтроллера, о которых они могли только мечтать.

Тенденция, которая имеет большинство затронутых разработчиков встроенного


программного обеспечения в последние годы, была сложностью. Требование для
лучшей возможности соединения, графических интерфейсов, и выше
вычислительная мощность в оконечном приложении была подобрана увеличенной
функциональностью в самих микроконтроллерах, и конечно, в размере программного
обеспечения, работающего на них. Чтобы помочь разработчикам справиться с этим
Cortex-M сложности, процессоры включают усовершенствованную отладку и
прослеживают возможности, которые используются профессиональными средствами
разработки, такими как Keil MDK. Однако это недостаточно: для хранения затрат на
разработку программного обеспечения при повторном использовании программного
обеспечения управления, стал обязательным. Поэтому ARM сотрудничал со своей
экосистемой инструментов и поставщиков RTOS для создания стандарта CMSIS,
который включает эффективное портирование стандартного промежуточного
программного обеспечения и заказного программного обеспечения между
несколькими наборами инструментальных средств и микроконтроллерами.

Сегодняшние новые проблемы являются безопасностью. Поскольку более


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

xvii
Предисловие
xviii

Ядра ARM. Еще раз методология программного обеспечения, средства разработки


и стандарты имеют решающую роль для проигрывания.

Я знал Trevor в течение прошлых 10 лет, в течение которых он помог сотням


клиентов добраться до рынка. Наличие доступа к его опыту и экспертным знаниям,
синтезируемым на страницах этой книги, является уникальной возможностью и к
новому и испытало встроенных разработчиков. Я надеюсь, что Вы максимально
используете его.

Javier Orensanz
Предисловие
ARM сначала представил семейство процессоров Cortex-M в 2004. С тех пор
процессор Cortex-M получил широкое принятие как хорошо масштабируемый
процессор общего назначения для маленьких микроконтроллеров. Во время записи
существует хорошо более чем 3 000 стандартных устройств, которые показывают
процессор Cortex-M. Они доступны от многих ведущих полупроводниковых
поставщиков, и темп разработки не показывает знака замедления. Семейство
процессоров Cortex-M теперь установило себя как промышленный стандарт. Как
таковой знание того, как использовать его, становится необходимым навыком для
профессиональных разработчиков. Эта книга предназначается, поскольку и введение
в процессор Cortex-M и руководство по методам раньше разрабатывали прикладное
программное обеспечение для работы ее. Книга записана как учебное руководство, и
главы предназначаются, чтобы работаться через в порядке. Каждая глава содержит
много примеров, которые представляют ключевые принципы, обрисованные в общих
чертах в этой книге с помощью минимального объема кода. Каждый пример
разработан, чтобы быть созданным с пробной версией Комплекта разработчика
Микроконтроллера для ARM. Эти примеры разработаны для выполнения в средстве
моделирования, таким образом, можно использовать большинство рук на примеры в
этой книге без потребности в любых дополнительных аппаратных средствах.

Глава 1 “Введение в Семейство процессоров Cortex-M”: Обеспечивает введение и


обзор функции каждого процессора в семействе Cortex-M.

Глава 2 “Разработка программного обеспечения для Семейства Cortex-M”:


Представляет Вас основам создания проекта “C” для процессора Cortex-M.

Глава 3 “Архитектура Cortex-M”: Предоставляет архитектурное описание Коры-M3 и


ее различий к другим процессорам Cortex-M.

Глава 4 “Стандарт Программного интерфейса Микроконтроллера Коры”:


Представляет Стандарт программного интерфейса микроконтроллера коры
(CMSIS), программируя спецификации для процессоров Cortex-M.

Глава 5 “Функции Передовой архитектуры”: Расширяет Главу 3 “Архитектура


Cortex-M” путем представления большего количества расширенных функций
архитектуры Cortex-M.

Глава 6 “Процессор Коры-M7”: В этой главе мы смотрим на процессор Cortex-


M7, который представляет более сложную модель памяти и структуру шины.
xix
Предислов
ие xx

Глава 7 “Отладка с CoreSight”: Предоставляет описание системы отладки


CoreSight и ее функций в реальном времени.

Глава 8 “Практический DSP для Коры-M4 и Коры-M7”: Смотрят математика и


поддержка обработки цифровых сигналов (DSP), доступная на Коре-M4 и как
разработать приложения DSP в реальном времени.

Глава 9 “Стандартная Операционная система реального времени Программного


интерфейса Микроконтроллера Коры”: Представляет использование
операционной системы реального времени (RTOS) на процессоре Cortex-M.

Глава 10 “Методы RTOS”: Эта глава исследует некоторые реальные методы,


которые могут использоваться при разработке основанного на RTOS проекта.

Глава 11 "Test Driven Development": В этой главе мы смотрим на то, как использовать
среду тестирования разработчика под названием Единица с Основанным на Cortex-M
микроконтроллером.

Глава 12 "Software Components": стандарты CMSIS, представленные в Главе 4


“Стандарт Программного интерфейса Микроконтроллера Коры”, помогают
стандартизировать, как код “C” написан для микроконтроллера Cortex-M. Эта глава
смотрит на то, как разработать компоненты программного обеспечения и как
упаковать их так, они могут быть легко распределены и снова использованы.

Глава 13 "ARMv8-M": последняя глава представляет введение в новую архитектуру


ARMv8-M. ARMv8-M представляет следующее поколение процессоров Cortex-M.
ARMv8-M также приносит технологию ARM TrustZone к микроконтроллерам
впервые. TrustZone обеспечивает основанную на аппаратных средствах модель
обеспечения безопасности даже для самых маленьких устройств.

Эта книга полезна для студентов, новичков и опытных и опытных разработчиков


одинаково. Однако предполагается, что у Вас есть элементарные знания того, как
использовать микроконтроллеры и что Вы знакомы с программированием на языке
“C”. Кроме того, полезно иметь элементарные знания о том, как использовать
отладчик µVision и IDE.
Список благодарностей
Я хотел бы благодарить Charlotte Kent, и Tim Pitts из Elsevier для помощи производят
книгу и Joseph Yui, Richard York и Ian Johnson ARM для их сотрудничества. Я также
хотел бы быть благодарным за то, что Tanya Wrycraft корректирует и полезный совет.

xxi
Эта страница, намеренно
оставленная незаполненный
CHPTER1

Введение в Cortex-M
Семейство процессоров

Так как первый выпуск этой книги был опубликован в 2013, число Кремниевых
Поставщиков, обеспечивающих Основанные на Cortex-M устройства, почти удвоилось, и
число вариантов микроконтроллера - теперь хорошо более чем 3 000 и продолжает
увеличиваться. Десятилетие назад я был знаком с основными характеристиками всех
основных используемых микроконтроллеров Cortex-M. Сегодня я изо всех сил пытаюсь не
отставать от диапазона доступных устройств, могла быть старость, конечно, но Вы
получаете изображение. В этой книге мы собираемся узнать о самом процессоре Cortex-M
и также методах программного обеспечения, требуемых разработать эффективный и
эффективный код приложения. Эта книга расположена как учебное руководство и лучше
работать через него глава главой. Каждая глава содержит много рук на примеры, и Вы
будете учиться намного больше путем фактического выполнения примеров.

Профили коры
В 2004 ARM представил свое новое семейство Коры процессоров. Семейство
процессоров Коры подразделено на три различных профиля. Каждый профиль
оптимизирован для различных сегментов приложений встроенных систем (Рис. 1.1).

Рисунок 1.1
Семейство процессоров Коры имеет три Приложения профилей, Реальное время и
Микроконтроллер.
Руководство разработчика по семейству процессоров Cortex-M.
DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00001-3 1
© 2016 Elsevier Ltd. Все права защищены.
2 Главы 1

Профиль Коры-A был разработан как процессор приложения высшего класса.


Процессоры коры-A способны к выполнению многофункциональных операционных
систем, таких как Победа RT и Linux. Ключевые приложения для Коры-A являются
бытовой электроникой, такой как смартфоны, планшетные компьютеры и абонентские
установки. Вторым профилем Коры является Cortex-R. Это - профиль в реальном
времени, который поставляет высокоэффективный процессор, который является
основой специализированного устройства. Очень часто процессор Cortex-R является
частью дизайна “системы на микросхеме”, который фокусируется на определенной
задаче, такой как управление жестким диском (HDD), автомобильное управление
механизмом и медицинские устройства. Заключительным профилем является Cortex-M
или профиль микроконтроллера. В отличие от более ранних центральных процессоров
ARM, семейство процессоров Cortex-M было специально разработано для
использования в маленьком микроконтроллере. Процессор Cortex-M в настоящее
время прибывает в шесть вариантов: кора-M0, Кора-M01, Кора-M1, Кора-M3, Кора-
M4 и Кора-M7. Кора-M0 и Кора-M01 являются самыми маленькими процессорами в
семействе. Они позволяют кремниевым производителям разрабатывать недорогие
устройства низкой мощности, которые могут заменить существующие 8-разрядные
микроконтроллеры при тихом предложении 32-разрядной производительности. Кора-
M1 имеет большую часть тех же функций как Кора-M0, но была разработана как
“мягкое ядро” для выполнения в устройстве Программируемой пользователем
вентильной матрицы (FPGA). Кора-M3 является оплотом семейства Cortex-M и была
первым вариантом Cortex-M, который будет запущен. Это включило новое поколение
высокоэффективных 32-разрядных микроконтроллеров, которые могут быть
произведены по очень низкой цене. Сегодня, существует много микроконтроллеров
Cortex-M3-based, доступных от большого разнообразия кремниевых производителей.
Это представляет сейсмический сдвиг, где Основанные на Cortex-M
микроконтроллеры начинают заменять традиционное 8-/16-bit микроконтроллеры и
даже другие 32-разрядные микроконтроллеры. Следующим самым высоким
участником выполнения семейства Cortex-M является Кора-M4. Это имеет все
функции Коры-M3 и добавляет поддержку обработки цифровых сигналов (DSP). Кора-
M4 также включает аппаратную поддержку плавающей точки вычислений одинарной
точности. Corex-M7 является процессором Cortex-M с высшим уровнем
производительности, все еще поддерживая модель программистов Cortex-M. Кора-M7
была также разработана для использования в высокой надежности и безопасности
критические системы (Рис. 1.2).
Введение в семейство процессоров Cortex-M 3

Рисунок 1.2
Профиль Cortex-M имеет пять различных вариантов с общей моделью
программистов.

В конце 1990-х, различные производители произвели микроконтроллеры на основе ARM7


и центральных процессоров ARM9. В то время как эти микроконтроллеры были
огромным прыжком в производительности и конкурировали в цене с существующим 8-
/16-bit архитектура, они были не всегда просты в использовании. Разработчик должен был
бы сначала изучить, как использовать ЦП ARM и затем иметь, чтобы понять, как
определенный производитель интегрировал ЦП ARM в их систему микроконтроллера.
Если Вы переместились в другой основанный на ARM микроконтроллер, Вы, возможно,
прошли другую кривую обучения системы микроконтроллера, прежде чем Вы могли
уверенно запустить разработку. Cortex-M изменяет все это; это - полный
Микроконтроллер (MCU) архитектура, не только ядро процессора. Это обеспечивает
стандартизированный шинный интерфейс, архитектуру отладки, ядро процессора,
структуру прерывания, управление питанием и защиту памяти. Что еще более важно,
каждый процессор Cortex-M является тем же через всех производителей, поэтому после
того как Вы учились использовать один процессор Cortex-M-based, можно снова
использовать это знание с любыми другими производителями микроконтроллеров Cortex-
M. Также в семействе Cortex-M, после того как Вы изучили основы того, как использовать
Кору-M3, затем можно использовать этот опыт разработать использование любого
другого процессора Cortex-M. Через эту книгу мы будем использовать Кору-M3 в
качестве эталонного устройства и затем смотреть на различия между Корой-M3 и Корой-
M0, Корой-M01 и Корой-M4. Кора-M7 имеет более усовершенствованную систему
памяти, которая представляет функции, такие как Сильно связанные Памяти и Кэши, мы
бросим подробный взгляд на Кору-M7 отдельно так к концу этой книги, у Вас будут
практические знания всех процессоров Cortex-M.

Кора-M3
Сегодня, Кора-M3 наиболее широко используется из всех процессоров Cortex-M. Это
частично, потому что это было доступно не только в течение самого долгого
промежутка времени, но также и это отвечает требованиям для микроконтроллера
общего назначения. Это обычно означает, что имеет хороший баланс между высокой
производительностью, низкой потребляемой мощностью и низкой стоимостью (Рис.
1.3).
4 Главы 1

Рисунок 1.3
Кора-M3 была первым доступным устройством Cortex-M. Это - полный процессор
для микроконтроллера общего назначения.

Основой Коры-M3 является высокоэффективный 32-разрядный ЦП. Как ARM7 это


- компьютер с сокращенной системой команд, где большинство инструкций
выполнится в единственном цикле (Рис. 1.4).

Рисунок 1.4
Кора-M3 ЦП имеет трехэтапный конвейер с предсказанием ветвлений.

Это частично сделано возможным трехэтапным конвейером с отдельной


выборкой, декодируют и выполняют единицы (Рис. 1.5).

Рисунок 1.5
Кора-M3 ЦП может выполнить большинство инструкций в единственном цикле. Это
достигается конвейером, выполняющим одну инструкцию, декодируя
следующую, и выбирающую одну треть.
Введение в семейство процессоров Cortex-M 5

Так, в то время как одна инструкция выполняется, секунда декодируется, и одна


треть выбирается. Тот же подход использовался на ARM7. Здорово, когда код входит
в прямую линию, однако, когда программа переходит, конвейер должен быть
сброшен и снова наполнен новыми инструкциями, прежде чем выполнение сможет
продолжиться. Это сделало ответвления по довольно дорогому ARM7 с точки зрения
вычислительной мощности. Однако Кора-M3 и Кора-M4 включают инструкцию
выбрать единицу, которая может обработать спекулятивные целевые выборки
ответвления, которые могут уменьшить штраф места размещения. Кора-M7
включает полный Целевой блок кэш-памяти Адреса Ответвления, который еще более
эффективен. Это помогает Коре-M3 и Коре-M4 иметь длительную вычислительную
мощность 1.25 DMIPS/MHz, в то время как Кора-M7 достигает 2.14 DMIPS/MHz.
Кроме того, процессор Cortex-M3 имеет аппаратную целочисленную математическую
единицу с аппаратными средствами, делятся, и единственный цикл умножаются.
Процессор Cortex-M3 также включает контроллер прерываний вложенного вектора
(NVIC), который может обслужить до 240 источников прерывания. NVIC
обеспечивает быстро детерминированную обработку прерываний, и от прерывания,
повышаемого до достижения первой строки “C” в процедуре обработки прерывания,
берет всего 12 циклов каждый раз. NVIC также содержит стандартный таймер,
названный таймером SysTick. Это - 24-разрядный таймер обратного отсчета с
автоматической перезагрузкой. Этот таймер присутствует на всех различных
процессорах Cortex-M. Таймер SysTick используется для обеспечения регулярных
периодических прерываний. Типичное использование этого таймера должно
обеспечить галочку таймера для маленьких операционных систем реального времени
(RTOS) места. Мы взглянем на такой RTOS в Главе 9 “CMSIS-RTOS” Также рядом с
NVIC, контроллер прерываний пробуждения (WIC); это - небольшая площадь
процессора Cortex-M, который поддерживается, когда процессор находится в режиме
низкой мощности. WIC может использовать сигналы прерывания от периферийных
устройств микроконтроллера до пробуждения процессор Cortex-M от режима низкой
мощности. WIC может быть реализован различными способами и в некоторых
случаях не требует, чтобы часы функционировали; также, это может быть в
отдельном энергетическом регионе от основного процессора Cortex-M. Это позволяет
99% процессора Cortex-M быть помещенными в режим низкой мощности только с
минимальным током, используемым WIC.
6 Глав 1

Рисунок 1.6
Архитектура отладки Cortex-M независима от ЦП и содержит до трех единиц
трассировки в реальном времени в дополнение к блоку
управления выполнения.

Семейство Cortex-M также имеет очень усовершенствованную архитектуру отладки


под названием CoreSight
(Рис. 1.6). Более ранние процессоры ARM7/9 могли быть отлажены через “Joint Test
Action Group” (JTAG) интерфейс отладки. Это обеспечило средство загрузить код
приложения во флэш-память на микросхеме и затем осуществить код с основной
отладкой выполнения/остановки.
В то время как отладчик JTAG обеспечил недорогой способ отладить, он имел две
основных проблемы. Первым было ограниченное количество точек останова, обычно
два с одной требуемой для единственного ступающего кода и во-вторых, когда ЦП
выполнял код, микроконтроллер стал черным квадратом с отладчиком, имеющим
видимость к ЦП, памяти или периферийным устройствам, пока микроконтроллер не
был остановлен. Архитектура отладки CoreSight в процессорах Cortex-M намного
более сложна, чем старые процессоры ARM7 или ARM9. Это позволяет до восьми
аппаратных точек останова быть помещенными в регионы данных или код. CoreSight
также обеспечивает три отдельных единицы трассировки, которые поддерживают
усовершенствованные функции отладки, не внедряя на выполнении Коры ЦП. Кора-
M3 и Кора-M4 всегда оснащены контрольной точкой данных и прослеживают единицу
(DWT) и единицу макроячейки трассировки инструментария (ITM). Интерфейс
отладки позволяет недорогому отладчику просматривать содержание памяти, и
периферийное устройство регистрируется “на лету”, не останавливая ЦП, и DWT
может
Введение в семейство процессоров Cortex-M 7

передайте содержание потоком переменных программы в режиме реального времени,


не используя ресурсов процессора. Вторую единицу трассировки называют
трассировкой инструментария. Эта единица трассировки обеспечивает способ связи
отладки между под управлением кодом и пользовательским интерфейсом отладчика.
Во время разработки стандартный канал IO может быть перенаправлен к консоли в
отладчике. Это позволяет Вам оснащать свой код с printf () сообщения отладки,
которые могут затем быть прочитаны в отладчике, в то время как код работает. Это
может быть полезно для захвата сложных проблем во время выполнения. Трассировка
инструментария также очень полезна во время программного обеспечения,
тестирующего, поскольку благодаря этому тестовая обвязка вывела данные к ПК, не
нуждаясь ни в каких определенных аппаратных средствах на цели. Трассировка
инструментария на самом деле более сложна, чем простой Универсальный
асинхронный приемопередатчик (UART), поскольку она обеспечивает 32 канала
передачи, которые могут использоваться различными ресурсами в рамках кода
приложения. Например, мы можем обеспечить расширенную отладочную
информацию о производительности RTOS путем размещения кода в ядро RTOS,
которое использует канал трассировки инструментария для общения с отладчиком.
Заключительную единицу трассировки называют встроенной макроячейкой
трассировки (ETM). Эта единица трассировки является дополнительным
соответствием и не присутствует на всех устройствах Cortex-M. Обычно
производитель будет соответствовать ETM на их высокопроизводительных
микроконтроллерах для обеспечения расширенных возможностей отладки. ETM
обеспечивает трассировочную информацию инструкции, которая позволяет отладчику
создавать список трассировок ассемблерного и Высокоуровневого языка
выполненного кода. ETM также включает более усовершенствованные инструменты,
такие как покрытие кода контролирующий и синхронизирующий анализ
производительности. Этими функциями отладки часто является требование для очень
важной безопасности и разработка кода высокой целостности.

Усовершенствованные архитектурные функции


Кора-M3 и Кора-M4 могут также быть оснащены другой единицей для помощи
выполнению кода высокой целостности. Единица защиты памяти (MPU) позволяет
разработчикам сегментировать карту распределения памяти Cortex-M на регионы с
различными правами доступа. Мы посмотрим на рабочие режимы процессора Cortex-
M в Главе 5 “Функции Передовой архитектуры”, но помещать его простыми словами,
Кора ЦП может выполнить код в привилегированном режиме или более строгом
непривилегированном режиме. MPU может определить привилегированные и
непривилегированные регионы по 4 ГБ адресного пространства (т.е., код, RAM и
периферийное устройство). Если ЦП будет работать в непривилегированном режиме,
и он пытается получить доступ к привилегированному региону памяти, то MPU
повысит исключение, и выполнение векторизует к служебной программе отказа MPU.
MPU обеспечивает поддержку оборудования для более усовершенствованных
разработок программного обеспечения. Например, можно настроить код приложения
так, чтобы RTOS и драйверы устройств низкого уровня имели полный
привилегированный доступ ко всем функциям микроконтроллера, в то время как код
приложения ограничивается своим собственным регионом кода и данных. Как ETM,
MPU является дополнительной единицей, которая может быть приспособлена
производителями во время дизайна микроконтроллера. MPU обычно находится на
высокопроизводительных устройствах, которые имеют большой объем Флэш-памяти и
8 Глав 1

SRAM. Наконец, с Корой-M3 и Корой-M4 соединяют интерфейсом к остальной


части микроконтроллера через шинную архитектуру Гарварда. Это означает, что у
них есть порт для выбирающих инструкций и констант от памяти кода и второй
порт для доступа к SRAM и периферийным устройствам. Мы посмотрим на
шинный интерфейс более тесно в Главе 5 “Функции Передовой архитектуры”, но в
сущности, шинная архитектура Гарварда увеличивает производительность
процессора Cortex-M, но не представляет дополнительной сложности для
программиста.

Более ранние центральные процессоры ARM, ARM7 и ARM9, поддерживали две


системы команд. Этот код мог быть скомпилирован или как 32-разрядный код ARM
или как 16-разрядный код Ползунка. Система команд ARM позволила бы коду быть
записанным для максимальной производительности, в то время как код Ползунка
достигнет большей плотности кода (Рис. 1.7). Во время разработки должен был
решить программист, какая функция должна быть скомпилирована с ARM 32-
разрядная система команд и который должен быть создан с помощью Ползунка 16-
разрядная система команд. Компоновщик затем взаимодействовал бы эти две системы
команд вместе. В то время как процессоры Cortex-M являются кодом, совместимым с
исходной системой команд Ползунка, они разработаны для выполнения расширенной
версии системы команд Ползунка под названием Ползунок 2. Ползунок 2 является
смешением 16-и 32-разрядные инструкции, который был разработан, чтобы быть
очень C дружественный и эффективен. Даже для наименьшего проекта Cortex-M весь
код может быть написан на высокоуровневом языке, обычно C, без любой
потребности использовать ассемблер.

Рисунок 1.7
Более ранний ARM ЦП имел две системы команд ARM (32 бита) и Ползунок (16
битов). Процессоры Cortex-M имеют систему команд под названием Ползунок 2,
который является смешением 16-разрядных и 32-разрядных инструкций.

С Ползунком 2 системы команд Кора-M3 обеспечивает 1.25 DMIPS/MHz, в то время как


ЦП ARM7 с помощью ARM, 32-разрядная система команд достигает 0.95 DMIPS/MHz и
Ползунка 16-разрядная система команд на ARM7, является 0.7 DMIPS/MHz (Рис. 1.8). ЦП
Cortex-M имеет много аппаратных акселераторов, таких как единственный цикл,
умножаются, аппаратное деление и инструкции по управлению битовым полем что
повышение справки ее производительность по сравнению с основанными на ARM7
устройствами.
Введение в семейство процессоров Cortex-M 9

Рисунок 1.8
Кора-M3 и Ползунок M4 2 системы команд достигают более высоких уровней
производительности или, чем Ползунок или, чем система команд
ARM, работающая на ARM7.

Ползунок 2 системы команд также могут достигнуть превосходной плотности кода,


которая сопоставима с исходной 16-разрядной системой команд Ползунка при
обеспечении большего количества производительности обработки, чем ARM 32-
разрядная система команд (Рис. 1.9).

Рисунок 1.9
Ползунок 2 системы команд Коры-M3 и-M4 достигает той же плотности кода как
Ползунок ARM7 (16 битов) система команд.
10 Глав 1

Все процессоры Cortex-M используют Ползунок 2 системы команд (Рис. 1.10). Кора-
M0 использует подмножество всего 56 инструкций, и Кора-M4 добавляет DSP,
единственную инструкцию несколько данных (SIMD) и инструкции с плавающей
точкой.

Рисунок 1.10
Ползунок 2 масштаба системы команд из 56 инструкций относительно Коры-M0,-
M01 до 169 инструкций относительно Коры-M4.

Кора-M0
Кора-M0 была представлена спустя несколько лет после того, как Кора-M3 была
выпущена и была во всеобщем употреблении. Кора-M0 является намного меньшим
процессором, чем Кора-M3 и может быть всего 12 логическими элементами K в
минимальной конфигурации. Кора-M0 обычно разрабатывается в микроконтроллеры,
которые предназначаются, чтобы быть очень недорогими устройствами и/или
предназначаются для операции низкой мощности. Однако важная вещь состоит в том,
что, после того как Вы понимаете Кору-M3, у Вас не будет проблемы с помощью
Коры-M0; различия главным образом очевидны для высокоуровневых языков (Рис.
1.11).
Введение в семейство процессоров Cortex-M 11

Рисунок 1.11
Кора-M0 является уменьшенной версией Коры-M3, все еще сохраняя ту же модель программистов.

Процессор Cortex-M0 имеет ЦП, который может выполнить подмножество Ползунка


2 системы команд. Как Кора-M3, это имеет трехэтапный конвейер, но никакая
выборка предположения ответвления, поэтому не переходит и переходит в рамках
кода, заставит конвейер сбрасывать и снова наполнять, прежде чем выполнение
сможет возобновиться. Кора-M0 также имеет шинную архитектуру Von Neumann,
таким образом, существует единственный путь для кода и данных. В то время как это
делает для простого дизайна, это может стать узким местом и уменьшить
производительность. По сравнению с Корой-M3 Кора-M0 достигает 0.84 DMIPS/MHz,
который, в то время как меньше, чем Кора-M3 все еще о том же как ARM7, который
имеет три раза количество логического элемента. Так, в то время как Кора-M0 в
заднем конце семейства Cortex-M, это все еще упаковывает большую
вычислительную мощность. Процессор Cortex-M0 имеет тот же NVIC как Кора-M3,
но это ограничено максимумом 32 линий прерывания от периферийных устройств
микроконтроллера. NVIC также содержит таймер SysTick, который полностью
совместим с Корой-M3. Большинство RTOS, которые работают на Коре-M3 и Коре-
M4, будет также работать на Коре-M0, хотя поставщик должен будет сделать
выделенный порт и перекомпилировать код RTOS. Как разработчик, самое большое
различие Вы найдете между использованием Коры-M0, и Кора-M3 является своими
возможностями отладки. В то время как на Коре-M3 и Коре-M4 там обширная
поддержка отладки в реальном времени, Кора-M0 имеет более скромную архитектуру
отладки. На Коре-M0 единица DWT не поддерживает трассировку данных, и ITM не
приспособлен, таким образом, нас оставляют с основным управлением выполнением
(т.е., выполняют, останавливаемся, единственное продвижение и точки останова и
контрольные точки), и непрерывные доступы памяти/периферийного устройства. Это
- все еще улучшение от поддержки JTAG, оказанной на ARM7 и центральных
процессорах ARM9.

В то время как Кора-M0 разработана, чтобы быть высокоэффективным процессором


микроконтроллера, она имеет относительно низкое количество логического элемента.
Это делает это идеальным и для устройств недорогой и для низкой мощности.
12 Глав 1

Потребление типичного питания Коры-M0 составляет 16 мкВт/МГц при выполнении,


и почти обнулите когда в ее режиме ожидания низкой мощности. В то время как
другие 8-и 16-разрядная архитектура могут также достигнуть подобных чисел низкой
мощности, они должны выполнить намного больше инструкций, чем Кора-M0 для
достижения того же конечного результата (Рис. 1.12). Это означает дополнительные
циклы, и дополнительные циклы означали бы больше потребляемой мощности. Если
мы выбираем хороший пример для Коры-M0 такой, когда 16 3 16 умножаются, то
Кора-M0 может выполнить это вычисление в 1 цикле. В сравнении для 8-разрядной
типичной архитектуры как эти 8051 будут нужны по крайней мере 48 циклов, и 16-
разрядной архитектуре будут нужны 8 циклов. Это не только преимущество
производительности, но также и преимущество энергоэффективности также (Таблица
1.1).

Рисунок 1.12
Кора-M0 разработана для поддержки дежурных режимов низкой мощности. По
сравнению с 8-разрядным или 16-разрядным MCU это может остаться в режиме
ожидания в течение намного более длительного времени, потому что это должно
выполнить меньше инструкций, чем 8-/16-bit устройство для достижения того же
результата.

Таблица 1.1: Количество циклов, взятых для 16 3 16, умножается


против типичных 8-и 16-разрядной
архитектуры
8-разрядный Пример
(8051) 16-разрядный Пример ARM Cortex-M
MOV A, R7
MOV B (0xF0), R5 MOV R1, &MulOp1 MULS r0, r1, r0
MUL AB MOV R2, &MulOp2
MOV R0, B (0xF0) MOV SumLo, R3
XCH A, R7 MOV SumHi, R4
MOV B (0xF0), R4
(С отображенной памятью умножают
MUL AB единицу),
ADD A, R0
XCH A, R6
MOV B (0xF0), R5
MUL AB
ADD A, R6
MOV R6, A
RET
Время: 336 тактов Время: 8 тактов Время: 1 такт
Размер кода: 18 Размер кода: 2
байтов Размер кода: 8 байтов байта
Введение в семейство процессоров Cortex-M 13

Как Кора-M3, Кора-M0 также имеет функцию WIC. В то время как WIC связан с
процессором Cortex-M0, он может быть помещен в другой домен питания в
микроконтроллере (Рис. 1.13).

Рисунок 1.13
Процессор Cortex-M разработан для перехода к режимам низкой мощности. WIC
может быть помещен в отдельный домен питания.

Это позволяет производителю микроконтроллеров использовать их экспертные


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

Кора-M01
Процессор Cortex-M01 является вторым поколением сверхнизкое питание ядро
Cortex-M. Это имеет полную совместимость системы команд с Корой-M0,
разрешающей Вам использовать тот же компилятор и отладчики. Как Вы могли бы
ожидать, Кора-M01 имеет некоторые важные улучшения по Коре-M0 (Рис. 1.14).
14 Глав 1

Рисунок 1.14
Кора-M01 полностью совместима с Корой-M0. Это имеет больше расширенных
функций, больше вычислительной мощности и более низкой
потребляемой мощности.

Функцией определения Коры-M01 является своя потребляемая мощность, которая


является всего 9.8 МГц µW/по сравнению с 16 мкВт/МГц для Коры-M0 и 32
мкВт/МГц для Коры-M3. Одно из изменений в архитектуре ключа Коры-M01 является
перемещением к двухэтапному конвейеру. Когда Кора-M0 и Кора-M01 выполняют
условный переход, инструкции в конвейере больше не действительны. Это означает,
что конвейер должен быть сброшен каждый раз, когда существует ответвление. После
того как ответвление было взято, конвейер должен быть снова наполнен для
возобновления выполнения. В то время как это влияет на производительность, это
также означает получать доступ к Флэш-памяти, и каждый доступ стоит энергии, а
также время. Путем перемещения в двухэтапный конвейер количество доступов
Флэш-памяти и следовательно также уменьшается потребление энергии во время
выполнения
(Рис. 1.15).
Рисунок 1.15
Кора-M0 1 имеет двухэтапный конвейер по сравнению с трехэтапным конвейером,
используемым в других процессорах Cortex-M.
Введение в семейство процессоров Cortex-M 15

Другой важной опцией, добавленной к Коре-M01, является новый периферийный


интерфейс I/O, который поддерживает выборку в течение одного цикла к
периферийным регистрам. Единственный интерфейс I/O цикла является стандартным
компонентом карты распределения памяти Коры-M01 и не использует специальных
инструкций или разбитого на страницы обращения. К регистрам, расположенным в
интерфейсе I/O, могут получить доступ нормальные указатели “C” из Вашего кода
приложения. Интерфейс I/O предоставляет более быстрый доступ к периферийным
регистрам с меньшим количеством использования энергии будучи очевидным для
кода приложения. Единственный интерфейс I/O цикла является отдельным от
усовершенствованной высокоскоростной шины (AHB) облегченный интерфейс
внешней шины, таким образом, для процессора возможно выбрать инструкции через
облегченный интерфейс AHB при создании доступа к данным к периферийным
регистрам расположенным в интерфейсе I/O.

Кора-M01 разработана для поддержки выбирающих инструкций от 16-разрядной


Флэш-памяти. Так как большинство инструкций Коры-M01 является 16-разрядным,
это не оказывает основное влияние на производительность, но действительно делает
получающийся дизайн микроконтроллера более простым, меньшим, и следовательно
более дешевым. Кора-M01 имеет некоторые функции Cortex-M3, отсутствующие на
исходной Коре-M0. Это включает MPU, на который мы посмотрим в Главе 5
“Функции Передовой архитектуры” и способность переместить таблицу векторов к
другой позиции в памяти. Эти две функции оказывают улучшенную поддержку
операционной системы (OS) и поддержку более сложных разработок программного
обеспечения с несколькими задачами приложения на едином устройстве (Рис. 1.16).

Рисунок 1.16
Порт I/O позволяет выборку в течение одного цикла к GPIO и
периферийным регистрам.
Кора-M01 также имеет улучшенную архитектуру отладки по сравнению с Корой-M0.
Поскольку мы будем видеть в Главе 7 “Отладку с CoreSight”, это поддерживает тот же
доступ в режиме реального времени к периферийным регистрам и SRAM как Кора-M3
и Кора-M4. Кроме того, Кора-M01 имеет новую функцию отладки, названную “Микро
Буфером трассировки” (MTB) (Рис. 1.17). MTB
16 Глав 1

Рисунок 1.17
Микро Буфер трассировки может быть настроен для записи выполняемых инструкций в
раздел пользователя SRAM. Это может быть считано и отображено как
трассировка инструкции в отладчике ПК.

позволяет выполняемым инструкциям по программе быть зарегистрированными в


регион установки SRAM программистом во время разработки. Когда код
останавливается, эта трассировка инструкции может быть загружена и отображена в
отладчике. Это обеспечивает снимок выполнения кода сразу, прежде чем код был
остановлен. В то время как это - ограниченный буфер трассировки, это чрезвычайно
полезно для разыскивания неуловимых ошибок. К MTB могут получить доступ
стандартные аппаратные средства адаптера отладки провода JTAG/Serial, для которых
Вам не нужен дорогой инструмент трассировки.

Кора-M4
В то время как Кора-M0 может считаться Корой-M3 минус некоторые функции, Кора-
M4 является расширенной версией Коры-M3 (Рис. 1.18). Дополнительные функции на
Коре-M4 фокусируются на поддержке алгоритмов DSP. Типичные алгоритмы
являются преобразованиями, такими как быстрое преобразование Фурье (FFT),
цифровые фильтры, такие как конечная импульсная характеристика (FIR) фильтрует, и
алгоритмы управления, такие как контур управления Пропорционального внутреннего
дифференциала (PID). С ее функциями DSP Кора-M4 создала новое поколение
основанных на ARM устройств, которые могут быть названы контроллерами
цифрового сигнала (DSC). Эти устройства позволяют Вам разрабатывать устройства,
которые комбинируют функции типа микроконтроллера с обработкой сигналов в
реальном времени. В Главе 8 “Практический DSP для Коры-M4 и Коры-M7” мы
посмотрим на расширения DSP Коры-M4 более подробно и также как создать
программное обеспечение, которое комбинирует обработку сигналов в реальном
времени с типичным событийно-ориентированным кодом микроконтроллера.

Кора-M4 имеет ту же базовую структуру как Кора-M3 с теми же режимами


программистов ЦП, NVIC, архитектурой отладки CoreSight, MPU и шинным
интерфейсом. Улучшения по Коре-M3 частично к системе команд, где Кора-M4 имеет
Введение в семейство процессоров Cortex-M 17

Рисунок 1.18
Кора-M4 полностью совместима с Корой-M3, но представляет аппаратный
сопроцессор для операций с плавающей точкой и
дополнительные инструкции по DSP.

дополнительные инструкции по DSP в форме инструкций SIMD. Аппаратные


средства умножаются, накапливаются (MAC) был также улучшен так, чтобы
многие из 32 3 32 арифметических инструкции были единственным циклом
(Таблица 1.2).

Таблица 1.2: Единственный цикл инструкции MAC относительно Коры-


M4

Операция Инструкция
16 316 5 32 SMULBB, SMULBT, SMULTB, SMULTT
16 316 1 32 5 32 SMLABB, SMLABT, SMLATB, SMLATT
16 316 1 64 5 64 SMLALBB, SMLALBT, SMLALTB, SMLALTT
16 332 5 32 SMULWB, SMULWT
(16 3 32) 1 32 5 32 SMLAWB, SMLAWT
(16 3 16) 6 (16 3 16) 532 SMUAD, SMUADX, SMUSD, SMUSDX
(16 3 16) 6 (16 3 16) 1 32 5 32 SMLAD, SMLADX, SMLSD, SMLSDX
(16 3 16) 6 (16 3 16) 1 64 5 64 SMLALD, SMLALDX, SMLSLD, SMLSLDX
32 3 32 5 32 MUL
32 6 (32 3 32) 532 MLA, MLS
32 3 32 5 64 SMULL, UMULL
(32 3 32) 1 64 564 SMLAL, UMLAL
(32 3 32) 1 32 132 564 UMAAL
32 6 (32 3 32) 532 (верхний) SMMLA, SMMLAR, SMMLS, SMMLSR
(32 3 32) 5 32 (верхний) SMMUL, SMMULR
18 Глав 1

Инструкции по DSP
Кора-M4 имеет ряд инструкций SIMD, нацеленных на поддержку алгоритмов DSP.
Эти инструкции позволяют много параллельных арифметических операций в
единственном цикле процессора (Рис. 1.19).

Рисунок 1.19
Инструкции SIMD могут выполнить несколько вычислений в единственном
цикле.

Инструкции SIMD работают с 16-или 8-разрядные данные, которые были упакованы в


32-разрядные количества слова. Так, например, мы можем выполнить, два 16-
разрядных умножается, и суммируйте результат в 64-разрядное слово. Также
возможно упаковать 32-разрядные работы 8-разрядными данными и выполнить
квадратическое 8-разрядное дополнение или вычитание. Как мы будем видеть в Главе
8, инструкции SIMD могут использоваться для обширного улучшения
производительности алгоритмов DSP, таких как цифровые фильтры, которые в
основном работают, много из умножает и суммирует вычисления на конвейере
данных. Процессор Cortex-M4 может также быть оснащен аппаратными средствами
FPU. Этот выбор сделан в стадии проектирования поставщиком микроконтроллера,
так как ETM и MPU, который необходимо будет проверить таблицу данных
микроконтроллера, чтобы видеть, присутствует ли это. FPU поддерживает плавающую
точку одинарной точности арифметические вычисления с помощью стандарта IEEE
754 (Таблица 1.3).

Таблица 1.3: время цикла сопроцессора для операций с


плавающей точкой коры-M4

Операция Количество цикла


Добавить/Вычесть 1
Разделиться 14
Умножиться 1
Умножьтесь накапливаются (MAC) 3
Сплавленный MAC 3
Квадратный корень 14
На маленьких микроконтроллерах математические операции с плавающей точкой
всегда выполнялись библиотеками программного обеспечения, обеспеченными
инструментом компилятора. Как правило, такие библиотеки могут взять сотни
инструкций работать, плавающая точка умножаются. Так, добавление аппаратных
средств вычислений с плавающей точкой, которые могут сделать то же вычисление в
единственном цикле, дает беспрецедентную производительность
Введение в семейство процессоров Cortex-M 19

повышение. FPU может считаться сопроцессором, который находится вместе с


Корой-M4 ЦП. Когда вычисление выполняется, значения с плавающей точкой
передаются непосредственно от регистров FPU до и от хранилища памяти SRAM без
потребности использовать регистры ЦП. В то время как это может звучать
включенным, вся транзакция FPU организована компилятором. Когда Вы создаете
приложение для Коры-M4, можно скомпилировать код для автоматического
использования библиотек программного обеспечения, а не FPU. Затем любые
вычисления с плавающей точкой в Вашем коде “C” будут выполнены на FPU.

С оптимизированным кодом Кора-M4 может выполнить алгоритмы DSP намного


быстрее, чем стандартные микроконтроллеры и даже некоторые выделенные
устройства DSP (Рис. 1.20). Конечно, слово ласки здесь “оптимизировано”, это
означает иметь хорошее знание процессора и алгоритма DSP, который Вы реализуете
и затем рука, кодирующая алгоритм, использующий компилятор intrinsics для
получения лучшего уровня производительности. К счастью, ARM обеспечивает
полную библиотеку DSP с открытым исходным кодом, которая реализует много
обычно необходимых алгоритмов DSP как простые в использовании библиотечные
функции. Мы посмотрим на пользование этой библиотекой в Главе 8 “Практический
DSP для Коры-M4 и Коры-M7”

Рисунок 1.20
MP3 декодирует сравнительный тест.

Кора-M7
Во время записи последнего процессора Cortex-M, который будет выпущен ARM,
Кора-M7. Кора-M7 является самым высоким в настоящее время доступным
процессором Cortex-M7 производительности. Это - на самом деле что-то вроде
преуменьшения. Числа сравнительного теста для Коры-M7 по сравнению с Корой-M4
показывают ниже. Обратите внимание на то, что эти числа показывают на МГц
частоты ЦП. А также значительно превзойдя Кору-M4 по характеристикам Кора-M7
может работать при очень верхних частотах. Короче говоря это оставляет Кору-M4 в
пыли. Однако Кора-M7 все еще поддерживает модель программиста Cortex-M
поэтому при использовании более раннего процессора Cortex-M, перемещающегося в
Кору-M7, не основная проблема (Рис. 1.21).
20 Глав 1

Рисунок 1.21
Кора-M4 по сравнению со сравнительным тестом Коры-M7.

Кора-M7 достигает этого повышения уровней производительности с некоторыми


архитектурными улучшениями и более сложной системой памяти. Кора-M7 ЦП имеет
суперскалярную архитектуру; это означает, что имеет два, параллельны трехэтапным
конвейерам, которые могут двойные инструкции по проблеме. ЦП также способен к
обработке различных групп инструкций параллельно. ЦП также имеет “Целевой Кэш
Адреса Ответвления”, который улучшает производительность высокоуровневых
операторов, таких как условные переходы и что еще более важно циклы. Когда тот же
исходный код будет скомпилирован для Коры-M4 и Коры-M7, значительно
потребуется меньше циклов для работы Коры-M7 (Рис. 1.22).

Рисунок 1.22
Процессор коры-M7.
Введение в семейство процессоров Cortex-M 21

Кора-M7 также представляет более сложную структуру шины. Первые основанные на


ARM микроконтроллеры использовали процессор ARM7, который использовал шину,
названную Усовершенствованной Высокоэффективной шиной (AHB). Поскольку
сложность микроконтроллеров выросла, эта шина стала узким местом, когда было
несколько устройств управления шиной (ЦП и единицы DMA) в микроконтроллере. С
введением семейства Cortex-M AHB был обновлен до облегченной матрицы AHB. Это
в действительности - ряд параллельных шин, которые позволяют нескольким
устройствам управления шиной получать доступ к памяти параллельно. Арбитраж
внутренней шины только происходит, если два устройства управления шиной
пытаются получить доступ к той же группе периферийных устройств или блоку
памяти. Кора-M7 представляет Усовершенствованный Расширяемый Интерфейс (AXI-
M). AXI-M является высокоэффективным 64-разрядным интерфейсом, который
поддерживает несколько выдающихся транзакций памяти. Это также открывает много
возможностей для кремниевых разработчиков разработать многоядерные системы и
является шагом к проектам сети на микросхеме (NoC).

Для Разработчика старшим значащим различием между Корой-M4 и Корой-M7


является более сложная система памяти. Для процессора Cortex-M7 для достижения
очень высоких уровней производительности это имеет иерархию памяти. ЦП имеет
два региона памяти, названной Сильно связанными памятями (TCM) Инструкции и
Данных. I-TCM и D-TCM являются блоками памяти состояния с нулевым временем
ожидания, которая может быть до 16K в размере. Это гарантирует, что к любым
критическим стандартным программам или данным может получить доступ процессор
без любых задержек. Процессор может также включать два кэша до 64K. Эти единицы
обеспечивают до 64K кэша Инструкции и Данных для системной памяти, которая
расположена на шине AXI-M. При разработке приложения, необходимо понять и
управлять этой системой памяти. Как Кора-M4 Кора-M7 имеет дополнительную
возможность DSP в форме инструкций SIMD и может быть оснащена единственным
или двойным Сопроцессором для операций с плавающей точкой прецессии. Кора-M7
может также быть пригодна для важных приложений безопасности. Процессор Cortex-
M7 может быть синтезирован с дополнительной функцией безопасности, такой как
“Коды с коррекцией ошибок” на ее шинных интерфейсах и “Созданный В Сам Тест”
единица. Кора-M7 является также первым процессором Cortex-M, который будет
иметь полный пакет документации безопасности, чтобы позволить Кремниевым
Поставщикам производить полностью, безопасность квалифицировала устройство.

Заключение
Эта книга действительно затрагивает две темы. Введение в аппаратные средства
процессора Cortex-M и также во введении в разработку программного обеспечения
для Основанных на Cortex-M микроконтроллеров. С введением процессора Cortex-M у
нас теперь есть недорогая аппаратная платформа, которая способна к поддержке более
сложной разработки программного обеспечения и в прошлое десятилетие видела
принятие RTOSs, и библиотеки промежуточного программного обеспечения должны
были поддерживать более сложные периферийные устройства, найденные на
устройствах Cortex-M. Таким образом вместе с пониманием функций низкого уровня
процессоров Cortex-M мы также должны использовать более сложные методы
проектирования (Рис. 1.23).
22 Главы 1

Рисунок 1.23
Производительность и питание фигурируют для семейства
процессоров Cortex-M.
CHPTER2

Разработка программного
обеспечения для
Семейство Cortex-M

Введение
Одно из больших преимуществ использования процессора Cortex-M - то, что оно
имеет широкую и растущую поддержку средства разработки диапазона. Существуют
наборы инструментальных средств, доступные максимум на уровне нулевых
нескольких тысяч долларов стоимости в зависимости от глубины Ваших карманов и
типа приложения, которое Вы разрабатываете. Сегодня существует пять основных
наборов инструментальных средств, которые используются для разработки Cortex-M
(Таблица 2.1).

Таблица 2.1: наборы инструментальных средств процессора


Cortex-M
Средство разработки
GNU GCC со свободным и коммерческим IDE
Greenhills
IAR встроенные инструментальные средства для ARM
Комплект разработчика микроконтроллера Keil для ARM (MDK-ARM)
Управление задачами для набора инструментов VX для ARM

Строго говоря GCC GNU является набором инструментальных средств


компоновщика компилятора и не включает интегрированную среду разработки или
отладчик. Много компаний создали набор инструментальных средств вокруг
компилятора GCC путем добавления их собственного IDE и отладчика для
обеспечения полной системы разработки. Некоторые из них перечислены в
приложении; существуют вполне
некоторые, таким образом, это не полный список.

Комплект разработчика микроконтроллера Keil


В этом учебном руководстве мы собираемся использовать MDK-ARM Keil (Комплект
разработчика микроконтроллера для ARM) набор инструментальных средств. MDK-
ARM Keil обеспечивает полную среду разработки для всех Основанных на Cortex-M
микроконтроллеров (Рис. 2.1).

Руководство разработчика по семейству процессоров Cortex-M.


DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00002-5 23
© 2016 Elsevier Ltd. Все права защищены.
24 Главы 2

Рисунок 2.1
Установка Ядра MDK-ARM содержит IDE, компилятор и отладчик.
Поддержка устройства и промежуточного программного
обеспечения добавляется через программные пакеты.

MDK-ARM включает его собственную среду разработки по имени µVision (Микро


Видение), который действует как менеджер проектов редактора и отладчик. Одни из
больших преимуществ MDK-ARM - то, что это использует ARM “C” компилятор. Это -
очень широко используемый компилятор “C\C11”, который непрерывно разрабатывался
ARM, так как их первый ЦП был создан. MDK-ARM также включает интегрированную
Операционную систему реального времени (RTOS) под названием RTX. Все процессоры
Cortex-M способны к выполнению операционной системы, и мы посмотрим на
использование RTOS в Главе 9 “CMSIS-RTOS”. А также включая RTOS, MDK-ARM
включает библиотеку DSP, которой можно пользоваться на Коре-M4 и также Коре-M3. Мы
посмотрим на эту библиотеку в Главе 8 “Практический DSP для Коры-M4 и Коры-M7”.

Программные пакеты
MDK-ARM установлен как базовый набор инструментальных средств. Это состоит из
IDE µVision, компилятора и отладчика плюс утилита, названная установщиком
пакета. Базовый набор инструментальных средств не содержит поддержки
определенных микроконтроллеров Cortex-M. Поддержка определенного семейства
микроконтроллеров Cortex-M установлена через систему программного пакета.
Установщик пакета позволяет Вам выбирать и устанавливать поддержку семейства
микроконтроллеров. После того, как выбранный,
“Пакет Семейства Устройств” будет загружен с веб-сайта Репозитория Пакета и
установлен в набор инструментальных средств. Эта система программного пакета
может также использоваться для распределения библиотек программного
обеспечения и других компонентов программного обеспечения. Мы посмотрим на
то, как сделать компонент программного обеспечения для повторного использования
кода в Главе 12 "Software Components".

Учебные упражнения
Существует несколько основных причин для использования MDK-ARM как среда
разработки для этой книги. Во-первых, это включает ARM “C” компилятор, который
является промышленным ссылочным компилятором для процессоров ARM. Во-
вторых, это включает средство моделирования программного обеспечения который
модели каждый из процессоров Cortex-M и периферийных устройств для диапазона
Основанных на Cortex-M микроконтроллеров. Это позволяет Вам выполнять
большинство учебных примеров в этой книге без потребности в аппаратном
отладчике или оценочной плате. Средство моделирования является очень хорошим
путем к
Разработка программного обеспечения для семейства Cortex-M 25

изучите, как каждый процессор Cortex-M работает, поскольку можно получить так же
очень подробную отладочную информацию от средства моделирования как от
аппаратного отладчика. MDK-ARM также включает первый RTOS для поддержки
спецификации CMSIS-RTOS. Мы будем видеть больше из этого в Главе 9 “CMSIS-
RTOS”, но это - в основном универсальный API для Cortex-M RTOS. В то время как
мы можем использовать средство моделирования для экспериментирования с
различными процессорами Cortex-M, там прибывает точка, когда Вы захотите
выполнить свой код некоторых реальных аппаратных средств. Теперь существует
много очень недорогих модулей, которые включают аппаратные средства отладчика.
Приложение предоставляет URL веб-сайтам, где эти платы могут быть куплены. В
Главе 6 “Процессор Коры-M7”, мы посмотрим на Кору-M7, и практические примеры
будут выполнены на плате исследования STM32F7. Это - недорогая оценочная плата и
широко доступно от большинства поставщиков каталога электроники (Рис. 2.2).

Рисунок 2.2
Недорогие модули Cortex-M включают плату Исследования ST32F7. Мы будем
использовать это управление по Коре-M7 и аппаратному
осуществлению отладки.

Учебные упражнения, описанные в этой книге, приспособлены к использованию


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

Установка
Для практических упражнений в этой книге мы должны установить MDK-ARM
облегченный набор инструментальных средств и “пакеты” Поддержки Семейства
Устройств для микроконтроллеров, которые мы будем использовать и учебный пакет
в качестве примера.
26 Глав 2

Первая Загрузка MDK-ARM Keil, облегченный с www.keil.com.

Облегченный MKD-ARM является бесплатной версией полного набора инструментальных


средств, который позволяет Вам создавать код приложения до 32K размера изображения.
Это включает полностью рабочий компилятор, RTOS и средство моделирования и
работает с совместимыми аппаратными отладчиками. Прямая ссылка для загрузки:
https://www.keil.com/arm/demo/eval/arm.htm.

Если это изменяется со временем, посетите основную веб-страницу Keil и перейдите


по ссылке к инструментам MDK-ARM.
Выполните загруженный исполняемый файл для установки MDK-ARM на ПК.

Запустите IDE µVision

Откройте установщик пакета

В установщике пакета нажмите на вкладку Devices и переместитесь до выбора по


Микроэлектронике ST Ряд STM32F1 (Рис. 2.3).

Рисунок 2.3
Используйте установщик пакета для загрузки файлов поддержки для семейства
STM32F1 микроконтроллеров.
Разработка программного обеспечения для семейства Cortex-M 27

На вкладке Packs выберите Keil:: STM32F1xx_DFP и нажатие кнопка Install.


Повторите этот процесс для установки поддержки следующих семейств устройств
(Таблица 2.2).

Таблица 2.2: семейство Выбранных устройств поддерживает


пакеты
Кремниевый Пакет
поставщик Устройство устройства
Микроэлектроника ST Ряд STM32F7 Keil:: STM32F7xx_DFP
NXP Ряд LPC1700 Keil:: LPC1700_DFP

В разделе Generic Pack окно выбирает и установка или обновляет следующие


пакеты (Таблица 2.3).

Таблица 2.3: Необходимые универсальные программные


пакеты
Универсальный пакет
РУКА:: CMSIS
ARM:: CMIS-Driver_Validation
Keil:: ARM_Compiler

Загрузите пакет в качестве примера для практических упражнений.


Учебные примеры могут быть найдены по http://booksite.elsevier.com/9780081006290.

Загрузите Учебный файл В качестве примера и сохраните его на Вашем жестком


диске. Удостоверьтесь, что это имеет .pack расширение; некоторые браузеры могут
переименовать файл путем предоставления ему .zip расширения.

На веб-сайте страниц Tutorial существует также пакет Утилит. Загрузите этот


пакет на свой жесткий диск и проверьте, что он имеет .pack расширение.

После того как Вы загрузили Учебный Пакет В качестве примера, и Утилиты


упаковывают, двойной щелчок по каждому файлу в свою очередь для установки их
содержания в Набор инструментальных средств MDK-ARM.
Для просмотра примеров откройте установщик пакета.
Выберите вкладку Boards и выберите “Учебное руководство Руководства
Разработчиков”.
Теперь нажмите на вкладку Examples для наблюдения учебных примеров.
Чтобы показать им в порядке, нажмите на серый блок во главе столбца.
Упражнение 2.1 Создание первой программы
Теперь, когда набор инструментальных средств и примеры установлены, мы можем
посмотреть на установку a
проект для типичного маленького Основанного на Cortex-M микроконтроллера.
После того как проект настроен,
28 Глав 2

мы можем познакомиться с IDE µVision, создать код и сделать наши первые


шаги с отладчиком.

Проект Blinky
В этом примере мы собираемся разработать простой проект под названием Blinky.
Код в этом проекте разработан для чтения напряжения с помощью ADC
микроконтроллера. Значение, полученное из ADC, затем отображено как
гистограмма на маленьком жидкокристаллическом дисплее (Рис. 2.4).

Жидкокристаллический дисплей

Микро
Напряжение на
ADC1 channel1

8 светодиодов на GPIO B

Рисунок 2.4
Аппаратные средства проекта Blinky состоят из аналогового источника
напряжения, внешнего жидкокристаллического
дисплея и банка светодиодов.

Код также высвечивает группу светодиодов в последовательности. Существует


восемь светодиодов, присоединенных к контактам порта на порте GPIO B. Скорость,
на которой светодиодная флэш-память установлена значением ADC.
Запустите IDE µVision путем нажатия на значок UV4.

Откройте установщик пакета.


Нажмите на вкладку Boards и выбор “Учебная запись” Руководства Разработчиков
В качестве примера.
Разработка программного обеспечения для семейства Cortex-M 29

Выберите вкладку Examples и нажмите кнопку копирования для “Исключая 1.1


Первыми Проектами”.

Установите каталог установки на подходящее место на Вашем жестком диске.


В следующих инструкциях это местоположение назовут, путь. Проект \First.

В этом осуществлении мы пройдем шаги, необходимые для воссоздания этого


проекта с нуля.
В µVision, близко текущий проект путем выбора project\close проекта из строки
главного меню (Рис. 2.5).

Рисунок 2.5
Закройте любой открытый проект.

Запустите новый проект путем выбора проекта Project\new µVision (Рис. 2.6).

Рисунок 2.6
Создайте новый проект и сохраните его в Первый Каталог проекта.
30 Глав 2

Это откроет меню, просящее название проекта и каталог.

Можно дать проекту любое имя, которое Вы хотите, но удостоверяетесь, что


выбираете, путь. Каталог проекта \First.
Этот каталог содержит файлы исходного кода “C”, которые мы будем использовать в
нашем проекте.
Введите свое название проекта и нажмите Save.
Затем, выберите микроконтроллер для использования в проекте (Рис. 2.7).

Рисунок 2.7
Выберите STM32F103RB из базы данных устройства.

После того как Вы выбрали каталог проекта и сохранили название проекта, новое
диалоговое окно с базой данных устройства будет запущено. Здесь, мы должны
выбрать микроконтроллер, который мы собираемся использовать для этого проекта.
Переместитесь по базе данных устройства и выберите Микроэлектронику ST, “Ряд
STM32F103” и затем STM32F103RB и нажмите "OK". Это настроит проект для этого
устройства; это включает установку корректных параметров компилятора, файла
сценария компоновщика, имитационной модели, соединения отладчика и алгоритмов
программирования Flash.
При выборе STM32F103RB нажать "OK".

Теперь, IDE отобразит “Среду выполнения” (RTE) менеджер. RTE позволяет Вам
выбирать компоненты программного обеспечения, которые были установлены через
систему пакета и добавляют их к нашему проекту. Это позволяет Вам создавать
сложные программные платформы очень быстро. Для справки на любом из
компонентов программного обеспечения нажмите на синюю ссылку в столбце
описания (Рис. 2.8).
Разработка программного обеспечения для семейства Cortex-M 31

Рисунок 2.8
Менеджер по Среде выполнения позволяет Вам добавлять компоненты
программного обеспечения к своему проекту быстро
создать разработку “платформа”.

На данный момент мы должны добавить минимальную поддержку нашего


первоначального проекта (Рис. 2.9).

Рисунок 2.9
Выберите компоненты “Ядра” и “Запуска”.
32 Главы 2

В RTE отметьте поле “CMSIS:: Core” и “Устройство:: поле Startup”.


Это добавляет первоначальный код Запуска и также функции поддержки для
процессора Cortex-M.

Этот пример также использует некоторые функции микроконтроллера, таким


образом, мы сможем использовать его в некоторых файлах поддержки платы. Этот
пример разработан для работы с оценочной платой, названной MCBSTM32E.
Удостоверьтесь, что это - плата, выбранная в столбце Board Support\Variant.
Отметьте поле “Board Support:: ADC” и “Поддержку Совета:: поле LED” (Рис. 2.10).

Рисунок 2.10
Компоненты поддержки платы требуют, чтобы субкомпоненты работали. Пока это не
разрешено, “sel”. Столбец будет окрашен в Оранжевый (Темно-Серый
в печатных версиях).

Окно вывода проверки теперь показывает нам, что компоненты поддержки платы
требуют некоторых дополнительных субкомпонентов (Рис. 2.11).
Рисунок 2.11
Функции светодиодного индикатора требуют, чтобы драйвер GPIO был
добавлен к проекту.
Разработка программного обеспечения для семейства Cortex-M 33

Для добавления в драйвере GPIO, можно или открыть раздел Device RTE и вручную
добавить в драйвере GPIO или просто нажать кнопку твердости RTE, и все
зависимости компонента будут разрешены автоматически (Рис. 2.12).

Рисунок 2.12
Выберите файл поддержки GPIO вручную или нажмите кнопку твердости для
добавления необходимых компонентов
автоматически.

Теперь, когда мы выбрали все компоненты, требуемые нашим проектом, нажмите


кнопку OK, и файлы поддержки будут добавлены к окну проекта (Рис. 2.13).

Рисунок 2.13
Первоначальный проект с выбранными компонентами
программного обеспечения.

Дважды щелкните по startup_stm32F10x.md.s файлу для открытия его в редакторе.


Нажмите на вкладку мастера конфигурации у основания окна редактора (Рис. 2.14).

Рисунок 2.14
Конфигурационные файлы могут быть просмотрены как текст или как
мастера конфигурации.
34 Главы 2

Это преобразовывает исходный файл простого текста в представление, которое


показывает параметры конфигурации в файле (Рис. 2.15).

Рисунок 2.15
Мастер конфигурации позволяет Вам просматривать и изменять #defines в заголовочном
или исходном файле.

Это представление создается XML-тэгами в комментариях исходного файла.


Изменение значений в мастере конфигурации изменяет базовый исходный код. В
этом случае мы можем установить размер стекового пространства и пространства
"кучи".
В представлении проекта нажмите вкладку Books у основания окна (Рис. 2.16).

Рисунок 2.16
Справка набора инструментальных средств.
Разработка программного обеспечения для семейства Cortex-M 35

В окне Books “Полное Пользовательское Руководство” открывает систему


справочной информации для µVision и руководств компилятора (Рис. 2.17).

Рисунок 2.17
Справка компонента программного обеспечения.

В RTE синие гиперссылки в Описании открывают справочные файлы для


определенного компонента программного обеспечения.
Переключитесь назад на представление проекта и добавьте исходные файлы проекта
"C".

Выделите папку “Source Group” в окне проекта, щелкните правой кнопкой и


выберите, “Добавьте Существующие файлы к Group Source Group 1” (Рис. 2.18).

Рисунок 2.18
Добавьте существующий файл к исходной группе проекта.
36 Глав 2

Это откроет диалоговое окно “Add files to Group”. В диалоговом окне добавьте файл
проекта Blinky.c (Рис. 2.19).

Рисунок 2.19
Добавьте Blinky.c.

Проект должен теперь содержать Blinky.c и компоненты RTE (Рис. 2.20).

Рисунок 2.20
Завершенный проект.
Разработка программного обеспечения для семейства Cortex-M 37

Разработайте проект путем выбора project\build цели (Рис. 2.21).

Рисунок 2.21
Разработайте проект.

Это скомпилирует каждый из “.c” модулей в свою очередь и затем соединит их для
создания заключительной прикладной программы. Окно вывода показывает
результат процесса сборки и сообщает о любых ошибках или предупреждениях
(Рис. 2.22).

Рисунок 2.22
О заключительном размере программы сообщают в Окне вывода
Сборки.

О размере программы также сообщают (Таблица 2.4).

Таблица 2.4: использование памяти раздела


Linker

Раздел Описание
Код Размер исполняемого изображения
Данные RO Размер кодовых констант во Флэш-памяти
Размер инициализированной переменной
Данные RW в SRAM
Размер на неинициализированных
Данные ZI переменных в SRAM
Если об ошибках или предупреждениях сообщат в окне сборки, нажимающем на них,
то возьмет Вас к строке кода в окне редактора.
38 Глав 2

Откройте Опции для Целевого диалогового окна (Рис. 2.23).

Рисунок 2.23
Откройте глобальные опции проекта.

Это может быть сделано в меню проектов путем щелчка правой кнопкой по названию
проекта и выбора “Опций для Цели” или путем выбора той же опции в меню проектов из
основной панели инструментов (Рис. 2.24).

Рисунок 2.24
Целевое меню определяет карту распределения памяти проекта.

“Опции для Целевого” диалогового окна содержат все глобальные


настройки проекта.
Разработка программного обеспечения для семейства Cortex-M 39

Теперь выберите вкладку Debug (Рис. 2.25).

Рисунок 2.25
Выберите средство моделирования и имитационную модель
STM32F103RB.

Меню Debug разделяется на две половины. Опции средства моделирования


слева, и аппаратный отладчик справа.
Нажмите поле радио Средства моделирования Использования.

Проверьте, что Диалоговое окно Средства моделирования, DLL установлен на


DARMRM.DLL и параметр, является pSTM32F103RB.
Теперь мы можем добавить сценарий моделирования для обеспечения некоторых
входных значений ADC (Рис. 2.26).

Рисунок 2.26
Откройте файловый менеджер для выбора сценария
моделирования.
40 Глав 2

Нажмите кнопку Файлового менеджера и добавьте файл Dbg_sim.ini, который


находится в первом каталоге проекта как файл инициализации отладчика (Рис. 2.27).

Рисунок 2.27
Добавьте сценарий моделирования.

Файл сценария использует “C” - как язык для моделирования внешнего


оборудования. Весь моделируемый микроконтроллер “контакты” появляется как
виртуальные регистры, которые могут быть считаны из и записаны в сценарием.
Сценарий отладки генерирует моделируемое напряжение для ADC, сценарий для
этого показывают ниже. Это генерирует сигнал, который растет и вниз и он
применяется к виртуальному регистру ADC1_IN1, который является каналом 1
преобразователя ADC 1. Функция twatch читает моделируемые часы процессора и
останавливает сценарий для конкретного количества циклов.
Пустой Аналог сигнала (пускают в ход
предел) {вольты плавающие;

printf ("Аналог (%f) вводимый \n", предел); в то


время как (1) {/* навсегда */
вольты 5 0;
в то время как (вольты, 5 пределов) {
ADC1_IN1 5 вольт; аналоговый вход/* 2 */
twatch (250000);/* 250 000 Повреждений Времени Циклов */
вольты 1 5 0.1; /* увеличивают напряжение */
}
вольты 5 пределов;
в то время как (вольты.5 0.0)
{ADC1_IN1 5 вольт;
Разработка программного обеспечения для семейства Cortex-M 41

twatch (250000);/* 250 000 Повреждений Времени Циклов


*/вольты - 5 0.1;/* уменьшают напряжение */
}
}
}

Нажмите "OK" для закрытия опций для Целевого диалогового окна.


Теперь запустите Отладчик и выполните код (Рис. 2.28).

Рисунок 2.28
Запустите отладчик.

Это подключит µVision к Имитационной модели и загрузит изображение проекта в


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

Рисунок 2.29
Представление отладки.

Отладчик µVision разделен на многие окна, которые позволяют Вам исследовать и


управлять выполнением своего кода. Ключевые окна показывают в Фигах. 2.30 2.35.
42 Главы 2

Рисунок 2.30
Окно Register.

Окно Register отображает текущее содержание регистрового файла ЦП (R0-R15).


Регистр состояния Программы (xPSR) и также Основной указатель вершины стека (MSP)
и Указатель стека процесса (PSP). Мы посмотрим на все эти регистры в следующей главе
(Рис. 2.31).

Рисунок 2.31
Окно Disassembly.

Поскольку его имя подразумевает, окно Disassembly покажет Вам список ассемблеров
низкого уровня, чередованный с высокоуровневым "C" листингом кода. Одна из
больших достопримечательностей семейства Cortex-M - то, что весь Ваш код проекта
может быть написан на высокоуровневом языке, таком как “C\C11”. Вы никогда или
очень редко не должны писать ассемблерные подпрограммы низкого уровня. Однако
полезно смочь “прочитать” ассемблерный код низкого уровня для наблюдения то, что
делает компилятор. Окно дизассемблирования показывает абсолютный адрес текущей
команды, затем, это показывает Код операции, это - или 16-разрядная инструкция или
32-разрядная инструкция. Необработанный OP
Разработка программного обеспечения для семейства Cortex-M 43

Код затем отображен как ассемблерная мнемосхема. Текущее местоположение


счетчика команд показывает желтая стрелка в левом поле. Темно-серые блоки
указывают на местоположение исполняемых строк кода (Рис. 2.32).

Рисунок 2.32
Окно Editor.

Окно исходного кода имеет подобное расположение окно дизассемблирования. Это окно
просто отображает высокоуровневый "C" исходный код. Текущее местоположение
счетчика команд показывает желтая стрелка в левом поле. Blue Arrow показывает
местоположение курсора. Как окно дизассемблирования, темно-серые блоки указывают на
местоположение исполняемых строк кода. Исходное окно позволяет Вам иметь много
открытых модулей проекта. Каждый исходный модуль может быть достигнут путем
нажатия на вкладку наверху окна.

Командное окно позволяет Вам вводить команды отладчика, чтобы


непосредственно настроить и управлять функциями отладчика. Эти команды могут
также быть сохранены в текстовом файле и выполнены как сценарий, когда
отладчик запускается (Рис. 2.33).
Рисунок 2.33
Командная строка отладчика.
44 Главы 2

Рядом с командным окном группа окон часов. Эти окна позволяют Вам
просматривать локальные переменные, глобальные переменные и необработанную
память (Рис. 2.34).

Рисунок 2.34
Переменное окно часов.

Можно управлять выполнением кода через значки на панели инструментов (Рис.


2.35). Код может быть единственным, ступил “C” или собрал строку за один раз или
работал в полной скорости и остановился. Те же команды доступны через меню
отладки, которое также показывает ярлыки функциональной клавиши, которые
можно предпочесть.

Рисунок 2.35
Панель инструментов Debugger.

Установите точку останова на основном цикле с условием


продолжения в Blinky.c (Рис. 2.36).
Разработка программного обеспечения для семейства Cortex-M 45

Рисунок 2.36
Точка останова отображена как красная точка (Рядом со строкой
53).

Можно установить точку останова путем перемещения курсора мыши в темно-


серый блок рядом с номером строки и щелчком левой кнопкой. Точка останова
отмечена красной точкой.
Запустите выполнение кода.

Со сценарием моделирования на месте мы сможем выполниться, весь


жидкокристаллический дисплей кодирует и достигает точки останова (Рис. 2.37).

Рисунок 2.37
Установите точку останова на основном цикле с условием продолжения. Если Вы
добираетесь здесь, код инициализации работал успешно.

Теперь проведите несколько минут, исследуя отладчик выполненное управление (Рис.


2.38).

Рисунок 2.38
Панель инструментов одноэтапные опции.
Используйте одноэтапные команды, установите точку останова и запустите
средство моделирования, работающее в полной скорости. Если Вы теряете то,
что продолжается, выйдите, отладчик выбором
отлаживают/начинают/останавливают отладчик и затем перезапускают снова.
46 Глав 2

Добавьте переменную к окну Watch.

После того как Вы закончили ознакомляться с командами управления выполнением


в отладчике, определяют местоположение основного () функция в Blinky.c. Чуть
выше основного () объявление для переменной под названием ADC_DbgValue.
Выделите эту переменную, щелкните правой кнопкой, и выбор, “Добавьте
ADC_DbgValue” для Наблюдения 1 (Рис. 2.39).

Рисунок 2.39
Добавьте ADC_DbgValue для наблюдения 1.

Теперь запустите выполнение кода, и Вы сможете видеть переменное обновление


ADC_DbgValue в окне часов.

Сценарий моделирования подает напряжение к моделируемому


микроконтроллеру, который в свою очередь предоставляет преобразованные
результаты коду приложения.
Теперь добавьте ту же переменную к окну Logic Trace.
Отладчик µVision также имеет логическую функцию трассировки, которая
позволяет Вам визуализировать исторические ценности данной глобальной
переменной. В окне часов (или окне исходного кода), выделите имя переменной
AD_DbgValue, щелкните правой кнопкой, и выбор добавляет AD_DbgValue к
Анализатору логики (Рис. 2.40).
Рисунок 2.40
Добавление переменной к Анализатору логики.
Разработка программного обеспечения для семейства Cortex-M 47

Если окно Logic Analyzer не открывается автоматически избранный это от


панели инструментов (Рис. 2.41).

Рисунок 2.41
Открытие анализатора логики.

Теперь с выполнением кода, нажмите кнопку Min\Max Auto, которая установит


минуту и макс. значения и также нажмет уменьшение кнопки для получения до
разумных временных рамок. После того как это сделано, Вы сможете просмотреть
трассировку значений, сохраненных в переменной AD_DbgVal. Можно добавить
любые другие глобальные переменные или периферийные регистры к окну
анализатора логики (Рис. 2.42).

Рисунок 2.42
Анализатор логики.

Представление Now состояние пользовательских периферийных устройств.

Средство моделирования имеет модель целого микроконтроллера не только процессор


Cortex-M, таким образом, возможно исследовать состояние периферийных устройств
микроконтроллера непосредственно.
Выберите peripherals\General цель IO\GPIOB (Рис. 2.43).
48 Глав 2

Рисунок 2.43
Периферийное окно GPIO B.

Это откроет окно, которое отображает текущее состояние порта GPIO


микроконтроллера B. Когда моделирование работает, мы видим состояние контактов
порта. Если контакты настроены как исходные данные, мы можем вручную
установить и очистить их путем нажатия на отдельные поля “Pins”.
Можно сделать то же для ADC путем выбора ADC1 (Рис. 2.44).

Рисунок 2.44
Открытие периферийного устройства ADC просматривает
окно.
Разработка программного обеспечения для семейства Cortex-M 49

Когда код работает, возможно видеть текущую конфигурацию ADC и результатов


преобразования. Можно также вручную установить входное напряжение путем ввода
нового значения в поля Analog Inputs (Рис. 2.45).

Рисунок 2.45
Периферийное окно ADC.

Средство моделирования также включает терминал, который обеспечивает канал I\O


для микроконтроллеров UARTS.
50 Глав 2

Выберите view\serial windows\UART окно № 1.

Это открывает консольное окно типа, которое отображает вывод от выбранного


UART и также позволяет Вам входным значениям (Рис. 2.46).

Рисунок 2.46
Окно консоли UART.

Средство моделирования также имеет некоторые усовершенствованные


аналитические инструменты включая трассировку, покрытие кода и анализ
производительности.
Откройте меню View\Trace и выберите Данные Трассировки и Включите Запись
Трассировки (Рис. 2.47).

Рисунок 2.47
Включение инструкции Трассировки.

Это откроет окно Trace инструкции. Трассировка записывает историю каждой


инструкции, выполняемой (Рис. 2.48).
Разработка программного обеспечения для семейства Cortex-M 51

Рисунок 2.48
Трассировка инструкции.

Теперь откройте окна View\Analysis\Code Coverage и View\Analysis\Performance


Analyzer (Рис. 2.49).

Рисунок 2.49
Выбор анализатора производительности.

Окно “Performance Analysis” показывает количество вызовов к функции и ее


кумулятивное время выполнения (Рис. 2.50).

Рисунок 2.50
Окно Performance Analyzer.

Окно покрытия кода предоставляет обзор количества выполняемых строк и частично


выполняемых в каждой функции (Рис. 2.51).
52 Главы 2

Рисунок 2.51
Окно Code Coverage.

И “Покрытие Кода” и “Анализ Производительности” важны для проверки и


тестирования программного обеспечения. В Главе 7 “Отладка с CoreSight” мы будем
видеть, как эта информация может быть получена из реального микроконтроллера.

Конфигурация проекта
Теперь, когда Вы знакомы с основными характеристиками отладчика, мы можем
посмотреть более подробно на то, как код проекта создается.
Сначала выйдите из отладчика путем выбора сеанса отладки Debug\Start\Stop (Рис.
2.52).

Рисунок 2.52
Выйдите из отладчика.

Откройте диалоговое окно “Options for Target”.


Все ключевые глобальные настройки проекта могут быть найдены в “Опциях для
Целевого” диалогового окна (Рис. 2.53).
Разработка программного обеспечения для семейства Cortex-M 53

Рисунок 2.53
Опции для Целевого диалогового окна.

Вкладка Target определяет расположение памяти проекта. Основной шаблон


определяется при создании проекта. На этом микроконтроллере существует 128K
внутренней Флэш-памяти и 20K SRAM. Если необходимо определить более сложное
расположение памяти, возможно создать дополнительные регионы памяти для
подразделения энергозависимой и энергонезависимой памяти (Рис. 2.54).

Рисунок 2.54
Меню Target определяет карту распределения памяти проекта.

Чем более сложная карта распределения памяти выше разделила внутренний Flash на
два блока и определила, тем более низкий блок Flash как регион по умолчанию для
кода и постоянных данных. Ничто не будет помещено в верхний блок, если Вы явно
не скажете компоновщику делать это. Точно так же SRAM был разделен на два
региона, и верхний регион не использован, если Вы явно не говорите компоновщику
использовать его. Когда компоновщик разрабатывает проект, он ищет маркировку
кода “СБРОСА”. Компоновщик затем помещает код сброса в базе в регионе кода,
определяемом как регион Запуска. Первоначальный код Запуска запишет все
внутренние SRAM для обнуления, если Вы не отметите поле NoInit для данного
региона SRAM. Затем SRAM оставят с его значениями мусора запуска. Это может
быть полезно, если Вы хотите допускать мягкую перезагрузку, где некоторые
системные данные сохраняются.
54 Главы 2

Если Вы хотите поместить объекты (код или данные) в неиспользованный регион


памяти, выберите модуль проекта, щелкните правой кнопкой и откройте его
локальные опции (Рис. 2.55).

Рисунок 2.55
Открытие локальных опций проекта.

В его локальных опциях поля присвоения памяти позволяют Вам вызывать


различные объекты памяти в модуле в определенный регион кода (Рис. 2.56).

Рисунок 2.56
Выбор регионов памяти для модуля. Это переопределяет глобальные
настройки.

Назад в основных опциях для меню Target существует опция установить


Внешнюю Кристаллическую частоту, используемую микроконтроллером (Рис.
2.57).
Разработка программного обеспечения для семейства Cortex-M 55

Рисунок 2.57
Кристалл (Xtal) частота только используется средством
моделирования.

Часто это будет стандартным значением, которое может быть умножено на


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

MDK-ARM Keil идет с двумя наборами библиотеки ANSI (Рис. 2.58). Первой является
стандартная библиотека, которая идет с компилятором ARM. Это полностью совместимо с
текущим ANSI, стандартным, и как таковым имеет большое место кода для использования
микроконтроллера. Вторая библиотека установила, Keil MicroLIB, эта библиотека была
записана в более ранний стандарт ANSI, стандарт C99. Эта версия стандарта ANSI больше
соответствует потребностям пользователей микроконтроллера (Таблица 2.5).

Рисунок 2.58
Выбор библиотеки MicroLIB.

Таблица 2.5: сравнение Размера между стандартными библиотеками ARM ISO и


библиотекой Keil MicroLIB
Сохранение
Процессор Объект Стандарт MicroLIB (%)
Библиотека
Кора-M0 (1) Ползунок otal 16,452 5996 64
Общее
количество
RO 19,472 9016 54
Общее
количество
Кора-M3\M4 Ползунок 2 библиотеки 15,018 5796 63
Общее
количество
RO 18,616 8976 54

Путем выбора MicroLIB Вы сохраните по крайней мере 50% стихов места кода
библиотеки ANSI библиотеки компилятора ARM. Так попытайтесь использовать
MicroLIB по мере возможности. Однако это имеет некоторые ограничения прежде
всего, это не поддерживает все функции в standardlib и вычислениях плавающей точки
двойной точности. В большом количестве приложений можно жить с этим.
56 Глав 2

“Поле галочки” Оптимизации перекрестного Модуля Использования включает


многопроходный процесс соединения, который полностью оптимизирует Ваш код
(Рис. 2.59). При использовании этой опции генерация кода изменяется, и выполнение
кода больше не может отображаться непосредственно на исходный код “C”. Не
используйте эту опцию, когда Вы тестируете и отлаживаете код, поскольку Вы не
сможете точно следовать за ним в окне исходного кода отладчика. Мы посмотрим на
другие опции, системное средство просмотра файловая и операционная система
позже в более поздних главах.

Рисунок 2.59
Оптимизация перекрестного модуля включает многопроходный процесс компиляции
для лучшей генерации кода.

Выходное меню позволяет Вам управлять заключительным изображением своего проекта


(Рис. 2.60). Здесь, мы можем выбрать между генерацией автономной программы выбором,
“Создают Исполняемый файл”, или мы можем создать библиотеку, которая может быть
добавлена к другому проекту. Значение по умолчанию должно создать автономный
проект с отладочной информацией. Когда Вы доберетесь к концу проекта, Вы должны
будете
Рисунок 2.60
Выходное диалоговое окно.
Разработка программного обеспечения для семейства Cortex-M 57

выберите, “создают шестнадцатеричный файл” опция генерировать файл HEX32, который


может использоваться с производственным программистом. Если Вы хотите разработать
проект за пределами µVision, выбор Создают Пакетный файл, и это произведет a, Проект
name..bat пакетный файл DOS, который может быть выполнен из другой программы для
восстановления проекта за пределами IDE. По умолчанию название заключительного
изображения всегда является тем же как Вашим названием проекта. Если Вы хотите
измениться, это просто изменяет поле “Name of Executable”. Можно также выбрать
каталог для хранения всего проекта, компилятора, и компоновщик генерировал файлы.
Это гарантирует, что исходный каталог проекта только содержит Ваш код
первоисточника. Это может сделать жизнь легче при архивации проектов.

Вкладка Listing позволяет Вам включать списки компиляторов и файлы карты


компоновщика (Рис. 2.61). По умолчанию файл карты компоновщика включен.
Быстрый способ открыть файл карты состоит в том, чтобы выбрать окно проекта и
двойной щелчок по корню проекта. Файл карты компоновщика содержит большую
информацию, которая может казаться непостижимой сначала, но существует
несколько важных разделов, которые необходимо учиться читать и следить при
разработке реального проекта. Первой является “карта распределения памяти
изображения”. Это показывает Вам подробное расположение памяти Вашего проекта.
Каждый сегмент памяти показывают против его абсолютного местоположения в
памяти. Здесь можно отследить, какие объекты были расположены к который регион
памяти. Можно также видеть
Рисунок 2.61
Диалоговое окно Списка.
58 Глав 2

общая сумма ресурсов памяти выделила, местоположение стека, и также если этому
включают местоположение памяти "кучи" (Рис. 2.62).

Рисунок 2.62
Список символов файла карты компоновщика.

Второй раздел дает Вам обзор ресурсов памяти, требуемых каждым модулем и
библиотекой в проекте вместе с деталями полного требования к памяти.
Использование памяти изображений разломано на размер кода. Размер данных кода
является объемом энергонезависимой памяти, используемой для хранения значений
инициализации, которые будут загружены в переменные RAM на запуске. В простых
проектах эти данные инициализации сохранены как простая таблица ROM, которая
записана в корректные местоположения RAM кодом запуска. Однако в проектах с
большим объемом инициализируемых данных, компилятор будет переключать
стратегии и использовать алгоритм сжатия для уменьшения размера данных
инициализации.
Разработка программного обеспечения для семейства Cortex-M 59

На запуске распаковывается эта таблица, прежде чем данные записаны в переменные


местоположения в памяти. Ввод данных RO перечисляет объем энергонезависимой
памяти, используемой для хранения литералов кода. Использование SRAM
разделяется на инициализированные данные RW и деинициализирует данные ZI
(Рис. 2.63).

Рисунок 2.63
Список разделов файлов карты компоновщика.

Следующая вкладка является вкладкой User. Это позволяет Вам добавлять внешние
утилиты к процессу сборки. Меню позволяет Вам выполнять утилиту к пред - или
постобрабатывать файлы в проекте.
Утилита может также быть выполнена, прежде чем каждый модуль компилируется.
Дополнительно, можно также запустить отладчик, после того как процесс сборки
закончился (Рис. 2.64).
60 Глав 2

Рисунок 2.64
Пользовательское диалоговое окно.

Кодом, сгенерированным компилятором, управляет вкладка C\C11. Это управляет


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

Рисунок 2.65
Отсчитайте поля могут иметь три состояния.
Разработка программного обеспечения для семейства Cortex-M 61

Они могут быть неконтролируемы, согласованы чистая черная галочка или


согласованы серый
галочка. Здесь, серая галочка означает, “наследовали глобальные опции”, и это -
состояние по умолчанию.

Самая важная опция в этом меню является управлением оптимизацией (Рис. 2.66). Во
время разработки и отладки Вас должен оставить уровень оптимизации в нуле. Затем
сгенерированные кодированные карты непосредственно к высокоуровневому "C"
исходному коду и легко отладить. Поскольку Вы увеличиваете уровень оптимизации,
компилятор будет использовать все более агрессивные методы для оптимизации кода.
На высоком уровне оптимизации, сгенерированном коде
больше карты тесно к коду первоисточника, который затем делает использование
отладчика очень трудным. Например, когда Вы одноэтапный код, его выполнение
больше не будет следовать за ожидаемым путем через исходный код. Установка
точки останова может также быть бессистемной, поскольку сгенерированный код не
может существовать на той же строке как исходный код. По умолчанию компилятор
генерирует наименьшее изображение. Если необходимо получить максимальную
производительность, можно выбрать опцию “Optimize for Time”. Затем стратегия
компилятора будет изменена для генерации самого быстрого исполняемого файла
код (Рис. 2.67).

Рисунок 2.66
Локальные опции модуля.
62 Главы 2

Рисунок 2.67
Диалоговое окно C\C11.

Меню компилятора также позволяет Вам вводить любой #defines, который Вы хотите
передать исходному модулю, когда это компилируется. При структурировании
проекта по нескольким каталогам, можно также добавить локальный, включают пути
к каталогам с заголовочными файлами проекта. Текстовое поле Misc Controls
позволяет Вам добавлять любые переключатели компилятора, которые
непосредственно не поддерживаются в главном меню. Наконец, полная строка
управления компилятором отображена, это включает опции CPU, проект включает
пути и пути к библиотеке и сделать файлы зависимости.
Разработка программного обеспечения для семейства Cortex-M 63

Существует также ассемблерное Окно настроек, которое включает многие из тех же


опций как меню “C\C11” (Рис. 2.68). Однако большая часть проекта Cortex-M записана
полностью в “C \C11”, таким образом, с удачей Вы никогда не должны будете
использовать это меню!.

Рисунок 2.68
Ассемблерное диалоговое окно.
64 Главы 2

Рисунок 2.69
Диалоговое окно Компоновщика.

По умолчанию меню Linker импортирует расположение памяти из меню Target (Рис.


2.69). Это расположение памяти преобразовывается в “точечный” файл
компоновщика. Точечный файл предоставляет текстовое описание расположения
памяти компоновщику, таким образом, это может создать заключительное
изображение. Пример точечного файла показывают ниже.
*************************************************************
Файл Описания Загрузки вразброс *** сгенерирован uVision ***
*************************************************************
LR_IROM1 0x00000000 0x00040000 {; регион загрузки size_region
ER_IROM1 0x00000000 0x00040000 {; загрузитесь обращаются к 5 адресам
выполнения *.o (СБРОС, 1 Первое)
* ($Sections InRoot$)
.ANY (1RO)
}
RW_IRAM1 0x10000000 0x00004000 {; данные RW
.ANY (1RW 1 ZI)
}
RW_IRAM2 0x2007C000 0x00008000 {
.ANY (1RW 1 ZI)
}
}
Разработка программного обеспечения для семейства Cortex-M 65

Точечный файл определяет ROM и регионы RAM и сегменты программы, которые


должны быть помещены в каждый сегмент. Точечный файл в качестве примера
сначала определяет регион ROM 256K. Вся эта память выделяется в одном банке.
Точечный файл также говорит компоновщику помещать сегмент сброса, содержащий
таблицу векторов в начале этого раздела. Затем, точечный файл говорит
компоновщику помещать все остающиеся энергонезависимые сегменты в этот регион.
Точечный файл также определяет два банка SRAM 16K и 32K. Компоновщику затем
разрешают использовать и страницы SRAM для инициализированных и
неинициализированных переменных. Это - простое расположение памяти, которое
отображается непосредственно на память микроконтроллеров. Если необходимо
использовать более сложное расположение памяти, можно добавить регионы
дополнительной памяти в меню Target, и это будет отражено в точечном файле.
Однако, при необходимости в сложной карте распределения памяти, которая не может
быть определена через меню Target затем, необходимо будет записать собственный
точечный файл. Прием здесь должен стать настолько близким, как Вы можете с меню
Target и затем вручать редактированию точечный файл.

При использовании собственного точечного файла необходимо затем снять флажок с


“Расположением Памяти использования от Целевого Диалогового окна” и затем
вручную выбрать новый точечный файл с помощью текстового поля Scatter File (Рис.
2.70).

Рисунок 2.70
Используя пользовательский точечный файл.

Упражнение 2.2 Аппаратная отладка


В этом разделе мы посмотрим на конфигурирование отладчика для использования
аппаратного интерфейса отладки, а не внутреннего средства моделирования. В этом
осуществлении мы будем использовать плату Исследования STM32F7, но
инструкции ниже могут быть применены к любой другой аппаратной установке
отладки. При использовании другой платы, необходимо установить пакет семейства
устройств для микроконтроллера, используемого на плате. В примерах пакета
устройства обычно будет проект Blinky.
66 Глав 2

Откройте установщик пакета.


Выберите вкладку Boards и “Учебные Примеры Руководства Разработчиков”.
Выберите вкладку Example и Копию “Исключая 2.2 Аппаратными
Отладками”.
Проект, показанный здесь, для платы Исследования STM32F7.
Подключите плату Исследования к ПК с помощью USB мини-коннектор.
Разработайте проект.
Проект создается и создает точно таким же образом как версия средства
моделирования.
Откройте Опции для Целевого диалогового окна и вкладки Debug (Рис. 2.71).

Рисунок 2.71
Выбор аппаратных средств отлаживает интерфейс.

В меню Debug опция “Use” была переключена для выбора аппаратного


отладчика, а не средства моделирования. Мы можем также выбрать аппаратный
интерфейс отладки. Для платы Исследования используется отладчик Ссылки ST.
Разработка программного обеспечения для семейства Cortex-M 67

Рисунок 2.72
Установка алгоритма программирования Flash от диалогового окна Настроек
Утилит.
Теперь откройте меню утилит (Рис. 2.72).

Когда проект будет создан, меню Utilities отметят поле “Use Debug Driver”. Это
вынудит программиста Flash использовать тот же аппаратный интерфейс, выбранный
в меню Debug. Однако меню Utilities позволяет Вам выбирать инструмент для
программирования Флэш-памяти микроконтроллера. Это может быть другим
интерфейсом отладки или внешним инструментом, таким как инструмент Silicon
Vendor Bootloader.
Наиболее распространенные проблемы программирования Flash упоминаются ниже
(Рис. 2.73).
Рисунок 2.73
Цель обновления должна быть выбрана для автоматического программирования Flash, когда
отладчик запускается.
68 Глав 2

Одна точка, которую стоит отметить в меню Utilities, является “Целью обновления
перед Отладкой” поля галочки.

Когда эта опция будет отмечена, Флэш-память будет повторно запрограммирована,


когда отладчик запускается. Если это не проверяется затем, необходимо вручную
повторно программировать Flash путем выбора Flash \Download от основной панели
инструментов (Рис. 2.74).

Рисунок 2.74
Вручную загрузка программы отображает к Flash.

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


ошибочное всплывающее окно окна (Рис. 2.75).

Рисунок 2.75
Программная ошибка Flash.

Окно вывода сборки сообщит о дальнейших сообщениях диагностики. Наиболее


распространенная ошибка является недостающим алгоритмом Flash. Если Вы видите,
что следующее сообщение проверяет, что “опции для target\utilities” меню настроены
правильно.
Никакой Алгоритм, найденный для: 00000000-й 000032A3H
Стирание пропускается!

Когда отладчик запустится, он проверит содержание Flash против изображения


программы. Если Flash не соответствует, текущее изображение, Вы получите ошибку
несоответствия памяти, и отладчик не запустится. Это означает, что изображение
Flash устарело, и текущая версия должна быть загружена во Флэш-память (Рис. 2.76).
Разработка программного обеспечения для семейства Cortex-M 69

Рисунок 2.76
Ошибка проверки Flash.

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

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


загрузит код во Флэш-память микроконтроллера и позволит интерфейсу отладчика
управлять реальным микроконтроллером вместо имитационной модели.
Эксперимент с отладчиком взаимодействует через интерфейс теперь, когда он
подключен к реальным аппаратным средствам.

Вы заметите, что некоторые функции, доступные в средстве моделирования, не


присутствуют при использовании аппаратного модуля. Это Трассировка
Инструкции, Покрытие Кода и окна Performance Analysis. Эти функции доступны с
аппаратной отладкой, но Вам нужно больше интерфейса передового оборудования
для получения их. У нас будет более глубокий взгляд на систему отладки CoreSight в
Главе 7 “Отладкой с CoreSight”.

Заключение
К концу этой главы необходимо смочь установить основной проект Cortex-M, создать
код и смочь отладить его в средстве моделирования или на подходящем аппаратном
модуле. В следующей главе мы начнем смотреть на семейство Cortex-M процессоров
более подробно и затем продолжать смотреть на некоторые практические проблемы,
вовлеченные в разработку программного обеспечения для работы их.
Эта страница, намеренно
оставленная незаполненный
CHPTER3

Архитектура Cortex-M

Введение
В этой главе мы более внимательно рассмотрим в архитектуре процессора Cortex-
M. Объем этой главы сконцентрируется на процессоре Cortex-M3. После того как у
нас есть твердое понимание Коры-M3, мы посмотрим на основные отличия в Коре-
M0, Коре-M01 и Коре-M4. Существуют некоторые значительные дополнения в
процессоре Cortex-M7, и мы посмотрим на них в Главе 6 “Процессор Cortex-M7”.
Через главу существует много упражнений. Они дадут Вам более глубокое
понимание каждой темы и могут использоваться в качестве ссылки при разработке
собственного кода.

Система команд Cortex-M


Поскольку мы видели в Главе 1 “Введение в семейство процессоров Cortex-M”,
процессоры Cortex-M являются основанными на RISC процессорами, и как таковой
имеют маленький набор инструкций.
Кора-M0 имеет всего 56 инструкций, Кора-M3 имеет 74, и Кора-M4 имеет 137 с
опцией дополнительных 32 для сопроцессора для операций с плавающей точкой.
Центральные процессоры ARM ARM7 и ARM9, которые первоначально
использовались в микроконтроллерах, имеют две системы команд ARM (32 бита)
система команд и Ползунок (16 битов) система команд. Система команд ARM была
разработана для получения максимальной производительности от ЦП, в то время
как система команд Ползунка дала хорошую плотность кода, чтобы позволить
программам вписываться в ресурсы ограниченной памяти маленького
микроконтроллера. Разработчик должен был решить, какая функция была
скомпилирована с системой команд ARM и который был скомпилирован с
системой команд Ползунка. Затем две группы функций могли
“взаимодействоваться” вместе для создания заключительной программы. Система
команд Cortex-M основана на более ранней 16-разрядной системе команд Ползунка,
найденной в процессорах ARM, но расширяет инструкцию по Ползунку создать
объединенную систему команд со смешением 16-и 32-разрядные инструкции (Рис.
3.1).
Руководство разработчика по семейству процессоров Cortex-M.
DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00003-7 71
© 2016 Elsevier Ltd. Все права защищены.
72 Главы 3

Рисунок 3.1
ARM7 и ЦП ARM9 имели отдельные 32-разрядные и 16-разрядные
системы команд. Процессор Cortex-M имеет единственную систему команд,
которая является смешением 16-и 32-разрядный
инструкции.

Система команд Cortex-M, названная Ползунком 2, разработана, чтобы быть


хорошей целью для инструментов компилятора. Хорошие новости - то, что Ваш
целый проект Cortex-M может быть кодирован на высокоуровневом языке, таком
как “C/C11” без потребности в кодированном ассемблере любой руки. Полезно
смочь “считать” Ползунок 2 ассемблерных кода через отладчик
Окно Disassembly для проверки то, что составил компилятор, но необходимо будет
крайне редко записать ассемблерную подпрограмму. Существует некоторый
полезный Ползунок 2 инструкции, которые не являются достижимым
использованием языка “C”, но большинство наборов инструментальных средств
компилятора предоставляет внутренние инструкции, которые могут
использоваться для доступа к этим инструкциям из кода “C”.

Модель программиста и регистры ЦП


Процессоры Cortex-M наследовали RISC ARM, загрузку, и хранят принцип действия.
Это означает, что, чтобы сделать любой вид обработки данных, инструкция, такая как
ADD или ВЫЧЕСТЬ данные должна сначала быть загружена в регистры ЦП;
инструкция по обработке данных выполняется, и результат затем хранится назад в
оперативной памяти. Это означает это
код, выполняющийся на процессоре Cortex-M, вращается вокруг центральных
регистров ЦП (Рис. 3.2).
Архитектура Cortex-M 73

Рисунок 3.2
Регистры ЦП Cortex-M состоят из 16 регистров данных, регистра состояния
программы и четырех специальных функциональных регистров. R13 R15 используется
в качестве указателя вершины стека, регистра ссылки и счетчика команд. R13 является
окруженным валом регистром, который позволяет ЦП Cortex-M работать с двойными
стеками.

На всех процессорах Cortex-M регистровый файл ЦП состоит из 16 регистров данных,


сопровождаемых Регистром состояния программы (PSR) и группой регистров
конфигурации. Все регистры данных (R0 R15) 32 бита шириной и могут быть
получены доступ всем Ползунком 2 загрузки и инструкции по хранилищу. К
остающимся регистрам ЦП могут только получить доступ две специализированных
инструкции, Регистр Перемещения к Специальному Регистру (MRS) и Перемещение
Специальные Регистры для Регистрации (MSR). R0 R12 Регистров является
регистрами обычного пользователя и используется компилятором, как он считает
целесообразным. R13 R15 регистров имеет специальные функции. R13 используется
компилятором в качестве указателя вершины стека, это - на самом деле окруженный
валом регистр с двумя регистрами R13. Когда процессор Cortex-M выходит из сброса,
второй регистр R13 не включен и выполнения процессора в “простом” режиме с
одним указателем вершины стека, называемым Основным указателем вершины стека
(MSP). Возможно включить второй регистр R13 путем записи в Регистр управления
затем, процессор будет настроен для выполнения с двумя стеками. Мы посмотрим на
это более подробно в Главе 5 “Функции Передовой архитектуры”, но на данный
момент мы будем использовать процессор Cortex-M в его режиме по умолчанию.
После указателя вершины стека у нас есть R14 регистр ссылки. Когда процедуру
называют, обратный адрес автоматически хранится в R14, регистре ссылки. Начиная с
Ползунка 2 системы команд не содержат инструкцию по ВОЗВРАТУ, когда процессор
достигает конца процедуры, это использует команду перехода на R14 для возврата.
Наконец, R15 является счетчиком команд, можно воздействовать на этот регистр
точно так же, как все другие, но Вы не должны будете делать этого во время
нормального выполнения программы. Регистры ЦП
74 Главы 3

PRIMASK, FAULTMASK и BASEPRI используются для временного


отключения обработки прерываний, и мы посмотрим на них далее в этой
главе.

Регистр состояния программы


PSR как его имя подразумевает, содержит весь (Рис. 3.3) флагов состояния ЦП.

Рисунок 3.3
Регистр состояния Программы содержит несколько групп флагов ЦП. Они включают
коды условий (NZCVQ), биты состояния Прерывания инструкции Continuable (ICI),
Если флаг Then и текущее число исключения.

PSR имеет много полей псевдонима, которые являются версиями маскированными


полного регистра. Три регистра псевдонима являются Приложением PSR, Прерывание
PSR и Выполнение PSR. Каждый из этих регистров псевдонима содержит
подмножество полных флагов регистра и может использоваться в качестве ярлыка,
если необходимо получить доступ к части PSR. PSR обычно упоминается как xPSR
для указания на полный регистр, а не любое из подмножеств псевдонима (Рис. 3.4).

Рисунок 3.4
Регистр состояния Программы имеет три регистра псевдонима, которые обеспечивают доступ
к определенным подобластям или Регистру состояния Программы. Следовательно, родовое
название для регистра состояния программы является xPSR.

В нормальной прикладной программе Ваш код не сделает явный доступ к xPSR или
любому из его регистров псевдонима. Любое использование xPSR будет сделано
сгенерированным кодом компилятора. Как программист у Вас должна быть
осведомленность о xPSR и флагах, содержавшихся в нем.

Старшие значащие четыре бита xPSR являются битами кода условия,


Отрицательными, Нуль, Несут, и переполнение. Они будут установлены и очищены
в зависимости от результатов инструкции по обработке данных. Результат Ползунка
2 инструкции по обработке данных может установить или очистить эти флаги.
Однако обновление этих флагов является дополнительным.
Архитектура Cortex-M 75

SUB R8, R6, № 240 Выполняет вычитание и не обновляет НИЖНИЕ ИНДЕКСЫ флагов кода условия
R8, R6, № 240 Выполняет вычитание и обновляет флаги кода условия

Это позволяет компилятору выполнять инструкцию, которая обновляет флаги кода


условия, затем выполните некоторые дополнительные инструкции, которые не
изменяют флаги и затем выполняют условный переход на состоянии xPSR кодов
условий. После четырех кодов условия флаги являются дальнейшим флагом
инструкции, который укусил Q.

Q бит и влажные инструкции по математике


Q укусил, флаг насыщенности, процессоры Cortex-M3/M4 и Cortex-M7 имеют
специальный набор инструкций, названных влажными инструкциями по математике.
Если нормальная переменная достигнет своего максимального значения, и Вы
увеличиваете ее далее, то она прокрутится вокруг для обнуления. Точно так же, если
переменная достигнет своего минимального значения и будет затем постепенно
уменьшена, то она прокрутится вокруг к максимальному значению (Рис. 3.5).

Рисунок 3.5
Нормальная переменная будет трансформация для обнуления, когда она поразит
свое максимальное значение. Это очень опасно в алгоритме управления. ЦП Cortex-
M поддерживает насыщаемые инструкции по математике, которые упорно
продолжают их максимальные и минимальные значения.

В то время как это - проблема для большинства приложений, это особенно серьезно
для приложений, таких как важные приложения безопасности и блок управления
приводом. Cortex-M3/M4 и насыщаемые инструкции по математике M7
предотвращают этот вид “списка вокруг”. При использовании влажных инструкций по
математике если переменная достигнет своего максимального или минимального
значения, то она будет придерживаться (насыщают) в том значении. После того как
переменная насыщала бит Q, будет установлен. Q укусил, “липкий” бит и должен
быть очищен кодом приложения. Стандартные инструкции по математике не
используются компилятором “C” по умолчанию. Если Вы хотите использовать
влажные инструкции по математике, необходимо получить доступ к ним при помощи
компилятора intrinsics или CMSIS-базовых функций.

uint32_t __ SSAT (uint32_t значение, uint32_t находился)


uint32_t __ USAT (uint32_t значение, uint32_t находился),
76 Глав 3

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


Следующее поле в PSR является “Прерыванием Инструкция Continuable” (ICI) и,
“Если Затем” (IT) инструкция отмечает. Большинство инструкций по процессору
Cortex-M выполняется в единственном цикле. Однако некоторые инструкции, такие
как Хранилище Загрузки Несколько, Умножьтесь и Разделитесь, берут несколько
циклов. Если прерывание происходит, в то время как эти инструкции выполняются,
они должны быть приостановлены, в то время как прерывание подается. После того
как прерывание было подано, мы должны возобновить инструкцию по мультициклу.
Полем ICI управляет процессор Cortex-M, таким образом, Вы не должны делать
ничего специального в своем коде приложения. Это действительно означает, что,
когда исключение повышено, много банка инструкции по циклу будет
приостановлена, поле ICI будет обновлено, и достижение запуска Вашей процедуры
прерывания будет всегда брать то же количество циклов независимо от инструкции, в
настоящее время выполняемой ЦП.

Условное выполнение — если затем блоки


Поскольку мы видели в Главе 1 “Введение в Семейство процессоров Cortex-M”,
большинство процессоров Cortex-M имеет трехэтапный конвейер. Это позволяет
ВЫБОРКУ, ДЕКОДИРУЮТ
и ВЫПОЛНИТЕ единицы для работы параллельно значительно улучшением
производительности процессора. Однако существует недостаток, что каждый раз
процессор делает переход, конвейер должен быть сброшен и снова наполнен. Это
представляет большой хит на производительности, поскольку конвейер должен быть
снова наполнен, прежде чем выполнение инструкций может возобновиться. Кора-M3
и-M4 уменьшают штраф ответвления при наличии единицы вызова команды, которая
может выполнить спекулятивные целевые выборки ответвления из возможного адреса
ответвления, таким образом, выполнение целей ответвления может запуститься ранее.
Однако для маленьких условных переходов процессор Cortex-M имеет другой прием
его рукав. Для маленького условного перехода, например

Если (Y 55 0x12C)
{I11;
} еще
{я —;}

который компилирует меньше чем в 4 инструкции, процессор Cortex-M может


скомпилировать код как ЕСЛИ ЗАТЕМ блок условия. Инструкции в, ЕСЛИ ЗАТЕМ
блок расширяется с помощью Таблицы 3.1 кода условия. Этот код условия
сравнивается с состоянием Флагов Кода условия в PSR. Если условие будет
соответствовать состоянию флагов, то инструкция будет выполняться, если это не
сделает и инструкция все еще введет конвейер, но не будет выполняться как “Никакая
Операция” (только для указанных целей) инструкция. Эта техника устраняет
ответвление и следовательно избегает потребности сбросить и снова наполнить
конвейер. Даже при том, что мы вставляем инструкции по NOP, мы все еще
добираемся, лучшие уровни производительности, чем при помощи более стандартного
выдерживают сравнение и переходят подход.
Архитектура Cortex-M 77
Таблица 3.1: коды условий
Инструкции

Код условия Протестированные Флаги xPSR Значение


EQ Z51 Равный
NE Z50 Не равный
Выше или то же
CS или HS C51 (Неподписанное)
CC или LO C50 Ниже (Неподписанный)
MI N51 Отрицательный
МН N50 Положительный или нуль
VS V51 Переполнение
VC V50 Никакое переполнение
Привет! C 5 1 и Z 50 Выше (Неподписанный)
Ниже или то же
LS C 5 0 или Z 51 (Неподписанное)
Больше, чем или равный (Со
GE N5В знаком)
LT N! 5 В Менее, чем (Со знаком)
GT Z50и5ВN Больше, чем (Со знаком)
Меньше чем или равный
LE Z 5 1 и N! 5 В (Со знаком)
AL Ничего Всегда выполняйтесь

Инициировать, ЕСЛИ ЗАТЕМ блок, мы используем инструкции по обработке данных


обновить коды условий PSR. По умолчанию большинство инструкций не обновляет
коды условий, если у них нет суффикса S, добавленного к ассемблерному коду
операции. Это дает компилятору большую гибкость в применении ЕСЛИ ЗАТЕМ
условие.

ADDS R1, R2, R3 //выполняют и добавляют и устанавливают флаги xPSR


ADD R2, R4, R5//Делают некоторые другие инструкции, но не изменяют xPSR ADD R5, R6,
R7

IT VS//, ЕСЛИ ЗАТЕМ условное выражение блока на первой инструкции ADD SUBVS R3,
R2, R4

Так, наш “C”, ЕСЛИ оператор THEN ELSE может быть скомпилирован в четыре
инструкции.

CMP r6, #0x12C


ITE EQ
STREQ r4, [r0, #0x08]
STRNE r5, [r0, #0x04]

CMP выдерживают сравнение, инструкция используется для выполнения теста и


установит или очистит флаг Zero Z в PSR. ЕСЛИ ЗАТЕМ блок создается
инструкцией по Если затем (IT). Инструкциям IT всегда следуют одна условно
исполняемая инструкция и дополнительно до четырех условно исполняемых
инструкций. Формат инструкции IT следующие:
IT x y z
конусовидный
78 Глав 3

X, y, и z параметры включают вторым, третьим, и четвертым инструкциям быть


частью условного блока. Может быть далее ЗАТЕМ ИЛИ ИНАЧЕ инструкции.
Конусовидный параметр является условием, относился к первой инструкции. Так,
NE ITTTE четыре инструкции, Если Затем блок с три ЗАТЕМ инструкции, которые выполняются
когда Z 5 1, сопровождаемый ЕЩЕ инструкцией, которая выполняется когда Z51
ITE GE Две инструкции, ЕСЛИ ЗАТЕМ блок с одним ЗАТЕМ инструкция, которая выполняется когда
N 5 В и один ЕЩЕ инструкция, которая выполняется когда N! 5 В

Использование условного исполняемого файла, ЕСЛИ ЗАТЕМ блоки оставлен до


компилятора. Обычно на низких уровнях оптимизации, ЕСЛИ ЗАТЕМ блоки не
используются, это высказывает хорошее мнение отладки. Однако на высоких
уровнях оптимизации, компилятор использует ЕСЛИ ЗАТЕМ блоки. Так, обычно не
будет никаких странных побочных эффектов, представленных условным методом
выполнения, но существует несколько правил принять во внимание.

Во-первых, условные блоки кода не могут быть вложены, обычно компилятор будет
заботиться об этом правиле. Во-вторых, Вы не можете использовать Оператор
перехода для вскакивания в условный блок кода. Если Вы действительно сделаете
эту ошибку, то компилятор предупредит Вас и не сгенерирует такой недопустимый
код.

В-третьих, единственное время, Вы действительно заметите выполнение, ЕСЛИ


ЗАТЕМ блок условия будет во время отладки. Если Вы одноэтапный отладчик через
условный оператор, условный код, будет казаться, выполнится, даже если условие
будет ложью. Если Вы
не знают о блоках кода условия Cortex-M, это может быть большой причиной
беспорядка!

Следующий бит в PSR является T, или Ползунок укусил. Это - бит прежней версии от
более раннего ARM ЦП и установлено на один при очистке этого бита он вызовет
исключение отказа. В предыдущих центральных процессорах T укусил,
использовался, чтобы указать, что Ползунок 16-разрядная система команд работал.
Это включено в PSR Cortex-M, чтобы поддержать совместимость с более ранними
центральными процессорами ARM и позволить 16-разрядному коду Ползунка
прежней версии выполняться на процессорах Cortex-M. Поле Final в PSR является
числовым полем Исключения. Единица Прерывания Вложенного вектора Коры
может поддерживать до 256 источников исключения. Когда исключение
обрабатывается, число исключения хранится здесь. Поскольку мы будем видеть
позже, что это поле не используется кодом приложения при обработке прерывания,
хотя это может быть полезная ссылка при отладке.
Упражнение 3.1 Влажная математика и условное выполнение
В этом осуществлении мы будем использовать простую программу, чтобы
исследовать регистры ЦП и использовать влажные инструкции по математике. Мы
также восстановим проект использовать условное выполнение.
Архитектура Cortex-M 79

Откройте установщик пакета.


Выберите вкладку Boards и “Учебные Примеры Руководства Разработчиков”.
Выберите вкладку Example и Копию “Исключая 3.1 Насыщенностью и Условным
Выполнением”.
интервал a, range5300; символ
c; международное основное
(пустота) {
в то время как (1) {
для (50; a, диапазон; a11) {c 5
a;

}}

Эта программа увеличивает целочисленную переменную от 0 до 300 и копирует


ее в символьную переменную “c”.
Создайте программу и запустите отладчик.
Добавьте эти две переменные к Анализатору логики и запустите программу (Рис. 3.6).

Рисунок 3.6
Поскольку мы копируем целое число в символ, символьное значение будет
трансформация, после того как ее максимальное значение достигнуто.

В окне Logic Analyzer мы видим, что, в то время как целочисленная переменная


работает как ожидалось, символ насыщает, когда это достигает 255 и
“переворачивается” к нулю и начинает увеличивать снова.
Остановите отладчик и измените код как показано ниже для использования
насыщаемой математики.
Интервал #define Q_FLAG
0x08000000 a, расположитесь 5
300;
символ c;
неподписанный
международный
APSR; международное
основное (пустота) {в
то время как (1) {

для (a50; a, диапазон; a11) {c


5 __ SSAT (a, 9);
}
}}
80 Глав 3

Этот код заменяет приравнивание влажной встроенной функцией, которая насыщает


на девятом бите целочисленного значения. Это позволяет значениям 0 255 быть
записанными в значение байта, любые другие значения будут насыщать в
максимальном допустимом значении 255.
Разработайте проект и запустите отладчик.
Выполните код и просмотрите содержание переменных в Анализаторе логики (Рис.
3.7).

Рисунок 3.7
Используя инструкции по насыщенности, переменная cal “насыщает” на
выбранной разрядной границе.

Теперь символьная переменная насыщает, а не “rollingover”. Это все еще


неправильно, но не так потенциально катастрофически неправильно как
динамический случай. При изменении разрядного граничного значения “c” будет
насыщать в нижних значениях.
В окне Registers нажмите на регистр xPSR для просмотра флагов (Рис. 3.8).

Рисунок 3.8
То, когда переменная насыщает, Q укусил в xPSR, будет
установлено.

В дополнение к нормальным флагам кода условия NVCZ установлена


насыщенность Q бит.
Архитектура Cortex-M 81

Остановите отладчик и измените код как показано ниже.


#define Q_FLAG 0x08000000
интервал a, диапазон 5 300; символ c; неподписанный
международный APSR; зарегистрируйте неподписанный
интервал apsr __ asm ("apsr");
международное
основное (пустота)
{в то время как (1) {
для (a50; a, диапазон; a11) {c
5 __ SSAT (a, 9);
}
APSR 5 __ get_APSR ();
если (APSR&Q_FLAG) {
range22;
}
apsr 5 apsr&BQ_FLAG;
}}

После того как мы записали в символьную переменную, возможно считать APSR


(псевдоним приложения xPSR) и проверка, если Q укусил, установлен. Если
переменная насыщала, мы можем принять некоторые меры по ликвидации
последствий и затем очиститься, Q укусил для следующего повторения.
Разработайте проект и запустите отладчик.
Выполните код и наблюдайте переменные в окне Watch.

Теперь, когда данные по диапазону, символьная переменная будет насыщать, и


постепенно код будет корректировать переменную диапазона, пока выходные данные
не впишутся в символьную переменную.
Набор устанавливает контрольные точки на строках 19 и 22 для включения контроля
битов Q (Рис. 3.9).

Рисунок 3.9
Точки останова на строках 19 и 22.

Сбросьте программу и затем выполните код, пока первая точка останова не будет
достигнута.
Откройте окно Disassembly и исследуйте код, сгенерированный на контроль битов Q.
если
(xPSR&Q_FLAG)
{MOV r0, r1
LDR r0, [r0, #0x00] TST
r0, #0x8000000 BEQ
0x080003E0
20: range22;
82 Главы 3

} еще {
LDR r0, [ПК, #44]; @0x08000400
LDR r0, [r0, #0x00]
SUB r0, r0, #0x01
LDR r1, [ПК, #36]; @0x08000400
STR r0, [r1, #0x00]
B 0x080003E8
заблокированный 5 1;
}
MOV r0, #0x01
LDR r1, [ПК, #32]; @0x08000408
STR r0, [r1, #0x00]

Также обратите внимание на значение в счетчике состояния, это - количество


циклов, используемых, так как сброшено для достижения этой точки (Рис. 3.10).

Рисунок 3.10
Значение состояний противостоит в первой точке останова.

Теперь выполните код, пока он не поражает следующую точку останова, и


снова обратите внимание на счетчик состояния (Рис. 3.11).

Рисунок 3.11
Значение состояний противостоит во второй точке останова.

Остановите отладчик и откройте вкладку “Options for Target/C” (Рис.


3.12).
Архитектура Cortex-M 83

Рисунок 3.12
Измените уровень оптимизации, и также “выбор оптимизирует для
скорости”.

Измените уровень оптимизации от Уровня 0 до Уровня 3 и установите флажок


“Optimize for speed”.
Закройте Опции для Цели и восстановите проект.
Теперь повторите измерение количества цикла путем выполнения к двум точкам
останова
(Рис. 3.13).

Рисунок 3.13
Цикл значит первую и вторую точку останова.
84 Главы 3

Теперь контроль битов Q берет 7 циклов в противоположность оригиналу 14.


Исследуйте дизассемблированный код на контроль битов Q.
если (xPSR&Q_FLAG) {
F0116F00 TST 0x08000336 r1, #0x8000000
диапазон-;
} еще {
ITTE NE
STRNE r1, [r0, #0x08]
заблокированный 5 1;
}
STREQ r4, [r0, #0x04]

В более высоких уровнях оптимизации компилятор переключился от теста и


команд перехода к условным инструкциям по выполнению. Здесь, ассемблер
выполняет поразрядное И тест на R1, который содержит текущее значение xPSR.
Это установит или очистит флаг Z в xPSR. Системы команд ITT условный блок с
двумя инструкциями. Инструкции в этом блоке выполняют вычитание и
хранилище, если флаг Z является нулем; иначе они проходят через конвейер как
только для указанных целей инструкции.
Удалите точки останова. Работайте код в течение нескольких секунд затем
останавливают его.
Установите точку останова на одной из условных инструкций (Рис. 3.14).

Рисунок 3.14
ЕСЛИ ЗАТЕМ инструкции, следовавшие условными инструкциями.

Запустите код, работающий снова.

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

Карта распределения памяти Cortex-M и шины


В то время как устройство Cortex-M каждого производителя имеет различные
периферийные устройства и емкости памяти, ARM определил шаблон основной
памяти, которого должны придерживаться все устройства. Это обеспечивает a
Архитектура Cortex-M 85

стандартное расположение так весь поставщик, если память и периферийные


устройства расположены в тех же блоках памяти (Рис. 3.15).

Рисунок 3.15
Карта распределения памяти Cortex-M имеет стандартный шаблон, который разделяет
диапазон адресов на 4 ГБ на определенные регионы памяти. Этот шаблон памяти
характерен для всех устройств Cortex-M.

Шаблон памяти Cortex-M определяет восемь регионов, которые покрывают 4 ГБ


адресного пространства процессора Cortex-M. Первые три региона - каждый 0,5 ГБ в
размере и выделены пространству исполняемого кода, внутреннему SRAM и
внутренним периферийным устройствам. Следующие два региона выделены внешней
памяти и устройствам с отображенной памятью, оба региона составляют 1 ГБ в
размере. Заключительные три региона составляют пространство памяти процессора
Cortex-M и содержат регистры конфигурации для процессора Cortex-M и любых
определенных для поставщика регистров (Рис. 3.16).
86 Глав 3

Рисунок 3.16
В то время как процессор Cortex-M имеет много внутренних шин, они чрезвычайно
невидимы для разработчика программного обеспечения. Память
появляется как плоские 4 ГБ адресного пространства.

В то время как карта распределения памяти Cortex-M составляет линейных 4 ГБ


адресного пространства без разбитых на страницы регионов или сложных способов
адресации, память микроконтроллера и периферийные устройства подключены к
процессору Cortex-M многими различными шинами. Первые 0,5 ГБ адресного
пространства резервируются для исполняемого кода и кодовых констант. Этот регион
имеет два специализированных шин, шина ICODE используется для выборки
инструкций по коду, и шина DCODE используется для выборки кодовых констант. К
остающимся пространствам пользовательской памяти (внутренний SRAM и
периферийные устройства плюс внешний SRAM и периферийные устройства)
получает доступ отдельная системная шина. Пространство памяти процессора Cortex-
M имеет дополнительную частную периферийную шину. В то время как это может
выглядеть сложным, что касается Вашего кода приложения, что у Вас есть одно
бесшовное пространство памяти. Процессор Cortex-M имеет отдельные внутренние
шины для оптимизации его доступа к различным регионам памяти.

Как отмечалось ранее, большинство инструкций в Ползунке, 2 системы команд


выполняются в единственном цикле и Коре-M3, может дойти до 200 МГц, и на самом
деле некоторым проектам системы на микросхеме (SoC) удается получить процессор,
работающий еще быстрее. Однако текущая Флэш-память, используемая для хранения
программы, имеет время доступа приблизительно 50 МГц. Таким образом, существует
основная проблема вытаскивания инструкций из Флэш-памяти достаточно быстро для
питания процессора Cortex-M. При выборе микроконтроллера Cortex-M, важно
изучить таблицу данных, чтобы видеть, как Кремниевый Поставщик решил эту
проблему. Как правило, Флэш-память будет расположена как 64-или 128-разрядная
широкая память, таким образом, одно чтение от Флэш-памяти сможет загрузить
многоадресные команды. Эти инструкции затем сохранены в “единице” акселератора
памяти, которая затем подает инструкции к процессору Cortex-M как
Архитектура Cortex-M 87

необходимый. Акселератор памяти является формой простого блока кэш-памяти,


который разработан Кремниевым Поставщиком. Обычно, эта единица отключена,
после того, как сброшено, таким образом, необходимо будет включить ее, или
процессор Cortex-M будет работать непосредственно от Флэш-памяти. Общая
производительность процессора Cortex-M будет зависеть от того, как успешно эта
единица была реализована разработчиками микроконтроллера.

Буфер записи
Кора-M3 и Кора-M4 содержат однократный буфер записи данных. Это позволяет ЦП
превращать запись в буфер записи и продолжаться на следующую инструкцию, в то
время как буфер записи завершает запись к реальному SRAM. Это старается не
останавливать процессор, в то время как он ожидает записи для завершения. Если
буфер записи полон, ЦП вынужден ожидать, пока он не закончил свою текущую
запись. В то время как это обычно - прозрачный процесс к коду приложения,
существуют некоторые случаи, где необходимо ожидать, пока запись не закончилась
перед продолжающимся выполнением программы. Например, если мы включаем
внешнюю шину на микроконтроллере, необходимо ожидать, пока буфер записи не
закончил писать в периферийный регистр, и шина включена прежде, чем попытаться
получить доступ к памяти, расположенной на внешней шине. Процессор Cortex-M
предоставляет некоторые инструкции по барьеру памяти справиться с этими
ситуациями.

Инструкции по барьеру памяти


Инструкции по барьеру памяти останавливают выполнение кода приложения,
пока этап записи памяти инструкции не закончил выполняться. Они
используются, чтобы гарантировать, что критический раздел кода завершился
перед продолжающимся выполнением кода приложения (Таблица 3.2).

Таблица 3.2: инструкции по барьеру памяти

Инструкция Описание
Гарантирует, что все доступы памяти закончены, прежде чем новый доступ к
DMB памяти сделан
Гарантирует, что все доступы памяти закончены, прежде чем следующая
DSB инструкция выполняется
Гарантирует, что все предыдущие инструкции завершаются, прежде чем
ISB следующая инструкция
выполняемый. Это также сбрасывает конвейер ЦП
Системный блок управления
В дополнение к регистрам ЦП процессоры Cortex-M имеют группу конфигурации с
отображенной памятью и регистров состояния, расположенных около верхней части
карты распределения памяти, запускающейся в 0xE000 E008.
88 Глав 3

Мы посмотрим на основные функции, поддерживавшие этими регистрами в


остальной части этой книги, но сводка дана ниже (Таблицы 3.3).

Таблица 3.3: процессор Cortex имеет конфигурацию с отображенной памятью и


расположенные регистры состояния
в системном блоке управления
Разме
рв
Зарегистрироваться Слова Описание
Вспомогательное Позволяет Вам настраивать, как выполняются некоторые
управление 1 функции процессора
Зашитый идентификатор и числа пересмотра от ARM и
ИДЕНТИФИКАТОР ЦП 1 кремния
производитель
Управление
прерыванием и Обеспечивает Ожидают биты для SysTick и прерываний NMI
состояние 1 и
расширенное прерывание информация о Pending\active
Таблица векторов Программируемое смещение адреса для перемещения
смещается 1 Таблицы векторов в новое
местоположение в Flash или памяти SRAM
Прерывание приложения Позволяет Вам настраивать PRIGROUP и генерировать ЦП
и 1 и
управление сбросом сброс микроконтроллера
Конфигурация средств управления режимов ожидания
Системное управление 1 процессора
Конфигурация и Настраивает рабочий режим ЦП и некоторые исключения
управление 1 отказа
Приоритет обработчика Эти регистры содержат 8-разрядные приоритетные поля
систем 3 для настраиваемого
исключения процессора
Управление Показывает причину шины, управления памятью или отказа
обработчиком систем и 1 использования
состояние
Настраиваемое Показывает причину шины, управления памятью или отказа
состояние отказа 1 использования
Состояние серьезного
отказа 1 Шоу, какое событие вызвало серьезный отказ
Отказ диспетчера
памяти 1 Содержит адрес ячейки памяти, которая генерировала
адрес отказ памяти
Адрес отказа шины 1 Содержит адрес ячейки памяти, которая генерировала
отказ памяти

Система команд Cortex-M имеет инструкции по обращению, которые позволяют Вам


загружать и хранить 8-, 16-, и 32-разрядные количества. В отличие от ARM7 и ARM9,
16-и 32-разрядные количества не должны быть выровненные на границах слова или
полуслова (Рис. 3.17). Это дает компилятор и гибкость максимума компоновщика,
чтобы полностью упаковать память SRAM. Однако существует штраф, который будет
оплачен эту гибкость, потому что невыровненные передачи занимают больше времени
для выполнения. Система команд Cortex-M содержит загрузку и многоадресные
команды хранилища, которые могут передать несколько регистров и из памяти в
одной инструкции. Это берет несколько циклов процессора, но использует только
один 2 байта или 4 байтовых команды. Это допускает очень эффективное управление
стеком, копия памяти блока и т.д. Загрузка и многоадресные команды хранилища
только работают на выровненные данные слова. Так, при использовании
невыровненных данных компилятор вынужден использовать несколько отдельная
загрузка и инструкции по хранилищу достигнуть того же самого. В то время как Вы
полностью используете ценный внутренний SRAM, Вы потенциально увеличиваете
размер инструкции по приложению. Невыровненные данные для пользовательских
данных только, необходимо удостовериться, что стеки являются выровненным словом.
Начальное значение MSP определяется компоновщиком,
Архитектура Cortex-M 89

но второй указатель вершины стека Указатель стека процесса (PSP) включен и


инициализирован пользователем, так Вам решать для разбираний в нем. Мы
посмотрим на использование PSP в Главе 5 “Функции Передовой архитектуры”.

Рисунок 3.17
В отличие от этого, ранее ARM7 и центральных процессоров ARM9, процессор Cortex
может сделать невыровненные доступы памяти. Это позволяет компилятору и
компоновщику лучше всего использовать устройство SRAM.

Побитовая обработка
В маленькой встроенной системе часто необходимо установить и очистить отдельные
биты в SRAM и периферийных регистрах. При помощи стандартных инструкций по
обращению мы можем установить и очистить отдельные биты при помощи языка “C”
поразрядно И и ИЛИ команды, в то время как это работает хорошо, процессоры
Cortex-M предоставляют более эффективный метод побитовой обработки.

Процессор Cortex-M предоставляет метод, названный “соединение бита”, которое


позволяет отдельному SRAM и периферийным битам регистра быть
установленным и очищенными очень эффективным способом
(Рис. 3.18).

Рисунок 3.18
Разрядное соединение является техникой, которая позволяет первому 1 МБ
региона SRAM и первому 1 МБ периферийного региона
быть обращенным битом.
90 Глав 3

Первый 1 МБ или регион SRAM и первый 1 МБ периферийного региона определяются


как разрядные регионы полосы. Это означает, что каждая ячейка памяти в этих
регионах с побитовой адресацией. Так, на практике для сегодняшних
микроконтроллеров, все их внутренние SRAM и периферийные регистры с побитовой
адресацией. Соединение бита работает путем создания адреса слова псевдонима для
каждого бита реальной памяти или периферийного бита регистра. Так, 1 МБ реального
SRAM искажается к 32 МБ виртуального (Рис. 3.19) адресов слова.

Рисунок 3.19
Каждый бит в реальной памяти отображается на адресе слова в памяти
псевдонима.

Это означает, что каждый бит реального SRAM или периферийного регистра
отображается на адресе слова в разрядном регионе псевдонима полосы и путем
записи 1 с и 0s к адресу слова псевдонима, мы можем установить и очистить
местоположение бита реальной памяти. Точно так же, если мы пишем слово в
местоположение реальной памяти, мы можем считать разрядный адрес псевдонима
полосы для проверки текущего состояния немного в том слове. Для использования
разрядного соединения просто необходимо вычислить адрес слова в разрядном
регионе полосы, который отображается на местоположение бита в реальной памяти,
которую Вы хотите изменить. Затем создайте указатель на адрес слова в разрядном
регионе полосы. После того как это сделано, можно управлять реальной разрядной
ячейкой памяти путем чтения и записи в регион псевдонима через указатель.
Вычисление для адреса слова в разрядном регионе псевдонима полосы следующие:
Разрядное слово полосы обращается к основе полосы на 5 битов 1 (байтовое
смещение 3 32) 1 (разрядный номер 3 4)

Так, например, мы хотели считать и записать в бит 8 из регистра порта GPIO B на


типичном микроконтроллере Cortex-M, мы можем вычислить разрядный адрес
псевдонима полосы следующим образом:

GPIO B адрес регистра данных 5 0x40010C0C


Зарегистрируйте байтовое смещение от периферийного базового адреса 5
0x40010C0C 2 0x40000000
5 0x00010C0C

Разрядное слово полосы обращается к 5 ¦ 0x42000000 1 ¦ 0x000010C0C


0x20ÞÞ 1 ¦ 0x8 0x4Þ
5 0x422181A0

Мы можем определить указатель на этот адрес.


#define GPIO_PORTB_BIT8 5 (* ((энергозависимый неподписанный длинный *)
0x422181A0))
Архитектура Cortex-M 91

Теперь путем чтения и записи в этот адрес слова, мы можем непосредственно


управлять битом отдельного порта.
GPIO_PORTB_BIT8 5 1//установил контакт порта

Это скомпилирует в следующие ассемблерные инструкции:


Код операции Assembler
F04F0001 MOV r0, #0x01
4927 LDR r1, [ПК, #156]; @0x080002A8
6008 STR r0, [r1, #0x00]

Эта последовательность использует одну 32-разрядную инструкцию и две 16-


разрядных инструкции или в общей сложности 8 байтов. Если мы сравниваем это с
установкой контакта порта при помощи логического ИЛИ записать непосредственно в
регистр порта.
GPIOB-.ODR | 5 0x00000100;//Вовлек

Мы затем получаем следующую кодовую последовательность:


Код
операции Ассемблер
481E LDR r0, [ПК, #120]; @0x080002AC
6800 LDR r0, [r0, #0x00]
F4407080 ОРР r0, r0, #0x100
491C LDR r1, [ПК, #112]; @0x080002AC
6008 STR r0, [r1, #0x00]

Это использует четыре 16-разрядных инструкции и одну 32-разрядную инструкцию


или 12 байтов.

Использование разрядного соединения дает нам взаимовыгодную ситуацию, меньший


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

Можно найти некоторые инструменты компилятора, или библиотеки


программного обеспечения Silicon Vendor обеспечивают макро-функции для
поддержки разрядного соединения. Необходимо обычно избегать использования
таких макросов, поскольку они не могут привести к самому эффективному коду и
могут быть зависимым набора инструментальных средств.

Осуществите соединение на 3,2 бита


В этом осуществлении мы посмотрим на определение небольшой переменной
полосы, чтобы переключить контакт порта и сравнить его использование с
поразрядным И и ИЛИ инструкции.
Откройте установщик пакета.
Выберите вкладку Boards и “Учебные Примеры Руководства Разработчиков”.
Выберите вкладку Example и копию “Исключая Соединением 3,2 битов”.
92 Главы 3

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


использовать Порт B, укусил 8 контактов, поскольку мы уже сделали вычисление
для адреса слова псевдонима.
Так, теперь в коде “C” мы можем определить указатель на разрядный адрес полосы.
#define PortB_Bit8 (* ((энергозависимый неподписанный длинный *) 0x422181A0))

И в коде приложения, мы можем установить и очистить контакт порта путем записи в


этот указатель.
PortB_Bit8 5 1;
PortB_Bit8 5 0;

Разработайте проект и запустите отладчик.


Включите временной анализ с debug\execution profiling\Show меню Time
(Рис. 3.20).

Рисунок 3.20
Позвольте профилю синхронизации показать время выполнения на
строку кода.

Это открывает дополнительный столбец в отладчике, который отобразит время


выполнения для каждой строки. Сравните время выполнения для разрядной
инструкции по полосе по сравнению с И и ИЛИ инструкций.

Откройте окно Disassemble и исследуйте код, сгенерированный на каждый метод


установки контакта порта.

Инструкции по соединению бита являются лучшим способом установить и


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

Специализированные инструкции по побитовой обработке


В дополнение к разрядной поддержке полосы Ползунок 2 системы команд имеют
ориентируемые инструкции некоторого специализированного бита. Некоторые из
этих инструкций не непосредственно доступны с языка “C” и поддерживаются
компилятором “внутренние” вызовы (Таблица 3.4).
Архитектура Cortex-M 93

Таблица 3.4: В дополнение к разрядному


соединению процессор Cortex-M3 имеет
некоторую специализированную побитовую
обработку
инструкции

BFC Ясное битовое поле


BFI Битовое поле вставляет
Извлечение битового поля
SBFX со знаком
SXTB Знак расширяет байт
SXTH Знак расширяет полуслово
Неподписанное
UBFX извлечение битового поля
UXTB Нуль расширяет байт
Нуль расширяет
UXTH полуслово

Таймер SysTick
Все процессоры Cortex-M содержат стандартный таймер. Это называют таймером
SysTick и является 24-разрядным таймером обратного отсчета с автоперезагрузкой
(Рис. 3.21). После того, как запущенный, таймер SysTick будет обратный отсчет от
своего начального значения, после того как он достигает нуля, он повысит
прерывание, и новое значение количества будет загружено из регистра
перезагрузки. Основная цель этого таймера состоит в том, чтобы генерировать
периодическое прерывание для операционной системы реального времени (RTOS)
или другого управляемого событиями программного обеспечения. Если Вы не
выполняете RTOS, можно также использовать его в качестве простого
периферийного устройства таймера.

Рисунок 3.21
Таймер SysTick является 24-разрядным таймером обратного отсчета с
автоперезагрузкой. Это обычно используется для
обеспечения периодического прерывания для
планировщика RTOS.
Источник часов по умолчанию для таймера SysTick является тактовой частотой ЦП
Cortex-M. Может быть возможно переключиться на другой источник часов, но это
будет варьироваться в зависимости от фактического микроконтроллера, который Вы
используете. В то время как таймер SysTick характерен для всех процессоров Cortex-
M, его регистры занимают те же ячейки памяти в Cortex-M3/-M4 и-M7. В Коре-M0 и
Коре-M01, регистры SysTick расположены в системном блоке управления и имеют
различные символьные имена для предотвращения беспорядка. Строка прерывания
по таймеру SysTick и все периферийные строки микроконтроллера подключены к
Контроллеру прерываний вложенного вектора (NVIC).
94 Главы 3

Контроллер прерываний вложенного вектора


Кроме ЦП Cortex-M, следующая главная единица в процессоре Cortex-M является
NVIC. NVIC является тем же для использования между всеми процессорами Cortex-
M, после того как Вы настроили прерывание на Коре-M3, процесс является тем же
для Коры-M0 к Коре-M7. NVIC разработан для быстрой и эффективной обработки
прерываний, на Коре-M3 Вы достигнете первой строки кода “C” в Вашей процедуре
прерывания после 12 циклов для системы памяти состояния с нулевым временем
ожидания. Эта задержка прерывания полностью детерминирована так от любой
точки в фоновом режиме (непрерывание) код, Вы введете прерывание с той же
задержкой. Поскольку мы видели, что инструкции по мультициклу могут быть
остановлены без издержек и затем возобновлены, после того как прерывание
закончилось. На Cortex-M3/M4 и Кора-M7 NVIC поддерживает до 240 источников
прерывания, Кора-M0 может поддерживать до 32. NVIC поддерживает до 256
уровней приоритета прерываний на Коре-M3 и-M4 и четырех приоритетных уровнях
на Коре-M0 (Таблица 3.5).

Таблица 3.5: Контроллер прерываний Вложенного вектора состоит из семи групп


регистров, который позволяет Вам включать, устанавливать приоритетные уровни и
контролировать, пользователь прерывают периферийные каналы
Максимальный
размер в
Зарегистриров
a
аться Слова Описание
Набор Обеспечивает разрешение прерывания укусило для
включает 8 каждого источника прерывания
Ясный Обеспечивает запрет прерывания укусил для каждого
включают 8 источника прерывания
Ожидание Обеспечивает набор, ожидающий бит для каждого
набора 8 источника прерывания
Четкое Обеспечивает ясный незаконченный бит для каждого
ожидание 8 источника прерывания
Предоставляет прерыванию активный бит для каждого
Активный 8 источника прерывания
Обеспечивает 8-разрядное приоритетное поле для
Приоритет 60 каждого источника прерывания
Триггер
программного Запишите номер канала прерывания для генерации
обеспечения 1 программного обеспечения
прерывание
a
Фактическое количество используемых слов будет зависеть от количества каналов прерывания,
реализованных производителем микроконтроллеров

Рабочие режимы
В то время как ЦП Cortex-M выполняет фон (код непрерывания), ЦП находится в
рабочем режиме, названном режимом потока. Когда прерывание будет повышено,
NVIC заставит процессор переходить к соответствующей процедуре обработки
прерывания (ISR). Когда это происходит, изменения ЦП в новом рабочем режиме,
названном режимом обработчика. В простых приложениях без ОС можно
использовать конфигурацию по умолчанию процессора Cortex-M из сброса и нет
никакого главного функционального различия в этих рабочих режимах, и они могут
быть проигнорированы. Процессоры Cortex-M могут быть настроены с более сложной
операционной моделью, которая представляет операционные различия между
потоком и режимом обработчика, и мы посмотрим на это в Главе 5 “Функции
Передовой архитектуры”.
Архитектура Cortex-M 95

Обработка прерываний — запись


Когда периферийное устройство микроконтроллера повысит линию прерывания,
NVIC вызовет две вещи произойти параллельно. Во-первых, вектор исключения
выбирается по шине ICODE. Это - адрес точки входа в ISR. Этот адрес продвинут в
R15, счетчик команд, вынуждающий ЦП переходить к запуску процедуры
прерывания. Параллельно с этим ЦП автоматически продвинет ключевые регистры на
стек. Этот стековый фрейм состоит из следующих регистров, xPSR, ПК, LR, R12, R3,
R2, R1 и R0. Этот стековый фрейм сохраняет состояние процессора и обеспечивает
R0 R3 для использования ISR. Если ISR должен использовать больше регистров ЦП,
он должен ПРОДВИНУТЬ их на стек и POP их на выходе (Рис. 3.22).

Рисунок 3.22
Когда прерывание или исключение произойдут, ЦП автоматически продвинет
стековый фрейм. Это состоит из xPSR, ПК, LR, R12 и регистрирует R0 R3. В конце
прерывания или исключения, автоматически не сложен стековый фрейм.

Процесс записи прерывания берет на себя 12 циклов Cortex-M3/M4/M7 и 16 циклов


на Коре-M0. Все эти действия обрабатываются микрокодом в ЦП и не требуют
никаких специализированных инструкций по записи как LJMP или ПРОДВИГАЮТ,
чтобы быть частью кода приложения.

Векторы исключения хранятся в таблице векторов прерываний. Таблица векторов


прерываний расположена в начале адресного пространства. Первые 4 байта
используются для содержания начального значения основного указателя вершины
стека. Начальное значение основного указателя вершины стека вычисляется
компилятором и компоновщиком и будет сохранено в первых 4 байтах изображения.
После того, как сброшено, это
96 Глав 3

значение будет автоматически загружено в R13 как часть сброса ЦП. Таблица
векторов прерываний затем имеет местоположения адреса каждые 4 байта, растущие
вверх через адресное пространство. Таблица векторов содержит адрес ISR для
каждого из возможных источников прерывания в микроконтроллере. Таблица
векторов для каждого микроконтроллера стала предопределенная частью кода
запуска, как мы будем видеть в следующей главе. Маркировка для каждого ISR
хранится в каждом местоположении вектора прерывания. Для создания ISR, просто
необходимо объявить пустоту “C” функция с помощью того же имени в качестве
маркировки вектора прерывания.
СБРОС ОБЛАСТИ, ДАННЫЕ,
ТОЛЬКО ДЛЯ ЧТЕНИЯ
ЭКСПОРТИРУЙТЕ __ Векторы
__ Векторы DCD __ initial_sp ; Вершина стека
DCD Reset_Handler ; Обработчик сброса
; Внешние прерывания
DCD WWDG_IRQHandler ; Сторожевой таймер окна
; PVD через Строку EXTI
DCD PVD_IRQHandler обнаруживают
DCD TAMPER_IRQHandler ; Трамбовка
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC

Так, для создания стандартной программы “C” для обработки прерывания от час
реального времени мы создаем функцию “C”, названную следующим образом:
освободите RTC_IRQHandler (пусто) {
. . .. . ..
}

Когда проект будет разработан, компоновщик разрешит адрес стандартной


программы “C” и определит местоположение его в таблице векторов вместо
маркировки. Если Вы не используете это конкретное прерывание в своем проекте,
маркировка все еще, как должны объявлять, поддерживает порядок таблицы векторов.
После таблицы векторов прерываний существует вторая таблица, которая
объявляет все адреса ISR. Они объявляются как СЛАБЫЕ маркировки. Это
означает, что это объявление может быть перезаписано, если маркировка
объявляется в другом месте в проекте. В этом случае они действуют как
“поддержка” для предотвращения любых ошибок компоновщика, если процедура
прерывания официально не объявляется в исходном коде проекта.
СЛАБ
WWDG_IRQHandler ЭКСПОРТА ЫЙ]
ЭКСПОР [СЛАБ
Т PVD_IRQHandler ЫЙ]
ЭКСПОР [СЛАБ
Т TAMPER_IRQHandler ЫЙ]
Обработка прерываний — выход
После того как ISR закончил свою задачу, он вызовет возврат от прерывания до
точки, в фоновом режиме кодируют от того, где он кончил. Однако Ползунок 2
системы команд не имеет возврата или возвращается из инструкции по прерыванию.
ISR будет использовать тот же метод возврата
Архитектура Cortex-M 97

как стандартная программа непрерывания а именно, ответвление по R14 регистр


ссылки. Во время нормального функционирования регистр ссылки будет содержать
корректный обратный адрес. Однако, когда мы ввели прерывание, текущее
содержание R14 был продвинут на стек, и в его месте ЦП ввел специальный код.
Когда ЦП пытается перейти на этом коде вместо того, чтобы делать нормальное
ответвление, это вынуждено восстановить стековый фрейм и возобновить
нормальную обработку (Таблица 3.6).

Таблица 3.6: В начале исключения или прерывания R14 (Регистр Ссылки)


продвинут на стек. ЦП затем помещает управляющее слово в R14. В конце
прерывания код перейдет на R14. Управляющее слово не является допустимым
обратным адресом и заставит ЦП получать стековый фрейм и возвращаться к
корректному рабочему режиму

Значение возврата из прерывания Значение


Возвратитесь к режиму Thread и используйте Основной
0xFFFFFFF9 Указатель вершины стека
Возвратитесь к режиму Thread и используйте Указатель
0xFFFFFFFD Стека процесса
0xFFFFFFF1 Возвратитесь к режиму Handler

Обработка прерываний — важный выход!


Линии прерывания, которые подключают пользовательские источники прерывания
ввода-вывода к каналам прерывания NVIC, могут находиться на одном уровне
чувствительные или чувствительный край. Во многих микроконтроллерах значение по
умолчанию находится на одном уровне чувствительное, после того как прерывание
было повышено, оно будет утверждаться на NVIC, пока оно не будет очищено. Это
означает, что при выходе из ISR с прерыванием, все еще утверждаемым на NVIC,
новое прерывание будет повышено. Для отмены прерывания, необходимо очистить
флаги состояния прерывания в пользовательском периферийном устройстве прежде,
чем выйти из ISR. Если периферийное устройство генерирует другое прерывание, в то
время как его линия прерывания утверждается, дальнейшее прерывание не будет
повышено. При очистке флагов состояния прерывания в начале процедуры
прерывания затем, дальнейшие прерывания от периферийного устройства будут
подаваться. Для дальнейшего усложнения вещей, некоторые периферийные
устройства автоматически очистят некоторые свои флаги состояния. Например,
полный флаг преобразования ADC может быть автоматически очищен, когда регистр
результатов ADC читается. Имейте это в виду при чтении руководства пользователя
Микроконтроллера.
Упражнение 3.3 Прерывание SysTick
Этот проект демонстрирует установку первого прерывания с помощью таймера
SysTick.
Откройте установщик пакета.
Выберите вкладку Boards и “Учебные Примеры Руководства Разработчиков”.
Выберите вкладку Example и копию “Исключая 3.2 Прерываниями SysTick” (Рис.
3.23).
98 Глав 3

Рисунок 3.23
SysTick прерывают расположение проекта.

Это приложение состоит из минимального объема кода, необходимого, чтобы


получить выполнение процессора Cortex-M и генерировать прерывание SysTick.
Откройте main.c файл
#include "stm32f10x.h"
#define SYSTICK_COUNT_ENABLE 1
#define SYSTICK_INTERRUPT_ENABLE 2
международное основное (пустота)
{
GPIOB-.CRH 5 0x33333333;
SysTick-.VAL 5 0x9000;
SysTick-.LOAD 5 0x9000;
SysTick-.CTRL 5 SYSTICK_INTERRUPT_ENABLE | SYSTICK_COUNT_ENABLE; в
то время как (1);
}

Основная функция настраивает банк контактов порта как выводы. Затем, мы


загружаем таймер SysTick и перезагружаем регистр и затем включаем таймер и его
линию прерывания к NVIC. После того как это сделано, фоновый код находится в
некоторое время () цикл, делающий ничто.
Когда таймер будет считать в обратном порядке для обнуления, он генерирует
прерывание, которое выполнит SysTick ISR.
освободите SysTick_Handler (пусто)
{
статическое неподписанное символьное количество 5 0,
ledZero 5 0x0F; если (count11.0x60)
{
ledZero 5 ledZero ^ 0xFF;
LED_SetOut (ledZero);
количество 5 0;
}
}
Архитектура Cortex-M 99

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


GPIO.
Откройте Устройство:: файл STM32F10x.s и определяет местоположение таблицы
векторов.
SysTick_Handler PROC
SysTick_Handler ЭКСПОРТА [СЛАБЫЙ]
B .
ENDP

Таблица векторов обеспечивает стандартные маркировки для каждого источника прерывания,


созданного как “слабые” объявления. Для создания ISR “C” мы просто должны использовать
имя маркировки в качестве названия пустой функции. Функция “C” затем переопределит
собранный тупик и будет вызвана, когда прерывание будет повышено.

Разработайте проект и запустите Отладчик.

Не выполняя код, откройте окно Register и исследуйте состояние регистров (Рис.


3.24).
Рисунок 3.24
Регистр ЦП оценивает в начале кода.
100 Глав 3

В частности, отметьте значение указателя вершины стека (R13) регистр ссылки (R14)
и PSR.
Установите точку останова в процедуре прерывания и запустите код, выполняющий
(Рис. 3.25).

Рисунок 3.25
Набор точки останова на записи в прерывание.

Когда код совершает нападки, точка останова снова исследуют окно Register (Рис.
3.26).

Рисунок 3.26
Регистр ссылки (R14) теперь содержит код возврата, который вынуждает ЦП
возвратиться из прерывания в конце служебной функции
прерывания.

Теперь, R14 имеет код возврата из прерывания вместо нормального обратного


адреса, и указатель вершины стека был постепенно уменьшен 32 словами.
Откройте Окно памяти в 0x20000248 и декодируйте стековый фрейм (Рис. 3.27).

Рисунок 3.27
Просмотрите стековый фрейм в окне памяти.

Теперь откройте peripherals\core peripherals\NVIC (Рис.


3.28).
Архитектура Cortex-M 101

Рисунок 3.28
Периферийное окно NVIC и регистр xPSR просматривают, оба показывают таймер
SysTick активным прерыванием.

Периферийное окно NVIC показывает состояние каждой линии прерывания. Строка


15 является таймером SysTick, и этому включают (E) и активному (A) (Ожидание P
5). idx столбец указывает на номер канала NVIC и объединяется с номером канала
ISR в PSR.
Теперь установите точку останова на закрывающей фигурной скобке функции
обработки прерываний и выполните код
(Рис. 3.29).

Рисунок 3.29
Точки останова на точках входа и выхода ISR.
Теперь откройте окно дизассемблирования и просмотрите инструкцию по
возврату (Рис. 3.30).
102 Главы 3

Рисунок 3.30
Возврат из прерывания является нормальной командой перехода.

Инструкция по возврату является командой перехода, то же, как будто Вы


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

Исключения процессора Cortex-M


В дополнение к строкам прерывания ввода-вывода процессор Cortex-M имеет
некоторые внутренние исключительные ситуации, и они занимают первые 15
мест таблицы векторов (Рис. 3.31).

Рисунок 3.31
Первые 4 байта памяти содержат начальное значение стека. Таблица векторов начинает с
0x00000004. Первые 10 векторов для процессора Cortex, в то время как остаток для
пользовательских периферийных устройств.
Первое местоположение в таблице векторов является обработчиком Сброса. Когда
процессор Cortex-M будет сброшен, адрес, сохраненный здесь, будет загружен в
счетчик команд Cortex-M
Архитектура Cortex-M 103

принуждение перехода к запуску кода приложения. Следующее местоположение в


таблице векторов для немаскируемого прерывания. То, как это реализовано, будет
зависеть от определенного микроконтроллера, который Вы используете. Это может,
например, быть подключено к внешнему контакту на микроконтроллере или к
периферийному устройству, такому как сторожевой таймер в микроконтроллере.
Следующие четыре исключения для обработки отказов, которые могут произойти во
время выполнения кода приложения. Все эти исключения присутствуют на Cortex-
M3/M4 и Коре-M7, но только обработчик серьезных отказов реализован на Коре-M0.
Тип отказов, которые могут быть обнаружены процессором, является отказом
использования, соединяет шиной отказ, отказ диспетчера памяти и серьезный отказ.

Отказ использования

Отказ использования происходит, когда код приложения неправильно использовал


процессор Cortex-M. Типичная причина состоит в том, когда процессору дали
недопустимый код операции для выполнения. Большинство компиляторов ARM
может сгенерировать код для диапазона ядер процессора ARM. Так, возможно
неправильно настроить компилятор и произвести код, который не будет работать
на процессоре Cortex-M. Другие причины отказа использования показывают ниже
(Таблицы 3.7).

Таблица 3.7: Возможные причины исключения отказа


использования

Неопределенная инструкция
Недопустимый адрес возврата из прерывания
Невыровненный доступ к памяти с помощью загрузки и многоадресных команд
хранилища
a
Разделитесь на нуль
a
Невыровненный доступ к памяти
a
Эта опция должна быть активирована в системном блоке управления настраиваемый регистр
использования отказа.

Отказ шины

Отказ шины повышен, когда ошибка обнаруживается на матрице шины AHB (больше
о матрице шины в Главе 5 “Функции Передовой архитектуры”). Потенциальные
причины этого отказа следующим образом (Таблица 3.8).
Таблица 3.8: Возможные причины исключения отказа шины

Недопустимый регион памяти


Неправильный размер передачи, то есть, побайтовой записи к
слову только периферийное устройство регистрирует уровень
полномочий процессора Wrong (Мы посмотрим на уровни
полномочий в Главе 5 “Функции Передовой архитектуры”),
104 Главы 3

Отказ диспетчера памяти

Единица защиты памяти (MPU) является дополнительным периферийным


устройством процессора Cortex-M, которое может быть добавлено, когда
микроконтроллер разработан. Это доступно на всех вариантах кроме Коры-M0. MPU
используется для управления доступом к различным регионам адресного
пространства Cortex-M в зависимости от рабочего режима процессора. На это
посмотрят более подробно в Главе 5 “Функции Передовой архитектуры”. MPU
повысит исключение в следующих случаях (Таблица 3.9).

Таблица 3.9: Возможные причины исключения отказа диспетчера памяти


Доступ к региону MPU с неправильным уровнем полномочий
Запись в регион только для чтения
Доступ к ячейке памяти за пределами определенных регионов MPU
Выполнение программы из памяти регион, который определяется как неисполняемый
файл

Серьезный отказ

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

Включение исключений отказа

Обработчик серьезных отказов всегда включается и может только быть отключен


путем установки регистра FAULTMASK ЦП. Другие исключения отказа должны быть
включены в Системном Блоке управления, “Управление Обработчиком систем и”
регистр состояния (SCB-. SHCSR). SCB-. Регистр SHCSR также содержит, Ожидают и
Активные биты для каждого исключения отказа.

Мы посмотрим на исключения отказа и отслеживающие отказы в Главе 5


“Функции Передовой архитектуры”.

Приоритет и вытеснение
NVIC содержит группу приоритетных регистров с 8-разрядным полем для каждого
источника прерывания. В его конфигурации по умолчанию лучшие 7 битов
приоритетного регистра позволяют Вам определять
Архитектура Cortex-M 105

уровень вытеснения. Чем ниже уровень вытеснения, тем более важный прерывание.
Так, если прерывание будет подаваться, и второе прерывание повышено с более
низким уровнем вытеснения, то состояние текущего прерывания будет сохранено, и
процессор будет служить новому прерыванию. Когда это будет закончено, процессор
продолжит служить исходному прерыванию, если более высокое приоритетное
прерывание не ожидает (Рис. 3.32).

Рисунок 3.32
Каждый периферийный приоритетный регистр состоит из настраиваемого поля вытеснения
и подприоритетного поля.

Младший значащий бит (LSB) является подприоритетным битом. Если два


прерывания будут повышены с тем же уровнем вытеснения, то прерывание с
самым низким подприоритетным уровнем будет подаваться сначала. Это означает,
что у нас есть 128 уровней вытеснения каждый с двумя подприоритетными
уровнями
(Рис. 3.33).

Рисунок 3.33
Каждый приоритетный регистр 8 битов шириной. Однако кремниевый производитель не
может реализовать все приоритетные биты. Реализованные биты всегда
расширяются от MSB к LSB.

Когда микроконтроллер разработан, производитель может определить число


активных битов в приоритетном регистре. Для Cortex-M3/M4 и Кора-M7, это может
быть минимумом три и максимум до восемь. Для Коры-M0 и M0 1 это всегда - 2 бита.
Сокращение количества активных приоритетных битов уменьшает количество
логического элемента NVIC и следовательно его потребляемую мощность. Если
производитель не реализует полные 8 битов приоритетного регистра, то LSBs будет
отключен, это делает более безопасным портировать код между микроконтроллерами
с различными числами активных приоритетных битов. Необходимо будет проверить
таблицу данных производителя для наблюдения, сколько битов приоритетного
регистра активно.
106 Глав 3

Группы и подгруппа
После сброса процессора первые 7 битов приоритетных регистров определяют
уровень вытеснения, и LSB определяет подприоритетный уровень. Это разделение
между группой вытеснения и приоритетной подгруппой может быть изменено путем
записи в поле “NVIC priority group” в “Регистре” Управления Прерыванием и Сбросом
приложения. Этот регистр позволяет нам изменять размер поля группы вытеснения и
приоритетной подгруппы. На сбросе, этот регистр значения по умолчанию к
приоритетному нулю группы (Таблица 3.10).

Таблица 3.10: Приоритетная группа и значения подгруппы


Приоритетная Вытесните биты Подприоритетные
группа группы биты группы
0 71 0
1 72 10
2 73 20
3 74 30
4 75 40
5 76 50
6 7 60
7 Ничего 70

Так, например, если бы наш микроконтроллер имеет четыре активных приоритетных


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

Рисунок 3.34
Приоритетный регистр с четырьмя активными битами и приоритетной группой 5.
Это уступает четыре, вытесняют уровни и четыре
приоритетных уровня.

Самый высокий уровень вытеснения для пользовательского исключения является


нулем, однако, некоторые исключения процессора Cortex-M имеют отрицательные
приоритетные уровни, таким образом, они будут всегда вытеснять пользовательское
прерывание ввода-вывода (Рис. 3.35).
Архитектура Cortex-M 107

Рисунок 3.35
Исключения процессора Cortex-M и возможные приоритетные
уровни.

Управление приоритетами во время выполнения


Существует три регистра ЦП, которые могут использоваться для динамичного отключения
источников прерывания в NVIC. Это PRIMASK, FAULTMASK и регистры BASEPRI
(Таблица 3.11).

Таблица 3.11: PRIMASK ЦП, FAULTMASK и регистры BASEPRI используются для


динамичного отключения прерываний и исключений

Регистр маски ЦП Описание


PRIMASK Отключает все исключения кроме серьезного отказа и NMI
FAULTMASK Отключает все исключения кроме NMI
Отключает все исключения на выбранном уровне Вытеснения, и ниже
BASEPRI вытесните уровень

Эти регистры не с отображенной памятью, они - регистры ЦП и могут только быть


получены доступ с MRS и инструкциями MSR. При программировании в “C” к ним
может получить доступ специализированный компилятор внутренние инструкции,
мы посмотрим на эти intrinsics более тесно в Главе 4 “Стандарт Программного
интерфейса Микроконтроллера Коры”.

Модель исключения
Когда NVIC служит единственному прерыванию, существует задержка 12 циклов,
пока мы не достигаем ISR и еще 10 циклов в конце ISR до резюме процессора
Cortex-M
108 Глав 3

выполнение фонового кода. Это дает нам быстро детерминированную обработку


прерываний в системе, которая может иметь только один или два активных
источника прерывания (Рис. 3.36).

Рисунок 3.36
Когда исключение повышено, стековый фрейм продвинут параллельно с адресом
ISR, выбираемым от таблицы векторов. На Коре-M3 и Коре-M4 это всегда - 12
циклов. На Коре-M0 требуется 16 циклов. Кора-M01 берет 15 циклов.

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

Объединение в цепочку хвоста NVIC

В очень управляемом прерыванием дизайне мы можем часто находить, что, в то время


как ЦП служит высокоприоритетному прерыванию, более низкое приоритетное
прерывание также находится на рассмотрении. В более ранних центральных
процессорах ARM и многих других процессорах, было необходимо возвратить из
прерывания POPing контекст ЦП от стека назад в регистры ЦП и затем выполнение
нового стека PUSH прежде, чем выполнить незаконченный ISR. Это довольно
расточительно с точки зрения циклов ЦП, поскольку это выполняет две избыточных
операции стека (Рис. 3.37).
Рисунок 3.37
Если ISR будет работать, и более низкое приоритетное прерывание повышено, то
это автоматически “выследит объединенный в цепочку” для
выполнения 6 циклов после того, как начальное прерывание
завершилось.
Архитектура Cortex-M 109

Когда эта ситуация происходит на процессоре Cortex-M, NVIC использует технику,


названную объединением в цепочку хвоста для устранения ненужных операций
стека. Когда процессор Cortex-M достигает конца активного ISR и существует
незаконченное прерывание затем, NVIC просто вызывает процессор к вектору к
незаконченному ISR. Это берет фиксированные шесть циклы для выборки начального
адреса незаконченной процедуры прерывания, и затем выполнение следующего ISR
может начаться. Дальше с незаконченными прерываниями имеют дело в том же пути.
Когда не будет никакого дальнейшего ожидания прерываний, стековый фрейм будет
POPed назад к регистрам процессора, и ЦП возобновит выполнение фонового кода.
Как Вы видите из Рис. 3.37, объединение в цепочку хвоста может значительно
улучшить задержку между процедурами прерывания.

NVIC, поздно прибывающий

Другая ситуация, которая может произойти, является “последним прибывающим”


первоочередным прерыванием. В этой ситуации низкоприоритетное прерывание
повышено сопровождаемое почти сразу первоочередным прерыванием. Большинство
микроконтроллеров обработает это путем вытеснения начального прерывания. Это -
нежелательный, потому что он заставит два стековых фрейма быть продвинутыми и
задержит первоочередное прерывание (Рис. 3.38).

Рисунок 3.38
Если процессор Cortex-M войдет и ISR, и более высокое приоритетное прерывание
повышено, то NVIC автоматически переключится для обслуживания
первоочередного прерывания. Это только произойдет, если начальное прерывание
будет в своих первых 12 циклах.

Если эта ситуация произойдет на процессоре Cortex-M, и первоочередное прерывание


прибывает в рамках начальных 12 НАЖАТИЙ цикла низкоприоритетного стекового
фрейма, то NVIC переключится на обслуживание первоочередного прерывания, и
низкоприоритетное прерывание будет хвостом, объединенным в цепочку для
выполнения, после того как первоочередное прерывание закончено. Чтобы
“последний прибывающий” переключатель произошел, первоочередное прерывание
должно произойти в начальный период с 12 циклами низкоприоритетного
прерывания. Если это произойдет немного позже, чем это, то это вытеснит
низкоприоритетное прерывание, которое требует нормального стека PUSH и
НАСЕЛЕНИЯ.
110 Глав 3

NVIC вытеснение POP

Заключительный метод оптимизации, используемый NVIC, является названным


вытеснением POP (Рис. 3.39). Это - своего рода реверсирование последней
прибывающей техники, обсужденной выше.

Рисунок 3.39
Если прерывание будет повышено, в то время как находится в его выходе из 12
циклов, процессор будет “перематывать” стек и служить новому
прерыванию с минимальной задержкой 6 циклов.

Когда типичный микроконтроллер достиг конца ISR, он всегда должен


восстанавливать стековый фрейм независимо от любых незаконченных прерываний.
Как мы видели выше, NVIC будет использовать объединение в цепочку хвоста для
эффективного контакта с любыми в настоящее время незаконченными прерываниями.
Однако, если не будет никаких незаконченных прерываний, то стековый фрейм будет
восстановлен регистрам ЦП в стандартных 10 циклах. Если в течение этого периода с
12 циклами новое прерывание будет повышено, то POPing стекового фрейма будет
остановлен, и указатель вершины стека будет раной назад к началу стекового фрейма.
Затем, новый вектор прерывания будет выбран, и новый ISR будет выполняться. В
конце новой процедуры прерывания мы возвращаемся к фоновому коду посредством
обычного процесса POP с 10 циклами. Важно помнить, что эти три метода,
Объединение в цепочку Хвоста, Поздно Прибывая и Поп-Вытеснение все
обрабатываются NVIC без любых инструкций, добавляемых к Вашему коду
приложения.

Упражнение 3.3 Работа с несколькими прерываниями


Это осуществление расширяет наше исходное осуществление исключения SysTick для
включения второго прерывания ADC. Мы можем использовать эти два прерывания
для исследования поведения NVIC, когда это имеет несколько источников
прерывания.
Откройте установщик пакета.
Выберите вкладку Boards и “Учебные Примеры Руководства Разработчиков”.
Выберите вкладку Example и Копию “Исключая 3,3 Несколько Прерываний”.
Откройте main.c и найдите основное () функция.
Архитектура Cortex-M
111
неподписанный символьный ФОН 5 0; неподписанный символьный ADC 5 0; неподписанный символьный
SYSTICK 5 0;
международное основное (пустота) {
интервал i;
GPIOB-.CRH 5 0x33333333; //Настройте Порт B светодиодные контакты
SysTick-.VAL 5 0x9000; //Запустите значение для счетчика Галочки sys
SysTick-.LOAD 5 0x9000; //Значение перезагрузки
SysTick-.CTRL 5 SYSTICK_INTERRUPT_ENABLE | SYSTICK_COUNT_ENABLE;
init_ADC (); //установите периферийное устройство ADC
ADC1-.CR1 | 5 (1UL, 5); //включите для Прерывания EOC
NVIC-.ISER [0] 5 (1UL, 18); //включите Прерывание ADC
ADC1-.CR2 | 5 (1UL, 0); //ADC включает
в то время как
(1) {
ФОН 5 1;
}}

Мы инициализируем таймер SysTick то же как прежде. Кроме того, периферийное


устройство ADC также настроено. Для включения прерывания ввода-вывода
необходимо включить источник прерывания в периферийном устройстве и также
включить его канал прерывания в NVIC путем установки корректного бита в
регистрах NVIC ISER. В этом примере пишем мы непосредственно в NVIC-. ISER [0]
регистр. В следующей главе мы будем видеть лучший более “стандартный” способ
сделать это.

Мы также добавили три переменные: ФОН, ADC и SYSTICK. Они будут установлены
на логический, когда регион соответствия кода выполнится, и обнулите в других
случаях. Это позволяет нам отслеживать казнь каждого региона кода с помощью
Анализатора логики отладчика.
освободите ADC_IRQHandler (пусто) {
интервал i;
ФОН 5 0;
SYSTICK 5 0;
для (я 5 0; я, 0x1000; i11) {
ADC 5 1;
}
ADC1-.SR и 5 B (1, 1); /* очищают прерывание EOC */
ADC 5 0;
}

Обработчик прерываний ADC устанавливает переменные региона выполнения, затем


находится в цикле задержки. Прежде, чем выйти из него также пишет в регистр
состояния ADC для очистки конца флага преобразования. Этот deasserts запрос на
прерывание ADC к NVIC.
освободите SysTick_Handler (пусто)
{интервал i;

ФОН 5 0; ADC 5 0;
ADC1-.CR2 | 5 (1UL, 22); для (я 5
0; я, 0x1000; i11) {
SYSTICK 5 1;
}
SYSTICK 5 0;
}
112 Глав 3

Обработчик прерываний SysTick подобен обработчику ADC. Это устанавливает


переменные казни региона и находится в цикле задержки перед выходом. Это также
пишет в регистр управления ADC для инициирования единственного
преобразования ADC.
Разработайте проект и запустите средство моделирования.
Добавьте каждую из переменных выполнения к Анализатору логики и запустите
выполнение кода
(Рис. 3.40).

Рисунок 3.40
Прерывание SysTick выполняется (логика высоко) затем, прерывание ADC является
объединенным в цепочку хвостом и будет работать,
когда SysTick заканчивается.

Прерывание SysTick повышено, который запускает преобразование ADC. ADC


заканчивает преобразование и повышает его прерывание, прежде чем прерывание
SysTick завершится так, это вводит Незаконченное состояние. Когда прерывание
SysTick завершается, прерывание ADC является объединенным в цепочку хвостом и
начинает выполнение, не возвращаясь к фоновому коду.

Выйдите из отладчика и закомментируйте строку кода, которая очищает конец


ADC флага преобразования.
//ADC1-.SR И 5 B (1, 1);

Создайте код и перезапустите отладчик и наблюдайте выполнение прерываний в окне


Logic Analyzer (Рис. 3.41).

Рисунок 3.41
Хвост ADC объединяет SysTick в цепочку и работает многократно, потому что
флаг состояния ADC не был очищен.
После того, как первое прерывание ADC было повышено, флаг состояния прерывания не
был очищен, и линия прерывания ADC к NVIC остается утверждаемой. Это вызывает
непрерывные прерывания ADC к
Архитектура Cortex-M 113

будьте повышены NVIC блокирование действия фонового кода. Прерывание


SysTick имеет тот же приоритет как ADC, таким образом, это будет хвост,
объединенный в цепочку для погони за текущим прерыванием ADC, закончился.
Пренебрежение очистить флаги состояния прерывания является наиболее
распространенной ошибкой, сделанной, сначала начиная работать с прерываниями и
процессорами Cortex-M.
Выйдите из отладчика и не прокомментируйте конец кода преобразования.
ADC1-.SR И 5 B (1, 1);

Добавьте следующие строки к фоновому коду инициализации.


NVIC-.IP[18] 5 (2, 4);
SCB-.SHP[11] 5 (3, 4);

Это программирует пользовательское периферийное устройство приоритетные регистры


прерывания NVIC для установки приоритетного уровня ADC и “Приоритетных
регистров” Обработчика Систем для установки приоритетного уровня SysTick. Это оба
массивы байтов, которые покрывают 8-разрядное приоритетное поле для каждого
источника исключения. Однако на этом микроконтроллере производитель реализовал
четыре приоритетных бита из возможных восьми. Приоритетные биты расположены в
верхнем откусывании каждого байта. На сбросе обнуляется PRIGROUP, который создает
7-разрядное поле вытеснения и 1-разрядное приоритетное поле (Рис. 3.42).

Рисунок 3.42
После того, как сброшено микроконтроллер с четырьмя реализованными приоритетными
битами будет иметь 16 уровней вытеснения.

На нашем устройстве все доступные приоритетные биты расположены в поле


вытеснения, дающем нам 16 уровней приоритетного вытеснения.

Создайте код, перезапустите отладчик и наблюдайте выполнение прерываний в окне


Logic Analyzer (Рис. 3.43).
Рисунок 3.43
ADC в более высоком приоритете, чем SysTick, таким образом, он
предвосхищает прерывание SysTick.
114 Глав 3

ADC теперь имеет самое высокое на значение emption поэтому, как только его
прерывание повышено, это вытеснит прерывание SysTick. Когда это завершится,
прерывание SysTick возобновится и завершится прежде, чем возвратиться к
фоновому коду.

Выйдите из отладчика и не прокомментируйте следующие строки в фоновом режиме


код инициализации.

Регистр AIRC не может быть записан в свободно. Это защищено полем ключа,
которое должно быть запрограммировано со значением 0x5FA, прежде чем запись
будет успешна.
работайте временно 5 SCB-.AIRCR;
работайте временно и 5 B (SCB_AIRCR_VECTKEY_Msk |
SCB_AIRCR_PRIGROUP_Msk); работайте временно 5 (временный файл |
(uint32_t) 0x5FA, 16) | (0x05, 8)); временный файл SCB-.AIRCR 5;

Это программирует поле PRIGROUP в регистре AIRC к значению 5, что означает 2-


разрядное поле вытеснения и 6-разрядное приоритетное поле. Это отображается на
доступное 4-разрядное приоритетное поле, дающее четыре уровня вытеснения
каждый с четырьмя уровнями приоритета (Рис. 3.44).

Рисунок 3.44
PRI Group установлена определить 2-разрядное поле вытеснения и 2-
разрядное приоритетное поле.

Создайте код и перезапустите отладчик и наблюдайте выполнение прерываний в окне


Logic Analyzer (Рис. 3.45).
Рисунок 3.45
SysTick и ADC имеют различные приоритетные уровни, но то же вытесняет
уровень. Теперь, ADC не может вытеснить SysTick.
Архитектура Cortex-M 115

Прерывание ADC больше не вытесняет таймер SysTick несмотря на них имеющий


различные значения в их приоритетных регистрах. Это вызвано тем, что у них теперь
есть различные значения в приоритетном поле, но то же вытесняет значение.
Выйдите из отладчика и измените приоритеты прерывания как показано ниже.
NVIC-.IP[18] 5 (2, 6 | 2, 4);
SCB-.SHP[11] 5 (1, 6 | 3, 4);

Установите регистр базового приоритета для блокирования, ADC вытесняют группу.


__ set_BASEPRI (2, 6);

Создайте код, перезапустите отладчик и наблюдайте выполнение прерываний в окне


Logic Analyzer (Рис. 3.46).

Рисунок 3.46
Установка регистра Базового приоритета отключает прерывание ADC.

Установка регистра BASEPRI отключила прерывание ADC и любые другие


прерывания, которые находятся на том же уровне, вытесняют группу или ниже.

Поддержка загрузчика
В то время как таблица векторов прерываний расположена в начале памяти, когда
процессор Cortex-M сбрасывается, возможно переместить таблицу векторов к другому
местоположению в памяти. Поскольку программное обеспечение, встроенное в
маленькие микроконтроллеры, становится более сложным существует
увеличивающаяся потребность разработать системы с постоянной программой
начальной загрузки, которая может проверить целостность кода главного приложения,
прежде чем это будет работать и проверка на обновление программы, которое может
быть поставлено различными последовательными интерфейсами (например, Ethernet,
USB, UART) или SD / мультимедийную карту (Рис. 3.47).
116 Глав 3

Рисунок 3.47
Программа начальной загрузки может быть помещена в первый сектор во Флэш-
памяти. Это проверит, существует ли обновление кода приложения прежде, чем
запустить программу главного приложения.

После того как загрузчик выполнил свои проверки и, при необходимости обновил
прикладную программу, это перейдет счетчик команд к запуску кода приложения,
который начнет работать. Для работы правильно код приложения требует, чтобы
таблица векторов была отображена на начальном адресе кода приложения (Рис.
3.48).

Рисунок 3.48
Когда код приложения начинает работать, он должен переместить таблицу
векторов к запуску кода приложения путем программирования регистра
Смещения таблицы векторов NVIC.

Таблица векторов может быть перемещена путем записи в регистр в системном блоке
управления, названном “регистром” Смещения Таблицы векторов. Этот регистр
позволяет Вам перемещать таблицу векторов к любой 128-байтовой границе в карте
памяти процессора Коры.

Упражнение 3.4 Загрузчик


Это осуществление демонстрирует, как программа начальной загрузки и прикладная
программа могут и быть резидентным объектом на том же микроконтроллере Cortex-
M и как отладить такую систему.
Архитектура Cortex-M 117

Откройте установщик пакета.


Выберите вкладку Boards и “Учебные Примеры Руководства Разработчиков”.
Выберите вкладку Example и Копию “Исключая 3.4 Загрузчиками”.
Это - больше расширенной функции IDE µVision, который позволяет Вам
просматривать два или больше проекта одновременно (Рис. 3.49).

Рисунок 3.49
Загрузчик и проект Blinky в многопроектной рабочей области.

Рабочая область состоит из двух проектов, проекта загрузчика, который


разрабатывается для работы вектора сброса процессора Cortex как нормального, и
проект Blinky, который является нашим приложением. Во-первых, мы должны
разработать проект Blinky для выполнения от адреса приложения который не в том
же секторе Flash как загрузчик. В этом примере адрес приложения выбран, чтобы
быть 0x2000.

Разверните проект Blinky, щелкните правой кнопкой по папке рабочей области и


установите его как активный проект (Рис. 3.50).

Рисунок 3.50
Выберите проект и щелчок правой кнопкой для создания этого
активным проектом.

Теперь нажмите на папку проекта Blinky и откройте опции для вкладки Target\Target
(Рис. 3.51).

Рисунок 3.51
Проекту Blinky нужно было сместить его код к 0x2000 начальному адресу.
118 Глав 3

Нормальный начальный адрес для этой микросхемы является 0x8000000, и


мы увеличили это до 0x8002000.
Откройте system_stm32F10x.c файл и найдите строку 128.
#define VECT_TAB_OFFSET 0x02000

Это содержит #define для регистра смещения Таблицы векторов. Обычно, это - нуль,
но если мы установим это на 0x2000, то таблица векторов будет ре, отображенным
для соответствия нашему коду приложения, когда это начнет работать.
Разработайте проект Blinky.
Разверните проект загрузчика и установите его как активный проект (Рис. 3.52).

Рисунок 3.52
Выберите загрузчик как активный проект.

Открытый main_boot.c

Программа начальной загрузки демонстрирует, как спрыгнуть с одной программы к


запуску другого. Мы должны определить начальный адрес нашей второй программы.
Это должно быть кратным 128 байтам (0x200). Кроме того, пустой указатель функции
также определяется:
Определение типа #define
APPLICATION_ADDRESS 0x2000, пустое
(*pFunction) (пусто); pFunction
Jump_To_Application; uint32_t JumpAddress;

Когда код загрузчика входит основной, он выполнил бы пользовательские проверки


на Flash кода приложения, такие как контрольная сумма и мог также протестировать
другие критические аспекты аппаратных средств. Загрузчик затем проверил бы,
чтобы видеть, существует ли новое приложение, готовое быть запрограммированным
в прикладную область. Это могло быть в ответ на команду от утилиты обновления
через последовательный интерфейс, например. Если бы сбой проверок прикладной
программы или новое обновление доступны, мы ввели бы в основной код загрузчика.
международное
основное (пустота)
{uint32_t флаги
начальной загрузки;
/* проверьте целостность кода приложения */
Архитектура Cortex-M 119

/* Проверьте, является ли обновление доступным */


/* если любой случай является истинным набором немного в */флагах
начальной загрузки регистра флагов начальной загрузки 5 0;

если (флаги начальной загрузки! 5 0) {


//введите код обновления Flash здесь
}

Если код приложения и аппаратные средства будут в порядке, то загрузчик передаст


коду приложения. Вектор сброса кода приложения теперь расположен в адресе
приложения 14, и это может быть загружено в указатель функции, который может
затем быть выполнен, приведя к переходу к запуску кода приложения. Прежде чем
мы перейдем к коду приложения, также необходимо загрузить указатель вершины
стека начальным адресом, ожидаемым кодом приложения.
еще {
JumpAddress 5 * (__ IO uint32_t*) (APPLICATION_ADDRESS 1 4);
Jump_To_Application 5 (pFunction) JumpAddress;
//считайте первые четыре байта кода приложения и программируйте это значение в указатель вершины
стека:

//Это устанавливает стек, готовый к коду приложения __ set_MSP


(* (__ IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application ();

}}

Разработайте проект.

Откройте Опции загрузчика для вкладки Target\Debug и откройте файл


loadApp.ini (Рис. 3.53).

Рисунок 3.53
Сценарий отладки используется для загрузки символов проекта приложения. Это
позволяет Вам отлаживать загрузчик и код приложения
одновременно.

Загрузка ".. \\Blinky \\Flash \\Blinky. AXF", возрастающий


Этот файл сценария может использоваться со средством моделирования или
аппаратным отладчиком. Это используется для загрузки кода приложения Blinky, а
также кода загрузчика. Это позволяет нам отлаживать беспрепятственно между
двумя отдельными программами.
120 Глав 3

Запустите отладчик.

Одноэтапный код через загрузчик, проверяющий, что корректный адрес указателя


вершины стека загружается в MSP и что начальный адрес Blinky загружается в
указатель функции.

Используйте Окно памяти для просмотра приложения Blinky, которое запускается в


0x800200, и проверьте, что значение указателя вершины стека загружается в R13, и
адрес сброса загружается в указатель функции (Рис. 3.54).

Рисунок 3.54
Первые 8 байтов образа прикладного объекта содержат начальный адрес
указателя вершины стека и адрес обработчика
сброса.

Откройте blinky.c файл в проекте Blinky и установите точку останова на основном


(Рис. 3.55).

Рисунок 3.55
Установите точку останова на основном () в проекте Blinky.

Выполните код

Теперь, процессор Cortex оставил программу начальной загрузки и ввел


прикладную программу Blinky. Системный код запуска запрограммировал
регистр смещения Таблицы векторов поэтому теперь, аппаратная таблица
векторов соответствует программному обеспечению Blinky.
Откройте таблицу прерываний вектора Peripherals\Core Peripherals\Nested (рис. 3.56).
Рисунок 3.56
Путем программирования VTO таблица аппаратного прерывания была перемещена
для соответствия таблице векторов
программного обеспечения.
Архитектура Cortex-M 121

Теперь, таблица векторов в 0x8002000 для соответствия коду Blinky.


Откройте файл IRQ.C и установите точку останова на обработчике прерываний
SysTick (Рис. 3.57).

Рисунок 3.57
Установите точку останова в начале обработчика прерываний SysTick.

Выполните код.

Когда таймер SysTick повысит, его прерывание, адрес обработчика будет выбран от
таблицы векторов Blinky а не адреса по умолчанию в начале памяти, и корректный
обработчик SysTick будет выполняться. Теперь программа Blinky работает счастливо в
ее адресе смещения. При необходимости в коде приложения для вызова, загрузчик
затем установил шаблон в памяти и вызывает сброс в рамках кода приложения путем
записи в “Системный регистр” Управления Прерыванием и Сбросом Приложения
Блока управления.
Shared_memory 5 USER_UPDATE_COMMAND
NVIC_SystemReset ();

То, когда загрузчик перезапускает часть своих проверок запуска, должно будет
протестировать shared_memory местоположение и если это установлено, выполняет
необходимый код.

Управление питанием
В то время как Кора-M0 и Кора-M01 специально предназначены для операции
низкой мощности, Кора-M3 и Кора-M4 все еще имеют удивительно низкую
потребляемую мощность. В то время как потребление фактической мощности будет
зависеть от производственного процесса, используемого Кремниевым Поставщиком,
числа ниже дают признак ожидаемой потребляемой мощности (Таблица 3.12).

Таблица 3.12: Потребляемая мощность изображает вариантом процессора в LP на 90 нм


(Низкая мощность) процесс

Процессор Динамическая потребляемая мощность Подробнее


(µW/MHz)
Кора-M0 1 11 Исключает единицы отладки
Кора-M0 16 Исключает единицы отладки
Кора-M3 32 Исключает единицы отладки и MPU
Исключает FPU, MPU и единицы
Кора-M4 33 отладки
122 Главы 3

Процессоры Cortex-M способны к переходу к режимам низкой мощности под


названием СОН и DEEPSLEEP. Когда процессор в помещенном в Режим ожидания,
основной сигнал тактовой частоты ЦП останавливается, который останавливает
процессор Cortex-M. Остальная часть часов микроконтроллера и периферийных
устройств будет все еще работать и может использоваться для пробуждения ЦП.
Режим DEEPSLEEP является расширением режима ожидания, и его действие будет
зависеть от определенной реализации, сделанной на микроконтроллере. Как правило,
когда к режиму DEEPSLEEP переходят, периферийные часы процессора будут также
остановлены наряду с часами процессора Cortex-M. Другие области
микроконтроллера, такие как SRAM на микросхеме и питание к Флэш-памяти могут
также быть выключены в зависимости от конфигурации микроконтроллера. (Рис.
3.58).

Рисунок 3.58
wakesup контроллер является небольшой площадью логических элементов, которые не требуют
источника часов. WIC может быть расположен на другом домене питания к процессору Cortex-
M. Это позволяет всем часам процессора быть остановленными. Диапазон доступных режимов
питания определяется кремниевым производителем.

Когда процессор Cortex-M ввел режим ожидания низкой мощности, он может быть
разбужен периферийным устройством микроконтроллера повышение прерывания к
NVIC. Однако NVIC нужны часы для работы, поэтому если все часы останавливаются,
нам нужен другой аппаратный блок, чтобы сказать Блоку управления питанием (PMU)
микроконтроллера восстанавливать часы, прежде чем NVIC сможет ответить.
Процессоры Cortex-M могут быть оснащены дополнительной единицей, названной
контроллером прерываний пробуждения (WIC). Обнаружение прерывания
дескрипторов WIC, когда все часы останавливаются и позволяют всему процессору
Cortex переходить к режимам низкой мощности. Контроллер пробуждения состоит из
минимального количества логических элементов и не нуждается в системных часах.
Контроллер пробуждения может быть помещен в другой домен питания к основному
процессору Cortex-M. Это позволяет производителям микроконтроллеров
разрабатывать устройство, которое может иметь режимы низкой мощности, где
большая часть микросхемы выключена при поддержании ключевых периферийных
устройств для пробуждения процессора.
Архитектура Cortex-M 123

Переход к режимам низкой мощности

Ползунок 2 системы команд содержат две специализированных инструкции,


которые поместят процессор Cortex-M в режим SLEEP или DEEPSLEEP
(Таблица 3.13).

Таблица 3.13: инструкции по записи низкой мощности


Внутреннее CMSIS-
Инструкция Описание ядро
Ожидайте
WFI прерывания __ WFI ()
WFE Ожидайте события __ WFE

Поскольку его имя подразумевает, инструкция по Ожиданию прерывания (WFI)


поместит процессор Cortex-M в выбранный режим низкой мощности. Когда
прерывание будет получено от одного из периферийных устройств
микроконтроллера, процессор выйдет из режима низкой мощности и продолжит
обрабатывать прерывание как нормальное. Инструкция по ожиданию события (WFE)
также используется для перехода к режимам низкой мощности, но имеет некоторые
параметры конфигурации, как мы будем видеть затем.

Конфигурирование режимов низкой мощности

Системный регистр управления используется для конфигурирования опций


низкой мощности процессора Cortex-M (Рис. 3.59).

Рисунок 3.59
Системный регистр управления содержит биты конфигурации низкой мощности
процессора Cortex-M.

Процессор Cortex-M имеет два внешних сигнала сна, которые подключены к системе
управления питанием, разработанной производителем. По умолчанию сигнал СНА
активируется, когда WFI или инструкции WFE выполняются. Если SLEEPDEEP
укусил, установлен, второй сигнал сна, SLEEPDEEP активируется, когда процессор
Cortex-M вводит режим ожидания. Два сигнала сна используются производителем
микроконтроллеров для обеспечения более широкой схемы управления питанием
микроконтроллера. Установка SLEEPONEXIT укусила, вынудит микроконтроллер
ввести свой режим ожидания, когда это достигло конца прерывания. Это позволяет
Вам разрабатывать систему, которая просыпается в ответ на прерывание, выполняет
необходимый код и затем автоматически возвратится ко сну. В такой системе никакое
управление стеком не требуется (кроме случая вытесненных прерываний) во время
последовательности записи/выхода прерывания, и никакой фоновый код не будет
выполнен. Инструкция WFE помещает процессор Cortex-M в свой режим ожидания, и
процессор может быть
124 Главы 3

разбуженный прерыванием таким же образом как инструкция WFI. Однако


инструкция WFE имеет фиксатор внутреннего события. Если фиксатор события будет
установлен на один, то процессор очистит фиксатор, но не переходит к режиму низкой
мощности. Если фиксатор будет нулем, то он перейдет к режиму низкой мощности. На
типичном микроконтроллере события являются сигналами прерывания ввода-вывода.
Так незаконченные прерывания будут препятствовать тому, чтобы процессор спал.
SEVONPEND укусил, используется для изменения поведения инструкции WFE. Если
этот бит установлен, строки прерывания ввода-вывода могут использоваться для
пробуждения процессора, даже если прерывание отключено в NVIC. Это позволяет
Вам помещать процессор в его режим ожидания, когда прерывание ввода-вывода
произойдет, процессор разбудит и возобновит выполнение инструкции, следующей
инструкциям WFE вместо того, чтобы перейти к процедуре прерывания (Рис. 3.60).

Рисунок 3.60
Две инструкции по записи низкой мощности помещают процессор Cortex в его режим
низкой мощности. Оба режима используют прерывание ввода-вывода для пробуждения
процессора, но их поведение пробуждения отличается.

Прерывание, отключенное в NVIC, не может использоваться для выхода из режима


ожидания, вводимого инструкцией WFI. Однако инструкция WFE ответит на
действие по любой линии прерывания, даже если это будет отключено или временно
недоступно регистрами маски процессора (BASEPRI, PRIMASK и FAULTMASK).

Упражнение 3.3 Режимы низкой мощности

В этом осуществлении мы будем использовать проект исключения


экспериментировать с режимами низкой мощности Cortex-M.
Архитектура Cortex-M 125

Выберите вкладку Boards и “Учебные Примеры Руководства Разработчиков”.


Выберите вкладку Example и Копию “Исключая 3.5 Режимами Низкой
мощности”
в то время как (1)
{
СПИТЕ 5 1; ФОН 5
0; __ wfe (); ФОН 5
1; СПИТЕ 5 0;
}

Этот проект использует SysTick и прерывания ADC, которые мы видели в последнем


примере. На этот раз мы добавили дополнительную переменную СНА для контроля
состояния работы процессора. Инструкция WFI была добавлена в основном цикле с
условием продолжения.
Разработайте проект и запустите отладчик.
Откройте окно Logic Analyzer и запустите код, выполняющий (Рис. 3.61).

Рисунок 3.61
В нашем простом проекте фоновый код только выполняется __ wfi () инструкция,
вынуждающая ЦП ввести состояние сна.

Здесь, мы видим, что фоновый код выполняется __ wfi () инструкция и затем засыпает,
пока прерывание не повышено. Когда прерывания завершились, мы возвращаемся к
фоновому коду, который сразу поместит процессор в его режим низкой мощности.
Выйдите из отладчика и измените код для соответствия строкам ниже:
SCB-.SCR 5 0x2;
СПИТЕ 5 1; ФОН 5
0; __ wfi (); в то
время как (1) {

Добавьте код для установки бита два из системного регистра управления. Это
устанавливает флаг Sleep On Exit, который вызывает процессор в режим низкой
мощности, когда он завершает прерывание. Сократите
126 Глав 3

оставление тремя строками из цикла с условием продолжения и вставляет их в раздел


инициализации основного () функция.

Создайте код, перезапустите отладчик и наблюдайте выполнение прерываний в окне


Logic Analyzer (Рис. 3.62).

Рисунок 3.62
После того как сну на выходе включили, мы больше не выполняем код в
фоновом режиме (код непрерывания).

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

Перемещение от коры-M3
В этой главе мы сконцентрировались на изучении процессора Cortex-M3. Теперь,
когда Вы знакомы с тем, как Кора-M3 работает, мы можем исследовать различия
между Корой-M3 и другими вариантами Cortex-M. Поскольку мы будем видеть, что
это главным образом архитектурные различия и если можно использовать Кору-M3,
можно легко переместиться до Коры-M4 или вниз к Коре-M0 (1) - базирующийся
микроконтроллер. Все больше кремниевые производители делают семейство
микроконтроллеров, были варианты, имеют ту же схему контактов пакета, и
периферийная покупка может быть выбрана с процессором Cortex-M0 или Cortex-M3,
разрешающим Вам беспрепятственно переключить устройства, обменивающие
производительность по сравнению со стоимостью.
Архитектура Cortex-M 127

Кора-M4
Кора-M4 наиболее легко описана как Кора-M3 с дополнительным FPU и
инструкциями по DSP. Мы посмотрим на эти функции в Главе 8 “Практический DSP
для Коры-M4 и Коры-M7”, но здесь мы возьмем тур по основным отличиям между
Корой-M3 и Корой-M4. Кора-M4 предлагает ту же вычислительную мощность 1.25
DMIPS/MHz как Кора-M3, но имеет намного большую математическую возможность.
Это поставляется тремя способами. Аппаратные средства, в которых FPU может
выполнить вычисления с плавающей точкой немного как 1 цикл по сравнению с
сотнями циклов то же вычисление, взяли бы Кору-M3. Для целочисленных
вычислений Кора-M4 имеет более высокую производительность MAC, который
изменяет к лучшему Кору-M3 MAC, чтобы позволить единственным вычислениям
цикла быть выполненными на 32-разрядных широких количествах, которые приводят
к 64-разрядному результату. Наконец, Кора-M4 добавляет группу SIMD
“Единственная Инструкция Несколько Данных” (SIMD) инструкции, которые могут
выполнить несколько целочисленных вычислений в единственном цикле. В то время
как Кора-M4 имеет большее количество логического элемента, чем Кора-M3, FPU
содержит больше логических элементов, чем весь процессор Cortex-M0 (Таблица
3.14).

Таблица 3.14: Дополнительные функции в Коре-M4

Функция Комментарии
Сопроцессор
для операций с
плавающей
точкой См., что глава 7 “Отлаживает с CoreSight”
DSP SIMD
инструкции
Поле GE в xPSR
Расширенное Кора-M4 расширяет целочисленный MAC для поддержки
целое число единственного цикла
выполнение 32-разрядных умножается который урожай 64-
Единица MAC разрядный результат

Кора-M0
Кора-M0 является уменьшенной версией Коры-M3; это предназначается для
микроконтроллеров недорогой и низкой мощности. Кора-M0 имеет вычислительную
мощность 0.84 DMIPS/MHz. В то время как Кора-M0 может работать в высоких
тактовых частотах, она часто разрабатывается в недорогие устройства с простыми
системами памяти. Следовательно, типичный микроконтроллер Коры-M0 работает с
частотой ЦП 50 DMIPS/MHz, однако, ее низкая потребляемая мощность делает его
идеальным для приложений низкой мощности. В то время как это по существу имеет
модель того же программиста как Кора-M3, существуют некоторые ограничения, и
они получены в итоге ниже (Таблицы 3.15).
128 Глав 3

Таблица 3.15: Функции, не включенные в Кору-M0

Функция Комментарии
Те же настройки канала связи как Кора-M3, но никакое
Трехэтапный конвейер спекулятивное ответвление
целевая выборка
Инструкция и данные используют тот же вход шины, который
Шинный интерфейс Von Newman может иметь более медленное
производительность по сравнению с Гарвардской
архитектурой M3/M4
Никакое условное выражение, Условные переходы всегда используются, которые вызывают
ЕСЛИ ЗАТЕМ блоки конвейерный сброс
Никакие влажные инструкции по
математике
Таймер SYSTICK является Однако до сих пор каждый микроконтроллер Коры-M0 имеет
дополнительным приспособленный
Никакая единица защиты памяти MPU охвачен в Главе 5 “Функции Передовой архитектуры”
Ограниченное количество каналов прерывания по сравнению с
32 канала NVIC Cortex-M3/
M4, однако, на практике это не реальное ограничение и Кора-M0
предназначается для небольших устройств с ограниченным
количеством периферийных устройств
Четыре программируемых Приоритетный уровень регистрируется, только реализовал 2
приоритетных уровня бита (четыре уровня), и
нет никакой приоритетной установки группы
Исключение серьезного отказа Никакой отказ использования, отказ управления памятью или
только исключение отказа шины
векторы
Та же детерминированная обработка прерываний как M3, но
16 задержек прерывания цикла с четырьмя
больше цикла наверху
Ограниченный фиксированными четырьмя уровни
Никакая приоритетная группа вытеснения
Никакой регистр BASEPRI
Никакой регистр FAULTMASK
Кора-M0 имеет меньше функций отладки по сравнению с Корой
Уменьшенные функции отладки -
M3/M4, см. Главу 8 “Практический DSP для Коры-M4 и Коры -
M7” для получения дополнительной информации
Никакие инструкции по
эксклюзивному доступу Инструкции по эксклюзивному доступу охвачены в Главе 5
“Функции передовой архитектуры”
Никакой обратный разрядный
порядок продвижения количества
нулевые инструкции
Сокращенное количество
регистров в Посмотрите ниже
системный блок управления
Таблица векторов не может быть
перемещена NVIC не включает регистр смещения таблицы векторов
Весь код выполняется на Кора-M0 не поддерживает непривилегированный рабочий
привилегированном уровне режим

Системный блок управления содержит сокращенное количество функций по


сравнению с Корой-M3\M4. Кроме того, регистры таймера SysTick были перемещены
от NVIC до системного блока управления (Таблица 3.16).
Архитектура Cortex-M 129

Таблица 3.16: Регистры в системном блоке управления Коры-M0


Размер
в
Зарегистрироваться Слова Описание
Управление SysTick и состояние 1 Включает таймер и его прерывание
Перезагрузка SysTick 1 Содержит 24-разрядное значение перезагрузки
Содержит текущее 24-разрядное значение
Текущее значение SysTick 1 таймера
Калибровка SysTick 1 Позволяет обрезать входную тактовую частоту
Зашитый идентификатор и числа пересмотра от
ИДЕНТИФИКАТОР ЦП 1 ARM и
кремниевый производитель
Управление прерыванием и Обеспечивает ожидают биты для прерываний NMI
состояние 1 и SysTick
и расширенное прерывание информация о
Pending\active
Прерывание приложения и
управление сбросом 1 Содержит те же поля как Кора-M3 минус
Поле PRIGROUP
Конфигурация и управление 1
Эти регистры содержат 8-разрядные приоритетные
Приоритет обработчика систем 2 поля для
настраиваемые исключения Процессора

Кора-M01
Кора-M01 является расширенной версией Коры-M0. Как таковой это имеет более
низкие числа потребляемой мощности, объединенные с большей вычислительной
мощностью. Кора-M01 также приносит MPU и возможность отладки в реальном
времени к очень низкопроизводительным устройствам. Кора-M01 также представляет
быстрый порт I/O, который ускоряет доступ к периферийным регистрам обычно
порты GPIO, чтобы позволить быстро переключаться контактов порта. Поскольку мы
будем видеть в Главе 7 “Отладку с CoreSight”, система отладки оснащена новой
единицей трассировки, названной микро буфером трассировки (MTB), который
позволяет Вам получать историю выполненного кода с недорогим средством
разработки (Таблица 3.17).

Таблица 3.17: кора-M0 1 функция

Функция Комментарии
Кора-M01 является кодом, совместимым с Корой-M0, и
Код, совместимый с обеспечивает
более высокая производительность с более низкой потребляемой
Кора-M0 мощностью
Это сокращает количество доступов Flash и следовательно
Двухэтапный конвейер потребляемой мощности
Порт I/O обеспечивает выборку в течение одного цикла к GPIO и
Порт I/O периферийным регистрам
Таблица векторов может Это поддерживает более сложные разработки программного
быть перемещена обеспечения. Обычно Загрузчик
и отдельное приложение
Поддерживает 16- Это позволяет устройствам, показывающим Кору-M01
разрядную Флэш-память использовать недорогую память
доступы
Код может выполниться в
привилегированном Кора-M01 имеет те же рабочие режимы как Cortex-M3/M4
и непривилегированные
уровни
Единица защиты памяти Кора-M01 имеет подобный MPU к Cortex-M3/M4
Это - единица трассировки “снимка”, к которой может получить
Микро буфер трассировки доступ недорогая отладка
единицы
130 Глав 3

Заключение
В этой главе мы покрыли основные характеристики семейства процессоров Cortex-M.
Для разработки успешно с Основанным на Cortex-M устройством необходимо будет
быть абсолютно знакомы со всеми темами, затронутыми в этой главе и Главе 2
“Разработка программного обеспечения для семейства Cortex-M”. Теперь, когда у нас
есть основное понимание процессора Cortex-M, мы посмотрим на более
усовершенствованные функции процессора плюс диапазон методов и технологий
разработки программного обеспечения.
CHPTER4

Программное обеспечение
микроконтроллера коры
Интерфейсный стандарт

Введение
Широко распространенное внедрение процессора Cortex-M в микроконтроллеры
общего назначения привело к двум возрастающим тенденциям в промышленности
электроники. В первую очередь, тот же процессор доступен из широкого спектра
поставщиков каждый с их собственным семейством микроконтроллеров. В
большинстве в корпусе каждый поставщик создает семейство микроконтроллеров,
которые охватывают диапазон требований для разработчиков встроенных систем.
Это быстрое увеличение количества устройств означает, что как разработчик можно
выбрать подходящий микроконтроллер из нескольких тысяч устройств все еще с
помощью тех же инструментов и навыков независимо от кремниевого поставщика.
Этот взрывной рост в Основанных на Cortex-M микроконтроллерах сделал
процессор Cortex-M фактическим промышленным стандартом для 32-разрядных
микроконтроллеров и в настоящее время нет никаких настоящих претендентов (Рис.
4.1).

Рисунок 4.1
CMSIS-совместимым инструментам разработки программного обеспечения и
стопкам промежуточного программного
обеспечения позволяют нести логотип CMSIS.

Оборот монеты является дифференцированием. Для поставщика микроконтроллера


было бы возможно разработать их собственный 32-разрядный процессор. Однако это
дорого, чтобы сделать и также требует, чтобы экосистема доступных инструментов и
программного обеспечения получила массовое принятие. Это более экономически
эффективно, чтобы лицензировать процессор Cortex-M от ARM и затем использовать
их собственные экспертные знания для создания микроконтроллера с
инновационными периферийными устройствами. Существуют теперь больше
чем 17 (от 10, когда я сначала записал эту книгу 3 несколько лет назад),
кремниевые поставщики, поставляющие Основанные на Cortex-M
микроконтроллеры. В то время как в каждом устройстве процессор Cortex-M
является тем же, но каждый изготовитель заключительного кремния стремится
предложить уникальную группу пользователя

Руководство разработчика по семейству процессоров Cortex-M.


DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00004-9 131
© 2016 Elsevier Ltd. Все права защищены.
132 Главы 4

периферийные устройства для данного диапазона приложений. Это может быть


микроконтроллером, разработанным для приложений низкой мощности, блока
управления приводом, связи или графики. Таким образом, кремниевый поставщик
может предложить микроконтроллер с современным процессором, который имеет
широкую поддержку средств разработки одновременно с помощью их навыка и
знания для разработки микроконтроллера, показывающего инновационный набор
периферийных устройств (Рис. 4.2).

Рисунок 4.2
Основанные на коре микроконтроллеры могут иметь много сложных периферийных
устройств на однокристальной схеме. Чтобы заставить их работать, необходимо
будет использовать некоторую форму стороннего кода. CMSIS предназначается,
чтобы позволить стекам из других источников интегрироваться вместе легко.

Эти двойные факторы привели к обширному “облаку” стандартных


микроконтроллеров со все больше сложными периферийными устройствами. А также
типичные периферийные устройства микроконтроллера, такие как USART, I2C, ADC
и DAC, современный высокопроизводительный микроконтроллер мог иметь
Хост/Устройство контроллер USB, Ethernet MAC, контроллер SDIO и интерфейс LCD.
Программное обеспечение для управления любым из этих периферийных устройств
является эффективно проектом сам по себе, так уведенный дни разработчика,
использующего микроконтроллер на 8/16 битов и пишущего весь код приложения от
вектора сброса. Для выпуска любого вида сложного продукта, почти бесспорно, что
Вы будете использовать некоторую форму стороннего кода для выполнения работы в
срок. Сторонний код может принять форму примера кода, или коммерческого стека с
открытым исходным кодом или библиотеки, обеспеченной
кремниевый поставщик. Обе из этих тенденций создали потребность заставить уровень
“C” кодировать более портативный между различными средствами разработки и
различными микроконтроллерами. Существует также потребность смочь легко
интегрировать код, взятый от множества источников в единственный проект.

Для решения этих проблем, консорциум кремниевых поставщиков и


поставщиков инструментов разработал “Стандарт Программного интерфейса
Микроконтроллера Коры” или CMSIS (Объявленный seeMsys), если коротко.
Стандарт программного интерфейса микроконтроллера коры 133

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

В этой точке стоит согласиться точно, каков CMSIS. CMSIS состоит из семи
взаимосвязанных спецификаций, которые поддерживают разработку кода через все
Основанные на Cortex-M микроконтроллеры. Эти семь спецификаций следующим
образом; CMSIS-ядро, CMSIS-RTOS, CMSIS-DSP, CMSIS-драйвер, CMSIS-пакет,
CMSIS-SVD и CMSIS-DAP (Рис. 4.3).

Рисунок 4.3
CMSIS состоит из нескольких отдельные спецификации (ЯДРО, DSP, RTOS, SVD,
ДРАЙВЕР, DAP и ПАКЕТ), которые делают исходный код более портативным
между инструментами и устройствами.

Это также стоит быть ясным, каков CMSIS не. CMSIS не является сложным уровнем
абстракции, который вынуждает Вас пользоваться сложной и большой библиотекой.
Скорее CMSIS-базовая спецификация берет очень небольшое количество ресурсов
приблизительно 1 К кода и всего 4 байта RAM и просто стандартизирует способ,
которым Вы получаете доступ к регистрам процессора и микроконтроллера Cortex-
M. Кроме того, CMSIS действительно не влияет на способ, которым Вы
разрабатываете код или вынуждаете Вас принять конкретную методологию. Это
просто служит основой, которая помогает Вам интегрировать сторонний код и код
повторного использования будущих проектов. Каждая из спецификаций CMSIS не
то, что сложный и может быть изучен легко.
134 Главы 4

Полная документация для каждой из спецификаций CMSIS может быть загружена


с URL www.keil.com/cmsis. Каждая из спецификаций CMSIS интегрируется в
Набор инструментальных средств MDK-ARM и документация CMSIS доступны путем
открытия Run-Time Environment и нажимания на ссылку CMSIS в столбце описания
(Рис. 4.4).

Рисунок 4.4
К документации CMSIS получают доступ через ссылку описания в менеджере по
Среде выполнения.

CMSIS-ядро
Базовая спецификация обеспечивает минимальный набор функций и макросов
для доступа к ключевым регистрам процессора Cortex-M. Базовая
спецификация также определяет функцию к
настройте осцилляторы микроконтроллера и синхронизируйте дерево в коде запуска,
таким образом, устройство готово к употреблению, когда Вы достигаете основной ().
Базовая спецификация также стандартизирует соглашение о присвоении имен для
периферийных регистров устройства. CMSIS-базовая спецификация также включает
поддержку Трассировки Инструментария во время сеансов отладки.

CMSIS-RTOS
Спецификация CMSIS-RTOS обеспечивает стандартный API для Операционной
системы реального времени. Это - в действительности ряд функций обертки, которые
переводят API CMSIS-RTOS в API определенного RTOS, который Вы используете.
Мы посмотрим на использование RTOS в целом и API CMSIS-RTOS в Главе 9
“CMSIS-RTOS”. Keil RTX RTOS был первым RTOS, который будет поддерживать API
CMSIS-RTOS, и он был выпущен как ссылочная реализация с открытым исходным
кодом. RTX может быть скомпилирован с Keil/ARM, GCC и IAR
Стандарт программного интерфейса микроконтроллера коры 135

компиляторы. Это лицензируется с тремя лицензиями Распределения программного


обеспечения Беркли (BSD) пункта, которые позволяют ее неограниченное
использование в коммерческих и некоммерческих приложениях.

CMSIS-DSP
Поскольку мы видели в Главе 3 “Архитектуру Cortex-M” Кора-M4, “Контроллер
Цифрового сигнала” со многими улучшениями для поддержки алгоритмов DSP.
Разработка оперативной системы DSP лучше всего описана как “нетривиальное время
передачи” и может быть довольно пугающей для всех кроме самых простых систем.
Чтобы помочь простым смертным включать алгоритмы DSP в Cortex-M4/M7 и
проекты Коры-M3, CMSIS включает библиотеку DSP, которая обеспечивает более чем
60 из обычно используемых математических функций DSP. Эти функции
оптимизированы для работы Коры-M4 и Коры-M7, но могут также быть
скомпилированы для работы Коры-M3. Мы взглянем на пользование этой
библиотекой в Главе 8 “Практический DSP для Коры-M4 и Коры-M7”.

CMSIS-драйвер
Спецификация CMSIS-драйвера определяет стандартный API для диапазона
периферийных устройств, которые характерны для большинства семейств
микроконтроллеров. Это включает периферийные устройства, такие как USART,
SPI, и I2C, а также более сложные периферийные устройства, такие как Ethernet
MAC и USB.
CMSIS-драйверы предназначаются для обеспечения стандартной цели для
библиотек промежуточного программного обеспечения. Например, это позволило
бы стороннему разработчику создавать библиотеку USB, которая использовала
драйвер CMSIS-USB. Такая библиотека могла затем быть развернута на любом
устройстве, которое имеет драйвер CMSIS-USB. Это значительно ускоряет
поддержку новых устройств и разрешает библиотеку
разработчики для концентрации на добавлении опций к их продуктам вместо того,
чтобы постоянно иметь необходимость потратить поддержку разработки времени
новых устройств.

CMSIS-SVD и DAP
Одна из ключевых проблем для поставщиков инструментов должна смочь оказать
поддержку отладки для новых устройств, как только они выпущены. Одной из
основных областей, которые должны быть настроены в отладчике, являются окна
“Peripheral View”, которые показывают разработчику текущее состояние
периферийных устройств микроконтроллера. С ростом и в числе поставщиков Cortex-
M и также в возрастающем числе и сложности периферийных устройств на
микросхеме для любого данного поставщика инструментов становится почти
невозможно поддержать поддержку всех возможных микроконтроллеров. Для
преодоления этого препятствия, спецификация CMSIS-SVD определяет “Системный
файл” Описания Средства просмотра. Этот файл обеспечивается и сохраняется
кремниевым поставщиком и содержит полное описание периферийных регистров
микроконтроллера в формате XML. Этот файл затем импортируется средством
разработки, которое использует его для автоматического построения периферийных
окон отладки для микроконтроллера. Этот подход позволяет полной поддержке для
отладочных средств быть доступной, как только новые микроконтроллеры выпущены.
136 Глав 4

Спецификация CMSIS-DAP определяет интерфейсный протокол для аппаратной


единицы отладки, которая находится между хостом ПК и Портом доступа Отладки
микроконтроллера (Рис. 4.5). Это позволяет любой отладчик программного
обеспечения, который поддерживает CMSIS-DAP для соединения с любой аппаратной
единицей отладки, которая также поддерживает CMSIS-DAP. Существует растущее
число очень недорогих оценочных плат, которые содержат интегральный отладчик,
который соединяется с ПК с помощью USB. Во многих случаях этот аппаратный
отладчик поддерживает протокол CMSIS-DAP так, чтобы он мог быть подключен к
любому совместимому набору инструментальных средств.

Рисунок 4.5
CMSIS-DAP допускает совместимость между различными поставщиками — отладчики
программного и аппаратного обеспечения.

CMSIS-пакет
Спецификации CMSIS-ядра и Драйвера могут использоваться для разработки
допускающих повторное использование компонентов программного обеспечения,
которые являются портативными через семейства устройств. Спецификация CMSIS-
пакета определяет метод связывания всех элементов компонента (программные файлы,
примеры, справочные файлы, шаблоны) в программный пакет. Такой Пакет может быть
загружен и установлен в Ваш набор инструментальных средств. Пакет также содержит
информацию о зависимостях от компонента программного обеспечения, то есть, другие
файлы, которые должны присутствовать, когда компонент используется. Это позволяет
Вам быстро интегрировать программное обеспечение из многих источников для создания
платформы, на которой можно разработать код приложения. Поскольку сложность
микроконтроллеров Cortex-M когда-либо увеличивается, это - очень важная технология
для повышения производительности и надежности кода разработчика.

В Главе 12 "Software Components" мы посмотрим на использование


спецификаций CMSIS-драйвера и CMSIS-пакета для создания компонента
программного обеспечения, который может быть снова использован через
несколько микроконтроллеров.

Основы CMSIS
CMSIS-базовая спецификация обеспечивает стандартный набор низкоуровневых
функций, макросов и периферийных определений регистра, которые позволяют
Ваш код приложения легко доступу
Стандарт программного интерфейса микроконтроллера коры 137

Процессор Cortex-M и периферийные регистры микроконтроллера. Эта


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

Кодирование правил
В то время как CMSIS важен для обеспечения стандартизированного программного
интерфейса для всех микроконтроллеров Cortex-M, это также интересно для
встроенных разработчиков, потому что это основано на непротиворечивом множестве
“C” кодирующие правила под названием MISRA-C. При применении эти правила
кодирования генерируют четкий однозначный код “C”, и этот подход стоит изучить,
поскольку он воплощает многие лучшие практики, которые должны быть приняты
при записи исходного кода “C” для собственного прикладного программного
обеспечения.

MISRA-C
MISRA-C кодирование стандарта сохраняется и публикуется MIRA. MIRA, обозначает
“Агентство по Исследованию Автомобильной промышленности”, расположен около
Регби в Англии и ответственен за многие промышленные стандарты, используемые
британской автомобильной промышленностью. В 1998 его подразделение
программного обеспечения выпустило первую версию его правил кодирования,
официально названных “инструкции MISRA для использования C в электронике
механизма” (Рис. 4.6).

Рисунок 4.6
Исходный код CMSIS был разработан с помощью MISRA-C в качестве
стандарта кодирования.
Исходная спецификация MISRA-C содержала 127 правил, которые попытались,
предотвращают общие ошибки кодирования и разрешают серые области ANSI C
спецификация при применении к встроенным системам. Хотя первоначально
предназначено для автомобильной промышленности, MISRA-C встретил признание в
более широком сообществе встроенных систем. В 2004 исправленное издание MISRA-C
138 Глав 4

был выпущен с заголовком “Инструкции MISRA-C для использования C в критических


системах”. Это изменение в заголовке отражает растущее принятие MISRA-C как стандарт
кодирования для общих встроенных систем. Было два дальнейших обновления стандарта
MISRA-C в 2008 и 2012. Одна из других ключевых достопримечательностей MISRA-C -
то, что он был записан инженерами и не программистами. Это привело к ясному,
компактному, и легкий понять подшипник. Каждое правило ясно объяснено с примерами
хорошей практики кодирования. Это означает, что весь стандарт кодирования содержится
в книге всего 106 страниц, которые могут легко быть считаны вечером. Типичный пример
правила MISRA-C показывают ниже:

Правило 13.6 (потребовало), чтобы Числовые переменные, используемые в для


цикла для итеративного подсчета, не должны быть изменены в теле цикла
Счетчики цикла не должны быть изменены в теле цикла. Однако другие
контрольные переменные цикла, представляющие логические значения, могут быть
изменены в цикле. Например, флаг, чтобы указать, что что-то было завершено,
который затем тестируется в на оператор.
Отметьте 5 1;
Для ((я 5 0; (я, 5) && (отмечают 55 1); i11)

{
/*. . .. . ..*/

Отметьте 5 0; Совместимый/* позволяет раннее завершение цикла */i 5 я 1 3;/* Не


Совместимое изменение счетчика цикла */

Где возможный правила MISRA-C были разработаны так, чтобы они могли быть
статически проверены или вручную или специальным инструментом. Стандарт
MISRA-C не является открытым стандартом и публикуется в газете и электронной
форме на веб-сайте MIRA. Полное изложение того, как получить Стандарт MISRA,
доступно в Приложении A.

В дополнение к инструкциям MISRA-C CMSIS осуществляет некоторые


дополнительные правила кодирования. Для предотвращения любой неоднозначности
в реализации компилятора стандарта “C” типы CMSIS использует типы данных,
определенные в ANSI C заголовочный файл stdint.h (Таблица 4.1).

Таблица 4.1: типы переменных CMSIS

Стандартный ANSI C тип MISRA C тип


Символ со знаком int8_t
Со знаком короткий int16_t
Интервал со знаком int32_t
Подписанный __ int64 int64_t
Неподписанный символ unit8_t
Короткое целое без знака uint16_t
Неподписанный интервал uint32_t
Неподписанный __ int64 uint64_t
Стандарт программного интерфейса микроконтроллера коры 139

Тип определяет, гарантируют, что ожидаемый размер данных отображается на


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

CMSIS также указывает спецификаторы типа IO для доступа к периферийным


переменным. Это определения типов, которые ясно дают понять тип доступа,
который каждый периферийный регистр имеет (Таблица 4.2).

Таблица 4.2: спецификаторы CMSIS IO


Спецификатор MISRA-C
IO ANSI C тип Описание
Энергозависима Только для
#define __ Я я константа чтения
Энергозависимы Только для
#define __ O й записи
Энергозависимы Читайте и
#define __ IO й запишите

В то время как это не обеспечивает дополнительной функциональности для Вашего


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

Большая часть документации CMSIS автоматически генерируется с помощью


инструмента под названием Doxygen. Это - бесплатная загрузка, выпущенная в
соответствии с лицензией GPL. В то время как Doxygen не может на самом деле
записать документацию для Вас, это действительно делает большую часть тусклого
скучного материала для Вас (отъезд Вас, чтобы сделать увлекательную работу
документации). Doxygen работает путем анализа исходного кода и извлечения
объявлений и определенных комментариев исходного кода для создания
всестороннего “объектного словаря” для проекта. Выходным форматом по умолчанию
для Doxygen является доступный для просмотра HTML, но это может быть
преобразовано в другие форматы при желании. Комментарии исходного кода CMSIS
содержат определенные теги, снабженные префиксом символ, например, @brief. Эти
теги используются Doxygen для аннотирования описаний функций CMSIS.
/**
* @brief включают прерывание в контроллере прерываний NVIC
* @param IRQn номер прерывания, который указывает прерывание
* @return ни один.
* Включите указанное прерывание в Контроллере прерываний NVIC.
* Другие настройки прерывания, такие как приоритет не затронуты. */
Когда инструмент Doxygen выполняется, он анализирует Ваш исходный код и
генерирует отчет, содержащий словарь Вас функции и переменные на основе
объявлений исходного кода и комментариев.

CMSIS-базовая структура
CMSIS-базовые функции могут быть включены в Ваш проект посредством
добавления трех файлов. Они включают код запуска по умолчанию со стандартной
таблицей векторов CMSIS.
140 Глав 4

Второй файл является system_, устройством.. c файл, который содержит


необходимый код для инициализации системных периферийных устройств
микроконтроллера. Наконец, устройство включает файл, который импортирует
заголовочные файлы CMSIS, которые содержат CMSIS-базовые функции и
макросы (Рис. 4.7).

Рисунок 4.7
CMSIS-базовый стандарт состоит из запуска устройства, система C код и заголовок
устройства. Заголовок устройства определяет периферийные регистры устройства и
получения по запросу в заголовочных файлах CMSIS. Заголовочные файлы CMSIS
содержат все CMSIS-базовые функции.

Код запуска
Код запуска обеспечивает вектор сброса, начальное значение указателя вершины стека
и символ для каждого из векторов прерывания.
__ Векторы DCD __ initial_sp ; Вершина стека
DCD Reset_Handler ; Обработчик сброса
DCD NMI_Handler ; Обработчик NMI
; Обработчик серьезных
DCD HardFault_Handler отказов
; Обработчик ошибок
DCD MemManage_Handler MPU

Когда процессор запустится, он инициализирует основной указатель вершины


стека путем загрузки значения, сохраненного в первых 4 байтах таблицы
векторов. Затем это перейдет к обработчику сброса;
Reset_Handler PROC
ЭКСПОРТИРУЙТЕ [СЛАБЫЙ] Reset_Handler
ИМПОРТИРУЙТЕ __ основной
ИМПОРТ SystemInit
LDR R0, 5 SystemInit
BLX R0
LDR R0, 5 __ основной
BX R0
ENDP
Стандарт программного интерфейса микроконтроллера коры 141

Системный код
Обработчик сброса называет SystemInit () функцией, которая расположена в CMSIS
system_, устройство.. c файл. Этот код поставляется кремниевым производителем,
и он предоставляет весь необходимый код для конфигурирования
микроконтроллера после того, как он оставляет вектор сброса. Обычно это
включает установку внутренних цепей фазовой синхронизации, настраивая
часы микроконтроллера древовидная и внутренняя структура шины, включая
внешнюю шину при необходимости. Конфигурацией функций инициализации
управляет ряд #defines расположенный
в начале модуля. Это позволяет Вам настраивать базовую конфигурацию
системные периферийные устройства микроконтроллера. Начиная с SystemInit ()
выполняется функция, когда листы микроконтроллера сбросят системные
периферийные устройства микроконтроллера, и процессор Cortex-M будет в
полностью настроенном состоянии, когда программа достигает основной (). В
прошлом этот системный код инициализации - что-то, что необходимо было бы
записать или запереть от примера кода. На новом микроконтроллере это было бы
работой нескольких дней, таким образом, SystemInit () функция действительно
сохраняет Вас много времени и усилия. SystemInit () функция также устанавливает
глобальную переменную CMSIS SystemCoreClock на частоту ЦП. Эта переменная
может затем использоваться кодом приложения в качестве ссылочного значения при
конфигурировании периферийных устройств микроконтроллера. В дополнение к
SystemInit () функция системный файл CMSIS содержит дополнительную функцию
для обновления переменной SystemCoreClock, если частота тактовой частоты ЦП
изменяется на лету. Функциональный SystemCoreClockUpdate (); пустая функция,
которая должна быть вызвана, если частота тактовой частоты ЦП изменяется. Эта
функция адаптируется в соответствии с каждым микроконтроллером и оценит
регистры дерева часов, чтобы вычислить новую рабочую частоту ЦП и заменить
переменную SystemCoreClock соответственно.

Однажды SystemInit () функция работала, и мы достигаем кода приложения, мы


должны будем получить доступ к CMSIS-базовым функциям. Эта платформа
добавляется к модулям приложения через определенный для микроконтроллера
заголовочный файл.

Заголовочный файл устройства


Заголовочный файл сначала определяет весь микроконтроллер специальные
функциональные регистры в стандартном формате CMSIS.

Структура определения типа определяется для каждой группы специальных


функциональных регистров на поддерживаемом микроконтроллере. В коде ниже,
общее определение типа GPIO объявляется для группы перерегистров GPIO. Это -
стандартное определение типа, но мы используем спецификаторы IO для
обозначения типа доступа предоставленным данному регистру.
структура определения типа
{
__ IO uint32_t MODER; /*!, регистр режима порта GPIO, Смещение адреса: 0x00 */
__ IO uint32_t OTYPER; /*!, регистр типа выхода порта GPIO, Смещение адреса: 0x04 */
__ IO uint32_t OSPEEDR; /*!, регистр скорости выхода порта GPIO, Смещение адреса: 0x08 */
142 Главы 4

__ IO uint32_t PUPDR; /*!, порт GPIO регистр pull-up/pull-down, Смещение адреса: 0x0C */
__ IO uint32_t IDR; /*!, регистр входных данных порта GPIO, Смещение адреса: 0x10 */
__ IO uint32_t ODR; /*!, регистр данных выхода порта GPIO, Смещение адреса: 0x14 */
__ IO uint16_t BSRRL; /*!, набор битов порта GPIO / сбросил низкий регистр, Смещение адреса: 0x18 */
__ IO uint16_t BSRRH; /*!, набор битов порта GPIO / сбросил высокий регистр, Смещение адреса: 0x1A */
__ IO uint32_t LCKR; /*!, регистр блокировки конфигурации порта GPIO, Смещение адреса: 0x1C */
__ IO uint32_t AFR[2]; /*!, GPIO чередуют функциональные регистры, Смещение адреса: 0x24-0x28 */
} GPIO_TypeDef;

Следующие #defines привыкли к расположению карта распределения памяти


микроконтроллера. Сначала базовый адрес периферийных специальных
функциональных регистров объявляется и затем сместил адреса к каждым из
периферийных шин и наконец смещения к базовому адресу каждого порта GPIO.
#define PERIPH_BASE ((uint32_t) 0x40000000)
APB1PERIPH_BASE PERIPH_BASE #define
#define GPIOA_BASE (AHB1PERIPH_BASE 1 0x0000)
#define GPIOB_BASE (AHB1PERIPH_BASE 1 0x0400)
#define GPIOC_BASE (AHB1PERIPH_BASE 1 0x0800)
#define GPIOD_BASE (AHB1PERIPH_BASE 1 0x0C00)

Затем символы регистра для каждого порта GPIO могут быть объявлены.
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)

Затем в коде приложения мы можем программировать периферийные специальные


функциональные регистры путем доступа к элементам структуры.
освободите LED_Init (пусто) {
RCC-.AHB1ENR | 5 ((1UL, 3));/* Включают часы GPIOD */GPIOD-
.MODER и 5 B ((3UL, 2*12) |
(3UL, 2*13) |
(3UL, 2*14) |
(3UL, 2*15)); Фунт 12/*.. 15 производится */GPIOD-
.MODER | 5 ((1UL, 2*12) |
(1UL, 2*13) | (1UL,
2*14) | (1UL,
2*15));

Микроконтроллер, устройство.. h включают файл, предоставляет подобные


определения для всех периферийных специальных функциональных регистров на
микросхеме. Эти определения создаются и сохраняются кремниевым производителем
и поскольку они не используют никого не, ключевые слова ANSI во включать файле
могут использоваться с любым компилятором “C”. Это означает, что любой
периферийный код драйвера, написанный к спецификации CMSIS, является
полностью портативным между CMSIS-совместимыми инструментами.
Микроконтроллер включает файл, также предоставляет определения номера канала
прерывания для каждого источника прерывания ввода-вывода.
Стандарт программного интерфейса
микроконтроллера коры 143

WWDG_IRQn 5 0, /*!, окно прерывание WatchDog */


PVD_IRQn 5 1, /*!, PVD через Прерывание обнаружения Строки EXTI */
TAMP_STAMP_IRQn 5 2, /*!, Трамбовка и TimeStamp прерывают через строку EXTI */
RTC_WKUP_IRQn 5 3, /*!, прерывание Пробуждения RTC через строку EXTI */
FLASH_IRQn 5 4, /*!, Flash глобальное Прерывание */
RCC_IRQn 5 5, /*!, RCC глобальное Прерывание */
EXTI0_IRQn 5 6, /*!, прерывание EXTI Line0 */
EXTI1_IRQn 5 7, /*!, прерывание EXTI Line1 */
EXTI2_IRQn 5 8, /*!, прерывание EXTI Line2 */
EXTI3_IRQn 5 9, /*!, прерывание EXTI Line3 */
EXTI4_IRQn 5 10, /*!, прерывание EXTI Line4 */

В дополнение к регистру и определениям прерывания, кремниевый поставщик может


также обеспечить библиотеку периферийных функций драйвера. Снова, поскольку этот
код написан к стандарту CMSIS, который он скомпилирует с любым подходящим
средством разработки. Часто эти библиотеки очень полезны для получения работы
проекта быстро и минимизируют количество времени, необходимо потратить
низкоуровневый код написания. Однако они часто - очень общие библиотеки, которые не
приводят к большей части оптимизированного кода. Таким образом, если необходимо
получить максимальную производительность или минимальный размер кода, необходимо
будет переписать функции драйвера для удовлетворения определенному приложению.
Микроконтроллер включает файл, также импортирует, до пяти далее включают файлы.
Это “stdint.h”, “CMSIS-базовый” файл для процессора Cortex-M, который Вы используете.
Заголовочный файл “system_, устройство.. h” также включен для предоставления доступа
к функциям в системном файле. Внутренняя инструкция CMSIS и функции помощника
содержится в двух дальнейших файлах “core_cminstr.h” и “core_cmfunc.h”. При
использовании Коры-M4 или Коры-M7, дополнительный файл "core_CM4_simd.h"
добавляется для оказания поддержки для инструкций Коры-M4 SIMD. Как обсуждено
ранее “stdint.h” файл обеспечивает типы MISRA-C, которые используются в определениях
CMSIS и должны использоваться через
Ваш код приложения.

CMSIS-базовые заголовочные файлы


В CMSIS-базовой спецификации существует небольшое количество, определяет,
которые являются установкой для данного микроконтроллера. Они могут быть
найдены в, устройство.. h процессор включают файл (Таблица 4.3).

Таблица 4.3: значения конфигурации CMSIS

CMSIS определяют Описание


__ CMx_REV Базовое число пересмотра
Число приоритетных битов реализовано в приоритетных регистрах
__ NVIC_PRIO_BITS NVIC
Определяет, если MPU присутствует (см. Главу: 5 Функций Передовой
__ MPU_PRESENT архитектуры)
Определяет, если FPU присутствует (см. Главу: 7 Отладок с
__ FPU_PRESENT CoreSight)
__ Определяет, если существует поставщик определенная
Vendor_SysTickConfig Конфигурация SysTick
144 Главы 4

Процессор включает файл, также импортирует заголовочные файлы CMSIS, которые


содержат CMSIS-базовые функции помощника. Функции помощника разделяются на
группы как показано в Таблице 4.4:

Таблица 4.4: группы функции CMSIS


CMSIS-базовые функциональные группы
Функции доступа NVIC
Конфигурация SysTick
Доступ регистра ЦП
Инструкция ЦП intrinsics
Cortex-M4-SIMD intrinsics
Функции отладки ITM
Функции FPU (Только Кора-M7)
Функции кэша (Только Кора-M7)

Группа NVIC обеспечивает все функции, необходимые для конфигурирования


прерываний Cortex-M и исключений. Подобная функция обеспечивается для
конфигурирования таймера SysTick и прерывания. Группа регистров ЦП позволяет Вам
легко читать и писать в регистры ЦП с помощью Регистра Перемещения для
Специального Регистра (MRS) и Перемещение Специальные Регистры для Регистрации
инструкций (MSR). Любые инструкции, которые не достижимы языком “C”,
поддерживаются специализированными встроенными функциями и содержатся в группе
инструкций ЦП. Расширенный набор intrinsics также обеспечивается для Коры-M4 и
Коры-M7 для доступа к инструкциям SIMD. Наконец некоторые стандартные функции
обеспечиваются для доступа к Трассировке Инструментария отладки.

Прерывания и исключения
Управление регистрами NVIC может быть сделано функциями, обеспеченными в
группе исключения и прерывании. Эти функции позволяют Вам устанавливать канал
прерывания NVIC и управлять его приоритетом, а также опрашивать регистры NVIC
в течение времени выполнения (Таблица 4.5).

Таблица 4.5: прерывание CMSIS и группа исключения

Функция CMSIS Описание


NVIC_SetPriorityGrouping Установите приоритетную группировку
NVIC_GetPriorityGrouping Считайте приоритетную группировку
NVIC_EnableIRQ Включите канал прерывания ввода-вывода
Отключите канал прерывания ввода-
NVIC_DisableIRQ вывода
Считайте незаконченное состояние канала
NVIC_GetPendingIRQ прерывания
Установите незаконченное состояние
NVIC_SetPendingIRQ канала прерывания
NVIC_ClearPendingIRQ Очистите незаконченное состояние канала
прерывания
Получите активное состояние канала
NVIC_GetActive прерывания
Установите активное состояние канала
NVIC_SetPriority прерывания
NVIC_GetPriority Получите приоритет канала прерывания
NVIC_EncodePriority Кодирует приоритетную группу
NVIC_DecodePriority Декодирует приоритетную группу
NVIC_SystemReset Вызывает системный сброс
Стандарт программного интерфейса микроконтроллера коры 145

Функция конфигурирования также обеспечивается для таймера SysTick (Таблица 4.6).


Таблица 4.6: функция CMSIS-SysTick

Функция CMSIS Описание


Настраивает таймер и включает
SysTick_Config прерывание

Так, например, для конфигурирования внешней линии прерывания мы сначала


должны найти название внешнего вектора прерывания используемым в таблице
векторов кода запуска.
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
DCD DMA1_Stream0_IRQHandler; поток DMA1 0

Таким образом для внешней линии прерывания 0 мы просто должны создать


пустую функцию, копирующую имя, используемое в таблице векторов;
освободите EXTI0_IRQHandler (пусто);

Это теперь становится нашей процедурой обработки прерывания. Кроме того, мы


должны настроить периферийное устройство микроконтроллера и NVIC для
включения канала прерывания. В случае внешней линии прерывания следующий код
установит Порт контакт 0 для генерации прерывания к NVIC на убывающем фронте.
AFIO-.EXTICR [0] И 5 BAFIO_EXTICR1_EXTI0; /* ясный используемый контакт */
AFIO-.EXTICR [0] | 5 AFIO_EXTICR1_EXTI0_PA; /* набор PA.0 для использования */
ЭКС-TI-.IMR | 5 EXTI_IMR_MR0; /* размаскируйте прерывание */
ЭКС-TI-.EMR И 5 BEXTI_EMR_MR0; /* никакое событие */
/* никакой триггер нарастающего
ЭКС-TI-.RTSR И 5 BEXTI_RTSR_TR0; фронта */
/* установите триггер убывающего
ЭКС-TI-.FTSR | 5 EXTI_FTSR_TR0; фронта */

Затем мы можем использовать функции CMSIS для включения канала прерывания.


NVIC_EnableIRQ (EXTI0_IRQn);

Здесь мы используем определенный перечислимый тип для номера канала


прерывания. Это объявляется в заголовочном файле микроконтроллера,
устройстве.. h. После того как Вы становитесь немного знакомыми с CMSIS-
базовыми функциями, становится легко интуитивно разработать имя вместо того,
чтобы иметь необходимость искать его или искать номер канала NVIC.

Мы можем также добавить второй источник прерывания при помощи функции


конфигурирования SysTick, которая является единственной функцией в группе
SysTick.
uint32_t SysTick_Config (uint32_t галочки)

Эта функция настраивает значение обратного отсчета таймера SysTick и включает его
прерывание, таким образом, исключение будет повышено, когда его количество
достигнет нуля. Начиная с systemInit () функция
146 Глав 4

устанавливает глобальную переменную SystemCoreClock с частотой ЦП, которая


также используется Вы таймер SysTick, мы можем легко установить таймер SysTick
для генерации желаемого периодического прерывания. Таким образом, одно
прерывание миллисекунды может быть сгенерировано следующим образом.
SysTick_Config (SystemCoreClock/1000);

Снова мы можем искать обработчик исключений от таблицы векторов:


DCD 0; Зарезервировано
Обработчик
DCD PendSV_Handler; PendSV
Обработчик
DCD SysTick_Handler; SysTick

и создайте соответствие “C” функция;


освободите SysTick_Handler (пусто);

Теперь, когда у нас есть два источника прерывания, мы можем использовать другое
прерывание CMSIS и функции исключения для управления приоритетными
уровнями. Количество приоритетных уровней будет зависеть от того, сколько
приоритетных битов было реализовано кремниевым производителем. Для всех
процессоров Cortex-M мы можем использовать простую “плоскую” систему
приоритетов, где нуль является самым высоким приоритетом. Приоритетный
уровень установлен:
NVIC_SetPriority (IRQn_Type IRQn, uint32_t приоритет);

NVIC_SetPriority () функция немного более интеллектуален, чем простой макрос.


Это использует номер канала IRQn NVIC для дифференциации между
пользовательскими периферийными устройствами и исключениями процессора
Cortex-M. Это позволяет этому программировать или приоритетные регистры
обработчика систем в системном блоке управления или приоритетные регистры
прерывания в самом NVIC. NVIC_SetPriority () функция также использует
определение NVIC_PRIO_BITS для смещения приоритетного значения в активные
приоритетные биты, которые были реализованы кремниевым поставщиком.
_STATIC_INLINE освобождают NVIC_SetPriority (IRQn_Type IRQn, uint32_t приоритет)
{
если (IRQn, 0) {
SCB-.SHP [((uint32_t) (IRQn) и 0xF)-4] 5 ((приоритет, (8 - __ NVIC_PRIO_BITS)) и 0xff);}/* Приоритет набора
для Системных прерываний Cortex-M */
еще {
NVIC-.IP [(uint32_t) (IRQn)] 5 ((приоритет, (8 - __ NVIC_PRIO_BITS)) и 0xff);}/* Приоритет набора для
устройства определенные Прерывания */
}

Однако для Cortex-M3/M4 и Кора-M7 у нас есть опция установить приоритетные


группы и подгруппы, как обсуждено в Главе 3 “Архитектура Cortex-M”. В
зависимости от числа приоритетных битов, определенных производителем, мы можем
настроить приоритетные группы и подгруппы.
NVIC_SetPriorityGrouping ();

Установить приоритет NVIC, группирующий Вас, должно записать в “Регистр”


Управления Прерыванием и Сбросом приложения. Как обсуждено в Главе 3
“Архитектура Cortex-M” этот регистр защищена
Стандарт программного интерфейса микроконтроллера коры 147

его полем VECTKEY. Для обновления этого регистра, необходимо записать “0x5FA” в
поле VECTKEY. SetPriorityGrouping () функция предоставляет весь необходимый код,
чтобы сделать это.

__ STATIC_INLINE освобождают NVIC_SetPriorityGrouping (uint32_t PriorityGroup)


{
uint32_t reg_value;
uint32_t PriorityGroupTmp5 (PriorityGroup&(uint32_t) 0x07);/* только оценивает 0.. 7 используемый */reg_value
5 SCB-.AIRCR;/* читают старую конфигурацию регистра */reg_value &5 B
(SCB_AIRCR_VECTKEY_Msk|SCB_AIRCR_PRIGROUP_Msk); ясные биты/* для изменения */reg_value 5
(reg_value | ((uint32_t) 0x5FA, SCB_AIRCR_VECTKEY_Pos) |/* Вставляют ключ записи и приоритетную группу
*/

(PriorityGroupTmp, 8)); SCB-


.AIRCR 5 reg_value;
}

“Прерывание и Исключение” группа также обеспечивают системную


функцию сброса, которая генерирует жесткую перезагрузку целого
микроконтроллера.
NVIC_SystemReset (пусто);

Эта функция пишет в бит два из “Регистра” Управления Сбросом Прерывания


Приложения. Это стробирует логическую строку из Ядра Cortex-M к схеме сброса
микроконтроллера, которая сбрасывает периферийные устройства микроконтроллера и
процессор Cortex-M. Однако необходимо быть немного осторожными здесь, как
реализация этой функции до производителя микроконтроллеров и не может быть
полностью реализована. Таким образом, если Вы собираетесь использовать эту функцию,
необходимо протестировать ее сначала. Разрядный нуль того же регистра сделает "теплый"
сброс процессора Cortex-M. Это - сила сброс процессора Cortex-M, но оставьте регистры
микроконтроллера настроенными.

Упражнение 4.1 CMSIS и пользовательское сравнение кода


В этом осуществлении мы пересмотрим несколько примеров прерываний и исследуем
переписывание кода с помощью CMSIS-базовых функций.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку в качестве примера и Копию “EX 4.1 CMSIS Несколько
Прерывание”.
Выберите вкладку в качестве примера и Копию “EX 3.3 Несколько Прерываний”.
Откройте main.c в обоих проектах и сравните код инициализации.
Прерывания таймера и ADC SysTick могут быть инициализированы со следующими
функциями CMSIS.

SysTick_Config (SystemCoreClock / 100);


NVIC_EnableIRQ (ADC1_2_IRQn);
NVIC_SetPriorityGrouping (5);
NVIC_SetPriority (SysTick_IRQn, 4);
NVIC_SetPriority (ADC1_2_IRQn, 4);
148 Глав 4

Или можно использовать эквивалентный non-CMSIS код....


SysTick-.VAL 5 0x9000; //Запустите значение для счетчика Галочки sys
SysTick-.LOAD 5 0x9000; //Значение перезагрузки
SysTick-.CTRL 5 SYSTICK_INTERRUPT_ENABLE |SYSTICK_COUNT_ENABLE; //Запустите и
включите
прерывание
NVIC-.ISER [0] 5 (1UL, 18); /* включите Прерывание ADC */
NVIC-.IP[18] 5 (2, 6 | 2, 4);
SCB-.SHP[11] 5 (1, 6 | 3, 4);
Временный файл 5 SCB-.AIRC;
Временный файл и 5 B0x
Временный файл 5 временных файлов | (0xAF0) | (0x05);

Хотя оба блока кода достигают того же самого, версия CMSIS намного быстрее для
записи более читаемый и намного менее подверженный кодированию ошибок.
Разработайте оба проекта и сравните размер произведенного кода.

Функции CMSIS представляют маленькие издержки, но это - приемлемый


компромисс против простоты использования и пригодности для обслуживания.

CMSIS-базовый доступ регистра

Следующая группа функций CMSIS предоставляет Вам прямой доступ к регистрам


процессора CPU (Таблица 4.7).
Таблица 4.7: CMSIS функции регистра ЦП

Базовая функция Описание


__ get_Control Прочитайте регистр управления
__ set_Control Запишите в регистр управления
__ get_IPSR Считайте регистр IPSR
__ get_APSR Считайте регистр APSR
__ get_xPSR Считайте регистр xPSR
__ get_PSP Считайте указатель стека процесса
__ set_PSP Запишите в указатель стека процесса
__ get_MSP Считайте основной указатель вершины стека
Запишите в основной указатель вершины
__ set_MSP стека
__ get_PRIMASK Считайте PRIMASK
__ set_PRIMASK Запишите в PRIMASK
__ get_BASEPRI Считайте регистр BASEPRI
__ set_BASEPRI Запишите в регистр BASEPRI
__ get_FAULTMASK Считайте FAULTMASK
__ set_FAULTMASK Запишите в FAULTMASK
__ get_FPSCR Считайте FPSCR
__ set_FPSCR Запишите в FPSCR
Включите прерывания и настраиваемые
__ enable_irq исключения отказа
Отключите прерывания и настраиваемые
__ disable_irq исключения отказа
Включает прерывания и все обработчики
__ enable_fault_irq ошибок
Отключает прерывания и все обработчики
__ disable_fault_irq ошибок
Стандарт программного интерфейса микроконтроллера коры 149

Эти функции предоставляют Вам способность глобально управлять прерываниями NVIC


и установить конфигурацию процессора Cortex-M в его более усовершенствованный
рабочий режим. Сначала мы можем глобально включить и отключить прерывания
микроконтроллера со следующими функциями.

__ set_PRIMASK (пусто); __
set_FAULTMASK (пусто); __
разрешать-IRQ __
enable_Fault-irq __
set_BASEPRI ()

В то время как все эти функции включают и отключают источники прерывания, они
все имеют немного отличающиеся эффекты. __ set_PRIMASK () функция и функции
enable_IRQ/Disable_IRQ имеют тот же эффект, в котором они устанавливают и
очищаются, PRIMASK укусил, который включает и отключает все источники
прерывания кроме Обработчика Серьезных отказов и Немаскируемого прерывания. __
set_FAULTMASK () функция может использоваться для отключения всех прерываний
кроме Немаскируемого прерывания. Мы будем видеть позже, как это может быть
полезно, когда мы хотим обойти единицу Защиты памяти. Наконец __ set_BASEPRI ()
функция устанавливает минимальный активный приоритетный уровень для
пользовательских прерываний ввода-вывода. Когда регистр Базового приоритета
установлен на ненулевой уровень и прерывание на том же приоритетном уровне или
ниже будет отключен.

Эти функции позволяют Вам читать регистр состояния программы и его


псевдонимы. Можно также получить доступ к регистру управления для включения
усовершенствованных рабочих режимов процессора Cortex-M, а также явно
устанавливания значений указателя вершины стека. Специализированная функция
также обеспечивается для доступа к “Плавающей точке tatus и Управлению”
регистр, если Вы используете Кору-M4 или Кору-M7. Мы более внимательно
рассмотрим в более усовершенствованном
рабочие режимы процессора Cortex-M в Главе 5 “Функции Передовой архитектуры”.

CMSIS-ядро-процессора внутренние инструкции


CMSIS-базовый заголовок также обеспечивает две группы стандартизированных
встроенных функций. Первая группа характерна для всех процессоров Cortex-M, и
второе предоставляет стандарт, внутренний для инструкций Коры-M4 SIMD
(Таблица 4.8).

Таблица 4.8: инструкция CMSIS intrinsics


CMSIS
Функция Описание Больше информации
__
ТОЛЬКО
ДЛЯ
УКАЗАНН
ЫХ
ЦЕЛЕЙ Никакая операция
__ WFI Ожидайте прерывания
__ WFE Ожидайте события
__ SEV Событие Send См. главу 3 “архитектура Cortex-M”
__ ISB Барьер синхронизации инструкции
__ DSB Барьер синхронизации данных
Барьер синхронизации памяти
__ DMD данных

(Длительн
ый)
150 Глав 4

Таблица 4.8: (Длительный)


CMSIS
Функция Описание Больше информации
__
ВЕРСИЯ Обратный порядок байтов (32 бита)
Обратный порядок байтов (16
См. главу 4 “программное обеспечение
__ REV16 битов)
микроконтроллера коры
Обратный порядок байтов,
Соедините интерфейсом со Стандартом” для
__ REVSH подписанный короткий
инструкций по вращению
Обратный разрядный порядок (не
__ RBIT для Коры-M0)
__ ROR Вращайтесь прямо n битами
__
LDREXB Загрузитесь эксклюзивный (8 битов)
__ Загрузитесь эксклюзивный (16
LDREXH битов)
__
LDREXW Загрузитесь эксклюзивный (32 бита) См. главу 5 “функции передовой архитектуры”
__
STREXB Сохраните эксклюзивный (8 битов) инструкции по эксклюзивному доступу
__
STREXH Сохраните эксклюзивный (16 битов)
__
STREXW Сохраните эксклюзивный (32 бита)
__ CLREX Удалите монопольную блокировку
__ SSAT Подписанный насыщают
См. главу 3 “архитектура Cortex-M”
__ USAT Неподписанный насыщают
См. главу 4 “программное обеспечение
__ CLZ Считайте начальные нули микроконтроллера коры
Интерфейсный стандарт”

ЦП intrinsics обеспечивает прямой доступ к инструкциям по процессору Cortex-M,


которые не непосредственно достижимы с языка “C”. Используя внутреннее позволит
специализированной единственной инструкции по циклу заменить многоадресные
команды, сгенерированные стандартом “C” код.

С ЦП, внутренним, мы можем перейти к режимам низкой мощности с помощью __


WFI () и __ WFE () инструкции. ЦП intrinsics также обеспечивает доступ к
инструкциям влажной математики, что мы встретили в Главе 3 “Архитектуру Cortex-
M”. Встроенные функции также предоставляют доступ к инструкциям по барьеру
выполнения, которые гарантируют завершение записи данных или выполнение
инструкции прежде, чем продолжить следующую инструкцию. Следующая группа
инструкции intrinsics используется для гарантии эксклюзивного доступа к региону
памяти одним регионом кода. Мы взглянем на них в Главе 5 “Функции Передовой
архитектуры”. Остаток от ЦП intrinsics поддерживает единственные функции
манипулирования данными цикла, такие как поворачивание и обратные разрядные
инструкции по порядку.

Упражнение 4.2 Внутренняя побитовая обработка


В этом осуществлении мы посмотрим на манипулирование данными, внутреннее
поддерживаемый в CMSIS.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Стандарт программного интерфейса микроконтроллера коры 151

Выберите вкладку в качестве примера и Копию “Внутреннее CMSIS-ядро EX 4.2”.

Осуществление объявляет входную переменную и группу выходных переменных и


затем использует каждую из внутренних функций манипулирования данными.
outputREV 5 __ ВЕРСИЯ (вводится);
outputREV16 5 __ REV16 (вводится);
outputREVSH 5 __ REVSH (вводится);
outputRBIT 5 __ RBIT (вводится);
outputROR 5 __ ROR (вход, 8);
outputCLZ 5 __ CLZ (вводится);

Разработайте проект и запустите отладчик.


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

В то время как каждая внутренняя инструкция берет единственный цикл,


некоторые окружающие инструкции требуются так, встроенные функции берут
между 9 и 18 циклами.

Исследуйте значения в выходных переменных для ознакомления с действием


каждого внутреннего (Рис. 4.8).

Рисунок 4.8
Результаты intrinsics операций.

Рассмотрите, как Вы кодировали бы каждый внутренний стандарт использования “C”


инструкции.

CMSIS-SIMD Intrinsics
Следующая группа CMSIS intrinsics обеспечивает прямой доступ к инструкциям
Коры-M4 и Коры-M7 SIMD.

Инструкции SIMD обеспечивают одновременные вычисления для двух 16-разрядных


операций или четырех 8-разрядных операций. Это значительно улучшает любую
форму повторяющегося вычисления по набору данных, как
152 Главы 4

в цифровом фильтре и мы внимательно изучим эти инструкции в Главе 8


“Практический DSP для Коры-M4 и Коры-M7”.

CMSIS-базовые функции отладки


CMSIS-базовые функции также оказывают улучшенную поддержку отладки через
Трассировку Инструментария CoreSight. Стандарт CMSIS имеет две
специализированных спецификации отладки CMSIS-SVD и CMSIS-DAP, на который
мы посмотрим в Главе 7 “Отладка с CoreSight”. Однако CMSIS-базовая
спецификация содержит некоторую полезную поддержку отладки.

Аппаратная точка останова


В первую очередь, существует специализированное внутреннее для добавления
аппаратной точки останова к коду.
__ BKPT (uint8_t значение)

Используя это внутреннее поместит аппаратную команду контрольного останова в


этом местоположении в Вашем коде. То, когда эта точка будет достигнутым
выполнением, будет остановлено, и “значение” будет передано отладчику. Во время
разработки __ BKPT () внутренний может использоваться, чтобы захватить состояния
ошибки и остановить отладчик.

Трассировка инструментария

Как часть ее аппаратной системы отладки, Кора-M3, Кора-M4 и Кора-M7


обеспечивают “единицу” Трассировки Инструментария (ITM). Это может считаться
отладкой UART, который подключен к консоли в отладчике. Путем добавления
рычагов отладки (Оснащающих) в код, возможно считать и записать данные в и от
отладчика, в то время как код работает. Мы посмотрим на использование Трассировки
Инструментария для дополнительной отладки и тестирования программного
обеспечения в Главе 7 “Отладка с CoreSight”. На данный момент существует много
функций CMSIS, которые стандартизируют связь с ITM (Таблица 4.9).

Таблица 4.9: функции отладки CMSIS

Функция отладки CMSIS Описание


энергозависимый международный ITM_RxBuffer 5 Объявите, что одно слово устройства
ITM_RXBUFFER_EMPTY; хранения данных для получает флаг
ITM_SendChar (c); Отправьте один символ в ITM
Проверьте, были ли какие-либо данные
ITM_CheckChar () получены
ITM_ReceiveChar () Считайте один символ из ITM
Стандарт программного интерфейса микроконтроллера коры 153

CMSIS-базовые функции для Corex-M7


С выпуском процессора Cortex-M7 в конце 2014 CMSIS-базовая спецификация была
расширена для обеспечения некоторых дополнительных функций, чтобы
поддерживать новые функции, представленные Corex-M7 (Таблица 4.10).

Таблица 4.10: функция Коры-M7 CMSIS

Функция CMSIS коры-M7 Описание


Одиннадцать функций для поддержки кэшей Инструкции
Функции кэша и Данных
Функция FPU Одна функция для поддержки FPU

Поскольку мы будем видеть в Главе 6 “Процессор Коры-M7”, Кора-M7 представляет


кэши Данных и Инструкции семейству процессоров Cortex-M. Функции кэша CMSIS
позволяют Вам включать и отключать кэши и управлять ими, поскольку Ваш код
выполняется. Мы посмотрим на эти функции в Главе 6 “Процессор Коры-M7”.

Заключение
Хорошее понимание каждой спецификации CMSIS является ключевым для
эффективной разработки приложений для любого Основанного на Cortex-M
микроконтроллера. В этой главе мы представили каждую спецификацию CMSIS и
бросили подробный взгляд на CMSIS-базовую спецификацию. Мы посмотрим на
остающиеся спецификации CMSIS через остальную часть этой книги.
Эта страница, намеренно
оставленная незаполненный
CHPTER5

Функции передовой архитектуры

Введение
В последних нескольких главах мы покрыли большую часть того, что необходимо
знать для разработки с Основанным на Cortex-M микроконтроллером. В этой главе мы
посмотрим на некоторые из большего количества расширенных функций процессора
Cortex-M. Все функции, обсужденные в этой главе, включены в Кору-M01,-M3,-M4,
и-M7. В этой главе мы посмотрим на различные рабочие режимы, встроенные в
каждый из процессоров Cortex-M и некоторых дополнительных инструкций, которые
разработаны для поддержки использования операционной системы реального времени
(RTOS). Мы также взглянем на дополнительную Единицу защиты памяти (MPU),
которая может быть приспособлена к Коре-M01,-M3,-M4, и-M7 и как это может
разделить карту распределения памяти. Это обеспечивает управляемый доступ к
различным регионам памяти в зависимости от рабочего режима процессора. Для
закругления главы мы взглянем на шинный интерфейс между процессором Cortex-M и
системой микроконтроллера.

Рабочие режимы процессора коры


Когда процессор Cortex-M выходит из сброса, он работает в простом “плоском”
режиме, где весь код приложения имеет доступ к полному адресному пространству
процессора и неограниченный доступ к регистрам NVIC и ЦП. В то время как это
хорошо для многих приложений, процессор Cortex-M имеет много функций, которые
позволяют Вам поместить процессор в более усовершенствованный рабочий режим,
который подходит для программного обеспечения высокой целостности и также
поддерживает RTOS.

Как первый шаг к пониманию более усовершенствованных рабочих режимов


процессора Cortex-M, мы должны понять его рабочие режимы. ЦП может выполнять
его два различных режима, режим Thread и режим Handler. Когда процессор
выполняет фоновый код (т.е., код непрерывания), он работает в режиме Thread.
Когда процессор выполняет код прерывания, он работает в режиме Handler (Рис. 5.1).
Руководство разработчика по семейству процессоров Cortex-M.
DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00005-0 155
© 2016 Elsevier Ltd. Все права защищены.
156 Глав 5

Рисунок 5.1
Каждый процессор Cortex-M имеет два режима выполнения, Обработчик (прерывание)
и Поток (фон). Возможно настроить эти режимы для назначения полномочий и
непривилегированный доступ к регионам памяти. Также возможно настроить рабочий
режим с двумя стеками.

Когда процессор начинает исчерпывать сброс, нет никакого операционного различия


между режимом Thread и Handler. Оба режима имеют полный доступ ко всем
функциям ЦП, это известно как привилегированный режим. Путем программирования
Регистра управления процессора Cortex-M возможно поместить, режим Thread в
непривилегированном режиме путем установки уровня полномочий потока (TPL)
укусил (Рис. 5.2).

Рисунок 5.2
Регистр управления является регистром ЦП, к которому могут только получить доступ
MRS и инструкции MSR. Это содержит два бита, которые настраивают уровень
полномочий режима Thread и активацию указателя стека процесса.

В непривилегированном режиме, Регистре Перемещения к Специальному Регистру


(MRS), Перемещение Специальные Регистры для Регистрации (MSR), и инструкции
по Состоянию процессора изменения (CPS) отключены для всех специальных
регистров ЦП, за исключением APSR. Это препятствует тому, чтобы процессор
Cortex-M получил доступ к УПРАВЛЕНИЮ, FAULTMASK, и регистрам PRIMASK и
Регистру состояния ПРОГРАММЫ (кроме APSR). В непривилегированном режиме
также не возможно получить доступ к регистрам таймера SysTick, NVIC или
Системному Блоку управления. Это ограничивает возможность
непривилегированного кода, случайно нарушающего эксплуатацию процессора
Cortex-M. Если режим Thread был ограничен непривилегированным доступом, не
возможно очистить Поток
Функции передовой архитектуры 157

уровень полномочий режима укусил, даже если ЦП работает в режиме Handler с


доступом полномочия. После того как TLP укусил, был установлен, код приложения,
работающий в режиме Thread, больше не может влиять на эксплуатацию процессора
Cortex-M. Когда процессор отвечает на исключение или прерывание, он перемещается
в режим Handler, который всегда выполняет код в привилегированном режиме
независимо от содержания Регистра управления. Регистр управления также содержит
дополнительный бит, Активный Выбор Указателя вершины стека (ASPEL). Установка
этого бита включает дополнительный стек, названный Указателем стека процесса
(PSP). Регистр управления является регистром ЦП, а не регистром с отображенной
памятью и может только быть получен доступ MRS и инструкциями MSR. CMSIS-
базовая спецификация обеспечивает выделенные функции, чтобы читать и записать в
регистр CONRTOL.
освободите __ set_CONTROL (uint32_t
значение); uint32_t __ get_CONTROL (пусто);

Указатель Стека процесса является окруженным валом указателем вершины стека R13,
который используется кодом, работающим в режиме Thread. Когда процессор Cortex-M
отвечает на исключение, он переходит к режиму Handler. Это вызывает ЦП к указателям
стека коммутаторов. Это означает, что режим Handler будет использовать Основной
указатель вершины стека (MSP), в то время как режим Thread использует Указатель
Стека процесса (Рис. 5.3).

Рисунок 5.3
В сбросе R13 является основным указателем вершины стека и автоматически
загружается начальным значением стека. Регистр контроля ЦП может
использоваться для включения окруженного валом регистра R13 секунды. Это
Стек процесса, который используется в режиме Thread. Код приложения должен
загрузить начальное значение стека в этот регистр.
158 Глав 5

Поскольку мы видели в Главе 3 “Архитектуру Cortex-M” в сбросе, MSP будет


загружен значением, сохраненным в первых 4 байтах памяти. Однако Указатель
Стека процесса автоматически не инициализируется и должен быть настроен кодом
приложения, прежде чем он будет включен. К счастью, CMSIS-базовая спецификация
содержит функции для конфигурирования Стека процесса.
освободите __ set_PSP (uint32_t TopOfProcStack);
uint32_t __ get_PSP (пусто);

Так, если необходимо вручную установить начальное значение Стека процесса, каково
это должно быть? Нет простого способа ответить на это, но компилятор производит
файл отчета, который детализирует статическое дерево вызова для проекта. Этот файл
создается каждый раз, когда проект разрабатывают и называют, название проекта..
htm. Файл отчета включает значение для максимального использования стека и дерево
вызова для самой долгой цепочки вызовов.

Это дерево вызова, вероятно, будет для фоновых функций и будет


максимальным значением для Указателя Стека процесса. Это значение может
также использоваться в качестве начальной точки для MSP (Рис. 5.4).

Рисунок 5.4
Размер стека, выделенный основному указателю вершины стека (MSP),
определяется в коде запуска и может быть настроен через
мастер конфигурации.

Упражнение 5.1 Конфигурация стека


В этом осуществлении мы взглянем на конфигурирование рабочего режима
процессора Cortex-M, таким образом, режим Thread будет работать с
непривилегированным доступом и использует Указатель Стека процесса.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Функции передовой архитектуры 159

Выберите вкладку Example и Копию “конфигурация EX 5.1 Стека процесса”.


Создайте код, запустите отладчик и работайте к основному ().

Это - версия проекта Blinky, который мы использовали ранее с некоторым


кодом, добавленным для конфигурирования рабочего режима процессора.
Новый код включает ряд #defines.
#define USE_PSP_IN_THREAD_MODE (1, 1)
#define THREAD_MODE_IS_UNPRIVILIGED 1
#define PSP_STACK_SIZE 0x200

Первые два объявления определяют местоположение битов, которые должны быть


установлены в регистре управления включить Указатель Стека процесса и
переключить режим Thread в непривилегированный доступ. Затем мы определяем
размер пространства Стека процесса. В начале основного мы можем использовать
функции CMSIS, чтобы настроить и включить Указатель Стека процесса. Мы можем
также исследовать рабочие режимы процессора в окне Register (Рис. 5.5).

Рисунок 5.5
Процессор Cortex-M находится в режиме Thread/privileged с помощью основного
стека. PSP не инициализируется.

_initalPSPValue 5 __ get_MSP () 1 PSP_STACK_SIZE;


_set_PSP (initalPSPValue); __ set_CONTROL
(USE_PSP_IN_THREAD_MODE);
__ ISB ();
__ ISB ();
160 Глав 5

Рисунок 5.6
Теперь процессор находится в режиме Thread/privileged, но использует Указатель
Стека процесса, который был инициализирован со стековым
пространством 200-х байтов.

При достижении основного () функция процессор находится в режиме Thread с


полным привилегированным доступом ко всем функциям микроконтроллера (Рис. 5.6).
Кроме того, только MSP используется. Если Вы ступаете через эти три строки
конфигурации, код сначала читает содержание MSP. Это будет во главе основного
стекового пространства. Для получения начального адреса для PSP мы просто
добавляем желаемый размер стека в байтах. Это значение записано в Указатель Стека
процесса прежде, чем включить его в Регистре управления. Всегда настраивайте стек
прежде, чем включить его в случае, если существует активное прерывание, которое
могло произойти, прежде чем стек готов. Затем, мы должны выполнить любой код,
который должен настроить процессор прежде, чем переключить режим Thread на
непривилегированный доступ. ADC_Init () функциональные доступы NVIC для
конфигурирования прерывания и таймера SysTick также настроен. Доступ к этим
регистрам будет запрещен, когда мы переключимся на непривилегированный режим
(Рис. 5.7). Снова, барьер инструкции используется, чтобы гарантировать, что код
завершается, прежде чем выполнение продолжается.
Рисунок 5.7
Теперь процессор был установлен в режим Потока /
непривилегированный режим.
Функции передовой архитектуры 161

Установите точку останова в строке модуля IRQ.c 32.

Это находится в стандартной программе обработчика прерываний SysTick.


Теперь, выполните код, и он поразит точку останова, когда прерывание
обработчика SysTick будет повышено (Рис. 5.8).

Рисунок 5.8
Во время исключения процессор переходит к режиму Обработчика /
привилегированному режиму.

Теперь, когда процессор служит прерыванию, он переместился в режим


обработчика прерываний с привилегированным доступом к процессору
Cortex-M и использует основной стек.

Вызов контролера
После того, как настроенный, этот более усовершенствованный рабочий режим
обеспечивает раздел между кодом исключения/прерывания, работающим в режиме
Handler и кодом фонового приложения, работающим в режиме Thread. Каждый
рабочий режим может иметь свой собственный регион кода, регион RAM и стек. Это
предоставляет полный доступ кода обработчика прерываний к микросхеме без риска,
что это может быть повреждено кодом приложения. Однако в какой-то момент код
приложения должен будет получить доступ к функциям процессора Cortex-M,
которые только доступны в режиме Handler с его полным привилегированным
доступом. Чтобы позволить этому происходить, Ползунок, 2 системы команд имеют
инструкцию, названную вызовом контролера (SVC). Когда эта инструкция
выполняется, она повышает исключение супервизора, которое перемещает процессор
от выполнения кода приложения в режиме потока / непривилегированном режиме к
стандартной программе исключения в режиме обработчика / привилегированном
режиме. SVC имеет свое собственное расположение в таблице векторов и ведет себя
как любое другое исключение (Рис. 5.9).
162 Главы 5

Рисунок 5.9
Вызов контролера (SVC) позволяет выполнению перемещаться от
непривилегированного режима Thread до привилегированного режима Handler и
получать полный неограниченный доступ к процессору Cortex. Инструкция SVC
используется вызовами API RTOS.

Инструкция SVC может также быть закодирована 8-разрядным значением, названным


ординалом. Когда вызов SVC выполняется, этот порядковый номер может читаться и
использоваться в качестве индекса для вызова одной из 256 различных функций
супервизора (Рис. 5.10).

Рисунок 5.10
Неиспользованная часть инструкции SVC может быть закодирована порядковым числом.
На записи в обработчик SVC это число может быть считано для определения, какой
SVC функционирует для выполнения.

Набор инструментальных средств компилятора обеспечивает специализированную


функцию поддержки SVC, которая используется, чтобы извлечь порядковый номер и
затем вызвать соответствующую функцию. Во-первых, функция поддержки SVC
читает регистр ссылки для определения рабочего режима, затем это читает значение
сохраненного ПК от соответствующего стека. Мы можем затем считать ячейку памяти,
содержащую инструкцию SVC, и извлечь порядковый номер. Это число затем
используется в качестве индекса в справочную таблицу для загрузки адреса функции,
которая вызывается. Функция затем вызвана и выполняется в привилегированном
режиме, прежде чем мы возвратимся назад к коду приложения, работающему в
Функции передовой архитектуры 163

непривилегированный режим потока. Этот механизм может казаться чрезмерно


сложным способом вызвать функцию, но он обеспечивает основание разделения
супервизора/пользователя, куда операционная система (OS) работает в
привилегированном режиме и действует как супервизор к потокам приложения,
работающим в непривилегированном режиме потока. Таким образом, отдельные
потоки не имеют доступа к критическим функциям процессора кроме путем создания
вызовов API ОС.

Упражнение 5.2 Вызов контролера


В этом осуществлении мы посмотрим на вызывание некоторых функций с
инструкцией SVC вместо того, чтобы перейти к стандартной программе как в вызове
стандартной функции.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “вызов контролера EX 5.2”
Во-первых, давайте взглянем на структуру проекта (Рис. 5.11).

Рисунок 5.11
Инструкции SVC поддерживаются путем добавления дополнительного модуля
SVC.c. Этот модуль предоставляет код для “декодирования”
инструкции SVC 1 порядковое.

Проект состоит из стандартного файла запуска проекта и системного файла


инициализации. Исходный код приложения находится в файле main.c. Существует
дополнительный исходный файл SVC.c, который оказывает поддержку для обработки
исключений SVC. Файл SVC.c содержит обработчик исключений SVC, это -
стандартный файл поддержки, которому предоставляют компилятор ARM. Мы будем
164 Главы 5

более внимательно рассмотрите при его операции позже. Код приложения в


main.c вызывает две простых функции, которые в свою очередь называют
стандартные программы для выполнения основных арифметических операций.
международное
основное
(пустота) {test_a
(); test_t ();

в то время как (1);


}
освободите test_a (пусто)
{res 5 добавляет (74, 27);
res 1 5 mul4 (res);

}
освободите test_t (пусто)
{отделение res 5 (res,
10); модификация res 5
(res, 3);

Каждая из арифметических функций разработана, чтобы быть названной с


инструкцией SVC так, чтобы все эти функции, выполненные в режиме обработчика, а
не режиме потока. Для преобразования функций арифметики от стандартных функций
до функций программного прерывания мы должны изменить способ, которым
объявляется прототип функции. Путем это сделано, будет варьироваться между
компиляторами, но в компиляторе ARM существует функциональный спецификатор
__ svc. Это используется как показано ниже для преобразования функции, чтобы быть
SVC и позволяет Вам передавать до четырех параметров и получать возвращаемое
значение. Так добавление () функция объявляется следующим образом:
интервал __ svc (0) добавляет (интервал
i1, интервал i2); интервал __ SVC_0
(интервал i1, интервал i2) {
возвратитесь (i1 1 i2);
}

__ svc спецификатор определяет эту функцию как SVC и определил порядковое


число функции. Используемые ординалы должны начать с нуля и вырасти вверх
непрерывно максимум до 256. Для включения каждого ординала необходимо
создать справочную таблицу в файле SVC.c.
; Импортируйте пользователя функции
SVC сюда.
ИМПОРТИРУЙТЕ __
SVC_0
ИМПОРТИРУЙТЕ __ SVC_1
ИМПОРТИРУЙТЕ __ SVC_2
ИМПОРТИРУЙТЕ __ SVC_3
SVC_Table
; Введите пользователя функции SVC здесь
DCD __ SVC_0
DCD __ SVC_1 ;
DCD __ SVC_2 ;
DCD __ SVC_3 ;
Функции передовой архитектуры 165

Необходимо импортировать маркировку, используемую для каждого супервизора,


функционируют и затем добавляют функциональные маркировки к таблице SVC.
Когда код будет скомпилирован, маркировки будут заменены адресом записи каждой
функции.

В проекте создают код и запускают средство моделирования. Ступают код, пока Вы не


достигаете строки 61, вызов к добавить функции.

Следующий код отображен в окне дизассемблирования, и в окне регистра мы видим,


что процессор работает в режиме потока (Рис. 5.12).

Рисунок 5.12
До инструкции SVC процессор работает в режиме Thread.

Параметры функции загружаются в R0 регистров передачи параметров и R1, и


нормальная команда перехода заменяется инструкцией SVC. Инструкция SVC
кодируется порядковым номером 3. Если Вы сделаете окно дизассемблирования
активным окном и ступите через эти инструкции, то исключение SVC будет
повышено, и Вы введете обработчик SVC в SVC.c. В окне Registers можно также
видеть, что процессор теперь работает в режиме обработчика (Рис. 5.13).

Рисунок 5.13
После того как инструкция SVC была выполнена, provesor будет работать в режиме
Handler.

Первый раздел кода SVC_Handler удается, какой стек используется и затем читает,
значение счетчика команд экономило на стеке. Значение счетчика команд является
обратным адресом, таким образом, инструкция по загрузке вычитает 2 для получения
адреса инструкции SVC.
166 Глав 5

Это будет адресом инструкции SVC, которая повысила исключение. Инструкция


SVC затем загружается в R12, и порядковый номер извлечен. Код использует R12,
потому что двоичный файл ARM взаимодействует через интерфейс, стандарт
определяет R12 как “Регистр Царапины Вызова процедуры Intra”; это означает,
что не будет содержать данных программы и свободно для использования.
ПРОДВИНЬТЕ {R4, LR} ; Сохраните регистры
LDR LR, 5 SVC_Count
LDR LR, [LR]
CMP R12, LR
BHS SVC_Dead ; Переполнение
LDR LR, 5 SVC_Table
LDR R12, [LR, R12, LSL № 2] ; Загрузите адрес функции SVC
BLX R12 ; Вызовите функцию SVC

Следующий раздел обработчика исключений SVC готовится переходить к добавлению


() функция. Во-первых, регистр ссылки и R4 продвинуты на стек. Размер таблицы SVC
загружается в регистр ссылки. Ординал SVC сравнивается с размером таблицы, чтобы
проверить, что это - меньше, чем размер таблицы SVC и следовательно верный номер.
Если это допустимо, функциональный адрес загружается в R12 из таблицы SVC, и
функция вызвана. Если порядковое число не было добавлено к таблице, код перейдет к
прерыванию под названием SVC_DEAD. Хотя R4 не используется в этом примере, он
сохраняется на стеке, поскольку для вызванной функции возможно использовать его.

ПОП {R4, LR}


TST LR, #4
MRSNE R12, PSP
MOVEQ R12, SP
; Функциональные
STM R12, {R0-R3} возвращаемые значения
BX LR ; RETI

После того как функция SVC была выполнена, она возвратится назад к обработчику
исключений SVC для чистки прежде, чем возвратиться к фоновому коду в режиме
обработчика.

Исключение PEND_SV
Кора-M01,-M3,-M4, и-M7 имеют дополнительное исключение процессора,
названное исключением PENDSV. Исключение PENDSV было добавлено к
процессору Cortex-M, прежде всего, для поддержки RTOS. Мы более тщательно
изучим то, как RTOS использует исключение PENDSV в Главе 9 “CMSIS-RTOS”,
но на данный момент мы посмотрим на то, как это работает. Исключение PENDSV
может считаться каналом прерывания NVIC, который подключен к регистру
процессора, а не периферийному устройству микроконтроллера. Исключение
PENDSV может быть повышено прикладным программным обеспечением,
пишущим в регистр PENDSV, исключение PENDSV затем обработано таким же
образом как любое другое исключение.
Функции передовой архитектуры 167

Пример Pend_SV
В этом примере мы исследуем, как использовать прерывание вызова системной
службы PENDSV.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “исключение EX 5.3 PENDSV”
Разработайте проект и запустите отладчик.

Код инициализирует ADC и включает его “Конец Прерывания Преобразования”. Это


также изменяет PENDSV и приоритет прерывания ADC от их опций по умолчанию
(Рис. 5.14). SVC имеет приоритетный нуль (самый высокий), в то время как ADC
имеет приоритет 1, и прерывание PENDSV имеет приоритет 2 (самый низкий).
systemCode стандартная программа использует инструкцию SVC повысить
исключение и переместиться в режим Handler (Рис. 5.15).
NVIC_SetPriority (PendSV_IRQn, 2); //приоритеты прерывания набора
NVIC_SetPriority (ADC1_2_IRQn, 1);
NVIC_EnableIRQ (ADC1_2_IRQn); //включите прерывание ADC
ADC1-.CR1 | 5 (1UL, 5); //включите ADC и запустите преобразование
ADC1-.CR2 | 5 (1UL, 0);
ADC1-.CR2 | 5 (1UL, 22);
systemCode (); //назовите некоторый системный код с прерыванием SVC

Установите точку останова на systemCode () функция и выполните код.

Рисунок 5.14
Выполните код до systemCode () функция.

Откройте окно контроллера прерываний Периферийных устройств/Вложенного


вектора периферийных устройств/ядра и проверьте приоритетные уровни SVC,
PENDSV и прерываний ADC.
Рисунок 5.15
Окно Peripherals/NVIC показывает, что прерывания включены, ни один не активен или
незакончен. Мы можем также видеть их приоритетные
уровни.
168 Глав 5

Теперь шаг в systemCode стандартную программу (F11), пока Вы не достигаете


функции C.
освободите __ svc (0) systemCode (пусто);
освободите __ SVC_0 (пусто) {
неподписанный интервал i, ожидая;
для (я 50; я, 100; i11);
ожидая 5 NVIC_GetPendingIRQ (ADC1_2_IRQn);
если (ожидание 551) {
SCB-.ICSR | 5 1, 28; //устанавливает ожидание, ожидают
} еще {
Do_System_Code ();
}
}

В systemCode () стандартная программа, существует короткий цикл, который


представляет критический раздел кода, который должен быть выполнен. В то время как
этот цикл работает, ADC закончит преобразование и, поскольку это имеет более низкий
приоритет, чем прерывание SCV, это введет незаконченное состояние. Когда мы
выходим из цикла, мы тестируем состояние любых критических прерываний путем
чтения их незаконченных битов. Если критическое прерывание находится на
рассмотрении, то остаток от стандартной программы системного кода может быть
отложен. Чтобы сделать это, мы устанавливаем PENDSVSET, укусил в Регистре
управления Прерывания и Государственном реестре и вышел из обработчика SVC.
Установите точку останова на фигурной скобке выхода (}) systemCode () стандартная
программа и выполните код
(Рис. 5.16).

Рисунок 5.16
Выполните Do_System_Code () стандартная программа.

Теперь используйте окно отладки NVIC для исследования состояния прерываний


(Рис. 5.17).

Рисунок 5.17
Теперь исключение SVC работает в ADC и ожидании исключений PENDSV.
Теперь SVC работает в ADC и вызове системной службы PENDSV в незаконченном
состоянии.
Одноэтапный из Вызова Системной службы, пока Вы не вводите следующее
прерывание.

Оба из незаконченных прерываний будут хвостом, объединенным в цепочку на


конец вызова системной службы. ADC имеет самый высокий приоритет, таким
образом, он будет подаваться следующий (Рис. 5.18).
Функции передовой архитектуры 169

Рисунок 5.18
Теперь прерывание ADC активно, когда это закончится, стандартная программа
PENDSV будет подаваться, и стандартная программа
системного кода возобновится.

Шаг из обработчика ADC и Вы сразу введете прерывание системной службы


PENDSV, которое позволяет Вам возобновлять выполнение системного кода, который
требовали быть выполненным в Прерывании вызова Системной службы.

Межпроцессорные события
Процессоры Cortex-M разработаны так, чтобы было возможно создать
многопроцессорные устройства. Пример состоял бы в том, чтобы иметь Кору-M4 и
Кору-M0 в том же микроконтроллере. Кора-M0 будет обычно управлять
пользовательскими периферийными устройствами, в то время как Кора-M4 выполняет
интенсивные части кода приложения. С другой стороны, существуют устройства,
которые имеют Cortex-A9, который может запустить Linux и управлять сложным
пользовательским интерфейсом; на той же микросхеме существует две Коры-M4,
которые управляют кодом в реальном времени. Они более сложная система на
структурах кристалла требуют методов сигнального действия между различными
процессорами. Процессоры Cortex-M могут быть объединены в цепочку вместе
сигналом внешнего события. Сигнал события установлен при помощи инструкции по
событию набора. Эта инструкция может быть добавлена к Вашему коду C с помощью
__ SEV () внутренний обеспеченный CMSIS-базовой спецификацией. Когда __ SEV ()
инструкция будет дана, это разбудит целевой процессор, если это перешло к режиму
низкой мощности с помощью __ WFE () инструкция. Если целевой процессор будет
работать, то фиксатор события будет установлен так, чтобы, когда целевой процессор
выполняется __ WFE () инструкция, это сбросило фиксатор события и продолжало
бежать, не переходя к режиму низкой мощности.

Эксклюзивный доступ
Одной из основных характеристик RTOS является поддержка многозадачности. Как
мы будем видеть в следующей главе, это позволяет Вам разрабатывать свой код как
независимые потоки, которые концептуально работают параллельно на процессоре
Cortex-M. Поскольку Ваш код разрабатывает, потоки программы должны будут часто
получать доступ к общим ресурсам быть им SRAM или периферийные устройства.
RTOS обеспечивает механизмы, названные семафорами и взаимными исключениями,
которые используются для управления доступом к периферийным устройствам и
объектам общей памяти (Рис. 5.19).
170 Глав 5

Рисунок 5.19
В многопроцессорной системе или среде мультипотока необходимо управлять
доступом к совместно используемым ресурсам или ошибкам
такой, как считано, прежде чем запись сможет произойти.

В то время как возможно разработать “стандартные программы” блокировки


памяти на любом процессоре, Коре-M3,-M4, и-M7 обеспечивают ряд инструкций,
которые могут использоваться для оптимизации стандартных программ
эксклюзивного доступа (Таблица 5.1).

Таблица 5.1: инструкции по Эксклюзивному


доступу
__ Загрузитесь
LDREXB эксклюзивный (8 битов)
Загрузитесь
__ эксклюзивный (16
LDREXH битов)
__ Загрузитесь
LDREXW эксклюзивный (32 бита)
__ Сохраните
STREXB эксклюзивный (8 битов)
Сохраните
__ эксклюзивный (16
STREXH битов)
__ Сохраните
STREXW эксклюзивный (32 бита)
Удалите монопольную
__ CLREX блокировку

В более ранних процессорах ARM как ARM7 и ARM9, проблеме эксклюзивного


доступа ответила инструкция по подкачке, которая могла использоваться для обмена
содержанием двух регистров. Эта инструкция взяла 4 цикла, но это была атомарная
инструкция, означающая, который когда-то запустился, это не могло быть прервано и
гарантировалось эксклюзивный доступ к ЦП для проведения его операции. Поскольку
процессоры Cortex-M имеют несколько шин, для доступа для чтения и доступа для
записи возможно быть выполненным на различных шинах и даже различными
устройствами управления шиной, которые могут самостоятельно быть
дополнительными процессорами Cortex-M. На процессоре Cortex-M новый метод
инструкций по эксклюзивному доступу был представлен для поддержки
многозадачных и многопроцессорных сред (Рис. 5.20).
Функции передовой архитектуры 171

Рисунок 5.20
Загрузка и хранит эксклюзивные инструкции, может использоваться для управления
доступом к обращению за помощью памяти. Они разработаны для работы
с единственными и многопроцессорными устройствами.

Система эксклюзивного доступа работает путем определения переменной блокировки


для защиты совместно используемого ресурса. Прежде чем к совместно
используемому ресурсу можно получить доступ, заблокированная переменная
проверяется с помощью эксклюзивной инструкции по чтению; если это - нуль, то к
совместно используемому ресурсу в настоящее время не получают доступ. Прежде
чем мы получим доступ к совместно используемому ресурсу, переменная блокировки
должна быть установлена с помощью эксклюзивной инструкции по хранилищу. После
того как переменная блокировки была установлена, мы теперь имеем контроль над
совместно используемым ресурсом и можем записать в нее. Если наш процесс
вытесняется прерыванием или другим потоком, который также выполняет чтение
эксклюзивного доступа, то аппаратные средства привязываются, монитор
эксклюзивного доступа установлен, препятствуя исходной эксклюзивной инструкции
по хранилищу писать в переменную блокировки. Это дает эксклюзивный контроль к
процессу вытеснения.
Когда мы закончены с совместно используемым ресурсом, переменная блокировки
должна быть записана для обнуления; это очищает переменную и также удаляет
блокировку. Если Ваш код запускает процесс эксклюзивного доступа, но должен
отказаться от него, существует четкая эксклюзивная инструкция (CLREX), которая
может использоваться для удаления блокировки. Инструкции по эксклюзивному
доступу управляют доступом между различными процессами, работающими на
единственном процессоре Cortex-M, но та же техника может быть расширена
172 Главы 5

к многопроцессорной среде при условии, что кремниевый разработчик включает


дополнительные аппаратные сигналы шины монитора между процессорами Cortex.

Упражнение 5.4 Эксклюзивный доступ


В этом осуществлении мы создадим блокировку эксклюзивного доступа, которая
совместно используется процессом фонового потока и стандартной программой
обработчика SVC, чтобы продемонстрировать блокировку и разблокировать процесс.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “эксклюзивный доступ EX 5.4”
Создайте код и запустите отладчик.
международное основное (пустота) {
если (__ LDREXB (&lock_bit) 5 5 0) {
если (! __ STREXB (1, и lock_bit 5 5 0))
{семафор 1 1; lock_bit 5 0;
}
}

Первый блок кода демонстрирует простое использование инструкций по


эксклюзивному доступу. Мы сначала тестируем переменную блокировки с
эксклюзивной инструкцией по загрузке. Если ресурс не заблокирован другим
процессом, мы устанавливаем бит блокировки с эксклюзивной инструкцией по
хранилищу. Если это успешно, мы можем затем получить доступ к ресурсу общей
памяти, названному семафором. После того как эта переменная была обновлена,
переменная блокировки записана для обнуления, и четкая эксклюзивная инструкция
выпускает аппаратную блокировку.
Шаг через код для наблюдения его поведения.
если (__ LDREXB (&lock_bit) 55 0)
{thread_lock ();
если (! __ STREXB (1, &lock_bit))
{semaphore11;
}
}

Второй блок кода делает точно то же самое кроме между эксклюзивной загрузкой и
эксклюзивным хранилищем, которым называют функциональную блокировку потока.
Это - стандартная программа SVC, которая перейдет к режиму обработчика и
переходу к стандартной программе SVC0.
освободите __ svc (0) thread_lock (пусто);
освободите __ SVC_0 (пусто) {
__ LDREXB (&lock_bit);
}

Стандартная программа SVC просто делает другое эксклюзивное чтение переменной


блокировки, которая установит аппаратные средства, привязывают монитор
эксклюзивного доступа. Когда мы возвращаемся к исходной стандартной программе
и
Функции передовой архитектуры 173

попытайтесь выполнить эксклюзивную инструкцию по хранилищу, она перестанет


работать, потому что любое исключение, которое происходит между LDREX и
STREX, заставит STREX перестать работать. Локальный монитор эксклюзивного
доступа очищен автоматически при записи/выходе исключения.
Шаг через второй блок кода и наблюдает процесс блокировки.

Единица защиты памяти


Кора-M01,-M3,-M4, и-M7 процессоры имеют дополнительный MPU, который может
быть включен в ядро процессора кремниевым производителем, когда микроконтроллер
разработан. MPU позволяет Вам расширять привилегированную/непривилегированную
модель кода. Если это приспособлено, MPU позволяет Вам определять регионы в рамках
карты распределения памяти процессора Cortex-M и предоставлять привилегированный
или непривилегированный доступ к этим регионам. Если процессор будет работать в
непривилегированном режиме и попытках получить доступ к адресу в
привилегированном регионе, то исключение защиты памяти будет повышено, и
процессор векторизует к защите памяти ISR. Это позволяет Вам обнаруживать и
исправлять ошибки памяти во время выполнения. При использовании с Корой-M7 MPU
используется для конфигурирования Кэшей Инструкции и Данных, существующих в
Коре-M7. В следующем разделе мы посмотрим о том, как использованию MPU с Корой-
M01,-M3, и-M4. Мы посмотрим на функции конфигурации кэша в Главе 6 “Процессор
Коры-M7” (Рис. 5.21).
Рисунок 5.21
Единица защиты памяти доступна на Коре-M01, M3, M4 и M7. Это позволяет Вам
помещать шаблон защиты над картой памяти процессора.
174 Главы 5

На практике MPU позволяет Вам определять восемь регионов памяти в адресном


пространстве процессора Cortex-M и предоставлять привилегированный или
непривилегированный доступ к каждому региону. Эти регионы могут затем быть
далее подразделены на восемь одинаково размерных подобластей, которые в свою
очередь могут быть предоставлены привилегированный или непривилегированный
доступ. Существует также фоновая область памяти по умолчанию, которая покрывает
всех 4 ГБ адресного пространства. Когда этому региону включают, он делает доступ
ко всем ячейкам памяти привилегированным. Для дальнейшего усложнения вещей
регионы памяти могут быть перекрыты с самым высоким пронумерованным
регионом, берущим прецедент. Также любая область памяти, которая не покрыта
регионом MPU, не может иметь никакого вида доступа к памяти (Рис. 5.22).

Рисунок 5.22
MPU позволяет Вам определять восемь регионов, каждого с восемью
подобластями по карте памяти процессора. Каждый регион может предоставить
различные права доступа своему диапазону адресов. Также возможно установить
привилегированный доступ значения по умолчанию по целой карте распределения
памяти и затем создать “дыры” с различными правами доступа.
Таким образом, возможно создать сложные шаблоны защиты по пространству адреса
памяти. Это позволяет Вам разрабатывать режим защиты, который помогает создать
устойчивую операционную среду, но также и дает Вам достаточно веревки для
зависания себя.
Функции передовой архитектуры 175

Конфигурирование MPU
MPU настроен через группу регистров с отображенной памятью, расположенных в
системном блоке процессора Cortex-M. К этим регистрам можно только получить
доступ, когда процессор Cortex работает в привилегированном режиме (Рис. 5.23).

Рисунок 5.23
Каждый регион MPU настроен через регион, базовый адрес и регистры атрибута. После
того как каждый регион настроен, регистр управления делает регионы MPU
активными.

Регистр управления содержит три активных бита, которые влияют на полную


операцию MPU. Это бит PRIVDEFENABLE, который включает привилегированный
доступ по целой карте распределения памяти на 4 ГБ. Следующий бит является битом
HFNMIENA; когда установлено, этот бит включает операцию MPU во время
Серьезного отказа, NMI или исключения FAULTMASK. Заключительный бит является
MPU, ВКЛЮЧАЮТ бит; когда установлено, это включает операцию MPU. Как
правило, при конфигурировании MPU, последняя выполненная операция должна
установить этот бит. После того, как сброшено, все эти биты очищены для обнуления
(Рис. 5.24).

Рисунок 5.24
Регистр управления позволяет Вам включать глобальный привилегированный регион
(PRIVDEFENA). Разрешать бит используется для создания настроенных регионов
MPU активными, и HFMIENA используется для включения регионов, когда Серьезный
отказ, NMI или исключения FAULTMASK активны.
Остающиеся регистры используются для конфигурирования восьми регионов MPU.
Для конфигурирования данного региона (0 7) сначала выбирают регион путем записи
его номера региона в регистр числа региона. После того как регион был выбран, он
может затем быть настроен базовым адресом и
176 Глав 5

регистр атрибута и размера. Индексный регистр 27-разрядное поле адреса,


допустимый бит и также повторение номера региона MPU (Рис. 5.25).

Рисунок 5.25
Регион адреса Индексного регистра позволяет Вам устанавливать начальный адрес
региона MPU. Значения адреса, которые могут быть записаны, будут зависеть от
установки размера в регистре Атрибута и Размера. Если допустимый установлен на 1,
то набор номера региона в поле региона используется; иначе номер региона в
регистре региона используется.

Как Вы могли бы ожидать, базовый адрес региона MPU должен быть


запрограммирован в поле адреса. Однако доступные базовые адреса, которые могут
использоваться, зависят от размера определенного для региона. Минимальный размер
для региона - от 32 байтов до 4 ГБ. Базовый адрес региона MPU должен быть кратным
размеру региона. Программирование поля адреса устанавливает выбранный базовый
адрес регионов. Вы не должны устанавливать допустимый бит. Если Вы пишете
новый номер региона в поле региона индексного регистра, устанавливаете
допустимый бит и пишете новый адрес; можно начать настраивать новый регион без
потребности обновить регистр числа региона. Программирование атрибута и размера
регистрирует конфигурацию концов региона MPU (Рис. 5.26).

Рисунок 5.26
Регистр Атрибута и Размера позволяет Вам определять размер региона MPU от 32
байтов до 4 ГБ. Это также настраивает атрибуты памяти и опции
управления доступом.

Поле размера определяет размер адреса региона защиты памяти в байтах. Размер
региона вычисляется с помощью формулы:

Емкость памяти региона MPU 5 2 военнопленных ð РАЗМЕР 1


Это дает нам минимальный размер, запускающийся на уровне всего 32 байтов. Как
отмечено выше, выбранный размер также определяет диапазон возможных базовых
адресов. Затем, возможно установить атрибуты региона и права доступа. Как
процессор Cortex-M, MPU разработан для поддержки многопроцессорных систем.
Следовательно, возможно определить регионы, как совместно используемые
Функции передовой архитектуры 177

между процессорами Cortex-M или как являющийся эксклюзивным к данному


процессору. Также возможно определить политику кэша для области памяти,
покрытой регионом MPU. В настоящее время, подавляющее большинство
микроконтроллеров только имеют единственный процессор Cortex-M, хотя
асимметричные многопроцессорные устройства начали появляться (Кора-M4 и Кора-
M0). Кора-M7 представляет Кэши Инструкции и Данных, которые настроены через
MPU. Мы посмотрим на это более подробно в Главе 6 "Cortex-M7".

Атрибуты MPU определяются TEX, C, B, и биты S и подходящие настройки для


большинства микроконтроллеров показывают в Таблице 5.2.

Таблица 5.2: атрибуты региона Памяти

Регион памяти TEX C B S Атрибуты


Нормальная память, несовместно
Flash 000 1 0 0 используемая, пишет через
Внутренний Нормальная память, совместно используемая,
SRAM 000 1 0 1 пишет через
Нормальная память, совместно используемая,
Внешний SRAM 000 1 1 1 записывает запись обратно, выделяют
Периферия 000 0 1 1 Память устройства, совместно используемая

При работе с MPU мы больше интересуемся определением прав доступа. Они


определяются для каждого региона в поле AP (Таблица 5.3).

Таблица 5.3: права Доступа к памяти


Привилегирован Непривилегиров
AP ный анный Описание
Все доступы генерируют отказ
000 Никакой доступ Никакой доступ разрешения
Форма доступа привилегированный код
001 RW Никакой доступ только
Непривилегированные записи вызывают
010 RW RO отказ разрешения
011 RW RW Полный доступ
Непредсказуем Непредсказуем
100 ый ый Зарезервировано
101 RO Никакой доступ Чтения привилегированным кодом только
Только для чтения для привилегированного
110 RO RO и непривилегированного кода
111 RO RO

Однажды размер, атрибуты и права доступа определяются, разрешать бит может быть
установлен сделать регион активным. Когда каждый из необходимых регионов был
определен, MPU может быть активирован путем установки глобального, включают
бит в Регистре управления. Когда MPU активен, и код приложения делает доступ,
который нарушает полномочия региона, исключение MPU будет повышено. После
того как Вы вводите исключение MPU, существует несколько регистров, которые
предоставляют информацию, чтобы помочь диагностировать проблему. Первый байт
Настраиваемого регистра Состояния отказа, расположенного в системном блоке
управления, называют регистром Состояния отказа Диспетчера памяти (Рис. 5.27).
178 Глав 5

Рисунок 5.27
Регистр состояния отказа MPU является подразделом настраиваемого регистра
состояния отказа в системном блоке управления. Это содержит флаги ошибки,
которые установлены, когда исключение MPU происходит. Цель каждого флага
показывают в Таблице 5.4.

Таблица 5.4: регистр Состояния отказа отмечает описания

Флаг Описание
Флаг состояния нарушения прав доступа
IACCVIOL инструкции
DACCVIOL Флаг состояния нарушения доступа к данным
MUNSTKERR Отказ диспетчера памяти на неукладке
MSTKERR Отказ диспетчера памяти на укладке
Диспетчер памяти FPU ленивая ошибочная Кора-M4
MLSPERR укладки только
(см. главу 5: “Усовершенствованные архитектурные
функции”)
MMARVALID Допустимый адрес отказа диспетчера памяти

В зависимости от состояния состояния отказа адрес инструкции, которая вызвала


отказ памяти, может быть записан во второй регистр, адресный регистр отказа
диспетчера памяти. Если этот адрес допустим, он может использоваться, чтобы
помочь диагностировать отказ.

Упражнение 5.5 Конфигурация MPU


В этом осуществлении мы настроим MPU для работы с проектом Blinky.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “конфигурация EX 5.5 MPU”.

На этот раз используемым микроконтроллером является NXP LPC1768, которому


оснастили процессор Cortex-M3 MPU. Во-первых, мы должны настроить проект так,
чтобы были отличные регионы кода и данных, которые будут использоваться
процессором в режимах обработчика и потоке. При выполнении этого полезно
изобразить схематически карту распределения памяти кода приложения и затем
определить шаблон MPU соответствия (Рис. 5.28).
Функции передовой архитектуры 179

Рисунок 5.28
Карта распределения памяти проекта Blinky может быть разделена на
шесть регионов.

Регион 0 непривилегированных кодов приложения


Регион 1 Привилегированный системный код
Регион 2 непривилегированных SRAM
Регион 3 привилегированных SRAM
Регион 4 Привилегированных и непривилегированных стековых пространства
Регион 5 Привилегированных и непривилегированных пользовательских
периферийных устройств

Теперь откройте меню Options for Target/Target. Здесь, мы можем создать регионы
памяти для соответствия предложенному шаблону защиты MPU (Рис. 5.29).
180 Глав 5

Рисунок 5.29

Целевая карта распределения памяти определяет два региона 0-0x3FFF памяти кода и
0x4000 0x7FFF. Более низкий регион будет использоваться в качестве региона по
умолчанию для содержания кода приложения и будет получен доступ процессором в
непривилегированном режиме. Верхний регион будет использоваться для содержания
прерывания и служебных программ исключения и будет получен доступ процессором
в привилегированном режиме. Точно так же существует два региона RAM 0x10000000,
и 0x100008000 будет содержать данные, используемые непривилегированным кодом и
системными стопками, в то время как верхний регион 0x0207C000 — будет
использоваться для содержания данных, используемых привилегированным кодом. В
этом примере мы не собираемся устанавливать привилегированный регион фона,
таким образом, мы должны отобразить регионы MPU для периферийных устройств.
Все периферийные устройства кроме GPIO находятся в одном непрерывном блоке от
0x40000000, в то время как регистры GPIO находятся в 0x000002C9. К периферийным
устройствам получит доступ процессор, в то время как это находится и в
привилегированных и в непривилегированных режимах
(Рис. 5.30).

Рисунок 5.30
Используйте опции присвоения локальной памяти настроить регионы
памяти, используемые кодом прерывания.
Для подготовки кода мы должны вызвать код обработчика прерываний в регионы,
которые будут предоставлены привилегированный доступ. В этом примере весь код,
который будет работать в режиме Handler, был помещен в один модуль. В локальных
опциях для этого модуля мы можем выбрать код
Функции передовой архитектуры 181

и регионы данных, которым даст привилегированные права доступа MPU. Весь


другой код и данные будет помещен в регионы памяти по умолчанию, которые будут
работать в непривилегированном режиме. После того как расположение памяти
проекта было определено, мы можем добавить код к проекту настроить шаблон
защиты MPU.
#define SIZE_FIELD 1
#define ATTRIBUTE_FIELD 16
#define ACCESS_FIELD 24
#define
ВКЛЮЧАЮТ 1
#define ATTRIBUTE_FLASH 0x4
#define ATTRIBUTE_SRAM 0x5
#define ATTRIBUTE_PERIPHERAL 0x3
#define PRIV_RW_UPRIV_RW 3
#define PRIV_RO_UPRIV_NONE 5
#define PRIV_RO_UPRIV_RO 6
#define PRIV_RW_UPRIV_RO 2
#define USE_PSP_IN_THREAD_MODE 2
#define THREAD_MODE_IS_UNPRIVILIGED 1
#define PSP_STACK_SIZE 0x200
#define TOP_OF_THREAD_RAM 0x10007FF0
MPU-.RNR 5 0x00000000;
MPU-.RBAR 5 0x00000000;
MPU-.RASR 5 (PRIV_RO_UPRIV_RO, ACCESS_FIELD)
| (ATTRIBUTE_FLASH, ATTRIBUTE_FIELD)
| (17, SIZE_FIELD) |ENABLE;

Код, показанный выше, используется для установки региона MPU для


непривилегированного кода потока в начале памяти. Во-первых, мы должны
определить номер региона, сопровождаемый базовым адресом региона. Так как это
будет Флэш-память, мы можем использовать стандартный атрибут для этого типа
памяти. Затем, мы можем определить его тип доступа. В этом случае мы можем
предоставить Доступ только для чтения и для привилегированных и для
непривилегированных режимов. Затем, мы можем установить размер региона,
который является 256K, который должен равняться 2POW (РАЗМЕР 1 1), которые
приравниваются к 17. Разрешать бит установлен активировать этот регион, когда MPU
полностью включен. Каждый из других регионов программируется подобным
способом. Наконец, исключение управления памятью и MPU включены.
NVIC_EnableIRQ (MemoryManagement_IRQn);
MPU-.CTRL 5 ВКЛЮЧАЕТ;

Запустите отладчик, установите точку останова на строке 82 и выполните код.

Когда точка останова достигнута, мы можем просмотреть конфигурацию MPU


через периферийные устройства / ядро peripherals/MPU (Рис. 5.31).
182 Главы 5

Рисунок 5.31
Окна Peripheral отладчика обеспечивают подробное представление
настроенного MPU.

Здесь, мы можем легко видеть определенные регионы и права доступа, которые


предоставили.
Теперь выполните код в течение нескольких секунд и затем остановите процессор.

Исключение MPU было повышено, и выполнение перешло к MemManager_Handler


(Рис. 5.32).

Рисунок 5.32
Когда исключение MPU произойдет, код векторизует к MemManager_Handler по
умолчанию в коде запуска.
Функции передовой архитектуры 183

Вопрос теперь, что вызвало исключение MPU? Мы можем узнать это путем
рассмотрения отказа диспетчера памяти и регистра состояния (Рис. 5.33).
Откройте окно Peripherals/Core Peripherals/Fault Reports.

Рисунок 5.33
Отладчик также обеспечивает сжатое представление всех регистров
отказа.

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


обратиться к 0x2007C008. Если мы теперь открываем файл карты, произведенный
компоновщиком, мы можем искать этот адрес и найти, какая переменная
помещается в это местоположение.

Выделите название проекта в окне проекта и двойном щелчке. Это откроет файл
карты. Теперь используйте Редактировать/Находить диалоговое окно для поиска
файла карты адрес 0x2007C008 (Рис. 5.34).

Рисунок 5.34
Можно просмотреть компоновщика файл MAP путем двойного щелчка по корневому
узлу проекта в окне Project. Затем переройте этот файл для нахождения
символа расположенным в 0x2007C008.

Это показывает, что переменная clock_1s в 0x2007C008 и что это объявляется в irq.c.

Clock_1s является глобальной переменной, к которой также получают доступ от


основного цикла, работающего в непривилегированном режиме. Однако эта
переменная расположена в привилегированном регионе RAM, настолько
получающем доступ к этому, в то время как процессор работает в
непривилегированном режиме, вызовет отказ MPU (Рис. 5.35).
184 Главы 5

Найдите объявление clock_1s в blinky.c и удалите ключевое слово экстерна.


Теперь найдите объявление для clock_1s в irq.c и добавьте экстерна
ключевого слова. Создайте код и просмотрите обновленный файл карты.

Рисунок 5.35
Теперь clock_1s переменная расположена в SRAM, к которому можно получить
доступ и привилегированным и
непривилегированным кодом.

Теперь clock_1s объявляется в blinky.c и расположен в непривилегированном регионе


RAM, так может быть получен доступ и привилегированным и непривилегированным
кодом.
Перезапустите отладчик, и код будет работать без любого повышения любого
исключения MPU.

Подобласти MPU
Как мы видели, MPU имеет максимум восьми регионов, которые могут быть
индивидуально настроены с размером местоположения и типом доступа. Любой
регион, который настроен с размером 256 байтов или больше будет содержать
восемь одинаково подобласти пространства. Когда регион настроен, каждая из
подобластей включена и имеет атрибуты региона по умолчанию и настройки
доступа. Возможно отключить подобласть путем установки бита подобласти
соответствия в поле SRD регистра атрибута и размера MPU. Когда подобласть
отключена, “дыра” создается в регионе, эта “дыра” наследовала атрибуты и право
доступа любого перекрытого региона. Если не будет никакого перекрытого региона,
то глобальная привилегированная фоновая область памяти будет использоваться.
Если фоновая область памяти не будет включена затем, то никакие права доступа не
предоставят, и исключение MPU будет повышено, если доступ будет сделан к
адресу в подобласти “дырой” (Рис. 5.36).
Рисунок 5.36
Каждый регион имеет восемь подобластей. Если подобласть отключена, она
наследовала права доступа от перекрытого региона или
глобальной фоновой области памяти.
Функции передовой архитектуры 185

Если у нас будет два перекрытых региона, то регион с самым большим количеством
региона будет иметь приоритет. В случае выше, непривилегированный регион
перекрывается привилегированным регионом. Перекрытый раздел даст доступу
полномочия. Если подобласть будет отключена в регионе 1, то права доступа в
регионе 0 будут наследованы и предоставят непривилегированный доступ к
диапазону подобласти адресов.

Ограничения MPU
При разработке прикладного программного обеспечения для использования MPU
необходимо понять, что MPU только контролирует действие процессора Cortex-M.
Многие, если вообще, Кора, основанные на M микроконтроллеры имеют другие
периферийные устройства, такие как единицы DMA, которые способны к
автономному доступу к памяти и периферийным регистрам. Этими единицами
являются дополнительные “Устройства управления шиной”, которые выносят
решение с процессором Cortex-M для получения доступа к ресурсам
микроконтроллера. Если такая единица сделает доступ к запрещенному региону
памяти, то она не инициирует исключение MPU. Это важно для запоминания,
поскольку процессор Cortex-M имеет структуру шины, которая разработана для
поддержки нескольких независимых устройств “Устройства управления шиной”.

AHB облегченный шинный интерфейс


Семейство процессоров Cortex-M имеет заключительное важное архитектурное
улучшение по более раннему поколению ARM7-и основанных на ARM9
микроконтроллеров. В них первое поколение основанных на ARM
микроконтроллеров с ЦП соединили интерфейсом к микроконтроллеру через два типа
шин. Они были усовершенствованной высокоскоростной шиной (AHB) и
усовершенствованной периферийной шиной (APB) (Рис. 5.37).

Рисунок 5.37
Первое поколение основанных на ARM микроконтроллеров имело систему
внутренней шины на основе усовершенствованной высокоскоростной шины и
усовершенствованной периферийной шины. Поскольку несколько устройств
управления шиной (ЦП, DMA) были представлены, арбитражная фаза шины должна
была быть завершена, прежде чем передача могла быть сделана через шину.
186 Глав 5

Высокоскоростная шина подключила ЦП к Flash и памяти SRAM, в то время как


периферийные устройства микроконтроллера были подключены к одним или
нескольким шинам APB. Шина AHB также поддерживала дополнительные
устройства управления шиной, такие как единицы DMA для нахождения вместе с
процессором ARM7. В то время как эта система работала, структура шины начала
становиться узким местом особенно как более сложными периферийными
устройствами, такими как Ethernet, MAC и USB были добавлены. Эти периферийные
устройства содержали свои собственные единицы DMA, которые также должны были
действовать как устройство управления шиной. Это означало, что могло быть
несколько устройств (ARM7 ЦП, DMA общего назначения и Ethernet MAC DMA)
выносящий решение для шины AHB в любом данном моменте времени. Поскольку
все более сложные периферийные устройства добавляются, полная пропускная
способность и детерминированная производительность стали трудными предсказать.

Семейство процессоров Cortex-M преодолевает эту проблему при помощи матрицы


шины AHB (Рис. 5.38). Матрица шины AHB состоит из многих параллельных шин
AHB, которые подключены к различным ресурсам устройства, таким как блок RAM
или группа периферийных устройств
на шине APB. Соединение шин AHB и расположение ресурсов устройства,
присвоенных производителем, когда микросхема разработана. Каждый регион
ресурсов устройства является ведомым устройством. Каждый из этих регионов затем
подключен назад к каждому из устройств управления шиной через дополнительные
шины AHB для формирования матрицы шины. Это позволяет производителям
разрабатывать сложные устройства с несколькими процессорами Cortex-M,
единицами DMA, и усовершенствованными периферийными устройствами, каждым с
параллельными путями к различным ресурсам устройства. Матрица шины
предрасположена в
Рисунок 5.38
Семейство процессоров Cortex-M заменяет единственную шину AHB матрицей
шины, которая обеспечивает параллельные пути для каждого
устройства управления шиной к каждому блоку ведомых устройств.
Функции передовой архитектуры 187

микроконтроллеру и не нужна никакая конфигурация Вашим кодом приложения.


Однако при разработке кода приложения необходимо обратить внимание туда, где
различные объекты памяти расположены. Например, память, используемая
контроллером Ethernet, должна быть помещена в один блок SRAM, в то время как
память USB расположена в отдельном блоке SRAM. Это позволяет Ethernet и USB
единицу DMA для работы параллельно, в то время как процессор Cortex-M получает
доступ к Flash и пользовательским периферийным устройствам. Таким образом
путем структурирования карты распределения памяти кода приложения можно
использовать эту степень параллелизма и получить дополнительное повышение
производительности.

Заключение
Если Вы намереваетесь написать код без операционной системы затем, объем
информации в этой главе может быть проигнорирован. Однако эти функции
критически важны, если Вы хотите использовать больше платформы перспективной
разработки, такой как RTOS, поскольку мы будем видеть в Главе 9 “CMSIS-RTOS”,
В то время как процессоры Cortex-M просты в использовании, они действительно
включают функции для поддержки безопасности, критических, и приложений
защиты, а также многоядерных систем.
Эта страница, намеренно
оставленная незаполненный
CHPTER6

Процессор коры-M7
В первых нескольких главах этой книги мы посмотрели на Кору-M0,-M01,-M3,
и процессоры-M4. Затем мы собираемся исследовать последний процессор Cortex-M,-
M7. Кора-M7 в настоящее время является самым высоким процессором Cortex-M
выполнения. Это сохраняет модель того же программиста как другие члены семейства
так все, что мы изучили, до сих пор может быть применен к Коре-M7. Однако его
внутренняя архитектура имеет некоторые радикальные различия к более ранним
процессорам Cortex-M, которые существенно улучшают его производительность.
Кора-M7 также имеет более сложную систему памяти, которую мы должны понять и
управлять (Рис. 6.1).

Рисунок 6.1
Кора-M7 имеет более сложную структуру шины и структуру памяти, но она сохраняет
Cortex-M
модель
программиста.
Руководство разработчика по семейству процессоров
Cortex-M.
DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00006-2 189
© 2016 Elsevier Ltd. Все права защищены.
190 Глав 6

Разработчику модель программиста процессора Cortex-M7 выглядит одинаково как


другие процессоры Cortex-M. Однако его производительность улучшена многими
архитектурными функциями, которые очень отличны от остальной части семейства.
Они включают шестиэтапный двойной конвейер проблемы, расширенную единицу
предсказания ветвлений и единицу математики плавающей точки двойной точности. В
то время как эти функции повышают производительность Коры-M7, они в основном
очевидны для разработчика. Для разработчика Кора-M7 действительно начинает
отличаться от других процессоров Cortex-M с точки зрения своей модели памяти. Для
достижения длительной высокой производительности, обрабатывающей Кору-M7,
представляет иерархию памяти, которая состоит из “сильно связанных памятей” и
пары внутренней кэш-памяти в дополнение к основному Flash микроконтроллера и
SRAM. Кора-M7 также представляет новый тип шинного интерфейса, шины AXI-M.
Шина AXI-M позволяет 64-разрядную передачу данных и также поддерживает
несколько транзакций.

Суперскалярная архитектура
Кора-M7 имеет суперскалярную архитектуру и расширенный конвейер. Это означает,
что может к “двойной проблеме” инструкции, и при определенных условиях эти две
инструкции могут быть обработаны параллельно (Рис. 6.2).

Рисунок 6.2
Кора-M7 имеет шестиэтапный двойной конвейер проблемы. ЦП имеет несколько
обработок “каналы”, которые позволяют различным группам
инструкций быть обработанными параллельно.

Конвейер Коры-M7 был увеличен до шести этапов. Шестиэтапные конвейерные


действия как два трехэтапных конвейера каждый с выборкой декодирует и выполняет
этап. Два конвейера подключены к хранилищу памяти через 64-разрядную шину,
которая позволяет двум инструкциям быть выбранными и введенными в конвейеры
параллельно. Оба конвейера в свою очередь подключены к нескольким “каналам” в
блоке обработки. Каждый из каналов процессора способен к выполнению a
Процессор 191 коры-M7

подмножество инструкций. Это означает, что существуют отдельные пути обработки


для инструкций по Загрузке и Хранилищу, инструкций MAC, ALU и инструкций с
плавающей точкой. Это позволяет быть параллельным инструкциям по процессу,
если мы можем дать эти две инструкции в конвейере к различным каналам
обработки. В то время как это увеличивает сложность процессора, для разработчика
это происходит “под капотом” и является проблемой для компилятора для
упорядочивания инструкций по программе как доступов памяти с чередованием
адресов и инструкций по обработке данных.

Предсказание ветвлений
Производительность Коры-M7 далее улучшена путем добавления кэша ответвления к
единице предсказания ветвлений (Рис. 6.3). Это - специализированный блок кэш-
памяти с 64 записями каждый 64 бита шириной. Во время выполнения во время
выполнения Целевой кэш адреса ответвления (BTAC) обеспечит корректный адрес
ответвления. Если правильно предсказано BTAC позволяет ответвлениям цикла быть
обработанными в единственном цикле. Команды перехода могут также быть
обработаны параллельно с другой двойной данной инструкцией, далее
минимизирующей ответвление наверху. Это - критическая функция, поскольку она
позволяет микроконтроллеру общего назначения близко подходить к соответствию
производительности цикла выделенного устройства DSP.

Рисунок 6.3
BTAC гарантирует, что команды перехода являются единственным циклом.
Это значительно уменьшает любые издержки в
программных циклах.
Упражнение 6.1 Простой цикл
В этом осуществлении мы собираемся использовать некоторые реальные
аппаратные средства в форме платы Исследования STM32F7 и платы
Исследования STM32F4 вместо средства моделирования программного
обеспечения.
192 Главы 6

В остатке от упражнений этой главы мы продолжим использовать плату


Исследования STM32F7.

В этом осуществлении мы измерим время выполнения простого цикла и на Corex-M4


и на Коре-M7.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку в качестве примера и Копию “Исключая 6.1 Простыми циклами
Коры-M7”.

Это - многопроектная рабочая область. Тот же код создается в проекте Коры-M4


и проекте Коры-M7 (Рис. 6.4).

Рисунок 6.4
Эти два проекта открыты в многопроектной рабочей области.

Пакет разрабатывает проект (Рис. 6.5).

Рисунок 6.5
Разработайте оба проекта с командой Batch Build.

Выберите проект M7 (Рис. 6.6).

Рисунок 6.6
Выберите M7 как активный проект.
Процессор 193 коры-M7

Запустите отладчик и установите точку останова.


Выполните отладчик, пока он не поразит команду контрольного останова.
Возьмите количество цикла в окне регистра (Рис. 6.7).

Рисунок 6.7
Читайте цикл значат M7.

Повторитесь для-M4 и сравните (Рис. 6.8).

Рисунок 6.8
Читайте цикл значат-M4.

С этим простым примером мы видим, что код, скомпилированный для Коры-M7,


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

Структура шины
Кора-M7 также имеет более сложную структуру шины, чем более ранние процессоры
Cortex-M, все еще поддерживая линейную карту распределения памяти. Кора-M7
имеет шинный интерфейс AXI-M,
194 Главы 6

шина периферийного интерфейса AHB, ведомая шина AHB и также выделенные


локальные шины для Инструкции-TCM и Данных-TCM (Рис. 6.9).

Рисунок 6.9
Кора-M7 представляет много новых шинных интерфейсов.

Интерфейс главной шины между Корой-M7 и микроконтроллером является шиной


AXI-M ARM. Это - 64-разрядная широкая шина, способная к поддержке нескольких
транзакций. Шина AXI обеспечивает много ведомых портов, которые соединяются
мостом на облегченной шине AHB. Облегченная шина AHB совпадает с, найден на
других членах семейства Cortex-M; это помогает кремниевому повторному
использованию поставщиков существующие проекты микроконтроллера с
процессором Cortex-M7. Кора-M7 также имеет порт (AHBP) периферийной шины
AHB, который используется для доступа к периферийным устройствам
микроконтроллера через матрицу шины AHB.
Шина AHBP оптимизирована для периферийного доступа, таким образом,
периферийный доступ регистра будет иметь более низкую задержку по сравнению
с другими процессорами Cortex-M. Кора-M7 также имеет второй порт AHB; это -
ведомый порт (AHBS) AHB. Этот порт позволяет другие устройства управления
шиной, обычно единицы DMA, доступ к Инструкции-TCM и Данным-TCM.
Типичную реализацию этих шин в микроконтроллере показывают на (Рис. 6.10).
Процессор 195 коры-M7

Рисунок 6.10
Типичная конфигурация шинного интерфейса для микроконтроллера
Коры-M7.

В этом примере шина AXI-M подключена к матрице шины AHB через мост. Однако
AHB соединяют шиной, только подключает входы шины AXI-M к системной памяти
микроконтроллера. Периферийные шины шины AHB подключены назад к Коре-M7
через порты AHBP. Каждая из единиц DMA может действовать как устройства
управления шиной и иметь доступ ко всей системной памяти и периферийным
устройствам и может использовать Ведомую шину ADB для доступа к Инструкции и
Данным TCM. Хотя шина AHBS показывается как направляемый через Кору-M7, эта
шина будет бодрствовать, если процессор Cortex-M7 будет помещен в режим низкой
мощности. Это позволяет другим устройствам управления шиной получить доступ к
TCM, даже когда Кора-M7 полностью затекает.

Иерархия памяти
Более сложная структура шины Коры-M7 поддерживает карту распределения памяти,
которая содержит иерархию регионов памяти, которую должен понять и управлять
разработчик (Рис. 6.11).
196 Глав 6

Рисунок 6.11
Кора-M7 имеет иерархию памяти различных уровней производительности.

Во-первых Кора-M7 имеет два блока TCM — один для данных и один для
инструкций. Инструкция-TCM и Данные-TCM подключены к процессору через 64-
разрядную шину и являются памятью состояния с нулевым временем ожидания.
Инструкция-TCM и Данные-TCM могут быть до 16 K (Рис. 6.12).

Рисунок 6.12
TCMs являются памятями состояния с нулевым временем ожидания, с
которыми соединяют интерфейсом
непосредственно к ЦП через
специализированные 64-разрядные шины.

Код, расположенный в Инструкции-TCM, будет работать в состояниях с нулевым


временем ожидания и будет очень детерминирован. Таким образом, этот регион
памяти должен являться родиной любых критических стандартных программ и
процедур обработки прерывания. Данные-TCM являются самой быстрой RAM
данных, доступной процессору, и должны быть дома любых часто используемых
данных и являются также хорошим местоположением для памяти "кучи" и стека.
Процессор 197 коры-M7

Упражнение 6.2 Определение местоположения кода и данных


в TCM
Это осуществление демонстрирует, как загрузить код в Инструкцию-TCM и
данные в Данные-TCM и сравнить его выполнение для кодирования
расположенный в системной Флэш-памяти.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку в качестве примера и Копию “Исключая 6,2 6.4 Коры-M7 TCM и I-
кэш” (Рис. 6.13).

Рисунок 6.13
Проект имеет два модуля цикла, которым определили местоположение их кода
в ITCM и Флэш-памяти AXI.

Откройте опции для целевого меню.

В этом проекте у нас есть два набора функций цикла, которые накапливают
значения, сохраненные в тысяче массивов элемента. По умолчанию проект
поместит код во флэш-память, которая расположена на шине AXI-M в 0x8000000
(Рис. 6.14).
Рисунок 6.14
Расположение памяти с дополнительным регионом (RAM1), созданный для
покрытия ITCM.
198 Глав 6

Однако мы также определили RAM (RAM1) регион в 0x0000000 для 32 K, который


является местоположением Инструкции-TCM относительно этого устройства.
Флажок галочки по умолчанию снимается так, компоновщик не поместит объектов в
этот регион, если мы конкретно не скажем его.
Откройте “Options for file loop_TCM.c” (Fig. 6.15).

Рисунок 6.15
Модуль локальные опции используется для отображения данных кода/константы в
регион RAM1. Код, расположенный в регион RAM I-TCM, будет автоматически
загружен из Flash в I-TCM кодом запуска.

В опциях присвоения памяти мы можем выбрать регион RAM1 для сегментов


Code/Const в этом файле. Это означает, что код в loop_TCM.c файле будет сохранен
во флэш-памяти, но будет скопирован в регион RAM1 (Инструкция TCM SRAM) при
запуске. В качестве награды отладочные символы будут также соответствовать
адресу загрузки, это позволяет нам отлаживать код, загруженный в Инструкцию-
TCM, не имея необходимость делать специальную сборку.
Открытый main.c.
Массивы, которые содержат данные, которые будут накоплены, определяются в
начале основного ().
uint32_t array_DTCM[NUM_SAMPLES] __ приписывает __ ((в (0x20000000)));//Располагаются в самой быстрой
памяти данных DTCM

uint32_t array_SDRAM[NUM_SAMPLES] __ приписывает __ ((в (0xC0000000)));//Определяют местоположение в


SDRAM самой
медленной памяти
данных

__ приписывают директиву, используется, чтобы вынудить компоновщика определить


местоположение массива в абсолютном адресе. В этом случае мы вызываем первый
массив в регион D-TCM и второе в SRAM, расположенный на шине AXI. В основном ()
приложение мы настраиваем таймер SysTick для действия как таймер секундомера.
Основной () затем вызывает идентичные функции цикла, которые выполняются или из
Инструкции-TCM или из Flash AXI. Функции цикла также получают доступ к экземпляру
массива, который расположен или в Данных-TCM или в AXI-M SRAM.
Процессор 199 коры-M7

Создайте код и запустите отладчик.


Откройте окна/отладку представления / последовательные окна/отладку printf окно.
Выполните код и наблюдайте различное время выполнения, отображенное в
последовательном окне.
Синхронизация Цикла меры в Flash AXI и ITCM использование DTCM для данных
Синхронизация цикла Flash AXI с помощью DTCM RAM 5 79156
Синхронизация цикла ITCM с помощью DTCM RAM 5 24432
Синхронизация цикла Flash AXI с помощью SDRAM 5 89827
Синхронизация цикла ITCM с помощью SDRAM 5 37306

Блоки кэш-памяти
За пределами TCMs весь код программы и данные будут сохранены в системной памяти.
Это будет микроконтроллером внутренний Flash и SRAM. Микроконтроллер может
также иметь интерфейс внешней шины для доступа к дополнительной RAM и памяти
ROM. Как мы видели с Корой-M3 и-M4, необходимо обеспечить некоторую форму
“Акселератора Флэш-памяти” для освобождения инструкций от флэш-памяти до ЦП для
поддержания обработки в полной тактовой частоте ЦП. Кора-M7 является оба более
высоким процессором производительности и разработана для выполнения в более
высоких тактовых частотах, и эта форма ускорения памяти больше не является
полностью эффективной. Для соблюдения и его кода и требований пропускной
способности Кора-M7
может быть реализован и с Кэшами Данных и с Инструкции (Рис. 6.16).
Рисунок 6.16
I-кэш и D-кэш привыкли к кэш-памяти, расположенной на шине AXI-M.
200 Глав 6

Оба из кэшей используются для содержания копий инструкций, и данные,


выбранные из памяти, получили доступ по шине AXI-M. Однажды инструкция или
значение данных был загружен в кэш, к этому можно получить доступ больше
быстрее, чем системный Flash и SRAM.

Операция кэша
Как TCMs, Кэши Инструкции и Данных являются блоками памяти, внутренней к
процессору Cortex-M7, которые способны к тому, чтобы быть полученным
доступ с состояниями с нулевым временем ожидания. Кэш Инструкции может
составить до 64 Кбит в размере, и Кэш Данных может составить до 16 Кбит
(Рис. 6.17).

Рисунок 6.17
Кэш состоит из строки данных, которая отображается на физической памяти через Тег. Биты
C определяют политику кэша, в то время как V и биты D используются для отслеживания
состояние данных.

Кэш-память Инструкции и Данных расположена в серию строк кэша, которые 32


байта длиной. Каждая строка кэша имеет кэш-тег. Кэш-тег содержит информацию,
которая отображает строку кэша на системную память. Тег также имеет группу битов,
которые детализируют текущий статус строки кэша. И Кэш Инструкции и Данных
имеет V или допустимый бит, который указывает, что строка кэша содержит в
настоящее время допустимую информацию. Кэш данных имеет дополнительный D и
биты C. Кэш данных D бит указывает, что данные, в настоящее время сохраненные в
кэше, грязны. Это означает, что значение, сохраненное в кэше, было обновлено, но
местоположение соответствия в системной памяти не имеет. Два бита C содержат
атрибуты кэша для этой строки кэша, и мы обсудим их через мгновение (Рис. 6.18).
Процессор 201 коры-M7

Рисунок 6.18
Строка кэша зеркально отражается к ячейкам памяти через пространство
физической памяти.

Кэш отображается как страница памяти, которая отражается через адресное


пространство процессора Cortex-M7. Это означает, что каждая строка кэша имеет
много ячеек памяти соответствия, равномерно расположенных с интервалами через
системную память.

Когда к системной памяти получают доступ, значение, сохраненное в системной


памяти, загружается в ЦП и также в местоположение кэша соответствия. Кэш-тег
будет установлен декодировать адрес данных в системной памяти, и допустимый бит
будет установлен. После того, как загруженный в кэш дальнейшие доступы к этому
местоположению считают значение из кэша, а не системной памяти. В зависимости от
политики кэша, которая установлена кодом приложения, записи к ячейке памяти
вызовут запись к строке кэша соответствия.
Снова кэш-тег будет обновлен с адресом декодирования местоположения системной
памяти. Допустимый бит будет установлен указать, что кэш содержит корректное
текущее значение данных. Точка, в которой обновляется системная память, будет
зависеть от политики кэша, которая установлена битами C в кэш-теге. Мы посмотрим
на настройки политики кэша позже. Если кэш-память будет содержать значение,
которое еще не было записано в системную память, которую укусил D, то будет
установлен. Поскольку код приложения выполняется, данные и инструкции будут
перемещены в кэши. Если данные были загружены в строку кэша, и доступ сделан к
другому местоположению в системной памяти, которая отображается на той же строке
кэша затем, старые данные будут “выселены”. Новые данные будут скопированы в
строку кэша, и кэш-тег будет обновлен (Рис. 6.19).
202 Главы 6

Рисунок 6.19
Во время выполнения данные будут загружены в кэш. Это может также быть
выселено, если к зеркальному местоположению
кэша получают доступ.

Если к нескольким местоположениям, отображенным на единственной строке кэша,


будут часто получать доступ, то они будут постоянно выселять друг друга. Это
известно как перегрузка кэша, и большая перегрузка уменьшит эффективность кэша
(Рис. 6.20).

Рисунок 6.20
Для повышения эффективности кэша кэш, я расположен как много параллельных
страниц. Это обеспечивает несколько местоположений для
хранения кэшированных данных.

Уменьшать влияние перегрузки кэша расположено как ряд параллельных страниц,


названных “путями”, а не одним непрерывным блоком памяти. Кэш Инструкции
расположен как два пути, и кэш данных расположен как четыре пути. Теперь кэш-
память отображается через систему при гранулярности каждого кэша путь. Это
создает много параллельных местоположений в кэше, в который может быть
отображена данная ячейка памяти. Это уменьшает вероятность перегрузки кэша и
приводит к более эффективному использованию кэш-памяти.
Процессор 203 коры-M7

Кэш инструкции
Кэшем Инструкции управляет небольшая группа функций, обеспеченных CMSIS-
базовой спецификацией. Функции обеспечиваются, чтобы включить и отключить
Кэш Инструкции. Существует также функция для лишения законной силы
содержимого кэша. Когда Кэш Инструкции делается недействительным, все
допустимые биты очищены, эффективно освободив кэш любых загруженных
инструкций. В то время как выполнение продолжается, выборки к адресу команды
начнут перезагружать кэш (Таблица 6.1).

Таблица 6.1: CMSIS-базовые функции I-управления-кэшем


Функции CMSIS-I-Cache
освободите SCB_EnableICache
(пусто) освобождают
SCB_DisableICache (пусто)
освобождают
SCB_InvalidateICache (пусто)

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

Упражнение 6.3 Кэш инструкции


Это осуществление измеряет увеличение производительности, достигнутое при
помощи кэша Инструкции.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Вновь откройте последнее осуществление “Исключая 6,2 6.4 Коры-M7 TCM и I-кэш”.
Открытый main.c.
Удалите комментарии в строках 75 и 91.

Это добавляет новый блок кода к последнему примеру. Здесь мы включаем Кэш
Инструкции и повторно выполняем функции цикла AXI для наблюдения изменения
в синхронизации.
Откройте окна/окно отладки представления / последовательные окна/окно отладки.
Выполните код и наблюдайте различие во время выполнения по сравнению с
исходным примером.
Синхронизация Цикла меры в Flash AXI с I-кэшем Включила
синхронизацию цикла AXI с I-кэшем и DTCM RAM 5 62395
Синхронизация цикла AXI с I-кэшем и SDRAM 5 76300
204 Главы 6

Кэш Инструкции является большим улучшением по выполнению от Flash, но не


столь хороший как Инструкция-TCM.

Кэш данных
Кэш Данных также расположен на шине AXI-M для кэширования любых системных
доступов RAM. В то время как это ускоряет доступ к данным программы, это может
представить неожиданные побочные эффекты из-за проблем когерентности данных
между системной памятью и Кэшем Данных. Кэш Данных является в
действительности затенением системная память так, чтобы переменная программы
могла жить в двух местах в кэше и в памяти SRAM. Это было бы прекрасно, если бы
ЦП был единственным устройством управления шиной в системе. В типичном
микроконтроллере Коры-M7 может быть несколько других устройств управления
шиной в форме периферийных единиц DMA или даже другие процессоры Cortex-M. В
такой много основной системе кэш может теперь представить проблему
когерентности данных (Рис. 6.21).

Рисунок 6.21
D-кэш может представить проблемы когерентности данных. Системная память может
быть обновлена другими устройствами управления шиной. D-кэш может
“скрыть” эти изменения от ЦП.

Так как наши данные могут теперь быть сохранены, несколько местоположений в
иерархии памяти (регистр ЦП, Кэш Данных, микроконтроллер SRAM), чем более
медленная системная память может содержать историческую ценность, которая
отличается от текущих данных, расположенных в Кэше Данных, единица DMA будет
только иметь доступ к системной памяти, так будет использовать, тем более старая
историческая ценность, а не текущее значение, сохраненное в кэше, Кроме того,
обновление DMA микроконтроллера SRAM, может быть замаскирована от ЦП
устаревшим значением, сохраненным в кэше данных. Это означает, что Кэш Данных,
действительно требует большего количества управления, чем Кэш Инструкции. В
CMSIS-базовой спецификации существует восемь функций Управления кэшем
Данных
(Таблица 6.2).
Процессор 205 коры-M7

Таблица 6.2: CMSIS-базовые функции кэша данных

CMSIS-базовые функции кэша данных


SCB_EnableDCache (пусто)
SCB_DisableDCache (пусто)
SCB_InvalidateDCache (пусто)
SCB_CleanDCache (пусто)
SCB_CleanInvalidateDCache (пусто)
SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize)
SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize)
SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize)

Как Кэш Инструкции существуют функции, чтобы включить, отключить, и делать


недействительным кэш данных. Кроме того, мы можем убрать кэш. Это вызывает все
данные, которые, как сохранили в кэше, были записаны в системную память,
делающую целое когерентное хранилище памяти. Также возможно убрать и делать
недействительным регионы системной памяти, которая может быть сохранена в
кэше.
Кэш данных Делает недействительным Сброс, что находится в кэш-памяти и
вызывает перезагрузку
от системной памяти
Чистый Кэш данных Запишите данные, сохраненные в кэш-памяти к
системе
память
Чистый Кэш данных и Память кэша записи к системной памяти и сбросу
Делайте недействительным кэш-память

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

Барьеры памяти
В Главе 5 “Функции Передовой архитектуры” мы видели, что ползунок Cortex-M 2
системы команд содержит группу инструкций по барьеру памяти. Инструкции по
барьеру памяти используются для поддержания данных и когерентности инструкции в
микроконтроллере Cortex-M. Эти инструкции редко используются в большинстве
проектов Cortex-M и когда они - это, главным образом для безопасного
программирования. Однако при работе с Кэшами Инструкции и Данных Коры-M7 они
используются, чтобы гарантировать, что операции кэша закончились прежде, чем
позволить ЦП продолжать обрабатывать. CMSIS-базовые функции кэша включают
необходимые инструкции по барьеру памяти гарантировать, что все операции кэша
завершились, когда функция возвращается.
__ STATIC_INLINE освобождают SCB_EnableICache (пусто)
{
#if (__ ICACHE_PRESENT 55 1U)
__ DSB ();
206 Глав 6

__ ISB ();
SCB-.ICIALLU 5 0UL;/* делают недействительным I-кэш */SCB-.CCR | 5
(uint32_t) SCB_CCR_IC_Msk;/* включают I-кэш */__ DSB ();

__ ISB ();
#endif
}

Упражнение 6.4 Кэш данных в качестве примера


Это осуществление измеряет увеличение производительности, достигнутое путем
включения Кэша Данных.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Вновь откройте последнее осуществление “Исключая 6,2 6.4 Коры-M7 TCM и I-
КЭШ”.
Открытый main.c.
Удалите комментарии в строках 92 и 106.

Это добавляет новый блок кода к последнему примеру. Здесь мы включаем Кэш
Инструкции и повторно выполняем функции цикла AXI для наблюдения изменения
в синхронизации.
Откройте окна/окно отладки представления / последовательные окна/окно отладки.

Выполните код и наблюдайте различие во время выполнения по сравнению с


исходным примером.
Синхронизация цикла меры в Flash AXI с I-кэшем и D-кэшем включена
Синхронизация цикла Flash AXI с I-кэшем и D-кэшем 5 33305

Так включение Кэша Данных дает другое повышение производительности, когда


данные расположены во внутренней или внешней RAM, но как ожидалось лучший
уровень производительности прибывает из располагающегося кода и данных в
TCMs.

Единица защиты памяти и конфигурация кэша


Единица защиты памяти (MPU) распространена через всех членов семейства
процессоров Cortex-M за исключением Коры-M0. Поскольку мы видели в Главе 5
“Функции Передовой архитектуры” MPU, может использоваться для управления
доступом к различным регионам карты распределения памяти в Cortex-M01\-M3
и-M4. На Коре-M7 MPU предлагает ту же функциональность, но кроме того это
используется для конфигурирования регионов кэша и политики кэша.
Процессор 207 коры-M7

Политика кэша
Политика кэша для различных регионов памяти в микроконтроллере может быть
определена через регионы MPU с битами конфигурации кэша в MPU “Атрибут и
Размер” регистр (Рис. 6.22; Таблица 6.3).

Рисунок 6.22
MPU “Атрибут и Размер” регистр.

Таблица 6.3: опции D-конфигурации-кэша MPU

Поле конфигурации кэша Описание


Введите
TEX расширение
C Кэшируемый
B Bufferable
С обеспечением
совместного
S доступа

Опция с обеспечением совместного доступа в MPU “Атрибут и Размер” регистр


определяет, если регион памяти может быть совместно использован двумя
устройствами управления шиной. Если регион будет объявлен как совместно
используемый, то его данные будут сохранены когерентными между кэшем и
физической памятью. Это означает, что любое устройство управления шиной,
получающее доступ к данным, будет всегда получать корректное текущее значение.
Однако, чтобы сделать это, ЦП должен будет записать через Кэш Данных, когда он
обновляет значение RAM, если RAM обновляется другим устройством управления
шиной, он должен быть загружен в кэш. Так создание совместно используемого
SRAM удаляет проблемы когерентности, но уменьшает полную производительность
Кэша Данных.

Политика кэша также определяет, как данные записаны между кэш-памятью и


системной памятью. Сначала мы можем определить, когда данные выделяются в
кэш. Существует две опции для выделить политики, мы можем вынудить данные
быть загруженными в кэш, когда местоположение RAM читается, или мы можем
выбрать для загрузки местоположения RAM в кэш, когда это считано или записано в.
Эта политика установлена путем конфигурирования битов Расширения Типа (TEX)
(Таблица 6.4).

Таблица 6.4: Кэш выделяет настройки политики

TEX Кэш выделяет политику


000 Читайте выделяют, загружают ячейку памяти в кэш, когда это читается из
Читайте и запись выделяют, загружают ячейку памяти в кэш, когда это считано из
001 или записано в
208 Глав 6

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

После того как ячейка памяти была загружена в кэш, который мы можем
определить, когда системная RAM будет обновлена. Существует две возможных
записи “политик обновления через” и “записывают обратно”.

“Запись через” политику вынудит записи ЦП обновить кэш-память и системную


память одновременно. Это понижает производительность кэша, но поддерживает
когерентность для записей кэша (Рис. 6.23).

Рисунок 6.23
Запишите через политику кэша.

Запись назад политика вызовет записи к кэш-памяти только, и данные будут только
записаны в системную память, когда данные кэша будут выселены или кэш, чистая
инструкция дается. Это максимизирует производительность кэша для записей данных
за счет когерентности кэш-памяти (Рис. 6.24).

Рисунок 6.24
Политика кэша с обратной записью.

Политика обновления кэша настроена через C и биты B в регистре MPU


(Таблица 6.5).

Таблица 6.5: политика обновления Кэша

C B Политика обновления кэша


Запишите обратно — кэшируемый и
1 1 bufferable
Запишите Через — кэшируемый, но
1 0 никакая буферизация
Процессор 209 коры-M7

Управление кэшем данных


Поскольку мы видели, что Кэш Инструкции будет заботиться о себе, и в большинстве
случаев мы просто должны включить его. Однако мы должны уделить больше
внимания Кэшу Данных и полной системной когерентности.

Выключите кэш

Самая простая вещь сделать, выключают Кэш Данных. В то время как это удалит
любую проблему когерентности, она уменьшит производительность Коры-M7.
Однако это может быть полезная опция в начале проекта для упрощения системы.

Отключите кэширование по региону системной памяти

Это подобно первой опции кроме, мы можем программировать регион MPU для
предотвращения данных, кэширующихся на регионе системной памяти. Мы можем
затем определить местоположение данных, которые характерны для Коры-M7 и
других устройств управления шиной в этот регион. Так как весь доступ будет к
системной памяти не будет никаких проблем когерентности, но доступы к этому
региону памяти с Corex-M7 будут в их самом низком.

Измените политику кэша для региона системной памяти

Если политика кэша для региона будет установлена записать через системную
память, то будет всегда обновляться. Таким образом, это - более ограниченная
опция, где код приложения пишет в память, совместно использованную
устройствами управления шиной.

Используйте функции управления кэшем для гарантии когерентности

Функции управления кэшем могут использоваться, чтобы убрать или делать


недействительным регионы системной памяти, прежде чем к ним получат доступ. Это
заставит грязные данные быть записанными в системную память до второго
устройства управления шиной, получающего доступ к данным. Мы можем также
делать недействительным данные, заставляющие Кору-M7 перезагружать данные из
системной памяти, совместно использованной с другим устройством управления
шиной.

Упражнение 6.5 Конфигурация кэша данных


Это осуществление демонстрирует поведение различных конфигураций кэша. Если
Вы планируете использовать Кору-M7, необходимо экспериментировать с этим
примером для получения полного понимания Кэша Данных.
Initilise_Device ();
MPU_Config ();
//SCB_EnableDCache ();//кэш отключен в начале проекта
210 Глав 6

Initilise_Arrays ();//загружают данные в array_sdram1 и нуль array_sdram2


//Cache_Clean ();
Update_Source_Array ();//Запись новые значения к array_sdram1
//Cache_Clean ();
DMA_Transfer (); //копируют sdram1 в array_sdram2 с помощью устройства управления шиной DMA
//Cache_Invalidate ();
Test_Coherence (); //Тест когерентность между array_sdram1 и array_sdram2
Test_Coherence (); //Тест когерентность между array_sdram1 и array_sdram2

В этом осуществлении MPU настраивает Кэш Данных для покрытия первых 128 Кбит
внешнего SDRAM, который заполняется с двумя массивами данных. Код приложения
заполняет массив некоторыми заказанными данными и пишет нуль в секунду. Затем
единица DMA (устройство управления шиной) используется для копирования данных
из первого массива во второе. Наконец мы тестируем на когерентность данных между
содержанием двух массивов. Мы можем использовать эту простую программу для
наблюдения эффекта различных параметров кэширования. Код MPU содержится в
единственном исходном файле и заголовочном файле, таким образом, он может быть
снова использован в других проектах.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Вновь откройте последнее осуществление “Исключая 6.5 Кэшами Данных”.
Прокомментируйте строку 90, таким образом, Кэш Данных не включен.
Разработайте проект.
Запустите отладчик.
Откройте окна/отладку представления / последовательные окна/отладку printf окно.
Выполните код.

Во время этого первого показа Кэш Данных отключен, чтобы дать нам базовую
линию для различных конфигураций кэша. Циклы, взятые для каждой операции,
следующие:
-. Циклы ЦП потратили для инициализации массивов: 5 217-.CPU
циклов потратили ре, инициализирующее исходный массив 1065-
.CPU циклы, потраченные на Передачу DMA: 11985
-. Циклы ЦП потратили для сравнения: 13912 было
0 различных чисел

Откройте main.c и строку некомментария 90 для включения кэша данных.


Открытый mpu.h.

Это - шаблонный конфигурационный файл для кода в mpu.c. Первоначальная


конфигурация отображает регион Кэша Данных в начале внешнего SRAM в
0xC0000000 для 128 Кбит. В опциях Конфигурации кэша Данных мы включаем
регион как с обеспечением совместного доступа с другими устройствами управления
шиной в микроконтроллере (Рис. 6.25).
Процессор 211 коры-M7

Рисунок 6.25
Параметры конфигурации MPU.

Восстановите код.
Запустите отладчик и выполните код.
-. Циклы ЦП потратили для инициализации массивов: 5 184-.CPU
цикла потратили ре, инициализирующее исходный массив 1064-
.CPU циклы, потраченные на Передачу DMA: 11985
-. Циклы ЦП потратили для сравнения: 13910 было
0 различных чисел

В то время как Кэш Данных теперь работает, он не имеет значительного эффекта,


потому что он имеет запись и чтение от системной памяти для поддержания
когерентности.
В mpu.h изменяют опцию с обеспечением совместного доступа от Да ни до КАКОГО
(Рис. 6.26).

Рисунок 6.26
Установите регион D-кэша, чтобы быть нес обеспечением
совместного доступа.
212 Глав 6

Создайте и повторно выполните пример.

Теперь регион не совместно используем, но политика загрузки кэша установлена


записать через так данные массива, записанные в кэш, будет также записан в
память SDRAM.
-. Циклы ЦП потратили для инициализации массивов: 3 388-.CPU
циклов потратили ре, инициализирующее исходный массив 1057-
.CPU циклы, потраченные на Передачу DMA: 11981
-. Циклы ЦП потратили для сравнения: 4418 было
0 различных чисел

Большое повышение производительности найдено в стандартной программе


сравнения. Это вызвано тем, что текущие данные для первого массива загружаются в
кэш. После того как сравнение было выполнено, данные для второго массива будут
теперь также загружены (Чтение Выделяют), поэтому, если мы выполняем
стандартную программу сравнения снова, время еще быстрее, потому что теперь все
доступы данных к Кэшу Данных.
-. Циклы ЦП потратили для сравнения: 2083 Там
был 0 различными числами

Открытый mpu.h.
Изменитесь Bufferable к Да Записывают обратно.
Расширение Типа изменения Чтения Уровня 1 и Записи Выделяет (Рис. 6.27).

Рисунок 6.27
Установите политику D-кэша быть, “Записывают обратно” и “Чтение, и
Запись Выделяют”.

Создайте и выполните код.

На этот раз код перестал работать, потому что значения данных массива сохранены
в Кэше Данных. Правильные значения не копируются DMA. Также, так как мы
выбрали чтение, и Запись Выделяют, array_sdram2 [] загружается в Кэш Данных,
когда это инициализируется. Это означает, что DMA обновляет SDRAM, но Кора-
M7 будет только видеть старые значения, сохраненные в кэше.
Процессор 213 коры-M7

Строка некомментария 98 Invalidate_Cache ();


Строка некомментария 94 Clean_Cache ();
Создайте и выполните код.

Снова код перестал работать, но более интересным способом. На этот раз


Invalidate_Cache () функция загрузила значения в SDRAM в кэш, но они -
неправильные значения. Мы инициализировали оба массива и затем назвали
Clean_Cache () функцией. Это помещает начальные значения в SDRAM. Однако мы
затем обновляем array_sdram1 [] значения, которые будут только изменены в кэше.
Строка некомментария 96 Clean_Cache ();
Создайте и выполните код.
-. Циклы ЦП потратили для инициализации массивов: 3 051-
.CPU цикл, потраченный на чистый кэш: 1067
-. Циклы ЦП потратили ре, инициализирующее исходный массив
1062-.CPU циклы, потраченные на чистый кэш: 1095
-. Циклы ЦП потратили на Передачу DMA: 11 999-
.CPU циклов, потраченных на кэш, делают
недействительным: 371-.CPU цикл потратил для
сравнения: 2696 было 0 различных чисел

-. Циклы ЦП потратили для сравнения: 2081 Там


был 0 различными числами

На этот раз код работает правильно, потому что мы поддержали когерентность между
Кэшем Данных и SDRAM.

Сопроцессор для операций с плавающей точкой двойной


точности
Как Кора-M4, Кора-M7 имеет Аппаратный Сопроцессор для операций с плавающей
точкой (FPU).
Эта единица тесно интегрируется в конвейер процессора, чтобы позволить очень
быстро обрабатывать и значений с плавающей точкой одинарной и двойной точности.
Кора-M7, которую FPU включен через регистр CPARC в Системном Блоке
управления процессора Cortex-M7, это обычно делается системным кодом запуска.
Вычисления с плавающей точкой теперь используют аппаратный блок, а не
библиотеки программного обеспечения, если параметры компилятора были
установлены правильно. Поскольку Кора-M7 может быть оснащена синглом
или двойная точность FPU CMSIS-базовая спецификация обеспечивает функцию,
чтобы запросить процессор и возвратить тип FPU, приспособленного (Рис. 6.28).
214 Глав 6

Рисунок 6.28
CMSIS-Core получает функцию типа FPU.

После того как FPU включили, он может использоваться таким же образом, мы


видели в Главе 3 “Архитектуру Cortex-M”.

Функциональная безопасность
Много секторов дизайна требуют соответствия некоторой форме стандарта
безопасности. Некоторые очевидные секторы являются Медицинскими,
Автомобильными, и Космос. Все больше другие секторы, такие как Управление
производственным процессом, Робототехника и Бытовая электроника все требуют
соответствия к стандартам безопасности. Как показывает опыт, процессы
проектирования, требуемые для функциональной безопасности сегодня, приняты
основными разработчиками завтра. Разработка проекта функциональной безопасности
намного больше, чем пишет и тестирует код полностью. Базовое кремниевое
устройство должно быть продуктом одинаково строгого процесса разработки с
доступной документацией для резервного копирования этого. Микроконтроллер
должен также включить функции (коды с коррекцией ошибок на шинных
интерфейсах, созданных в самопроверке), которые позволяют программному
обеспечению проверять это, процессор работает правильно и смочь обнаружить и
исправить отказы. IEC 61508-3 системы уровня (SIL3) будет часто состоять из
сдвоенных процессоров, работающих или на шаге блокировки или с расположением
супервизора и приложением. Это позволяет системе обнаруживать и справляться с
отказами процессора.

Кора-M7 была разработана и с аппаратными средствами и с документацией


процесса/безопасности, которая позволяет этому использоваться в высоких
системах целостности. Во время записи никаких микроконтроллеров,
использующих эти функции, были все же выпущены.
Процессор 215 коры-M7

Функции безопасности коры-M7


Кора-M7 представляет диапазон функций безопасности, которые позволяют
кремниевому поставщику разрабатывать устройство, подходящее для высокой
системы надежности. Функции безопасности, совместно использованные с другими
процессорами Cortex-M, следующим образом (Таблица 6.6):

Таблица 6.6: Общие функции безопасности Cortex-M

Единица защиты памяти


Инструкция и трассировка данных
Исключения отказа

Кора-M7 расширяет доступные функции безопасности с помощью дополнительных


функций (Таблица 6.7).

Таблица 6.7: функции безопасности Corex-M7


Функция
безопасности Описание
Коррекция Кора-M7 может быть настроена, чтобы обнаружить и
ошибок исправить трудно и
Коды исправимые ошибки в ПОРШНЯХ Кэша с помощью ECC
TCM соединяет интерфейсом с поддержкой,
взаимодействующей через интерфейс к памяти с ECC
оборудование
Двухъядерная Кора-M7 может быть реализована, как двухъядерный дизайн
блокировка был
Шаг оба процессора работают на Шаге Блокировки
Кора-M7 может быть синтезирована с Памятью, Созданной в
MBIST самопроверке
интерфейс, который поддерживает проверку памяти во время
производства и
время выполнения

Документация безопасности
Чтобы позволить кремниевым поставщикам разработать новый микроконтроллер,
который подходит для использования безопасности, ARM также предоставляет
обширную документацию в форме пакета безопасности (Таблица 6.8).

Таблица 6.8: документация безопасности коры-M7

Документ Описание
Руководство Руководство по безопасности, описывающее подробно
по отказ процессора
безопасности
обнаружение и функции управления и информация о
аспекты интеграции в реализациях устройства Silicon
Partner
Руководство
FMEA Виды отказа и Анализ Эффектов с качественным анализом
из видов отказа в логике процессора, последствиях отказа
на
поведение процессора и пример количественных
аппаратных средств
метрики
Отчет, ясно дающий понять, как инженеры Silicon Partner
Разработка должны
интерфейсный
отчет управляйте результатами ARM и что ожидать от них
216 Глав 6

Эти отчеты только представляют интерес для Кремниевых Разработчиков и


некоторых компаний, специализирующихся на испытании на безопасность и
инструментах. Как Разработчик Вы будете больше интересоваться программными
инструментами, а не Кремниевым Процессом проектирования.

Средства разработки
Существует много наборов инструментальных средств, которые были
сертифицированы для использования безопасности. Это главным образом относится
к компилятору и компоновщику. Компилятор ARM, используемый в MDK-ARM,
сертифицирован следующим образом (Таблица 6.9):

Таблица 6.9: документация безопасности Компилятора

Функция безопасности Описание


Сертификация ¨
безопасности Сертификация TUV SUD
ISO 26262 (ASILD)
IEC 61508-3 (SIL3)
Пять лет расширили
Обслуживание обслуживание
Критические дефекты фиксируют
Сохраняемое ответвление
компилятора
Документация Руководство по безопасности
Документация процесса
разработки
Отчет о тестировании
Дефектный отчет

Заключение
В этой главе мы видели, что Кора-M7 сохраняет модель программиста Cortex-M
разрешение нас для легкого перехода к этому новому процессору. Однако это
действительно требует времени для понимания большого увеличения
производительности по Коре-M4. Это станет более отмеченным, Кремниевые
Поставщики перемещают меньшие технологии процесса и достигают еще более
высоких тактовых частот. Кора-M7 является также первым процессором Cortex-M с
полным комплектом документации безопасности, которая позволяет кремниевым
поставщикам разрабатывать устройства, подходящие для важных приложений
безопасности.
CHPTER7

Отладка с CoreSight

Многие разработчики, которые запускают работу с микроконтроллера Cortex-M,


предполагают, что его система отладки является формой интерфейса “JTAG (Joint Test
Action Group)”. На самом деле процессор Cortex-M имеет архитектуру отладки под
названием “CoreSight”, который значительно более мощен. В дополнение к
управлению выполнением и функциям доступа к памяти, обеспеченным “JTAG”,
система отладки “CoreSight” включает много единиц трассировки в реальном времени,
которые предоставляют Вам подробное представление отладки процессора, когда это
работает. В этой главе мы будем видеть, какие функции доступны и как настроить их.

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

Рисунок 7.1
Электрически стираемая программируемая постоянная память была
предшественником сегодняшней Флэш-
памяти.

Для помощи отладке код был “оснащен” путем добавления дополнительных строк
кода, чтобы записать отладочную информацию из UART или переключить контакт
ввода-вывода. Программы отладчика монитора были разработаны для работы
целевого микроконтроллера и выполнения управления кода приложения. В то время
как отладчики монитора были большим шагом вперед, они использовали ресурсы на
микроконтроллере и любой ошибке, которая, вероятно, откажет, код приложения
также разрушит программу мониторинга только в точке, Вам был нужен он (Рис. 7.2).

Руководство разработчика по семейству процессоров Cortex-M.


DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00007-4 217
© 2016 Elsevier Ltd. Все права защищены.
218 Глав 7

Рисунок 7.2
Внутрисхемный эмулятор обеспечивает ненавязчивую отладку в реальном времени для
более старых встроенных микроконтроллеров.

Если бы у Вас были деньги, то альтернатива должна была использовать


внутрисхемный эмулятор. Это было сложной частью аппаратных средств, которые
заменили целевой микроконтроллер и позволили полный контроль над выполнением
программы без любого проникновения на времени выполнения ЦП или ресурсах. В
конце 1990-х более усовершенствованные микроконтроллеры начали показывать
различные формы единицы отладки на микросхеме. Одна из самых популярных
единиц отладки на микросхеме была указана “Joint Test Action Group” и известна
инициалами JTAG. Интерфейс отладки JTAG обеспечивает основное соединение
отладки между микроконтроллером ЦП и отладчиком ПК через недорогой адаптер
отладки (Рис. 7.3).

Рисунок 7.3
Сегодня аппаратные средства отладки низкой стоимости доступны для
программирования всех устройств Cortex-M.

JTAG позволяет Вам запускать и останавливать выполнение ЦП. Это также позволяет
Вам читать и писать в ячейки памяти и вставлять инструкции в ЦП. Это позволяет
разработчику отладчика останавливать ЦП, сохранять состояние процессора,
выполнять серию команд отладки и затем восстанавливать состояние ЦП и
выполнение перезапуска прикладной программы. В то время как этот процесс
очевиден для пользователя, это означает, что программа отладчика ПК выполнила
управление ЦП (сброс, работала, останов, и установила точку останова) и доступ к
памяти (чтение-запись пользователю
Отладка с CoreSight 219

память и периферийные устройства). Главное преимущество JTAG - то, что он


предоставляет базовому набору функций отладки с надежностью эмулятора по
намного более низкой цене. Недостаток JTAG - то, что необходимо добавить
аппаратный сокет к макетной плате, и интерфейс JTAG использует некоторые
контакты микроконтроллера. Как правило, интерфейс JTAG требует пяти контактов
GPIO, которые могут также быть мультиплексированы с другими периферийными
устройствами. Что еще более важно, интерфейс JTAG должен остановить ЦП,
прежде чем любая отладочная информация сможет быть предоставлена отладчику
ПК. Этот стиль выполнения/остановки отладки становится очень ограниченным,
когда Вы имеете дело с системой реального времени, такой как протокол связи или
блок управления приводом. В то время как интерфейс JTAG использовался на
ARM7/9-based микроконтроллерах, новая архитектура отладки под названием
CoreSight была представлена ARM для всего Cortex-M/R и Пониженных
процессоров.

Аппаратные средства CoreSight


При первом рассмотрении таблицы данных Основанного на Cortex-M
микроконтроллера легко пропустить доступные функции отладки или предположить,
что это имеет форму интерфейса JTAG. Однако архитектура отладки CoreSight
обеспечивает очень мощный набор функций отладки, которые идут путем вне того,
что может быть предложено JTAG. В первую очередь, на практической стороне
основное соединение отладки CoreSight только требует двух контактов,
Последовательных В и Последовательный (Рис. 7.4).
Рисунок 7.4
Архитектура отладки CoreSight заменяет коннектор айсберга JTAG двумя
стилями сверхминиатюрного коннектора.
220 Глав 7

Аппаратный сокет JTAG является 20-контактным коннектором айсберга, который


часто имеет большее место на PCB, чем микроконтроллер, который отлаживается.
CoreSight указывает два коннектора: 10-контактный коннектор для стандартных
функций отладки и 20-контактный коннектор для стандартных функций отладки и
трассировки инструкции. Мы будем говорить об опциях трассировки позже, но если
Ваш микроконтроллер поддерживает трассировку инструкции затем, рекомендуется
установить более крупный 20-контактный сокет, таким образом, у Вас есть доступ к
единице трассировки, даже если Вы первоначально не намереваетесь использовать
его. В сложной ошибке можно разобраться в течение многих часов с инструментом
трассировки, где с основным выполнением/остановкой, отлаживающим его, мог
занять недели (Рис. 7.5) (Таблица 7.1).

Рисунок 7.5
Эти два отладочных соединителя требуют минимального количества контактов
процессора для аппаратной отладки.

Таблица 7.1: сокеты отладки CoreSight

Сокет Samtec Коннекс Дона


10-контактная стандартная
отладка FTSH-105-01-L-DV-K C42-10-B-G-1
20-контактная стандартная 1
трассировка ETM FTSH-110-01-L-DV-K C42-20-B-G-1

Эта стандартная система отладки использует 10-контактный сокет. Это требует


минимума двух из контактов микроконтроллера, последовательный провод IO (SWIO)
и последовательные проводные часы (SWCLK) плюс целевой Vcc, земля и сброс. Как
мы будем видеть ниже, Кора-M3 и Кора-M4 оснащены двумя единицами трассировки,
которые требуют и дополнительный контакт, названный последовательным проводом
(SWO). Некоторые устройства Коры-M3 и Коры-M4 оснащены дополнительной
единицей трассировки инструкции. Это поддерживается 20-контактным коннектором
и использует еще четыре контакта процессора для канала трассировки инструкции.

Аппаратные средства отладчика


После того как Вам оснастили Вашу плату подходящим сокетом CoreSight, Вам будет
нужна единица адаптера отладки, которая включает сокет и обычно подключается к
ПК через USB или соединение Ethernet. Растущее число недорогих макетных плат
также включает интерфейс отладки USB на основе CMSIS-DAP (Порт доступа
Стандартной Отладки Программного интерфейса Микроконтроллера Коры)
спецификация.
Отладка с CoreSight 221

Архитектура отладки CoreSight


Существует несколько уровней поддержки отладки, оказанной по семейству Cortex-
M. Во всех случаях система отладки независима от ЦП и не использует ресурсы
процессора или время выполнения (Рис. 7.6).

Рисунок 7.6
Кроме того, для выполнения управления Коры-M3 и Коры-M4 основная система
отладки включает две единицы трассировки. Трассировка
данных и трассировка инструментария.

Минимальная система отладки, доступная на Коре-M3 и Коре-M4, состоит из интерфейса


последовательного провода (SW), подключенного к системе управления отладкой,
которая состоит из блока управления выполнения, единицы точки останова и единицы
доступа к памяти. Единица точки останова поддерживает до восьми аппаратных точек
останова, на самом деле доступное общее количество будет зависеть от числа, указанного
Кремниевым Поставщиком, когда микросхема будет разработана. В дополнение к
единицам управления отладкой стандартная поддержка отладки CoreSight Коры-M3 и
Коры-M4 включает две единицы трассировки, трассировку часов данных и трассировку
инструментария (ITM). Трассировка часов данных позволяет Вам просматривать
внутреннюю RAM и периферийные местоположения “на лету”, не используя циклов ЦП.
Единица часов данных позволяет Вам визуализировать поведение своих данных
приложений.

Упражнение 7.1 Отладка CoreSight


Для большинства примеров в этой книге я использовал отладчик средства
моделирования, который является частью IDE µVision. В этом осуществлении,
однако, я пробегу установку отладчика для работы с платой Исследования STM32F7.
Эта оценочная плата имеет свой собственный адаптер отладки, включенный как часть
платы. В то время как существует множество оценочных плат, доступных для
222 Главы 7

различные устройства Cortex-M конфигурация аппаратного интерфейса отладки


являются по существу тем же для всех плат.

Аппаратная конфигурация
При разработке собственного аппаратного и программного обеспечения внешний
адаптер отладки подключен к макетной плате через 10-контактный сокет отладки
CoreSight. Адаптер отладки в свою очередь подключен к ПК через USB-кабель (Рис.
7.7).

Рисунок 7.7
Типичная оценочная плата обеспечивает коннектор JTAG/CoreSight. Оценочная плата
должна также иметь свой собственный источник питания. Часто это
обеспечивается через гнездо USB.

Важно отметить здесь, что макетная плата также имеет свой собственный источник
питания. Адаптер отладки снизит некоторый ток в макетную плату, достаточно
чтобы включить светодиоды на плате и дать появление, что аппаратные средства
работают. Однако недостаточно тока обеспечивается, чтобы позволить плате
работать надежно; всегда удостоверяйтесь, что макетная плата приводится в
действие ее обычным источником питания (Рис. 7.8).
Рисунок 7.8
Плата Исследования STM32F7xx.
Отладка с CoreSight 223

В этом примере мы настроим аппаратный отладчик, встроенный в плату


Исследования STM32F7. Эта плата подключена к разработке ПК с помощью USB-
кабеля. На этой плате USB-кабель предоставляет питание плате Исследования и
также соединяется со встроенным интерфейсом отладки.

Конфигурация программного обеспечения


Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “аппаратная EX 7.1 Отладка”.
Это - версия примера Blinky для платы Исследования ST.
Теперь откройте вкладку Options for Target\Debug

Рисунок 7.9
Вкладка Debug позволяет, Вы для конфигурирования отладчика для аппаратных
средств отлаживаете и выбираете адаптер
отладки.

Возможно переключиться от использования средства моделирования к отладчику


CoreSight путем нажатия на переключатель “Use” на правой стороне меню (Рис. 7.9).
В выпадающем поле удостоверяются, что Отладчик Ссылки ST выбран. Как средство
моделирования возможно запустить скрипт, когда отладчик микровидения
запускается. В то время как отладчик запустится успешно без этого сценария,
сценарий используется для программирования регистра в системе отладки
микроконтроллера, которая позволяет нам настраивать любые уникальные опции для
используемого микроконтроллера
(Рис. 7.10).
224 Главы 7

Рисунок 7.10
Файл сценария отладчика позволяет Вам настраивать отладочные регистры CoreSight.
Здесь, мы можем заморозить таймеры и управлять поведением
отладчика во время выключения питания.

В случае этого микроконтроллера производитель реализовал опции, которые


позволяют некоторым пользовательским периферийным устройствам быть
остановленными, когда ЦП Cortex-M останавливается системой отладки. В этом
случае пользовательские таймеры, сторожевые таймеры и модуль CAN могут быть
заморожены, когда ЦП останавливается. Сценарий также позволяет нам включать
поддержку отладки, когда кора ЦП помещается в режимы низкой мощности. В этом
случае режимы ожидания, разработанные производителем микроконтроллеров, могут
быть настроены, чтобы позволить источнику часов системе отладки CoreSight
продолжаться управлять, в то время как остальная часть микроконтроллера переходит
к требуемому режиму низкой мощности. Наконец, мы можем настроить
последовательный контакт трассировки. Это должно быть включено путем выбора
TRACE_IOEN с набором TRACE_MODE к Асинхронному. Когда отладчик
запустится, сценарий запишет, что пользовательская конфигурация оценивает
отладочному регистру MCU (Рис. 7.11).
_WDWORD (0xE0042004, 0x00000027);

Теперь нажмите кнопку настроек.


Отладка с CoreSight 225

Рисунок 7.11
Установочное меню драйвера первоначально покажет Вам, что адаптер отладки
подключен и работа. Успешно чтение coreID доказывает, что
микроконтроллер работает.

Это откроет окно конфигурации адаптера отладки. Две основных области в этом
диалоговом окне показывают состояние соединения адаптера отладки к ПК и к
микроконтроллеру. Область USB адаптера отладки показывает что порядковый номер
адаптера отладки и версия микропрограммного обеспечения. Это также позволяет
Вам выбирать, с каким стилем отладки соединяют интерфейсом для использования
при соединении с микроконтроллером. Для микроконтроллеров Cortex-M необходимо
обычно всегда использовать SW, но JTAG также доступен, должен Вы нуждаться в
нем. Поле галочки SWJ позволяет отладчику выбирать стиль интерфейса отладки
динамично.

Когда Вы будете подключены к микроконтроллеру, диалоговое окно устройства SW


отобразит все доступные интерфейсы отладки (на некоторых микроконтроллерах может
быть больше чем один). Хотя Вы обычно не должны реализовывать конфигурацию для
выбора порта отладки, эта информация полезна в этом, это говорит Вам, что
микроконтроллер работает. При переводе в рабочее состояние новой платы впервые
может быть полезно проверить этот экран, когда плата сначала соединена для получения
некоторой уверенности, что микроконтроллер работает (Рис. 7.12).
Рисунок 7.12
Раздел отладки позволяет Вам определять соединение и сбрасывать метод,
используемый отладчиком.
226 Глав 7

Диалоговое окно отладки в установке позволяет Вам управлять, как отладчик


соединяется с аппаратными средствами. Опция подключения определяет, если сброс
применяется к микроконтроллеру, когда отладчик соединяется, у Вас также есть опция
содержать микроконтроллер в сбросе. Помните, что, когда Вы программируете код во
флэш-память и сбрасываете процессор, код будет работать за многими циклами перед
соединением отладчика. Если код приложения делает что-то для нарушения
соединения отладки, то отладчик может не соединиться. Способность сбросить и
остановиться, код может быть окольным путем такие проблемы. Методом сброса
можно также управлять, это может быть аппаратным сбросом, относился к целому
микроконтроллеру или программному сбросу, вызванному путем записи в регистры
“SYSRESET” или “VECTRESET” в NVIC. В случае опции “SYSRESET” возможно
сделать “теплый” сброс, который сбрасывает ЦП Cortex-M, не сбрасывая
периферийные устройства микроконтроллера. Влияние опций кэша, когда физическая
память считана и отображена. Если код будет кэшироваться затем, то отладчик не
будет читать физическую память, но содержать кэшированную версию изображения
программы в памяти ПК. При написании кода самоизменения необходимо снять
флажок с этой опцией. Кэш памяти данных также сохранен, если используется, кэш
данных отладчика только обновляется однажды, когда код останавливается. Если Вы
хотите видеть периферийное обновление регистров, в то время как код
останавливается, необходимо снять флажок с этой опцией (Рис. 7.13).
Теперь нажмите на вкладку Trace.

Рисунок 7.13
Вкладка Trace используется, чтобы настроить Инструкцию, данные и единицы
трассировки инструментария и также включить счетчики
производительности.

Это диалоговое окно позволяет нам настраивать внутренние единицы трассировки


устройства Cortex-M. Для обеспечения точной синхронизации базовая тактовая
частота должна быть установлена на частоту тактовой частоты ЦП процессора
Cortex. Опции порта трассировки настроены для интерфейса SW с помощью
протокола связи UART. В этом меню мы можем также включить и настроить данные
Отладка с CoreSight 227

наблюдайте трассировку и включите различные счетчики события трассировки.


Это диалоговое окно также настраивает ITM, и мы взглянем на это далее в этой
главе (Рис. 7.14).
Теперь нажмите вкладку Flash Download.

Рисунок 7.14
Алгоритм программирования для внутренней Флэш-памяти
микроконтроллера.

Это диалоговое окно позволяет Вам устанавливать алгоритм Загрузки Flash для Флэш-
памяти микроконтроллера. Это будет обычно настраиваться автоматически, когда
проект будет определен. Это меню позволяет Вам обновлять или добавлять алгоритмы
для поддержки дополнительной внешней параллельной или последовательной Флэш-
памяти.

После того, как настроенный, можно запустить отладчик как нормальный, и он будет
подключен к аппаратным средствам вместо имитационной модели. Это позволяет Вам
осуществлять код реальных аппаратных средств через тот же интерфейс отладчика,
который мы использовали для средства моделирования. С данными трассировка часов
включила, Вы видите текущее состояние своих переменных в часах и окнах памяти, не
имея необходимость останавливать код приложения. Также возможно добавить
глобальные переменные к Анализатору логики для трассировки значений переменной
со временем. Это может быть невероятно полезно при работе с данными реального
времени (Рис. 7.15).
228 Глав 7

Рисунок 7.15
Трассировка Исключения и Счетчики события обеспечивают полезные
метрики выполнения кода.

Окна трассировки часов данных дают некоторую высокоуровневую информацию о


производительность во время выполнения кода приложения. Окна трассировки часов
данных обеспечивают необработанное высокоуровневое исключение трассировки и
доступ к данным. Трассировка исключения также доступна, который предоставляет
подробную информацию исключения и поведения прерывания (Рис. 7.16).
Отладка с CoreSight 229

Рисунок 7.16
Счетчики события являются руководством по тому, как эффективно процессор
Cortex-M работает в микроконтроллере.

Архитектура отладки CoreSight также содержит много счетчиков, которые


показывают производительность процессора Cortex-M. Дополнительные циклы
на количество инструкции являются количеством состояний ожидания,
процессор встретился с ожиданием инструкций, которые будут освобождены от
Флэш-памяти. Это - хороший признак в том, как эффективно процессор
работает.

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

Трассировка инструментария
В дополнение к трассировке часов данных основная структура отладки на Коре-M3 и
Коре-M4 включает вторую единицу трассировки, названную ITM. Можно думать о
ITM как о последовательном порте, который подключен к отладчику. Можно затем
добавить код к приложению, которое пишет пользовательские сообщения отладки в
ITM, которые затем отображены в отладчике. Путем оснащения кода этот путь можно
отправить сложную отладочную информацию в отладчик. Это может использоваться,
чтобы помочь определить местоположение неясных ошибок, но это также особенно
полезно для тестирования программного обеспечения.

ITM немного отличается от других двух единиц трассировки, в которых это


навязчиво на ЦП, то есть, это действительно использует несколько циклов ЦП. ITM
лучше всего считается отладкой UART
230 Глав 7

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


оснастить код путем добавления простой, отправляют и получают рычаги. Эти
рычаги являются частью стандарта CMSIS и автоматически определяются в
стандартном заголовочном файле микроконтроллера. Рычаги состоят из трех
функций и одной переменной.
статичный __ ВСТРАИВАЮТ uint32_t ITM_SendChar (uint32_t ch); //Отправляют символ в ITM
энергозависимый международный ITM_RxBuffer 5 ITM_RXBUFFER_EMPTY; //Получают буфер для ITM
статичный __ ВСТРАИВАЮТ международный ITM_CheckChar (пусто); //Проверка, чтобы видеть, имеет ли
символ
отправленный
//от отладчика
статичный __ ВСТРАИВАЮТ международный ITM_ReceiveChar (пусто); //Read символ от ITM

ITM на самом деле немного более сложен в этом, он имеет 32 отдельных канала. В
настоящее время канал 31 используется RTOS (Операционная система реального
времени) ядро для отправки сообщений в отладчик для ядра осведомленные окна
отладки. Канал 0 является каналом пользователя, который может использоваться
Вашим кодом приложения для отправки printf () сообщения стиля к консоли в
отладчике.

Упражнение 7.2 Установка ITM


В этом осуществлении мы посмотрим на конфигурирование ITM, чтобы отправить и
получить сообщения между микроконтроллером и отладчиком ПК.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “аппаратная EX 7.1 Отладка”.

Мы настроим проект Blinky так, чтобы было возможно отправить сообщения


через ITM из кода приложения. Во-первых, мы должны настроить отладчик,
чтобы включить приложению канал ITM.
Откройте диалоговое окно “Options for Target\debug”.
Нажмите кнопку настроек ST-Link и выберите вкладку Trace (Рис. 7.17).
Рисунок 7.17
Базовая Тактовая частота должна быть установлена правильно, чтобы ITM
работал успешно.
Отладка с CoreSight 231

Для включения ITM Базовые Часы должны быть установлены на корректную частоту,
как обсуждено в последнем осуществлении, и Трассировке нужно включить (Рис.
7.18).

Рисунок 7.18
ITM имеет 32 канала. В настоящее время канал 31 и 0 используется для
представления события RTOS и пользовательского
канала отладки ITM.

В меню портов стимула ITM порт 31 будет включен по умолчанию. Для включения
порта приложения, мы должны включить порт 0. Мы хотим смочь использовать
Приложение форма ITM привилегированный и непривилегированный режим так
Привилегированный Порт 7.. 0 должен быть неконтролируем.

После того как настройки Trace и ITM настроены, нажимают "OK" и


возвращаются назад к редактору.

Откройте редактора во время выполнения.


Выберите Компилятор:: раздел IO.

Здесь, мы можем настроить канал, используемый в качестве стандарта IO (STDIO).


Опция File оказывает поддержку для вызовов низкого уровня, выполненных
функциями stdio.h. Уезжайте это сняло флажок, если Вы не добавили файловую
систему (Рис. 7.19).
Рисунок 7.19
Компилятор:: опции ввода-вывода позволяют Вам выбирать канал STDIO
низкого уровня.
232 Главы 7

Включите STDERR, STDIN, STDOUT и TTY, и выберите ITM из выпадающего


меню.

Рисунок 7.20
Обновленный проект с ITM поддерживает для STDIO в retarget_IO.c.

Это добавляет “retarget_io.c” файл к проекту. Этот файл содержит функции драйвера
STDIO низкого уровня, которые читают и пишут отдельный символ в ITM (Рис. 7.20).
Откройте Blinky.c.
Добавьте, что stdio.h к списку включают файлы.
#include "RTE_Components.h"
#include, stdio.h.

Добавьте printf оператор после kernelStart () вызов API.


osKernelStart (); printf ("RTX
Started\n"); в то время как (1) {

Запустите отладчик.
Откройте view\serial windows\Debug (printf) средство просмотра.
Выполните код.

Рисунок 7.21
Сообщение отладки, отправленное от кода приложения до окна консоли
отладки.
Отладка с CoreSight 233

printf () сообщение отправляется на канал STDIO, который является ITM. Это


сообщение прочитано и отображено в окне консоли отладки (Рис. 7.21).

Мы будем видеть, как использовать ITM для отправки сообщений диагностики


во время выполнения в Главе 10 “Методы RTOS” и также как использовать его
в качестве части схемы тестирования программного обеспечения в Главе 11
"Test-Driven Development".

Системная поддержка отладки блока управления


Интерфейс отладчика CoreSight позволяет Вам управлять выполнением своего кода
приложения и исследовать значения в памяти и периферийных регистрах.
Объединенный с различными единицами трассировки, это предоставляет Вам
мощную систему отладки для нормальной разработки программы. Однако, поскольку
мы видели в Главе 3 “Архитектуру Cortex-M”, процессоры Cortex-M имеют до
четырех исключений отказа, которые будут инициированы, если код приложения
сделает неправильное использование процессора Cortex-M или аппаратных средств
микроконтроллера (Таблица 7.2).

Таблица 7.2: исключения Отказа

Исключение отказа Приоритет Процессор коры


Серьезный отказ 21 Кора-M0, кора-M01, кора-M3, кора-M4
Программируе
Отказ шины мый Кора-M3, кора-M4
Программируе
Отказ использования мый Кора-M3, кора-M4
Отказ диспетчера Программируе
памяти мый Кора-M3, кора-M4 (дополнительно)

Когда это произойдет, Ваша программа будет захвачена на обработчике ошибок по


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

Поведение исключений отказа может быть настроено регистрами в системном блоке


управления. Ключевые регистры перечислены в Таблице 7.3.

Таблица 7.3: регистры конфигурации исключения Отказа

Зарегистрироваться Процессо Описание


р
Активируйте дополнительные опции исключения
Конфигурация и управление M3, M4 отказа
Управление обработчиком Включите и незаконченные биты для исключений
систем и состояние M3, M4 отказа
Настраиваемый регистр
состояния отказа M3, M4 Подробные биты состояния отказа
Состояние серьезного отказа M3, M4 Сообщает эскалация серьезного отказа или отказа
Адрес отказа диспетчера Адрес местоположения, которое вызвало отказ
памяти M3, M4 диспетчера памяти
Адрес отказа шины M3, M4 Адрес местоположения, которое вызвало отказ шины
234 Главы 7

Когда процессор Cortex-M выходит из сброса, только обработчик серьезных отказов


включен. Если использование, шина или отказ диспетчера памяти будут повышены, и
обработчик исключений для этих отказов не включен, то отказ “возрастет” к
серьезному отказу. Регистр состояния серьезного отказа обеспечивает два бита
состояния, которые указывают на источник серьезного отказа (Таблица 7.4).

Таблица 7.4: регистр состояния Серьезного отказа

Имя: Бит Использовать


ПРИНУДИТЕЛ Достигнутый серьезный отказ, должный
ЬНЫЙ 30 давать сбой эскалация
Достигнутый серьезный отказ из-за
VECTTBL 1 дефектного чтения
из таблицы векторов

“Управление Обработчиком систем и” регистр состояния содержат, включают,


ожидание и активные биты для шины, использования и обработчиков исключений
диспетчера памяти. Мы можем также настроить поведение исключений отказа с
“Конфигурацией и Управления” регистр (Таблица 7.5).

Таблица 7.5: Регистр конфигурации и регистр управления

Имя: Бит Использовать


STKALIGN 9 Настраивает 4-или 8-байтовое выравнивание стека
Отключает отказы шины данных, вызванные инструкциями
BFHFMIGN 8 по хранилищу и загрузкой
DIV_0_TRP 4 Включает отказ использования для деления нулем
Включает отказ использования для невыровненного
UNALIGNTRP 3 доступа к памяти

“Делятся на нулевое” исключение, может быть полезное прерывание для включения,


особенно во время разработки. Остающиеся исключения нужно оставить
отключенными, если у Вас нет серьезного основания включить их. То, когда
исключение отказа диспетчера памяти произойдет, адрес инструкции, которая
попыталась получить доступ к запрещенному региону памяти, будет сохранен в
“Адресном регистре Отказа памяти”, так же когда отказ шины повышен адрес
инструкции, которая вызвала отказ, будет сохранено в “регистре” Адреса Отказа
Шины. Однако при некоторых условиях, не всегда возможно записать, что отказ
адресует к этим регистрам. Настраиваемый регистр “Состояния отказа” содержит
обширный набор флагов, которые сообщают о состояниях ошибки процессора Cortex-
M, которые помогают Вам разыскать причину исключения отказа.

Отслеживание отказов
Если Вы прибыли в обработчик серьезных отказов, сначала проверьте “регистр”
Состояния Серьезного отказа. Это скажет Вам при достижении серьезного отказа,
должного давать сбой эскалация или ошибка чтения таблицы векторов. Если
существует эскалация отказа, затем проверьте “Управление Обработчиком систем и”
регистр состояния для наблюдения, который другое исключение отказа активно.
Следующая остановка
Отладка с CoreSight 235

“Настраиваемое Состояние отказа” регистр. Это имеет широкий спектр флагов,


которые сообщают о состояниях ошибки процессора (Таблица 7.6).

Таблица 7.6: Настраиваемый регистр состояния отказа


Настраиваемый регистр состояния отказа
Имя: Бит Использовать
DIVBYZERO 25 Разделитесь на нулевую ошибку
НЕВЫРОВНЕН
НЫЙ 24 Невыровненный доступ к памяти
NOCP 19 Никакие CoProcessor не представляют
INVPC 18 Недопустимая загрузка ПК
Несанкционированный доступ регистр состояния
INVSTATE 17 программы выполнения EPSR
UNDEFINSTRA Предпринятое выполнение неопределенной
SSE 16 инструкции
BFARVALID 15 Адрес в адресном регистре отказа шины допустим
STKERR 12 Отказ шины на укладке записи исключения.
UNSTKERR 11 Отказ шины на неукладке выхода исключения
Ошибка шины данных. Ошибочный адрес, не
IMPRECISERR 10 сложенный
PRECISERR 9 Ошибка шины данных. Ошибочный адрес сложен
IBUSERR 8 Ошибка шины инструкции
Адрес в адресном регистре отказа диспетчера памяти
MMARVALID 7 допустим
Укладка на записи исключения вызвала отказ
MSTKERR 4 диспетчера памяти
Укладка на выходе исключения вызвала отказ
MUNSTKERR 3 диспетчера памяти
DACCVIOL 1 Флаг нарушения доступа к данным
IACCVIOL 0 Флаг нарушения прав доступа инструкции

Когда исключение отказа процессора будет вводиться, стековый фрейм будет обычно
продвигаться на стек. В некоторых случаях стековый фрейм не будет допустим, и это
будет обозначено флагами в “Настраиваемом Состоянии отказа” регистр. Когда кадр
допустимого стека будет продвинут, он будет содержать адрес ПК инструкции,
которая генерировала отказ. Путем декодирования стекового фрейма можно получить
этот адрес и определить местоположение проблемной инструкции. Системный блок
управления обеспечивает память и адресный регистр отказа шины, который в
зависимости от причины ошибки может содержать адрес инструкции, которая вызвала
исключение ошибки.

Упражнение 7.3 Исключения отказа процессора


Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “Отслеживание Отказа EX 7.3”.

В этом проекте мы генерируем исключение отказа и посмотрим на то, как он


обрабатывается NVIC. После того как исключение отказа произошло, мы можем
опросить стек для нахождения инструкции, которая вызвала исключение
ошибки.
236 Глав 7

энергозависимый uint32_t
op1; международное
основное (пустота)
{
международный op2 5 0x1234, op3 5 0;
SCB-.CCR 5 0x0000010;//Включают, делятся на нулевой отказ использования
op1 5 op2/op3;//выполняют деление нулем для генерации исключения использования

в то время как (1);


}

Код сначала включает, “делятся на нулевой отказ использования”, и затем


выполняет деление нулем для порождения исключения.
Создайте код и запустите отладчик.
Установите точку останова на строке кода, которая содержит инструкцию по делению
(Рис. 7.22).

Рисунок 7.22
Установите точку останова на операторе деления.

Выполните код, пока он не поразит эту точку останова.

Откройте окно Peripherals\Core Peripherals\System Control и Configuration и проверьте,


что Делению Нулевым прерыванием включили (Рис. 7.23).

Рисунок 7.23
Проверьте, что Деление Нулевым прерыванием включено при помощи
“Конфигурации системы и Управления”
периферийное представление.
Отладка с CoreSight 237

Одноэтапный инструкция по делению (Рис. 7.24).

Рисунок 7.24
Исключение ошибки заставит Вас поражать обработчик серьезных отказов, если
другие исключения отказа не были включены.

Исключение отказа использования будет повышено. Мы не включили вектор


исключения отказа использования, таким образом, отказ поднимет до серьезного
отказа.
Откройте окно Peripherals\Core Peripherals\Fault Reports (Рис. 7.25).

Рисунок 7.25
Если отказ происходит, можно просмотреть обзор регистров диагностики отказа
в периферийном окне сообщений о
неисправностях.
238 Глав 7

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

В окне Register считайте содержание R13, Основного Указателя вершины стека, и


откройте Окно памяти в этом местоположении (Рис. 7.26).

Рисунок 7.26
Используйте окно Register, считайте текущий адрес, сохраненный в указателе
вершины стека. Затем используйте Окно памяти для чтения
значения ПК, сохраненного в стековом фрейме.

Рисунок 7.27
Значение ПК, сохраненное в стековом фрейме, приводит нас к инструкции SDIV, которая вызвала
исключение ошибки.

Считайте значение ПК, сохраненное в Стековом фрейме, и откройте окно Disassembly


в этом местоположении (Рис. 7.27).
Это забирает нас к инструкции SDIV, которая вызвала отказ.
Выйдите из отладчика и добавьте строку кода ниже к началу программы.
SCB-.SHCSR 5 0x00060000;

Это включает Исключение отказа использования в NVIC.


Теперь добавьте обработчик исключений отказа использования уровня “C”.
освободите UsageFault_Handler (пусто)
{
error_address 5 (uint32_t *) (__ get_MSP ());//загружают текущий базовый адрес
указатель вершины стека
error_address 5 error_address 1 6; //Определяют местоположение значения ПК в
последнем стеке
кадр
в то время как (1);
}
Разработайте проект и запустите отладчик.
Установите точку останова на цикле с условием продолжения в функции исключения
(Рис. 7.28).
Отладка с CoreSight 239

Рисунок 7.28
Стандартная программа исключения отказа использования может
использоваться для чтения значения ПК из стека.

Выполните код, пока исключение не повышено, и точка останова достигнута.

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


инициирована. Это читает значение, сохраненное в указателе вершины стека, и
извлекает значение ПК, сохраненного в стековом фрейме.

Трассировка инструкции со встроенной макроячейкой


трассировки
Кора-M3, Кора-M4 и Кора-M7 могут иметь дополнительный модуль отладки,
приспособленный Кремниевым Поставщиком, когда микроконтроллер разработан.
Встроенная макроячейка трассировки (ETM) является третьей единицей
трассировки, которая обеспечивает трассировку инструкции, поскольку код
приложения выполняется на процессоре Cortex-M. Поскольку ETM является
дополнительной стоимостью для Кремниевого Поставщика, он обычно только
приспосабливается к Коре-M3 более высокого уровня, Коре-M4 и основанным на
коре-M7 микроконтроллерам. При выборе устройства это будет перечислено как
функция микроконтроллера в таблице данных (Рис. 7.29).
Рисунок 7.29
Кора-M3, Кора-M4 и Кора-M7 могут дополнительно быть оснащены третьей
единицей трассировки. Встроенная макроячейка трассировки (ETM) поддерживает
трассировку инструкции. Это позволяет Вам быстро находить сложные ошибки. ETM
также включает покрытие кода и аналитические инструменты производительности,
которые важны для проверки программного обеспечения.
240 Глав 7

Канал трассировки ETM требует четырех дополнительных контактов, которые


производятся к более крупному 20-контактному сокету, который включает контакты
отладки SW и контакты трассировки ETM. Стандартные отладчики JTAG/CoreSight не
поддерживают канал трассировки ETM, таким образом, Вы будете более сложная
единица отладки (Рис. 7.30).

Рисунок 7.30
Единица трассировки ETM обеспечивает все функции отладчика стандартного
оборудования плюс трассировка
инструкции.

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


использовались исторически с маленькими микроконтроллерами. В течение долгого
времени единственным решением, которое обеспечило бы любой вид трассировки
инструкции, был внутрисхемный эмулятор. Аппаратные средства эмулятора
получили бы каждую инструкцию, выполняемую микроконтроллером, и сохранили
бы его во внутреннем буфере трассировки. При необходимости трассировка могла
быть отображена в отладчике ПК как ассемблер или высокоуровневый язык обычно
“C.”. Однако буфер трассировки имел конечный размер, и было только возможно
получить часть выполненного кода, прежде чем буфер трассировки был полон. Так, в
то время как буфер трассировки был очень полезен, он имел некоторые серьезные
ограничения и взял некоторый опыт использовать правильно. Напротив, ETM
является трассировкой потоковой передачи, какие выводы сжали трассировочную
информацию. Эта информация может быть получена инструментом трассировки
CoreSight, более сложные единицы передадут данные трассировки потоком
непосредственно к жесткому диску ПК без потребности буферизовать ее в
аппаратных средствах отладчика (Рис. 7.31).
Отладка с CoreSight 241

Рисунок 7.31
Единица трассировки “Потоковой передачи” способна к записи каждой инструкции
непосредственно на жесткий диск ПК. Размер буфера трассировки только
ограничен размером Вашего жесткого диска.

Эта трассировка потоковой передачи позволяет программному обеспечению


отладчика отображать 100% инструкций, выполняемых наряду со временем
выполнения. Буфер трассировки потоковой передачи только ограничен размером
жесткого диска ПК, также возможно проанализировать трассировочную информацию
для предоставления точной страховой защиты кода и информации об анализе
производительности.

Упражнение 7.4 Использование трассировки ETM


В этом осуществлении мы посмотрим на то, как настроить Ulink, Pro отлаживают
адаптер для потоковой передачи трассировки и затем рассматривают
дополнительные функции отладки, доступные через ETM (Рис. 7.32).
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “Трассировка инструкции EX 7.4”.
Откройте файл инициализации STM32_TP.ini.
242 Главы 7

Рисунок 7.32
Файл сценария отладки используется для включения дополнительных четырех
контактов трассировки инструкции, когда
отладчик запускается.

Это - тот же файл сценария, который использовался со стандартным адаптером


отладки. На этот раз TRACE_MODE был установлен для 4-разрядных синхронных
данных трассировки. Это включит обоим, которые трассировка ETM передает по
каналу и переключает внешние контакты микроконтроллера с GPIO для отладки
контактов (Фиги. 7.33 и 7.34).

Рисунок 7.33
Выберите адаптер отладки, который способен к собиранию данных от
ETM.
Рисунок 7.34
Порт Trace может теперь быть настроен для доступа к
ETM.
Отладка с CoreSight 243

Теперь нажмите кнопку настроек ULINK Pro.


Выберите вкладку Trace.

Когда инструмент ULINK Pro Trace подключен, у Вас есть опция включить
трассировку ETM. Неограниченная опция трассировки позволяет Вам передавать
потоком каждую инструкцию, выполняемую в файл на Вашем жестком диске ПК.
Буфер трассировки затем только ограничен размером жесткого диска ПК. Это
позволяет проследить выполняемые инструкции в течение многих дней при
необходимости, да дни.
Нажмите "OK" для выхода назад редактору µVision.
Запустите отладчик.
Теперь отладчик имеет дополнительное окно трассировки инструкции (Рис. 7.35).

Рисунок 7.35
Окно трассировки отладчика может теперь отобразить все инструкции,
выполняемые процессором Cortex-M (передающий
трассировку потоком).

В дополнение к буферу трассировки ETM также позволяет нам показывать


информацию о покрытии кода, которая была ранее только доступна в
средстве моделирования (Рис. 7.36).
Рисунок 7.36
Трассировка потоковой передачи позволяет Вам отображать точную
информацию о покрытии кода.
244 Главы 7

Точно так же информация синхронизации может быть получена и отображена вместе


с кодом “C” или как аналитический отчет о производительности (Рис. 7.37).

Рисунок 7.37
Анализатор производительности показывает кумулятивное время выполнения
для каждой функции.

CMSIS-DAP

Рисунок 7.38
Спецификация CMSIS-DAP разработана для поддержки совместимости между
другими аппаратными средствами отладчика и
программным обеспечением отладчика.

Спецификация CMSIS-DAP определяет интерфейсный протокол между аппаратными


средствами отладчика CoreSight и программным обеспечением отладчика ПК (Рис. 7.38).
Это создает новый уровень совместимости между отладчиками программного и
аппаратного обеспечения различных поставщиков. Встроенное микропрограммное
обеспечение CMSIS-DAP разработано для превращения недорогого микроконтроллера
Cortex-M с периферийным устройством USB в отладчик Coresight. Это позволяет даже
самой основной оценочной плате размещать общий интерфейс отладки, который может
использоваться с любым совместимым набором инструментальных средств CMSIS (Рис.
7.39).
Отладка с CoreSight 245

Рисунок 7.39
Модуль MBED является первым для поддержки спецификации CMSIS-
DAP.

Спецификация CMSIS-DAP разработана для поддержки интерфейса USB между


целевыми аппаратными средствами и ПК. Это позволяет многим простым модулям
приводиться в действие непосредственно от USB-порта ПК (Рис. 7.40).

Рисунок 7.40
Драйвер CMSIS-DAP должен быть выбран в меню отладчика.

Интерфейс CMSIS-DAP может быть выбран в меню отладки вместо собственного


Ulink2. Параметрами конфигурации является по существу то же как ulink2, но
доступные опции будут зависеть на уровне встроенного микропрограммного
обеспечения, реализованного производителем устройств. Спецификация CMSIS-
DAP поддерживает все функции отладки, найденные в архитектуре отладки
CoreSight включая Микро буфер трассировки (MTB) Коры-M01.

Кора-M01 MTB
В то время как ETM доступен для Коры-M3 и Коры-M4, никакая форма трассировки
инструкции не в настоящее время доступна для Коры-M0. Однако Кора-M01 имеет
простую форму буфера трассировки инструкции, названного MTB. MTB использует
регион внутреннего SRAM, который является
246 Глав 7

выделенный разработчиком. Когда код приложения работает, трассировка


выполняемых инструкций зарегистрированы в этот регион. Когда код
останавливается, отладчик может считать данные трассировки MTB и отобразить
выполняемые инструкции. RAM трассировки MTB может быть настроена как
кольцевой буфер или одноразовая запись. В то время как это - очень ограниченная
трассировка, кольцевой буфер позволит Вам видеть, “что просто произошло” перед
остановленным кодом. В то время как одноразовый режим может быть инициирован
аппаратными точками останова, чтобы запустить и прекратить позволять Вам
разыскивать более неуловимые ошибки.

Упражнение 7.5 Микро буфер трассировки


Это осуществление основано на управлении Свободы NXP по микроконтроллеру
MKL25Z. Это было первым микроконтроллером, доступным для использования
Коры-M01.
Соедините плату свободы через ее USB-кабель к ПК.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “EX 7.5 Микро Буфер трассировки”.
Откройте меню Options for Target/debug (Рис. 7.41).

Рисунок 7.41
Выберите адаптер отладки CMSIS-DAP и Микро файл сценария Буфера
трассировки.

Здесь интерфейс CMSIS-DAP выбран наряду с файлом инициализации для MTB.


Файл сценария инициализации имеет мастер, который позволяет Вам
настраивать размер и конфигурацию MTB (Рис. 7.42).
Отладка с CoreSight 247

Рисунок 7.42
Файл сценария раньше настраивал Микро Буфер трассировки.

Здесь мы можем выбрать сумму внутреннего SRAM, который должен


использоваться для трассировки. Также возможно настроить различные действия
отладчика, когда трассировка полна. Или остановите запись трассировки или
выполнение останова на цели.

По умолчанию MTB расположен в начале внутреннего SRAM (0x20000000). Таким


образом, необходимо сместить запуск пользователя SRAM размером памяти,
выделенной MTB. Это сделано в Опциях Для диалогового окна Target\Target (Рис.
7.43).

Рисунок 7.43
Необходимо сместить пользовательскую RAM от региона, используемого
Микро Буфером трассировки.

Теперь запустите отладчик и выполните код.


Остановите отладчик и откройте окно Trace (Рис. 7.44).
248 Глав 7

Рисунок 7.44
Содержание Микро Буфера трассировки загружено на ПК и отображено в окне Trace
отладчика.

В то время как это - ограниченный буфер трассировки, он может использоваться


очень недорогими инструментами и обеспечивает средство разыскивания
ошибок во время выполнения, которые были бы трудоемкими для нахождения
любого другого пути.

Системное описание средства просмотра CMSIS


Формат системного описания средства просмотра (SVD) CMSIS разработан для
предоставления кремниевым производителям метод создания описания
периферийных регистров в их микроконтроллере. Это описание может быть передано
сторонним производствам инструментов так, чтобы компилятор включал файлы, и
периферийные окна представления отладчика могут быть созданы автоматически. Это
означает, что не будет никакой задержки в поддержке разработки программного
обеспечения, когда следующее новое семейство устройств будет выпущено. Как
разработчик Вы не должны будете обычно работать с этими файлами, но полезно
понять, как процесс работает так, чтобы можно было зафиксировать любые ошибки,
которые могут неизбежно произойти. Также возможно создать Ваши собственные
дополнительные периферийные окна отладки. Это позволило бы, Вы для создания
представления внешней памяти отобразили периферийное устройство, или обеспечьте
представление отладки сложного объекта памяти.
Когда Кремниевый Поставщик разрабатывает новый микроконтроллер, они также
создают XML-описание регистров микроконтроллера. Утилита преобразования затем
используется для создания версии двоичных файлов файла, который используется
отладчиком для автоматического создания периферийных окон отладки (Рис. 7.45).
Отладка с CoreSight 249

Рисунок 7.45
ARM создал репозиторий “системных файлов” описания средства просмотра. Это
позволяет поставщикам инструментов иметь поддержку новых
устройств, поскольку они выпущены.

Вместе с определением XML-описания ARM представил систему представления и


публикации для новых файлов SVD. Когда Кремниевый Поставщик разрабатывает
новый микроконтроллер, его системный файл описания отправлен через веб-сайт
CMSIS. После того как это было рассмотрено и проверено, это затем публикуется для
общедоступной загрузки на основном веб-сайте ARM.

Упражнение 7.6 CMSIS-SVD


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

Для этого осуществления Вам будет нужен XML-редактор. Если Вы не имеете


один, то загрузите испытательный или бесплатный инструмент с Интернета.
Откройте свой веб-браузер и перейдите к www.arm.com/cmsis.

Если у Вас не будет учетной записи пользователя на веб-сайте ARM, то необходимо


будет создать один и вход в систему.
На странице CMSIS выберите вкладку CMSIS-SVD (Рис. 7.46).
250 Глав 7

Рисунок 7.46
Веб-сайт CMSIS имеет каналы общего доступа к текущим спецификациям CMSIS
и репозиторию CMSIS-SVD.

Выберите ссылку STMicroelectronics.


В окне ST выберите загрузку SVD, которая поддерживает STM32F103RB
(Рис. 7.47).

Рисунок 7.47
Выберите файлы STM32F103 SVD.

Затем нажмите кнопку загрузки внизу страницы.


Разархивируйте сжатый файл в каталог.
Откройте файл STM32F103xx.svd с XML-редактором (Рис. 7.48).
Отладка с CoreSight 251

Рисунок 7.48
Файлы SVD состоят из XML-описания периферийных регистров
микроконтроллера.

Каждое из периферийных окон структурировано как серия XML-тэгов, которые


могут быть отредактированы, или может быть добавлена новая периферийная
область. Это позволило бы Вам отображать регистры внешнего периферийного
устройства, с которым соединяют интерфейсом на внешнюю шину. Каждое
периферийное окно запускается с имени, описания и названия группы,
сопровождаемого базовым адресом периферийного устройства
(Рис. 7.49).
Рисунок 7.49
Описание SVD для регистра порта GPIO.
252 Главы 7

После того как периферийные детали были определены, описание каждого регистра в
периферийном устройстве добавляется. Это состоит из имени регистра и описания
его смещения от периферийного базового адреса наряду с его размером в битах, типе
доступа и значении сброса (Рис. 7.50).

Рисунок 7.50
Описание SVD периферийного битового поля регистра.

Также возможно определить битовые поля в регистре. Это позволяет окну отладки
разворачивать представление регистра и отображать содержание битового поля (Рис.
7.51).

Рисунок 7.51
Получающееся периферийное представление.

Сделайте небольшое изменение XML-файла и сохраните результаты (Рис. 7.52).

Рисунок 7.52
Сделайте редактирование к описанию SVD.

Генерируйте файл швейцарского франка при помощи утилиты SVDConv.exe.


Эта утилита расположена в c:\keil\arm\cmsis\svd.
Преобразователь должен быть вызван со следующей командной строкой.
SVDConv STM32F103xx.svd - генерируйте 5 sfr
Это создаст STM32F103xx. Швейцарский франк.
Отладка с CoreSight 253

Теперь запустите µVision и откройте предыдущее осуществление.

Откройте меню “Options for Target” и выберите STM32F103xx.sfr как системный


файл средства просмотра (Рис. 7.53).

Рисунок 7.53
Загрузите файл швейцарского франка в меню Target проекта.

Разработайте проект и запустите отладчик.


Откройте выбор Средства просмотра View\System и просмотрите обновленное
периферийное окно
(Рис. 7.54).

Рисунок 7.54
Модификации теперь видимы в отладчике.

Уважение к Симпсонам в стороне, полезно знать, как добавить и изменить


периферийные окна, таким образом, можно исправить ошибки или добавить в
собственной определенной поддержке отладки.
254 Главы 7

Сводка функций отладки заключения


В этой главе мы взглянули через усовершенствованные функции отладки, доступные в
архитектуре отладки CoreSight для Cortex-M. Таблица 7.7 суммирует функции,
доступные на различных процессорах Cortex-M.

Таблица 7.7: сводка функции Отладки

Функция Cortex-M0/Cortex-M01 Cortex-M3/M4/M7


JTAG прежней версии JTAG прежней версии
или последовательный или последовательный
Интерфейс Debug провод провод
“Непрерывный” доступ к
памяти Да Да
6 инструкций 1 2
Аппаратная точка останова 4 литерала
Контрольная точка данных 2 4
Точка останова
программного обеспечения Да Да
Трассировка инструкции
ETM Нет Да (дополнительно)
Трассировка данных Нет Да (дополнительно)
Трассировка
инструментария Нет Да
Последовательное
проводное средство
просмотра Нет Да
Микро буфер трассировки Да (Только Кора-M01) Нет
CHPTER8

Практический DSP для


коры-M4 и коры-M7

Введение
С точки зрения разработчика Кора-M4 и Кора-M7 являются версиями процессора
Cortex-M, которые имеют дополнительные функции для поддержки Обработки
цифровых сигналов (DSP). Ключевые улучшения по Коре-M3 являются добавлением
“Единственной Инструкции Несколько Данных” или инструкций SIMD, улучшенный
Умножается, Накапливают (MAC) единицу для целочисленной математики и
дополнительное добавление аппаратных средств “Сопроцессор для операций с
плавающей точкой” (FPU). В случае Коры-M4 это - одинарная точность FPU, в то
время как Кора-M7 имеет опцию или одинарной или двойной точности FPU. Эти
улучшения дают Коре-M4 способность выполнить алгоритмы DSP на достаточно
высоко уровнях производительности для конкуренции с выделенными 16-разрядными
процессорами DSP. Как мы видели в Главе 6 "Cortex-M7", процессор Cortex-M7 имеет
более усовершенствованный конвейер и блок кэш-памяти ответвления. Обе из этих
функций существенно улучшают его возможность DSP. В этой главе мы посмотрим
на использование Cortex-M4/M7 для обработки сигналов реального мира (Рис. 8.1).

Рисунок 8.1
Кора-M4 и Кора-M7 расширяют Кору-M3 с помощью добавления инструкций по DSP и
быстрых возможностей математики. Это создает микроконтроллер, способный к
поддержке алгоритмов DSP в реальном времени, контроллера цифрового сигнала.

Аппаратные средства FPU


Одной из основных функций процессоров Cortex-M4 и Cortex-M7 является добавление
аппаратных средств FPU. FPU поддерживает арифметические операции с плавающей
точкой к стандарту IEEE 754.
Руководство разработчика по семейству процессоров Cortex-M.
DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00018-9 255
© 2016 Elsevier Ltd. Все права защищены.
256 Глав 8

Первоначально, FPU может считаться сопроцессором, к которому получают доступ


специализированные инструкции выполнить большинство арифметических операций с
плавающей точкой в нескольких циклах (Таблица 8.1).

Таблица 8.1: производительность Сопроцессора для


операций с плавающей точкой

Операция Количество цикла


Добавить/Вычесть 1
Разделиться 14
Умножиться 1
Умножьтесь накапливаются (MAC) 3
Сплавленный MAC 3
Квадратный корень 14

FPU состоит из группы регистров управления и состояния и 31 регистра скаляра


одинарной точности. Скалярные регистры могут также быть просмотрены как 16
регистров двойного слова (Рис. 8.2).

Рисунок 8.2
FPU 32-разрядные скалярные регистры может также быть просмотрен как 64-
разрядные регистры двойного слова. Это поддерживает
очень эффективный кастинг между типами C.

В то время как FPU разработан для операций с плавающей точкой, возможно


загрузить и сохранить фиксированную точку и целочисленные значения. Также
возможно преобразовать между плавающей точкой в фиксированную точку и
целочисленными значениями. Это означает, что “C”, бросающий между значениями с
плавающей точкой и целочисленными значениями, может быть сделан в
единственном цикле.
Интеграция FPU
В то время как возможно считать FPU как сопроцессор смежным с процессорами
Cortex-M4 и Cortex-M7, это не действительно верно. FPU является неотъемлемой
частью Cortex-M
Практический DSP для коры-M4 и коры-M7 257

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


конвейере к инструкциям по процессору Cortex-M. Пока это увеличивает
производительность FPU, это “невидимо” для кода приложения и не представляет
странных побочных эффектов (Рис. 8.3).

Рисунок 8.3
FPU описан как сопроцессор в документации регистра. В действительности это
очень сильно связано с основным конвейером инструкции.

Регистры FPU
В дополнение к скалярным регистрам FPU имеет блок регистров управления и
состояния (Таблица 8.2).

Таблица 8.2: регистры управления FPU

Зарегистрироваться Описание
Управление доступом
сопроцессора Управляет уровнем доступа полномочия к FPU
Управление контекстом с
плавающей точкой Настраивает укладку и ленивые опции укладки
Адрес контекста с плавающей Содержит адрес безлюдного стекового пространства
точкой FPU
Управление состоянием по Содержит коды условий FPU и параметры конфигурации
умолчанию с плавающей точкой FPU
Управление состоянием с Содержит значения управления состоянием по
плавающей точкой умолчанию

Все регистры FPU с отображенной памятью кроме Регистра Управления состоянием с


плавающей точкой (FPSC), который является регистром ЦП, к которому получает
доступ Регистр Перемещения к Специальному Регистру (MRS) и Перемещение
Специальные Регистры для Регистрации инструкций (MSR). Доступ к этой функции
поддерживается CMSIS-базовой функцией.
uint32_t __ get_FPSCR (пусто);
пусто __ set_FPSCR (uint32_t (fpscr)

Регистр FPSCR содержит три группы битов. Лучшие четыре бита содержат флаги кода
условия N, Z, C, и V, которые соответствуют флагам кода условия в xPSR. Эти флаги
установлены и очищены подобным образом результатами операций с плавающей
точкой. Следующие группы битов содержат параметры конфигурации для FPU. Эти
биты позволяют Вам изменять операцию FPU из стандарта IEEE 754. Если у Вас нет
веской причины сделать это, рекомендуется оставить их в покое. Заключительная
группа битов является флагами состояния для исключений FPU. Если FPU встретится
с ошибкой во время выполнения, то исключение будет повышено и
258 Глав 8

флаг состояния соответствия будет установлен. Строка исключения постоянно


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

Кора-M7 FPU
Микроконтроллеры с помощью Коры-M7 могут быть разработаны без FPU или
могут быть оснащены единицей одинарной или двойной точности. CMSIS-базовая
спецификация была расширена с помощью функции для создания отчетов о
конфигурации процессора Cortex-M7.
uint32_t SBC_GetFPUType (пусто)

0 5 никаких FPU
1 5 одинарных точностей
2 5 двойной точности

Эта функция читает регистр конфигурации в Системном Блоке управления,


“Регистр функции Media и VFP” затем возвращает конфигурацию процессора
Cortex-M7. Эта функция может только использоваться с Корой-M7.

Включение FPU
Когда Кора-M4 или Кора-M7 оставляют вектор сброса, FPU отключен. FPU включен
путем установки сопроцессора 10 и 11 битов в регистре CPARC. Необходимо
использовать инструкцию по барьеру данных гарантировать, что запись сделана,
прежде чем код продолжается. Команда барьера инструкции также используется,
чтобы гарантировать, что конвейер сбрасывается, прежде чем код продолжается.
SCB-.CPACR | 5 ((3UL, 10*2) | (3UL, 11*2));//Набор CP10 и Полный доступ CP11
__ DSB (); //барьер Данных
__ ISB (); //барьер Инструкции

Для записи в регистр CPARC процессор должен быть в привилегированном


режиме. После того, как включенный, FPU может использоваться в
привилегированных и непривилегированных режимах.

Исключения и FPU
Когда FPU будет включен, расширенный стековый фрейм будет продвинут, когда
исключение повышено. В дополнение к стандартному стековому фрейму процессор
Cortex-M также продвигает первые 16 регистров скаляра FPU и FPSCR. Это
расширяет стековый фрейм с 32 до 100 байтов. Очевидно продвигая этот объем
данных на стек, каждое прерывание значительно увеличило бы задержку прерывания.
Сохранять 12 задержек прерывания цикла, Cortex-M
Практический DSP для коры-M4 и коры-M7 259

процессор использует технику, названную “ленивая укладка”. Когда прерывание


повышено, нормальный стековый фрейм продвинут на стек, и указатель вершины
стека увеличен для оставления пространства для регистров FPU, но их значения не
продвинуты на стек. Это оставляет вакуум в стеке. Начальный адрес этого вакуума
автоматически хранится в “Адресном регистре Контекста С плавающей точкой”
(FPCAR). Если процедура прерывания будет использовать вычисления с плавающей
точкой, то регистры FPU будут продвинуты в это пространство с помощью адреса,
сохраненного в FPCAR как базовый адрес. “Регистр управления Контекста С
плавающей точкой” используется для выбора используемого метода укладки. Ленивая
укладка включена по умолчанию, когда FPU сначала включен. Методом укладки
управляют на старшие значащие 2 бита в “Регистре управления Контекста С
плавающей точкой”; это Автоматическое Сохранение состояния, Включают (АСПЕН),
и Ленивое Сохранение состояния Включают (LSPEN) (Таблица 8.3).

Таблица 8.3: Ленивые опции укладки


LSPEN Конфигурация АСПЕНА
0 0 Никакое автоматическое сохранение состояния. Только используйте, когда
прерывания не будут использовать плавающую точку
0 1 Ленивая укладка отключена
1 0 Ленивых укладок включены
1 1 Недопустимая конфигурация

Использование FPU
После того как Вы включили FPU, компилятор начнет использовать аппаратные
вычисления плавающей точки вместо библиотек программного обеспечения.
Исключением является инструкция по квадратному корню sqrt (), который является
частью math.h библиотеки. При включении FPU компилятор ARM предоставляет
внутреннюю инструкцию использовать инструкцию по квадратному корню FPU.
плавайте __ sqrtf (пустите в ход x);

Примечание: Внутренняя функция квадратного корня отличается от ANSI sqrt ()


библиотечная функция, в которой это берет и возвращает плавание, а не двойное.

Упражнение 8.1 Сопроцессор для операций с плавающей


точкой
Это осуществление выполняет несколько простых вычислений с плавающей точкой
с помощью процессора Cortex-M4 так, чтобы мы могли сравнить
производительность времени выполнения плавающей точки программного и
аппаратного обеспечения.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “сопроцессор для операций с плавающей точкой
EX 8.1”.
260 Глав 8

Код в основном цикле является смесью операций математики для осуществления FPU.
#include, math.h.
пускают в ход a, b, c,
d, e; интервал f, g 5
100;

в то время как (1) {


5 10.1234; b 5
100.2222; c 5
a*b;
d 5 c-a; e
5 d 1 b;
f 5 (интервал)
a; f 5 f*g;
a1 5 (неподписанный
интервал) a; 5 __ sqrtf (e);
//5 sqrt (e); 5 c/f;
e 5 a/0;
}
}

Прежде чем мы сможем разработать этот проект, мы должны удостовериться, что


компилятор создаст код для использования FPU.
Откройте Options for Target и выберите меню Target (Рис. 8.4).

Рисунок 8.4
Аппаратная поддержка плавающей точки включена в опциях Project Target.

Мы можем включить поддержку с плавающей точкой путем выбора “Использования


FPU” в поле аппаратных средств вычислений с плавающей точкой. Это включит
необходимые параметры компилятора и загрузит корректную модель средства
моделирования.
Закройте меню Options for Target и возвратитесь к редактору (Рис. 8.5).
Практический DSP для коры-M4 и коры-M7 261

Рисунок 8.5
Этот проект в качестве примера использует моделирование процессора
Corex-M4.

В дополнение к нашему исходному коду проект включает запуск CMSIS и


системные файлы для Коры-M4.
Теперь разработайте проект и запишите размер сборки (Рис. 8.6).

Рисунок 8.6
Отметьте размер кода проектом с помощью аппаратных средств
FPU.

Запустите отладчик.

Когда средство моделирования выполнит код к основному, это поразит точку


останова, которая была задана в system_ARMCM4.c файле (Рис. 8.7).

Рисунок 8.7
CMSIS-ядро SystemInit () функция включит FPU на запуске.
262 Главы 8

Стандартный микроконтроллер включает файлы, которые определят набор функций


процессора Cortex-M включая доступность FPU. В нашем случае мы используем
имитационную модель Коры-M4 только и используем минимальный ARMCM4_FP.h,
включают файл, обеспеченный как часть базовой спецификации CMSIS. Если FPU
будет присутствовать на микроконтроллере, SystemInit (), то функция удостоверится,
что это включается перед достижением основных приложений () функция.
Определения процессора находятся в ARMCM4_FP.H
/* 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 процессоров *//* 5 5 5 5 5 5 5 5
5 и базовое периферийное устройство разделяют 5 5 5 5 5 5 5 5 5 5 *//* 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 */
/* — — — — — — Конфигурация процессора коры-M4 и базовой периферии — — — — — */
#define __ CM4_REV 0x0001 /*!, Базовый пересмотр r0p1 */
#define __ MPU_PRESENT 1 /*!, подарок MPU или нет */
#define __ NVIC_PRIO_BITS 3 /*!, Число Битов используется для Приоритетных Уровней */
#define __ Vendor_SysTickConfig 0 /*!, Набор к 1, если другая Конфигурация SysTick используется */
#define __ FPU_PRESENT 1 /*!, существующий FPU или нет */

Затем __ FPU_USED определяется в core_cm4.h

#if (__ FPU_PRESENT 5 5 1U)


#define __ FPU_USED 1U

Откройте main.c модуль и выполните код к основному в то время как () цикл (Рис.
8.8).

Рисунок 8.8
Используйте локальные параметры отладчика для выполнения к
основному () в то время как (1) цикл.

Теперь откройте окно Disassembly (Рис. 8.9).


Практический DSP для коры-M4 и коры-M7 263

Рисунок 8.9
Окно Disassembler покажет Вам вызовы аппаратным средствам FPU.

Это покажет исходный код “C”, чередованный с инструкциями по сборке Коры-M4.


В Project окно выбирают окно Register (Рис. 8.10).

Рисунок 8.10
Окно Register позволяет Вам просматривать регистры FPU.

Окно Register теперь показывает 31 скалярный регистр в их формате .raw и формате


IEE754 (Рис. 8.11).
264 Главы 8

Рисунок 8.11
Выполните вычисления с плавающей точкой. Отметьте количество циклов, взятых для
каждой операции.

Содержание регистра FPSC также показывают. В этом осуществлении мы будем также


использовать состояния (количество цикла) значение, также показанное в окне
Register.

Выделите окно блока и ступите посредством каждой операции, отмечающей время


цикла каждым вычислением.
Теперь выйдите из отладчика и измените код для использования библиотек операций с
плавающей точкой программного обеспечения.
a1 5 (неподписанный
интервал) a;//5 __ sqrtf (e);
5 sqrt (e);

Прокомментируйте __ sqrtf () внутренний и замените его ANSI C sqrt () функция.

В настройках Options for Target\target мы также должны удалить поддержку FPU


(Рис. 8.12).
Рисунок 8.12
Отключите поддержку FPU в целевом меню проекта.
Практический DSP для коры-M4 и коры-M7 265

Также измените заголовочный файл процессора для Коры-M4 без FPU.


#include, ARMCM4.h.

Восстановите код и сравните размер сборки с исходной версией (Рис. 8.13).

Рисунок 8.13
Восстановите проект и сравните размер кода в исходном проекте.

Теперь перезапустите выполненный отладчик и выполните код к основному.

В окне дизассемблирования ступите через код и сравните количество циклов,


привыкших для каждой операции к количеству циклов, используемых FPU.

К концу этого осуществления можно ясно видеть не только значительное повышение


производительности, обеспеченное FPU, но также и его влиянием на размер кода
проекта. Единственный недостаток является дополнительной стоимостью для
использования микроконтроллера, оснащенного FPU и дополнительной потребляемой
мощностью, когда это работает.

Cortex-M4/M7 DSP и Инструкции SIMD


Ползунок 2 системы команд имеют много дополнительных инструкций, которые
полезны в алгоритмах DSP (Таблица 8.4).

Таблица 8.4: инструкции ползунка по 2 дес. ложкам

Инструкция Описание
Считайте
CLZ начальные нули
Обратные
ВЕРСИЯ, REV16, REVSH и RBIT инструкции
Пригодное поле
BFI вставляет
Ясное битовое
BFC поле
Аппаратные
UDIV и SDIV средства делятся
Знак и нуль
SXT и UXT расширяются
Кора-M4 и система команд M7 включают новую группу инструкций, которые могут
выполнить несколько арифметических вычислений в единственном цикле.
Инструкции SIMD позволяют данным на 8 битов или на 16 битов, упакованным в два
32-разрядных слова управляться на параллельно. Так, например,
266 Глав 8

можно выполнить, два 16-разрядных умножается и 32-разрядное, или 64-разрядные


накапливаются или квадратическое 8-разрядное дополнение в одном цикле
процессора. Начиная со многой работы алгоритмов DSP над конвейером данных
инструкции SIMD могут использоваться для существенного повышения
производительности (Рис. 8.14).

Рисунок 8.14
Инструкции SIMD поддерживают несколько арифметических операций в
единственном цикле. Данные операнда должны быть
упакованы в 32-разрядные слова.

Инструкции SIMD имеют дополнительное поле в регистре xPSR. “Больше, чем или
Равное” поле (GE) содержит 4 бита, которые соответствуют 4 байтам в операнде
результата инструкции SIMD. Если байтом операнда результата будет GE для
обнуления затем флага GE соответствия, то будет установлен (Рис. 8.15).

Рисунок 8.15
Кора-M4 xPSR регистр имеет дополнительное большее, чем или равное поле.
Каждый из четырех битов GE обновляется, когда инструкция
SIMD выполняется.

Инструкции SIMD можно рассмотреть как три отличных группы: Добавьте и вычтите
операции, умножьте операции и инструкции по поддержке. Добавление и вычитает
операции, может быть выполнен на 8-или 16-разрядные и неподписанные количества
со знаком. И неподписанная инструкция по сокращению вдвое со знаком также
предоставлена; эта инструкция добавляет или вычитает 8 или 16-разрядные
количества и затем половины результат как показано в Таблице 8.5.

Таблица 8.5: SIMD добавляют сокращение вдвое и вычитают


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

Инструкция Описание Операция


Неподписанное 16-разрядное
UHSUB16 сокращение вдвое вычитает Res [15:0] 5 (Op1[15:0] 2 Op2[15:0])/2
Res [31:16] 5 (Op1[31:16] 2Op2[31:16])/2
Неподписанное 16-разрядное
UHADD16 сокращение вдвое добавляет Res [15:0] 5 (Op1[15:0]1Op2[15:0])/2
Res [31:16] 5 (Op1[31:16]1Op2[31:16])/2

Инструкции SIMD также включают Добавление и Вычитают с Exchange (ASX) и


Вычитанием и Добавляют с Exchange (SAX). Эти инструкции выполняют и
добавляют и вычитают
Практический DSP для коры-M4 и коры-M7 267

на этих двух полусловах и хранилище результаты в верхних и более низких


полусловах целевого регистра (Таблица 8.6).

Таблица 8.6: SIMD добавляют обмен и вычитают обменные инструкции


Инструкци
я Описание Операция
Неподписанный 16-разрядный вычитают и
USAX добавляют с обменом Res [15:0] 5Op1 [15:0] 1Op2 [31:16]
Res [31:16] 5 Op1[31:16] 2 Op2[15:0]
Неподписанный 16-разрядный добавляют и
UASX вычитают с обменом Res [15:0] 5 Op1[15:0]1Op2[31:16]
Res [31:16] 5 Op1[31:16] 2 Op2[15:0]

Дальнейшая группа инструкций комбинирует эти две операции в вычитании и


добавляет (или добавляет и вычитает) с обменной инструкцией по сокращению вдвое.
Это дает совсем немного возможных перестановок. Сводка добавления и вычитает
инструкции SIMD, показан в Таблице 8.7.

Таблица 8.7: Перестановки SIMD добавляют, вычитают, сокращение вдвое и


насыщение инструкций
Неподписанн Неподписанны
Со знаком Со знаком ый й
Инструкци Со Сокращен Неподпис Сокращение
я знаком Насыщение ие вдвое анный Насыщение вдвое
ADD8 SADD8 QADD8 SHADD8 UADD8 UQADD8 UHADD8
SUB8 SSUB8 QSUB8 SHSUB8 USUB8 UQSUB8 UHSUB8
ADD16 SADD16 QADD16 SHADD16 UADD16 UQADD16 UHADD16
SUB16 SSUB16 QSUB16 SHSUB16 USUB16 UQSUB16 UHSUB16
ASX SASX QASX SHASX UASX UQASX UHASX
SAX SSAX QSAX SHSAX USAX UQSAX UHSAX

Инструкции SIMD также включают группу, умножают инструкции, которые


воздействуют на упакованные 16-разрядные значения со знаком. Как добавление и
вычитают инструкции, умножить инструкции также поддерживают насыщаемые
значения. А также умножьтесь и умножьтесь, накапливаются, SIMD умножаются,
поддержки инструкций умножаются, вычитают и умножаются, добавляют как
показано в Таблице 8.8.

Таблица 8.8: SIMD умножают инструкции

Инструкция Описание Операция


Установка Q, двойная 16-разрядный подписанный,
SMLAD умножается с 32-разрядным единственным X 5 X 1 (3 B) 1 (C 3 D)
аккумулятор
Двойной 16-разрядный подписанный умножаются с
SMLALD единственным 64-разрядным аккумулятором X 5 X 1 (3 B) 1 (C 3D)
Установка Q, двойная 16-разрядный подписанный,
SMLSD умножается, вычитают с 32-разрядным X 5 X 1 (3 B) 2 (B 3 C)
накопиться
Установка Q, двойная 16-разрядный подписанный,
SMLSLD умножается, вычитают с 64-разрядным X 5 X 1 (3B) 2 (B 3C)
накопиться
Сумма установки Q двойных, 16-разрядных
SMUAD подписанный, умножается X 5 (3B) 1 (C 3 D)
Двойной 16-разрядный подписанный умножают
SMUSD различие в возврате. X 5 (3B) 2 (C 3 D)
268 Глав 8

Чтобы сделать инструкции SIMD более эффективными, группа поддержки пакета и


распаковать инструкции была также добавлена к системе команд.
Упаковать/распаковать инструкции могут использоваться, чтобы извлечь 8-и 16-
разрядные значения от регистра и переместить их в целевой регистр.
Неиспользованные биты в 32-разрядном слове могут быть обнулены
(неподписанные) или один (подписанный). Инструкции по пакету могут также взять
два 16-разрядных количества и загрузить их в верхние и более низкие полуслова
целевого регистра (Рис. 8.16) (Таблица 8.9).

Рисунок 8.16
Группа инструкции SIMD включает инструкции по поддержке упаковать 32-разрядные
слова 8-и 16-разрядные количества.

Таблица 8.9: SIMD поддержка инструкций


Мнемосхе
ма Описание
PKH Упакуйте полуслово
Расширьте 8-разрядное значение со знаком
SXTAB до 32 битов и добавьте
Двойной расширяют 8-разрядное значение со
SXTAB16 знаком до 16 битов и добавляют
Расширьте 16-разрядное значение со знаком
SXTAH до 32 битов и добавьте
SXTB Знак расширяет байт
Двойной расширяют 8-разрядные значения со
SXTB16 знаком до 16 битов и добавляют
SXTH Знак расширяет полуслово
Расширьте 8-разрядное значение со знаком
UXTAB до 32 битов и добавьте
Двойной расширяются на 8 - 16 битов и
UXTAB16 добавляют
Расширьте 16-разрядное значение и
UXTAH добавьте
UXTB Нуль расширяет байт
Двойной нуль расширяется на 8 - 16 битов и
UXTB16 добавляет
UXTH Нуль расширяет полуслово

Когда инструкция SIMD будет выполняться, она установит или очистит биты xPSR
GE в зависимости от значений в получающихся байтах или полусловах.
Дополнительный выбор (SEL) инструкция обеспечивается для доступа к этим
битам. Инструкция SEL используется для выбора байтов, или полуслова от двух
входных операндов в зависимости от условия GE отмечает (Таблица 8.10).
Практический DSP для коры-M4 и коры-M7 269

Таблица 8.10: xPSR, “Больше, чем или равные” результаты битового


поля
GE укусил GE укусил
GE укусил [3:0] 51 50
0 Res [7:0] 5 OP1[7:0] Res [7:0] 5 OP2[7:0]
1 Res [15:8] 5 OP1[15:8] Res [15:8] 5 OP2[15:8]
2 Res [23:16] 5 OP1[23:16] Res [23:16] 5 OP2[23:16]
3 Res [31:24] 5 OP1[31:24] Res [31:24] 5 OP2[31:24]

Упражнение 8.2 Инструкции SIMD


В этом осуществлении у нас будет первый взгляд на использование инструкций
Cortex-M4/M7 SIMD. Мы просто умножим и накопим два 16-разрядных массива
сначала с помощью инструкции SIMD и затем с помощью операторов “C”
стандарта.

Сначала откройте CMSIS-базовую документацию, и SIMD подписал MAC,


внутренний __ SMLAD (Рис. 8.17).

Рисунок 8.17
Документация CMSIS-DSP для __ SMLAD () внутренний.

Откройте установщик пакета.


Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “EX 8.2 SIMD”..
Код приложения определяет два набора массивов как объединение 16-разрядных и 32-
разрядных количеств.
объединение _test {
int16_t Arry_halfword[100]; int32_t
Arry_word[50];
};
270 Глав 8

Код сначала инициализирует массивы со значениями 0 100.


для (n 5 0; n, 100; n11) {
op1. Arry_halfword[n] 5 op2. Arry_halfword[n] 5 n;}

Мы затем делаем умножение накапливает сначала использование инструкции SIMD,


затем стандартной Инструкции MAC.
для (n 5 0; n, 50; n11) {
Результат 5 __ SMLAD (op1. Arry_word[n], op2. Arry_word[n], Результат);}

Результат затем сбрасывается, и вычисление повторяется, не используя инструкцию


SIMD.
Результат 5 0;
для (n 5 0; n, 100; n11) {
Результат 5 Результатов 1 (op1. Arry_halfword[n] * op2. Arry_halfword[n]);}

Создайте код и запустите отладчик.


Установите точку останова в строке 23 и 28 (Рис. 8.18).

Рисунок 8.18
Набор устанавливает контрольные точки по обе стороны от кода
SIMD.

Выполненный к первой точке останова и обращают внимание на количество цикла


(Рис. 8.19).

Рисунок 8.19
Отметьте количество цикла запуска.
Выполните код, пока он не поразит вторую точку останова. Посмотрите, сколько
циклов использовалось для выполнения инструкции SIMD (Рис. 8.20).
Практический DSP для коры-M4 и коры-M7 271

Рисунок 8.20
Отметьте заключительное количество цикла.

Циклы использовали 5 5172 2 4066 5 1106


Установите точку останова в заключительном цикле с условием продолжения (Рис.
8.21).

Рисунок 8.21
Теперь установите точку останова после стандартной программы
копии массива.

Выполните код и посмотрите, сколько циклов используется для выполнения


вычисления, не используя инструкцию SIMD (Рис. 8.22).

Рисунок 8.22
Отметьте заключительное количество цикла.

Циклы использовали 5 7483 2 5172 5 2311

Сравните количество циклов раньше выполняло то же вычисление, не используя


инструкции SIMD.

Как ожидалось инструкции SIMD намного более эффективны при выполнении


вычислений на больших наборах данных.

Основное использование для инструкций SIMD должно оптимизировать


производительность алгоритмов DSP. В следующем осуществлении мы посмотрим на
различные методы в дополнение к инструкциям SIMD, которые могут использоваться
для повышения, увеличивают эффективность данного алгоритма.
272 Главы 8

Упражнение 8.3 Оптимизация алгоритмов DSP


В этом осуществлении мы посмотрим на оптимизацию Конечного фильтра
Импульсной характеристики (FIR). Это - классический алгоритм, который широко
используется в приложениях DSP (Рис. 8.23).

Рисунок 8.23
Фильтр FIR является фильтром усреднения со своими характеристиками,
определенными серией коэффициентов, относился к
каждому образцу в серии “касаний”.

Фильтр FIR является фильтром усреднения, который состоит из многих “касаний”.


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

Рисунок 8.24
Математическое выражение для фильтра FIR.

В этом осуществлении мы будем использовать имитационную модель Коры-M4 для


рассмотрения нескольких методов, которые могут использоваться для оптимизации
алгоритма DSP, работающего на процессоре Cortex-M.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “EX 8. Оптимизация FIR”.
Разработайте проект и запустите отладчик.

Основная функция состоит из четырех функций FIR, которые представляют


различную оптимизацию стандартному алгоритму FIR.
Практический DSP для коры-M4 и коры-M7 273

международное основное
(пустота) {
ель (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
fir_block (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
fir_unrolling (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
fir_SIMD (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
fir_SuperUnrolling (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);

в то время как (1);


}

Шаг в первую функцию и исследует код.

Функция фильтра реализована в “C” как показано ниже. Это -


стандартная реализация фильтра FIR, записанного просто в “C”.
пустая ель (q31_t *в, q31_t *, q31_t *coeffs, интервал *stateIndexPtr, интервал filtLen,
интервал blockSize)

{
международн
ый образец;
интервал k;
сумма q31_t;

международный stateIndex 5 *stateIndexPtr;


для (демонстрационные 50; образец, blockSize; sample11)
{
[stateIndex11] 5 состояния в [образце];
суммируйте 5 0;

для (k 5 0; k, filtLen; k11)


{
суммируйте 1 5 coeffs [k] * состояние [stateIndex];
stateIndex-;

если (stateIndex, 0)
{
stateIndex 5 filtLen-1;
}
}
[демонстрационные] 5 сумм;
}
*stateIndexPtr 5 stateIndex;
}

В то время как это компилирует и хорошо работает, это не в полной мере


пользуется улучшениями DSP Коры-M4. Для вытаскивания лучшего из Коры-M4
мы должны оптимизировать этот алгоритм, особенно внутренний цикл.
Внутренний цикл работает, FIR умножаются и накапливаются для каждого касания.
для (k 50; k, filtLen; k11)
{
суммируйте 1 5 coeffs [k] * состояние [stateIndex];
stateIndex-;

если (stateIndex, 0)
274 Главы 8

{
stateIndex 5 filtLen-1;
}
}

Внутренний цикл обрабатывает образцы путем реализации кольцевого буфера в


программном обеспечении. В то время как это хорошо работает, мы должны
выполнить тест для каждого цикла для обертывания указателя, когда он достигает
конца буфера (Рис. 8.25).

Рисунок 8.25
Обработка данных в кольцевом буфере требует, чтобы Кора-M4 проверила на конец
буфера на каждом повторении. Это увеличивает время
выполнения.

Выполненный к запуску внутреннего цикла и набора точка останова (Рис. 8.26).

Рисунок 8.26
Установите точку останова в начале внутреннего цикла.

Выполните код, таким образом, он делает одно повторение внутреннего


цикла и отмечает количество используемых циклов.

Круговое обращение требует, чтобы мы выполнили конец буферного теста на


каждом повторении. Выделенное устройство DSP может поддерживать кольцевые
буферы в аппаратных средствах без любых таких издержек, таким образом, это -
одна область, мы должны улучшиться. Путем передачи нашей функции фильтра FIR
блок данных, а не отдельные образцы позволяет нам использовать блок,
обрабатывающий в качестве альтернативы круговому обращению. Это повышает
эффективность на критическом внутреннем цикле (Рис. 8.27).
Практический DSP для коры-M4 и коры-M7 275

Рисунок 8.27
Обработка блока увеличивает размер буфера, но увеличивает
эффективность внутреннего цикла обработки.

Путем увеличения размера буфера состояния к количеству фильтра касается 1


размера блока обработки, мы можем избавить от необходимости круговое обращение.
Во внешнем цикле блок образцов загружается в вершину буфера состояния (Рис.
8.28).

Рисунок 8.28
С обработкой блока буфер фиксированного размера обрабатывается без
потребности проверить на конец буфера.

Внутренний цикл затем выполняет вычисления фильтра для каждого образца блока
путем скольжения окна фильтра, один элемент направо для каждого проходит через
цикл. Таким образом, внутренний цикл теперь становится
для (k 5 0; k, filtLen; k11)

{
суммируйте 1 5 coeffs [k] * состояние [stateIndex];
stateIndex11;

После того как внутренний цикл закончил обрабатывать, текущий блок


демонстрационных данных, сохраненных в буфере состояния, должен быть смещен
направо и новый блок данных, загруженный (Рис. 8.29).
276 Глав 8

Рисунок 8.29
После того как блок данных был обработан, внешний цикл смещает образцы один блок
налево и добавляет новый блок данных.

Теперь шаг во вторую функцию FIR.


Исследуйте, как код был изменен для обработки блоков данных.

Во внешнем цикле существует некоторый дополнительный код, но это только


выполняется один на касание и становится незначительным по сравнению со
сбережениями, сделанными во внутреннем цикле особенно для больших размеров
блока.

Установите точку останова на том же внутреннем цикле и запишите количество


циклов, которые это берет для выполнения.

Затем, мы можем далее повысить эффективность внутреннего цикла при помощи


приема компилятора, названного “развертыванием цикла”. Вместо того, чтобы
выполнять итерации вокруг цикла для каждого касания, мы можем обработать
несколько касаний в каждом повторении путем встраивания нескольких
вычислений касания на цикл.
Я 5 filtLen.. 2
для (k 5 0; k, filtLen; k11)
{
суммируйте 1 5 coeffs [k] * состояние [stateIndex];
stateIndex11;

суммируйте 1 5 coeffs [k] * состояние [stateIndex];


stateIndex11;

суммируйте 1 5 coeffs [k] * состояние [stateIndex];


stateIndex11;

суммируйте 1 5 coeffs [k] * состояние [stateIndex];


stateIndex11;

}
Теперь шаг в третью функцию феркина.

Установите точку останова на том же внутреннем цикле и запишите количество


циклов, которые это берет для выполнения. Разделите это на четыре и сравните его
с предыдущими реализациями.

Следующий шаг должен использовать инструкции SIMD. Путем упаковки


коэффициента и демонстрационных данных в 32-разрядные слова, единственные
MAC могут быть заменены двойным MAC со знаком
Практический DSP для коры-M4 и коры-M7 277

который позволяет нам расширять развертывание цикла с четырех суммирования


до восемь для того же количества циклов.
для (k 50; k, filtLen; k11)
{
суммируйте 1 5 coeffs [k] * состояние [stateIndex];
stateIndex11;

суммируйте 1 5 coeffs [k] * состояние [stateIndex];


stateIndex11;

суммируйте 1 5 coeffs [k] * состояние [stateIndex];


stateIndex11;

суммируйте 1 5 coeffs [k] * состояние [stateIndex];


stateIndex11;

Шаг в четвертый феркин функционирует и снова вычисляет количество циклов,


используемых на касание для внутреннего цикла.

Помните, что мы теперь вычисляем восемь суммирования, поэтому разделите


необработанное количество цикла цикла на восемь.

Для сокращения количества цикла внутреннего цикла еще больше мы можем


расширить развертывание цикла для вычисления нескольких результатов
одновременно (Рис. 8.30).
Рисунок 8.30
Супер развертывание цикла расширяет развертывание цикла для обработки нескольких
выходных образцов одновременно.
278 Глав 8

Это - своего рода “супер развертывание цикла”, где мы выполняем каждое


из вычислений внутреннего цикла для блока данных в одной передаче.
демонстрационные 5
blockSize/4;
сделать

{
sum0 5 sum1 5 sum2 5 sum3 5 0;
statePtr 5 stateBasePtr; coeffPtr 5 (q31_t
*) (S-.coeffs); x0 5 * (q31_t *)
(statePtr11);

x1 5 * (q31_t *) (statePtr11); я 5
numTaps.. 2;
сделать
{
c0 5 * (coeffPtr11);
x2 5 * (q31_t *) (statePtr11);
x3 5 * (q31_t *) (statePtr11); sum0 5
__ SMLALD (x0, c0, sum0); sum1 5 __
SMLALD (x1, c0, sum1); sum2 5 __
SMLALD (x2, c0, sum2); sum3 5 __
SMLALD (x3, c0, sum3); c0 5 *
(coeffPtr11);
x0 5 * (q31_t *) (statePtr11);
x1 5 * (q31_t *) (statePtr11); sum0 5 __
SMLALD (x0, c0, sum0); sum1 5 __
SMLALD (x1, c0, sum1); sum2 5 __
SMLALD (x2, c0, sum2); sum3 5 __
SMLALD (x3, c0, sum3);
}, в то время как (-i);
*pDst11 5 (q15_t) (sum0.. 15); *pDst11
5 (q15_t) (sum1.. 15); *pDst11 5 (q15_t)
(sum2.. 15); *pDst11 5 (q15_t) (sum3..
15);

stateBasePtr 5 stateBasePtr 1 4;}, в то


время как (-образец);

Теперь шаг в заключительный FIR функционирует и снова вычисляет количество


циклов, используемых внутренним циклом на касание.

На этот раз мы вычисляем восемь суммирования для четырех касаний


одновременно; это приносит нам близко к одному циклу на касание, которое
сопоставимо с выделенным устройством DSP.

В то время как можно кодировать алгоритмы DSP в “C” и получить разумную


производительность, эти виды оптимизации необходимы для получения уровней
производительности, сопоставимых с выделенным устройством DSP. Этому виду
разработки кода нужен опыт Cortex-M4/M7 и алгоритмы DSP, которые Вы хотите
реализовать. К счастью, ARM обеспечивает свободную библиотеку DSP, уже
оптимизированную для процессоров Cortex-M.
Практический DSP для коры-M4 и коры-M7 279

Библиотека CMSIS-DSP
В то время как возможно кодировать все Ваши собственные функции DSP, это может
быть трудоемким и требует большого зависящего от домена знания. Чтобы помочь
добавить общие функции DSP к Вашему приложению, ARM опубликовал библиотеку
61 общей функции DSP, которые составляют CMSIS-DSP (Стандартная Обработка
цифровых сигналов Программного интерфейса Микроконтроллера Коры)
спецификация. Каждая из этих функций оптимизирована для Cortex-M4/M7, но может
также быть скомпилирована для работы Коры-M3 и даже на Коре-M0. Библиотека
CMSIS-DSP является бесплатной загрузкой и лицензируется для использования в
любом коммерческом или некоммерческом проекте. Библиотека CMSIS-DSP также
включена как часть установки MDK-ARM и просто должна быть добавлена к Вашему
проекту путем выбора CMSIS:: опция DSP в менеджере по Среде выполнения (RTE).
Установка включает предварительно созданную библиотеку для каждого из
процессоров Cortex-M и всего исходного кода.

Документация для библиотеки включена как часть справки CMSIS, которая


может открытый из окна “Manage Run-Time Environment” (рисунок 8.31).

Рисунок 8.31
Документация CMSIS-DSP, к которой получают доступ путем нажимания на
ссылку описания, доступную в окне Manage Run-Time
Environment.

Библиотечные функции CMSIS-DSP


Библиотека CMSIS-DSP обеспечивает простые в исп