Текст
                    Ядро Cortex..M3 компании ARM
Полное руководство
Ь4 Э КА


Joseph Yiu ТНЕ DEFINITIVE GUIDE ТО ТНЕ ARM CORTEX..M3  Newnes 
СЕРИЯ МИРОВАЯ ЭЛЕКТРОНИКА Джозеф Ю ЯДРО CORTEX..M3 КОМПАНИИ ARM Полное руководство Перевод А. В. Евстифеева $4. Э КА Москва Издательский дом «ДодэкаХХI» 2012 
УДК 004.31(035.3) ББК 32.97304я81 Юll Данное издание подrотовлено при участии компании «Компэл» и российско ro представительства компании Texas Instruments. На сайтах www.compel.ru и www.ti.com/ru вы можете получить консультацию, а также заказать бесплатные образцы микросхем. Телефон rорячей линии технической поддержки ТI +74959810701. Ю, Джозеф. Юll Ядро CortexM3 компании ARM. Полное руководство / Джозеф Ю; пер. с анrл. А. В. Евстифеева.  М. : ДодэкаХХI, 2012.  552 с. : ил.  (Мировая электроника).  Доп. тит. л. анrл.  ISBN 9785941202430. Настоящая книrа представляет собой исчерпывающее руководство по HOBO му 32битному процессору компании ARM  CortexM3. В данном руководстве подробно описана архитектура процессорноrо ядра CortexM3 и ero подсистемы памяти. Также подробно рассмотрены остальные узлы процессора, в том числе контроллер векторных прерываний NVIC, модуль защиты памяти MMU и разно образные компоненты отладки. Приводится детальное описание новой системы команд Thumb2, поддерживаемой данным процессором. Книrа содержит большое число примеров проrраммноrо кода как на языке Си, так и на ассемблере. Это руководство должно присутствовать на столе любоrо разработчика, ис пользующеrо в своей работе микроконтроллеры с ядром CortexM3. Полнота и яс ность изложения материала книrи также позволяет рекомендовать её студентам соответствующих специальностей и подrотовленным радиолюбителям. УДК 004.31(035.3) ББК 32.97304я81 Все права защищены. Никакая часть этоrо издания не может быть воспроизведе на в любой форме или любыми средствами, электронными или механическими, включая фотоrрафирование, ксерокопирование или иные средства копирования или сохранения информации, без письменноrо разрешения издательства. Книrа «Ядро CortexM3 компании ARM. Полное руководство» Дж. Ю подrо товлена и издана по доrовору с Elsevier Inc., 30 Corporste Drive, 4th Floor, Burlington, МА 01803, USA. ISBN 9785941202430 (рус.) ISBN 978 1 85617 9638 (анrл.) @ 2010 Elsevier Inc. АН rights reserved. @ Издательский дом «ДодэкаХХI», 2012 
СОДЕРЖАНИЕ ]J(:1f)fIIII1fJIIJII() (:JI()]J() ................................................................... 1 ]J(:1f)'IIII1fJIIJII() (:1I()]J() ...................................................................  ]J(:1f)'IIII1fJIIJII() (:1I()]J() ...................................................................  ]J[I'II(:JI()]JII Ci]J1f()I'Ci.....................................................................  ()()()IICi'lIII1J1 ................................................................................ :; lI()(:(:Cil'lIii ..................................................................................... () JICi]JCi 1. ]J]JIII1........................................................................  1.1. Процессор ARM CortexM3  что же это такое? . ...................................................... 9 1.2. ARM  компания и архитектура .......................................................................... 11 1.2.1. Историческая справка........................................ ....................................... ............ .11 1.2.2. Версии архитектуры...... .......... ............................................ .................... .............. 12 1.2.3. Обозначения процессоров ......................................................................... .......... .14 1.3. Развитие набора команд .... ............... ...... ..... ....... ..... .... ...... .............. ...... .......... ....... 16 1.4. Технолоrия Thumb2 и архитектура набора команд .......................................... 17 1.5. Области применения процессора CortexM3....................................................... 18 1.6. Структура книrи .. ....... ........... .................... ........ .... ... ... ... .... ..... ...... ...... ..... ............... 19 1.7. Дополнительная литература .................................................................................. 19 lICi]JCi . ()()()I' C()rtx M .......................................................... 1 2.1. Основные сведения ......... ........... ................ .......... ... ... ..... ....... ........ ..... ............... ..... 21 2.2. Реrистры.......................................... ........... ......... ... ... .... ... .......... .... ...... ....... ... ....... .... 22 2.2.1. RO.. .R12  реrистры общеrо назначения......................................................... 23 2.2.2. R 13  указатели стека.................................................................................... ....... 23 2.2.3. R14  реrистр связи.................................. ............................... .............................. 23 2.2.4. R15  счётчи к команд... ....................... ........ ........... ............. .................... ............. 23 2.2.5. Реrистры специальноrо назначения .................................................................. 23 2.3. Режимы работы ............ ...... .......... ..................... ......... ...... .................................... ... 24 
 МИКРОl(онтроллеры Stellaris ,.::j)'I1{ft; .' .... @ на!базе ААМ Соrtех..МЗ И ААМ@ Corte ,..;,;; . ' '''a '''' ur '' , '1 \", Четыре основных преимущества Stellaris@ + Ф Расширенные коммуникационные возмо.ности: встроенные 10/1 00 Ethernet МАС/РНУ, CAN, USB..KoHTponnepbI + Ф DSРинструкции и модуль вычислений с плавающей точкой (FP (Cortex..M4F)  + Ф Простота разработки с использованием библиотек BepXHero уровня API Stellaris Peripheral Driver Library для проrраммирования встроенных периферийных модулей + Ф Возросшая энерrоэффективность за счет HOBoro техпроцессw- 65 нм (CortexM4F) Москва Тел.: (495) 9950901 Email: ti(g1compel.ru Санкт Петербурr Тел.: (812) 327 9404 Email: ti@compel.ru tI НОJИDэJ www.compel.ru 
Содержание . VII 2.4. Встроенный контроллер вложенных векторных прерываний........................ 25 2.4.1. Поддержка вложенных прерываний .................... ............................................. 25 2.4.2. Поддержка векторных прерываний .................................................................. 26 2.4.3. Поддержка динамическоrо изменения приоритетов ................................... 2б 2.4.4. Уменьшение времени реакции на прерывание .............................................. 2б 2.4.5. Маскирование прерываний........ ... ............................ .......... ......... .... .......... ......... 2б 2.5. Карта памяти ......... ....... ..................................... ..... .... ... ........ ........... ........ ............. ... 26 2.6. Интерфейсы шин.. .................................. .......... ...... ... ..... .......... .......... ..... ................ 27 2.7. Модуль защиты памяти MPU ................................................................................28 2.8. Набор команд ........ ................................... ......... ...... ... ..... ....... ......... ... ..... ................. 28 2.9. П рерывания и исключения ... .......... ........ ......... ..... ... ..... .................. ....... ............... 30 2.9.1. Низкое энерrопотребление и высокая энерrоэффективность ....................31 2.10. Возможности отладки ................................ ........ .... .... ... ... ................. ..... .... ... ........ 32 2.11. J?еюме......................................................................................................................33 2.11.1. Высокая производительность . ................ ....... ........ ................. ................ ........... 33 2.11.2. Развитые средства поддержки прерываний.................................................. 34 2.11.3. Низкое энерrопотребление.... ................. ...................... ................. ........ ............. 35 2.11.4. Системные возможности.. .......... .................. ........... ... ........................ .......... ...... 35 2.11.5. Поддержка отладки............. ..... ............ ............ .................. ........ .............. ............ 35 fJICi]Ja. ()(:II()]JbI C()rtx M ....................................................... 7 3.1. J?eJlIIC:TpJ)I .................................................................................................................... 7 3.1.1. Реrистры общеrо назначения с RO по R7 ........................................................... 37 3.1.2. Реrистры общеrо назначения с R8 по R12 ........................................................ 37 3.1.3. Указатель стека R13...................... .... ............................. .......... ......................... ....... 37 3.1.4. Реrистр связи R14 ............ .......... ....... ................................... ..................... ......... ...... 40 3.1.5. Счётчи К команд R15 ...... ............... ................... ............ ....... ...................... ....... ....... 40 3.2. J?еrистры специальноrо назначения ....................................................................41 3.2.1. Реrистры состояния проrраммы .............................. .......................................... 41 3.2.2. Реrистры PRIMASK, FAULTMASK и BASEPRI ............................................... 43 3.2.3. Реrистр управления CONTROL .......................................................................... 44 3.3. Режимы работы........................................................................................................ 45 3.4. Исключения и прерывания .. .............. ........... ..... .... ..... ........ ........ ..... .......... ... ........ 47 3.5. Таблица векторов..................................................................................................... 49 3.{). С::те)( ............................................................................................................................45» 3.б.l. Основные стековые операции..... ... ............. ................... ................ ........... ...... .... 50 3.б.2. Реализация стека в процессоре Cortex М3 .......................................................51 3 .б. 3. Два стека процессора Cortex  М3.................................. ....................... .......... ...... 52 3.7. Цикл сброса............................................................................................................... 54 JlCi]Ja. ]J[a()()}> J()all ............................................................. () 4.1. Основы языка ассемблера ...................... .... .................. .......................................... 56 4.1.1. Язык ассемблера: основы синтаксиса ................................................................ 5б 4.1.2. Язык ассемблера: использование суффиксов.................................................. 57 4.1.3. Язык ассемблера: унифицированный язык ассемблера ............................... 58 
ortex-M3 от Texas Instruments .. мноrообразие интерфейсов КЛЮЧЕВЬIЕ ОСОБЕННОСТИ: · Производительность до 100 MIPS · 3аrруженные в АОМ библиотека драйверов периферии и таблицы AES и САС · Физический уровень Ethernet на кристалле · BootLoader для обновления пользовательскоrо ПО, том числе для Ethernet · 32..разрядная шина для подключения внешней периферии и памяти · Усовершенствованный алrоритм управления приводом · Три аналоrовых компаратора · Два 8-канальных 12..разрядных АЦП 
Содержание . IX 4.2. Список команд. ..... ....................... .................... ..... .... ...... ........ ......... ..... ............. ... ... 59 4.2.1. Неподдерживаемые команды.. ................ ....... ........ ........... ..... ........ .......... ........... 64 4.3. Описание команд.. .............. ......................... ....... .... .... .... ...................... ....... ............ 65 4.3.1. Язык ассемблера: пересылка данных................................................................. 66 4.3.2. Псевдокоманды LD R и AD R... ...... .......... ... ............. ... ........... .......................... ...... 69 4.3.3. Язык ассемблера: обработка данных ................................................................. 70 4.3.4. Язык ассемблера: вызов подпроrрамм и безусловный переход................. 75 4.3.5. Язык ассемблера: условное выполнение и переходы .................................... 76 4.3.6. Язык ассемблера: объединение операций сравнения и условноrо пер ехода ....................................................................... ................................... 79 4.3.7. Язык ассемблера: команды барьерной синхронизации ................................81 4.3.8. Язык ассемблера: операции насыщения........................................................... 82 4.4. Некоторые полезные команды процессора CortexM3 ......................................85 4.4.1. Команды MSR и MRS ............................................................................................. 85 4.4.2. Ещё раз об IT  блоке .... ..... ..... ..... ............... ........... ............... ......... .... ..... ......... ......... 86 4.4.3. Команды SD IV и UD IV . ..... ............. .............. ............... ... ........................ ........... .... 87 4.4.4. Команды REV, REVH и REVSH ........................................................................... 88 4.4.5. Перестановка битов.. ..... ..... .......... ................................... ........................ .......... ..... 88 4.4.6. Команды SXTB, SXTH, UXTB и UXTH . ............................................................ 88 4.4.7. Очистка и вставка битовоrо поля ....................................................................... 89 4.4.8. Команды UBFX и SBFX.. ..... ............. ........... ............. ......... ...... .................. ............. 89 4.4.9. Команды LD RD и STRD .... ........... .... ............................ ...................................... ... 89 4.4.10. Команды табличноrо перехода ТВВ и ТВН.................................................... 90 fJICiIJa 5. CII(:1fMa паМJl1f1l ........................................................... 9 5.1. Основные особенности системы памяти ............................................................. 93 5.2. Карта памяти ......... ..................................... ......... .... ... ..... ......... ......... ..... ........... ... .... 93 5.3. Атрибуты доступа к памяти ..................... ........ .... ... ...... ......... ......... ..... ............ ...... 96 5.4. Права доступа к памяти, принятые по умолчанию ........................................... 98 5.5. Операции побитовоrо доступа .............................................................................. 99 5.5.1. Преимущества использования метода bitband............................................ 103 5.5.2. Битовые операции с данными разной разрядности ................................... 106 5.5.3. Битовые операции в Сипроrраммах .............................................................. 106 5.6. Обращения к невыровненным данным ............................................................. 107 5.7. Монопольный доступ ............................. .......... ....... .... ... ..... ................ ........ ... ....... 109 5.8. Порядок расположения байтов ............................................................................111 fJIaIJa (). ()(:()()III1()(:1fIlI'CilIlICiцllll C()rtxM ........................ 11 6.1. Конвейер.................................................................................................................. .114 6.2. Подробная блоксхема . ......... ................. .......... ..... ... ... ....... ................. .......... ........ 116 6.3. Интерфейсы шин в процессоре CortexM3........................................................ 119 6.3.1. Шина 1  Code..... ............ ..... ..................... ........ ..................... ......... ........ ........... ........ 120 6.3.2. Шина D  Code ... ................ .................... .......... ....................... ..... ......... ........... ........ 120 6.3.3. Системная шина.... ......... ..... .... ..... .................... ................ ....... ................... ........... 120 6.3.4. Внешняя шина РРВ .... ..... ..... ..... ....... ... ...... ........... ...... .... ..... ......................... ......... 120 
Решения по питанию для микроконтроллеров на базе ядра Cortex..M3/Cortex..M4 Семейство Stellaris от Texas Instruments  ведущее в отрасли микроконтроллеров реальноrо времени (MCU)t основанных на революционной CortexM3/M4 технолоrии от ДАМ. Управление питанием для ТИПОВblХ применений · Размер pewettIIЯ 12 "" · Вwccж. PSRR (ао 90 16) · Режимы  на мaлoi нarpyзtr8 · ВХОАМОе  от 0.3 В · AвтoмaПIчecкoв  м-.. ltllW" яоеи....... II I10181Ca101Ц8rO  · Peжммw энeprос6ереЖ81111R на мanoi нarpyзкe · ДIIanaaoи ВХО,l&ИOrO _...... : 1,8... 5.5 В · До9ККПД · Peжммw 8f_ на мanoi нarpyзtr8 · ДIIanaaOН в-..нoro ..........: 3.5 ... 28 В · PacвнIpeиныI Teмnepaтypныl AМ8R83OК : 1WC . ,..... aнeproc6epeжett ....... ttarpy3кt · Диапазон вxoднoro нanpaж.etIU: 2,3 .. 6 В · OДIIН 6ООМА DC/OC · даа 200 МА LOO · ф-циI CPI3IIbltIII» ч-:roтw.. умро.... .. _11 ШМIIII эмм · д-Iaэoн вxoaнoro нanpяжeиIItI: 3,0  17 В · КПДRR9S% · Ток nOТPe6JIettIII < 20 IIA · J'IrIwIIII IllfAYCFptIII PSRR . Дocmoчнo 4.7 мteФ · кopqyc ЗхЗ...... soм.s TPS65000x ..81 ...." ТРS6ЗОО1 I$ {'., >- Для заказа образцов, демонстрационных оnат It референсд.заiНОВ обращаiтесь на сайт www.compel.ru ми по эпепронноi оочте: U О compel.ru 
Содержание . XI 6.3.5. Шина DAP ......... ........... ................................ ... ......... ..... ........... ..................... .......... 120 6.4. Друrие интерфейсы процессора CortexM3....................................................... 121 6.5. Внешняя шина РРВ ... .................................... ... .... ... .... .... ..................... ................. 121 6.6. Типичная схема подключения процессора....................................................... 122 6.7. Виды сброса и сиrналы сброса............................................................................. 124 lICiBCi 7. исКlIю'llIиJl.................................... ........ .................. .12() 7.1. Типы исключений.. .................. ............ ....... ........ .... ... ..... ........ ............... ................ 126 7.2. Приоритеты исключений .................. ....... ........ ..... ... .... ........ .......... ....... ............... 128 7.3. Таблица векторов ... .............................. ...... ......... ... ... ..... ....... ................. ................ 134 7.4. Входы прерываний и отложенная обработка прерываний............................ 135 7.5. Исключения отказов ................................ ........... ... ... ..... ....... .......... ...... ................ 138 7.5.1. Отказы шины..................... ..... ............................................... ................................. 138 7.5.2. Отказы системы управления памятью ........................................................... 140 7.5.3. Отказы проrраммы.... ..... ............. ..................................... ................................ .... .141 7.5.4. Т яжёлые отказы...................................... ....................... .............. ..... ..... ......... ....... 143 7.5.5. Обработка отказов................................................ ............................ .................... 143 7.6. Вызов супервизора и системных служб ............................................................. 144 flIaBCi 8. K()II1fI'()lIlIel' IJlI()жеllIlЫХ IJeK1f()l'lIbIX IIl'еl'ЫВCillиii и )'III'CiВlIеllие Пl'еl'ываllИJlМИ ...................................149 8.1. Общие сведения о контроллере прерываний ................................................... 149 8.2. Базовые средства конфиrурации прерываний ................................................ 150 8.2.1. Разрешение и запрещение прерываний.......................................................... 150 8.2.2. Установка/сброс признака отложенноrо прерывания ............................... 153 8.2.3. Уровни приоритета.............................................................................................. 153 8.2.4. Активное состояние............................................ ........................... ..... ......... ........ 153 8.2.6. Реrистр BASEPRI ........... ......... ........................... ............... ............................... ...... 155 8.2.7. Конфиrурационные реrистры остальных исключений ............................. 156 8.3. Примеры инициализации прерывания ............................................................ 158 8.4. Проrраммные прерывания .............. ........ ....... ..... ... .... ........ ........... ...... ................ 160 8.5. Системный таймер SYSTI СК....................... ....... .... ... .... ......... ..... .... ...... ............... 161 flIalJa 9. Пl'еl'ЫIJаllllJl ..............................................................1()4 9.1. Последовательность обработки прерываний/исключений ............................ 164 9.1.1. Сохранение контекста... ................ ....................................................................... 164 9.1.2. Выборка вектора..................................................................... ..... .................. ........ 166 9.1.3. Обновление реrистров ..................... ................................................. ................... 166 9.2. Выход из исключения ......... ............ ........... ....... .... ... .... ........ ............ .... .............. ... 166 9.3. Вложенные прерывания. ............................. ...... .... ... .... .......... .......... ..... ............... 167 9.4. «Цепочечная» обработка прерыВаНий............................................................... 168 9.5. «Опоздавшие» исключения.................................................................................. 168 9.6. Ещё раз о значении EXCRETURN ..................................................................... 169 9.7. Задержка обработки прерывания ....................................................................... 171 
XII . Содержание 9.8. Отказы, связанные с прерываниями ................................................................. 172 9.8.1. Сохранение контекста.......................................................... ..... .... ................... .... 172 9.8.2. Восстановление контекста................................... ......................... ...................... 172 9.8.3. Выборка вектора .... ............................................. ... ........................... .................... 173 9.8.4. Некорректный возврат.......................................... ....................... ................... .... 173 flIaBa 10. Пр()rраММllр()lJаllllе C()rtexM ................................. 174 10.1. Общие сведения ...... .... ..... .... .... ..... ..... .... .... ...... .... ..... ...... .... .... ..... ..... .... ..... ..... .... ..174 10.2. Типичный процесс разработки ПО ...................................................................174 10.3. Использование языка Си.................................................................................... 175 10.3.1. Компиляция простой Сипроrраммы в пакете RVDS ...............................176 10.3.2. Компиляция простой Сипроrраммы в пакете MDKARM ................... 179 10.3.3. Отображённые в память реrистры и язык Си ............................................ 180 10.3.4. Встроенные функции.... ....................... ..... ......................................................... 182 1 0.3.5. Встроенный и iпliпеассемблер................ ....... ... ............................................. 183 10.4. Стандарт CMSIS ....... .... .... ...... ... ......... ..... .... ...... ... .... ....... .... ..... ..... ..... .... ...... ..... ... 183 10.4.1. Предпосылки появления стандарта CMSIS ................................................. 183 10.4.2. Области стандартизации.................................................................................. 185 10.4.3. Структура CMSIS .................. .............................................................................. 185 10.4.4. Использование стандарта CMSIS .................... ............. ........................... ....... 187 10.4.5. Выrода от использования CMSIS ................. ............................................... .... 189 10.5. Использование ассемблера. ... .... ..... ... ...... .... ..... .... ..... ...... .... .... ..... .... .... ...... .... .... 190 10.5.1. Интерфейс между ассемблером и Си............................................................. 190 10.5.2. Проrраммирование на ассемблере  первые шаrи ......................................... 191 10.5.3. Вывод результатов работы проrраммы ........................................................ 192 10.5.4. П porpaMMa «Неllо W orld» ..... .............................. ................................... ........... 194 10.5.5. Использование памяти данных ............ ....... ................. ....... ............. ........ ...... 197 10.6. Монопольный доступ и семафоры .................................................................... 198 10.7. Метод bitband и семафоры ................................................................................. 201 10.8. Использование команд извлечения битовоrо поля и команд табличных переходов ......................................................................... 202 flIaBa 11. Pa()()1fa с IIрерыВаllllяМll/llсКlIю'lеllllяМII.................204 11.1. Использование прерываний ..............................................................................204 11.1.1. Конфиrурирование стека.................................................................................. 204 11.1.2. Настройка таблицы векторов прерываний .................................................205 11.1.3. Назначение приоритетов прерываний..........................................................206 11.1.4. Разрешение прерываний ................................................................................... 207 11.2. Обработчики исключений/прерываний .........................................................209 11.3. Проrраммные прерывания ................................................................................ 211 11.4. При мер перемещения таблицы векторов . ....................................................... 213 11.5. Использование команды SVC ............................................................................ 216 11.6. При мер использования команды SVC: функции вывода текстовых сообщений ............................................................................................................. 217 11.7. Использование команды SVC в проrраммах на языке Си............................. 220 
Содержание. XIII flIalJa 12. ]J[1'()ДIJИII)f1fые ПI'Оfl'аММllые ВО3М()ЖIIО(:1fИ 11 П()IJедеllllе (:1I(:1feMbI ................................................. 12.1. Реализация системы с двумя раздельными стеками .....................................223 12.2. Выравнивание стека на rраницу двойноrо слова ..........................................226 12.3. Переход в режим потока с любоrо уровня вложенности ............................. 227 12.4. Пара слов о производительности ...................................................................... 229 12.5. Состояние блокировки .................... ...... ......... .... ... ... .... ................... ...... .... ......... 231 12.5.1. Что происходит во время блокировки? ........................................................ 231 12.5.2. Предотвращение блокировки ......................................................................... 232 12.(). J>eJlllc1rp J?AllJT1\I.[A........................................................................................... 233 lIaBa 13. MOA)'lIlJ аЩИ1fЫ паМJl1fИ MPU ...................................24 13.1. Общие сведения ... ....................................... ...... .... ... ...... ....... .......... ..... ............. ... 234 13.2. Реrистры модуля MPU ..................... ........ .......... .... .... ... .... ............... ....... ....... ..... 235 13.3. Настройка модуля MPU ................... ..... ........ ..... ... .... .... .......... ......... ..... .............. 241 13.4. Типичный процесс настройки модуля MPU ...................................................247 13.4.1. При мер использования запрета подобластей ............................................. 248 lIalJa 14. ]J[1'()'1ие IJОМОжIlОС1fи Пl'оце(:СОl'а CortexM...........25 14.1. Системный таймер YTIC .............................................................................. 252 14.2. Управление электропитанием .................. ........ ... ... ..... ...... ............... .............. ... 255 14.2.1. Спящие режимы..... ................................... ....... ............... ......................... ........... 255 14.2.2. Функция Sleep Оп  Exit...................................................................................... 257 14.2.3. Контроллер WI С .............. ............................... ................... ............. .................... 258 14.3. Межпроцессорный обмен......................... .......... .... ... ....... ................ ......... .... ..... 260 14.4. Управление сбросом .................... .............. ....... .... ... ..... ...... ................ ............. .... 264 lICilJa 15. АI'ХИ1fеК1f)'l'а (:ИС1fемы 01flIадки .................................()() 15.1. Общие сведения о возможностях отладки ...................................................... 266 15.2. Обзор архитектуры Coreight ......... ..... .......... .... .... ... ... .... ............... ...... ............. 266 15.2.1. Отладочный интерфейс процессора................... ........................................... 267 15.2.2. Интерфейс хоста отладки......................... ................................................... ..... 267 15.2.3. Модули DP, АР и DAP ........................................................................................268 15.2.4. Интерфейс трассировки ................................................................................... 269 15.2.5. Характеристики архитектуры CoreSight ...................................................... 269 15.3. Режимы отладки .. .................................. .......... ... ... .... .... ................... ..... .............. 271 15.4. События отладки .......... .............. .............. ......... .... ... .... .......... ......... .... ................ 275 15.5. Точки останова в процессоре Cortex М3 .......................................................... 276 15.6. Получение доступа к содержимому реrистров при отладке ......................... 277 15.7. Прочие отладочные возможности ядра............................................................ 278 
XIV . Содержание lIalJa 1(). К()МП()lIеll1fЫ ()1flIaAKII ................................................80 16.1. Общие сведения .. ..... .... ....... ... .... ....... ... ...... ..... ...... .... ....... .... ..... ..... ..... ........... ...... 280 16.1.1. Система трассировки в процессоре CortexM3 ........................................... 280 16.2. Компоненты трассировки: модуль DWT ......................................................... 281 16.3. Компоненты трассировки: модуль ITM ...........................................................283 16.3.1. Проrраммная трассировка с использованием модуля ITM.................... 284 16.3.2. Аппаратная трассировка с использованием модулей ITM и DWT ......... 285 16.3.3. Временные отметки модуля ITM ..................... ........... .............................. ...... 285 16.4. Компоненты трассировки: модуль ЕТМ ..........................................................285 16.5. Компоненты трассировки: модуль TPIU..........................................................286 16.6. Модуль FPB .... .... ....... ..... ....... ... .... ...... .... .... ...... ...... ..... ....... .... ... ....... .... ........... ...... 287 16.6.1. Точка останова................... ................................. ......... ........................................ 287 16.6.2. Функция Flash Patch .......................................................................................... 288 16.6.3. Компараторы.................................... .................................................................... 288 16.7. Порт доступа шины АНВ ....................................................................................290 16.8. Таблица ПЗУ ...... ....... ..... ...... .... ... ....... ... ..... ...... ..... .... ....... ..... .... ..... ..... ..... ...... ... .... 291 lIaBa 17. ]J[I'И(:1f)'пая к I'Ci()()1f (: ПI'()це(:с()I'()М C()rtexM.........294 17.1. Выбор устройства с ядром CortexM3................................................................294 17.2. Средства разработки.... ........ ... ... ...... ..... ... ..... .... ..... ...... .... ......... ....... ... ...... ... ... .... 295 17.2.1. Си  компиляторы и отладчики.... .............................. ... ......... .... .................. ..... 296 17.2.2. Поддержка встраиваемых ОС ........... ............ ....... ................................ ........... 297 17.3. Различия между процессорами CortexM3 ревизий О и 1..............................298 17.3.1. Ревизия 1  замена модуля JTAGDP на SWJDP....................................... 300 17.4. Различия между процессорами CortexM3 ревизий 1 и 2..............................300 17.4.1. Выравнивание стека на rраницу двойноrо слова по умолчанию........... 300 17.4.2. Дополнительный реrистр управления . ......................................................... 301 17.4.3. Новое значение реrистров идентификации................................................. 301 17.4.4. Возможности отладки................................. ............... ..... ....... ............................ 301 17.4.5. Особенности режима пониженноrо энерrопотребления ........................302 17.5. Чем же хороша ревизия 2 процессора CortexM3? .........................................303 17.6. Различия между процессорами CortexM3 и CortexMO ................................ 304 17.6.1. Модель проrраммирования .......................................................... ................... 305 17.6.2. Исключения и контроллер NVI С.... ..... . .......................................................... 305 17.6.3. Набор команд.................................................................... ...... ...... ....................... 306 17.6.4. Особенности системы памяти.... ..................................................................... 307 17.6.5. Возможности отладки................. ....................................................................... 307 17.6.6. Совместимость...................................... .................................................... ........... 307 lIaBa 18. ]J[epell()(: IIl'lIlI()жеllИЙ (: ПI'()це(:(:()l'а ARM7 lIа IIр()це(:(:()р C()rtexM3 ............................................O 18.1. Общие сведения ... ...... .... ...... ... .... ....... .... ..... ...... ..... ..... ...... ... ........... ...... .... ..... ...... 309 18.2. Особенности системы ... ....... ... ...... .... ...... ..... ...... ... ....... .... ..... ...... ...... .... ...... ... ..... 309 18.2.1. Карта памяти.................. ........ .............. ..... ...... ..................................................... 309 
Содержание . xv 18.2 . 2 . Пр еры в а ни я .......................................................................................................... 31 О 18.2.3. Модуль MPU .............................................. ...................... .............................. .......311 18.2.4 . Управление системой............. ............. ... ..... ............................. .... ..... ......... ...... ...311 18.2.5. Режимы работы .......................... .............. ..... ................................ .... .......... .........311 18.3. Файлы с ИСХОДНЫМ текстом на ассемблере....................................................... 312 18.3.1. Режим Thumb ................. .... ......... .......... ... ..... ............................. .... ...... ........ .........313 18.3.2. Состояние ARM .............. .... ............. .............. ............ ......................................... .313 18.4. Файлы с исходным текстом на Си ..................................................................... 315 18.5. Скомпилированные объектные файлы ........................................................... 316 18.6. Оптимизация ....................................................................................................... 316 flIalJa 1. Pal'a()()1fKa Пl'lIlI()жеllИЙ AlIJI C()rtexM (: II(:II()lIIJЗ()lJаllием GNU ............................................. 18 19.1. Общие сведения... ............................. ....... .......... .... .... .... .... .................. ................. 318 19.2. Приобретение инструментария GNU ............................................................... 319 19.3. Процесс разработки проrраммы ....................................................................... 319 19.4 . При меры................................................................................................................ 321 19.4 .1. При мер 1: первая проrрамма ......................... .............. ............. ....................... 321 19.4.2. При мер 2: связывание нескольких . файлов................................................. 323 19.4.3. При мер 3: простая проrрамма «Неllо World».............................................. 324 19.4.4. При мер 4: данные в ОЗУ ................................................................................... 326 19.4.5. При мер 5: проrрамма на Си ............................................................................. 327 19.4.6. При мер 6: перенаправление вывода в проrрамме на си.......................... 330 19.4.7. При мер 7: реализация собственной таблицы веКторов.............................331 19.5. Обращения к реrистрам специальноrо назначения ...................................... 332 19.6. Использование неподдерживаемых команд ................................................... 332 19.7. Iпliпеассемблер в компиляторе GCC ............................................................... 332 lIalJa o. и(:П()lIlJ()lJаllllе паке1fа RealView MDKARM К()МIIаIlИИ Keil............................................................ 20.1. Общие сведения. ................................... ............ .... .... .... ... ................... ................. 334 20.2. При ступая к работе в ИСР ,...Vision....................................................................334 20.3. Вывод сообщения «Hello World» по интерфейсу UART ................................ 341 20.4. Тестирование проrраммы ............................ ..... .... ... ............ ........... ......... ... ....... 343 20.5. Использование отладчика....................... .......... ... .... ....................... ..... ... ........... 346 20.6. Симулятор ............................................................................................................ 350 20.7. Модификация таблицы векторов ..................................................................... 353 20.8. Прерывания и стандарт CMSIS ......................................................................... 354 20.9. Перевод существующих приложений на стандарт CMSIS ............................ 360 fлава 21. ]J[роrраммирование CortexM3 в LabVIEW ..............361 21.1. Общие сведения.. .................................. .......... ....... ... .... ...................... .................. 361 21.2. Знакомство с Lab VIEW ........................................................................................ 361 21.2.1. Типичные области применения .................... .................................................. 362 
XVI . Содержание 21.2.2. Что нам нужно, чтобы использовать LabVIEW и ARM ........................... 363 21. 3. Процесс разработки... .... ...... .... ... ......... ..... ......... .... ..... ...... .... ........... ..... ........ .... ... 364 21.4. Пример использования среды LabVIEW ..........................................................366 21.4.1. Создание проекта......................................... .... ........ .... ....................................... 366 21.4.2. Определение входов и ВыходоВ....................................................................... 367 21.4.3. Создание проrраммы ....................................... ........ ........................... ... ..... ....... 368 21.4.4. Компиляция проrраммы и тестирование приложения........................... 370 21.5. Как это работает ...... ..... ........... .... .... ... ... ..... ......... ..... ...... ...... .... ...... ...... .......... ...... 371 21.6. Дополнительные возможности LabVIEW . ....................................................... 372 21.7. Перенос проекта на друrие процессоры ARM ..................................................... 374 ]J[РlllIожеllllе А. На()()р комаllД C()rtexM. СПl'аIJ()'1I1IJIЙ Ma1fel'lIalI ................................... 7:; ]J[l'lIlIожеllllе Б. l()()И1fllые КОМCiIlДЫ Thumb 11 IJel'<:1I1I aI'XIl1feK1f)'l'bI ARM ...........................47 ]J[РlllI()жеllllе ]J. И<:КlIЮ'lеIlIlЯ ПI'()це<:<:()l'а C()rtexM...............48 ]J[I'ИlI()жеllllе . Реfll<:1fры K()II1fp()lIlIel'a NVIC и ()lI()Ka УПl'аIJlIеllИJI <:1I<:1fем()й ...................... 440 ]J[l'lIlI()жеllllе д. РУК()IJ()Д<:1fIJ() П() lI()каlIlIаЦIIII ОШII()ОК IJ Пl'()fl'аммах ДlIJI C()rtex M ..........................455 ]J[РlllI()жеllllе Е. ]J[I'IIMel' <:цеllаl'lIЯ К()МII()II()ВЩlIка ДlIЯ паке1fа S()ur<:ery G++ ................................468 ]J[РlllI()жеllllе ж. ФУIIКЦIIII Д()<:1f)'IIа к JlДР)' <:1fаllдаl'1fа CMSIS ..47 ПРllл()жеНllе з. С()еДIIНlIтеЛII для п()ДключеНIIЯ ()1flIаД()'1I1ЫХ <:ред<:1fIJ.... ............ ........... ............ .480 ]J[РlllI()жеllllе и. СемеЙ<:1fIJ() MIIKI'()K()II1fp()lIlIep()1J Stellaris@ ..... 484 СПIf<:ОК JIIf1reI>a1rYI>I»I...................................................................5 Предме1fIlI»IЙ )'Kaa1felIlJ ... ...... ........... ..................... .................... :;O 
ВСТУПИТЕЛЬНОЕ СЛОВО С момента выхода первоrо издания книrи прошло не так уж MHoro времени, а темпы развития сообщества пользователей микроконтроллеров с процессора ми ARM уже превзошли самые смелые ожидания. Безо всякоrо преувеличения можно сказать, что продукция нашей компании произвела настоящую револю цию в мире микроконтроллеров. На сеrодняшний день в мире насчитывается TЫ сячи и тысячи конечных пользователей микроконтроллеров, построенных на процессорах ARM, что даёт все основания считать данную технолоrию наиболее быстро развивающейся из представленных на рынке. Поэтому второе издание книrи Джозефа, содержащее наиболее актуальную информацию о данной TeXHO лоrии МК, появилось как нельзя вовремя. О развитии сообщества можно судить по таким фактам, как увеличение чис ла компаний, предлаrающих свои изделия на базе процессора CortexM3 (на ce rодняшний день насчитывается более 30 таких компаний), разработка стандарта CMSIS, облеrчающеrо перенос приложений как между различными вариантами процессора Cortex, так и между устройствами разных производителей, а также появление более совершенных средств разработки. Нельзя не упомянуть и о BЫ пуске процессора CortexMO, который открыл перед микроконтроллерами ARM нишу чрезвычайно дешёвых устройств. Всё это свидетельствует о наступлении эры встраиваемых систем на базе про цессора CortexM3! Ричард Йорк (Richard York) Руководитель подразделения маркетинrа продукции, компания ARM 
ВСТУПИТЕЛЬНОЕ СЛОВО Люди, пишущие проrраммы для микроконтроллеров, в чёмто подобны боже ствам. Подчиняя микроконтроллеры своей воле, они вдыхают жизнь в застыв шие конструкции и в итоrе создают фантастические изделия. Далеко не послед нюю роль в этом акте творения иrрают средства разработки  вот почему в rруп пу, основной задачей которой было упрощение и в то же время усовершенствова ние процессора ARM7TDMI, помимо разработчиков ЦПУ, вошли специалисты отдела разработки проrраммных средств компании ARM. В результате TaKoro cOBMecTHoro творчества на свет появился процессор СоrtехТММ3, явивший собой потрясающее развитие ориrинальной архитектуры ARM. Новый процессор орrанично сочетает в себе все преимущества 32битной архитектуры ARM с поддержкой чрезвычайно эффективноrо набора команд Thumb2, обеспечивая при этом ряд новых возможностей. Однако, несмотря на все усовершенствования, процессор CortexM3 сохранил упрощённую модель проrраммирования, которая хорошо знакома всем приверженцам архитектуры ARM. Уэйн Лайонз (Wayne Lyons) Руководитель подразделения встраиваемых решений, компания ARM 
ВСТУПИТЕЛЬНОЕ СЛОВО Сеrодня мноrие российские разработчики и специалисты хорошо знакомы или начинают знакомиться с продукцией компании ARM, в том числе с новыми продуктами серии Cortex (МО, М3, М4.. .). На все вопросы, связанные с преиму ществами архитектуры ядра CortexM3, призвана ответить данная книrа. Это первый и пока единственный технический материал на русском языке, рассказы вающий о данной архитектуре, выпущенный при содействии компаний Texas Instruments и КОМПЭЛ. В предисловиях автора и сотрудников компании ARM rоворится о тенденци ях в мире микроконтроллеров и актуальных темах, связанных с архитектурой ядра. В свою очередь, я бы хотела сфокусировать внимание непосредственно на компании Texas Instruments, которая также использует продукты ARM в своих разработках, в том числе  в микроконтроллерах на ядре CortexM3 (семейство Stellaris, см. Приложение И). Итак, Texas Instruments (TI)  один из самых крупных производителей полу проводниковыхкомпонентов с номенклатурой более 80 000 наимен ований,КОТО рая значительно расширилась в 2011 в связи с приобретением компании National Semiconductor. Компания ТI была основана в 1930 r. и изначально занималась сейсмоrрафиче ской разведкой нефти, но уже с 1952 r. переориентировалась на электронику, а в 1958 r. сотрудник ТI Джек Килби изобрел первую в мире интеrральную микросхе му. С этоrо момента началась новая эпоха в развитии электроники. Компания ТI самостоятельно разрабатывала микроконтроллеры и цифровые сиrнальные про цессоры. Тем не менее, важной особенностью развития бизнеса ТI была и покупка друrих фирм, в основном в области аналоrовых компонентов. Это помоrло компа нии вырасти из нишевой в rиrанта с широчайшей номенклатурой полупроводни ковых компонентов. Из самых значимых приобретений  Silicon Systems в 1996 r., Unitrode и Power Trends в 1999 r., BurrBrown в 2000 r., Chipcon в 2007 r., Luminary Micro в 2009 r. и самая большая покупка на сеrодня  компания National Semiconductor в 2011 r. Последние приобретения открывают для ТI новые техноло rии и продукты. Например, с покупкой Luminary Micro компания приобрела ми кроконтроллеры семейства Stellaris на базе ядра CortexM3. Ero описанию посвя щено отдельное приложение в рамках этоrо издания. ТI не останавливается про сто на покупке: с момента присоединения Luminary Micro линейка продуктов продолжает расти. Совсем недавно анонсирована линейка новых микроконтрол леров LM4F на базе ядра CortexM4. Данная архитектура расширила семейство Stellaris, которое получило не только новые вычислительные возможности, но и фирменную технолоrию производства Texas Instruments. Тополоrической нормой для производства новых контроллеров стала отработанная в течение последних пяти лет 65нанометровая технолоrия. В результате стало возможным достичь He бывалоrо компромисса между производительностью и энерrопотреблением. Надеюсь, эта книrа станет для вас не просто настольным справочником, а Ha стоящим помощником в работе с микроконтроллерами, сделанными на базе ядра CortexM3 от компании ARM. Мария Рудяк Руководитель направления по работе с продукцией Texas Instruments КОМПЭЛ 
ПРЕДИСЛОВИЕ АВТОРА Данная книrа предназначена как для разработчиков, так и для проrрамми стов, заинтересовавшихся процессором Соrtех ТМ  М3 компании ARM. Разумеется, в официальных документах, таких как «CortexM3 Techпical Refereпce Maпual» и «ARMv7M Architecture Applicatioп Level Refereпce Maпual», содержится практи чески вся информация по этому процессору_ Однако указанные документы из лишне подробны и MorYT оказаться слишком сложными для понимания. Эта же книrа писалась в расчёте на проrраммистов, разработчиков встраива емых устройств, разработчиков систем на кристалле, радиолюбителей, учёных  в общем, самых разных людей, изучающих процессор CortexM3 и хоть в какой то мере знакомых с микроконтроллерами либо микропроцессорами. В книrе дo статочно подробно рассматриваются архитектура процессора CortexM3, набор команд с примерами использования некоторых из них, различные аппаратные возможности, а также развитая система отладки процессора. Кроме Toro, в книrе также приведены примеры проrрамм, позволяющие читателю освоить азы раз работки ПО дЛЯ процессора CortexM3 с использованием инструментариев ARM и GNU. Эта книrа также приrодится разработчикам, переносящим свои проекты с процессора ARM7TDMI на CortexM3, поскольку описывает как различия меж ду двумя указанными процессорами, так и собственно процесс переноса при кладных проrрамм с процессора ARM7TDMI на CortexM3_ Бпаrодарности Прежде Bcero, я хотел бы поблаrодарить всех тех, кто своими советами, KOH сультациями и отзывами оказал мне оrромную помощь в написании первоrо и BToporo изданий книrи: Ричарда Йорка (Richard York), Эндрю Фрейма (Andrew Frame), Рейнхарда Кейла (Reinhard КеН), Ника Сампейза (Nick Sampays), Дэва Ба нерджи (Dev Banerjee), Роберта Бойза (Robert Boys), Доминика Паджака (Dominic Pajak), Алана Тринrхэма (Alan Tringham), Стивена Теобальда (Stephen Theobald), Дэна Брука (Dan Brook), Дэвида Браша (David Brash), rайдна Поуви (Haydn Povey), [эри Кэмпбелла (Gary СаmрЬеll), Кевина Макдермотта (Kevin McDermott), Ричар да Ирншоу (Richard Earnshaw), Шияма Садасивана (Shyam Sadasivan), Саймона Краске (Simon Craske), Саймона Аксфорда (Simon Axford), Такаши Уrаджина (Ta kashi Ugajin), Уэйна Лайонза (Wayne Lyons), Самина Иштиака (Samin Ishtiaq) и Саймона Смита (Simon Smith). Я хотел бы особо поблаrодарить Яна Белла (Ian ВеН) и Джейми Бреттль (Jamie Brettle) из компании National Instruments за помощь в написании rлавы, посвящён ной пакету LabVIEW, и за их поддержку_ Также я хотел бы выразить мою призна тельность Карлосу О'Донеллу (Carlos O'Donell), Брайану Баррере (Brian Barrera) и Дэниелу Якобовицу (Daniel Jakobowitz) из компании CodeSourcery за их поддержку и помощь в подборе материалов, касающихся разработки ПО в пакете Sourcery G++. И, конечно же, orpoMHoe спасибо всем сотрудникам издательства Elsevier за их профессионализм, проявленный при подrотовке данной книrи к публикации. Наконец, я хотел бы высказать блаrодарность Питеру Коулю (Peter cole) и Ивану Ярдли (Ivan Yardley) за их постоянную поддержку и заинтересованность в этом проекте. 
ОБО3НАЧЕНИЯ в данной книrе используются следующие обозначения и правила оформле ния: Обычный ассемблерный код MOV RO, Rli Копируем содержимое реrистра Rl в реrистр RO Ассемблерный код с использованием обобщёННОIО синтаксиса Элементы, обозначенные уrловыми скобками, необходимо заменить названи ями реrистров: MRS <reg>, <specialreg> Тексты npOlpaMM на языке Си for (i=Оii<Зiitt) { funcl()i } псевдокод if (а > Ь) Значения 1. 4'ЬС, Ох123  шестнадцатеричные значения. 2. #3  элемент NQ3 (например, IRQ #3 означает IRQ с номером 3). 3. #immed 12  12битное непосредственное значение (константа). Биты pelucmpOB Обычно используются для указания части содержимоrо реrистра; например, запись «биты [15:12]» относится к битам с 15ro по 12й. Доступность битов pelucmpOB обозначается следующим образом: 1. R  доступен только для чтения. 2. W  доступен только для записи. 3. R/W  доступен для чтения и для записи. 4. R/Wc  доступен для чтения, при записи сбрасывается. 
rЛОССАРИЙ ADK АМВА Design Kit Набор разработки АМВА АНВ Advanced HighPerformance Bus Усовершенствованная высокопроизводительная шина (шина АНВ) AHBAP АНВ Access Port Порт доступа к шине АНВ АМВА Advanced Microcontroller Bus Architecture Усовершенствованная шинная архитектура для микроконтроллеров АРВ Advanced Peripheral Bus Усовершенствованная шина периферии (шина АРБ) ARM ARM ARM Architecture Reference Manual Справочное руководство по архитектуре ARM ASIC ApplicationSpecific Integrated Circuit Заказная интеrральная схема АТВ Advanced Trace Bus Усовершенствованная шина трассировки (шина АТВ) BE8 Byteinvariant big Endian mode Обратный порядок байтов с неизменным расположением байтов (формат хранения данных) CMSIS Cortex Microcontroller Software Interface Standard Стандарт проrраммноrо интерфейса микроконтроллеров с ядром Cortex СРI Cycles Per Instruction Число тактов на команду CPU Central Processing Unit Центральный процессор, ЦПУ CS3 CodeSourcery Соmmоп Startup Code Sequence Общий стартовый код ИСР CodeSourcery DAP Debug Access Port Порт доступа к модулю отладки (порт DAP) DSP Digital Signal Processor/Digital Signal Processing Процессор цифровой обработки сиrналов / Цифровая обработка сиrналов DWT Data Watchpoint and Trace unit Модуль трассировки и поддержки контрольных точек данных EABI/ABI Embedded Application Binary Interface Двоичный интерфейс встраиваемых приложений (интерфейс EABI) ЕТМ Embedded Trace Macrocell Встроенная макроячейка трассировки FPB Flash Patch and Breakpoint unit Модуль коррекции флэшпамяти и задания точки останова FPGA Field Programmable Gate Array Проrраммируемая вентильная матрица 
fлоссарuй . 7 FSR Fault Status Register Реrистр состояния отказа НТМ CoreSight АНВ Trace Macrocell Макроячейка трассировки АНВ ICE InCircuit Emulator Внутрисхемный эмулятор IDE Integrated Development Environment Интеrрированная среда разработки, ИСР IRQ Interrupt ReQuest Запрос прерывания (обычно применяется с внешними прерываниями) ISA Instruction Set Architecture Архитектура набора команд ISR Interrupt Service Routine Процедура обработки прерывания ITM Instrumentation Trace Macrocell Макроячейка инструментальной трассировки JTAG Joint Test Action Group Объединённая рабочая rруппа по автоматизации тестирования; название стандарта интерфейсов тестирования и отладки JTAGDP JTAG Debug Port Порт отладки JTAG LR Link Register Реrистр связи LSB Least Significant Bit Младший значащий бит MCU MicroController Unit Микроконтроллер (МК) MDKARM КеН Microcontroller Development Kit for ARM Пакет разработки для ARM компании КеН MMU Memory Management Unit Модуль управления памятью MPU Memory Protection Unit Модуль защиты памяти MSB Most Significant Bit Старший значащий бит MSP Main Stack Pointer Основной указатель стека NMI NonMaskable Interrupt Немаскируемое прерывание NVIC Nested Vectored Interrupt Controller Контроллер вложенных векторных прерываний OS Operating System Операционная система (ОС) 
8 . rлоссарuй РС PMU PSP РРВ PSR SCB SCS SIMD SoC SP SRPG SW SWDP SWJDP SWV тем ТРА TPIU UAL UART WIC Program Counter Счётчик команд Power Management Unit Модуль управления питанием Process Stack Pointer Указатель стека процесса Private Peripheral Bus Шина собственных периферийных устройств (шина РРВ) Program Status Register Реrистр состояния проrраммы System Control Block Блок управления системой System Control Space Пространство управления системой Single Instruction, Multiple Data Один поток команд  несколько потоков данных (архитектура SIMD) SystemonChip Система на кристалле Stack Pointer Указатель стека State Retention Power Gating Технолоrия SRPG SerialWire Интерфейс SerialWire SerialWire Debug Port Порт отладки SerialWire SerialWire JTAG Debug Port Порт отладки SerialWire/JTAG SerialWire Viewer Модуль наблюдения за шиной SerialWire (один из режимов работы модуля TPIU) Tightly Coupled Memory Тесно связанная память (характеристика CortexMl) Trace Port Analyzer Анализатор порта трассировки Trace Port Interface Unit Модуль интерфейса порта трассировки Unified Assembly Language Унифицированный язык ассемблера Universal Asynchronous Receiver Transmitter Универсальный асинхронный приёмопередатчик Wakeup Interrupt Controller Контроллер пробуждающих прерываний 
rЛАВА 1 ВВЕДЕНИЕ 1.1. Процессор ARM CortexM3  что же зто такое? Рынок микроконтроллеров поистине orpoMeH  по проrнозам аналитиков в 2010 rоду будет продано более 20 миллиардов данных устройств. На этом рынке идёт непрерывная конкурентная борьба между различными производителями, моделями и архитектурами микроконтроллеров. Рост запросов со стороны про мышленноrо сектора вызвал потребность в более производительных микрокон троллерах; в частности, возникла необходимость в микроконтроллерах, которые при той же частоте или потребляемой мощности выполняли бы большее число операций. Кроме Toro, микроконтроллеры становятся всё более «коммуника бельными», используя для связи с окружающим миром шину USB, Ethernet или радиоканал, и вполне естественно, что для поддержки этих каналов связи и раз витых периферийных устройств требуются дополнительные вычислительные pe сурсы. Одновременно растёт сложность самих приложений, что обусловлено ис пользованием более изощрённых пользовательских интерфейсов, необходимо стью поддержки мультимедиа и увеличением функциональности устройств. Процессор ARM СоrtехТММ3  первый представитель процессоров семейства Cortex, выпущенных компанией ARM в 2006 rоду  изначально был нацелен на рынок 32битных микроконтроллеров. Данный процессор, несмотря на неболь шое число лоrических вентилей, требуемых для ero реализации, обладает велико лепной производительностью и предлаrает MHoro новых возможностей, которые ранее были доступны только в самых «навороченных» процессорах. Процессор CortexM3 удовлетворяет самым разным требованиям рынка 32битных процес:' соров для встраиваемых систем, предлаrая: . Большую производительность  позволяет выполнять больший объём вычис лений без необходимости увеличения частоты или потребляемой мощности. . Низкое энерzопотребление  обеспечивает большее время автономной рабо ты, что особенно критично для портативных устройств, в том числе использу ющихся в беспроводных сетях. . Улучшенный детерминизм  rарантирует, что переход к обслуживанию кри тических задач и прерываний будет осуществляться за минимально возмож ное и, rлавное, точно определённое время. 
10 . fлава 1. Введение · Увеличенную плотность кода  позволяет разместить необходимый код даже в памяти небольшоrо объёма. · Простоту использования  обеспечивает лёrкость проrраммирования и OT ладки для растущеrо числа пользователей, переходящих с 8 и 16битных платформ на 32битную. · Низкую стоимость  позволяет приблизить стоимость 32битных систем к стоимости классических 8/16битных устройств и предлаrать 32битные ми кроконтроллеры начальноrо уровня по цене, составляющей менее одноrо дол лара США. · Большой выбор средств разработки  от недороrих или вообще бесплатных компиляторов до развитых пакетов от различных производителей средств разработки. Микроконтроллеры, созданные на базе процессора CortexM3, уже напрямую конкурируют с устройствами, имеющими друrие архитектуры. Причём, если раньше разработчики обращали внимание на стоимость отдельных устройств, то теперь они, в первую очередь, стремятся к уменьшению стоимости системы в цe лом. По существу, происходит аrреrирование устройств, блаrодаря чему появля ется потенциальная возможность замены трёх или четырёх традиционных 8бит ных устройств одним более мощным. Ещё одним из направлений снижения себестоимости является увеличение объёмов кода, используемоrо повторно в различных изделиях. Поскольку микро контроллеры с процессорным ядром CortexM3 рассчитаны на проrраммирова ние с использованием языков BbIcoKoro уровня, в частности языка Си, и имеют установившуюся архитектуру, это значительно упрощает перенос и повторное использование проrрамм, уменьшая тем самым время разработки и затраты на тестирование. Следует отметить, что CortexM3  не первый процессор компании ARM, предназначенный для создания микроконтроллеров общеrо назначения. До сих пор на этом рынке пользуется успехом несколько устаревший процессор ARM7, получивший оrромную популярность блаrодаря различным партнёрам компа нии ARM, таким как NXP (Philips), Texas Instruments, Atmel, OKI, а также мноrим друrим производителям, предлаrающим надёжные 32битные микроконтролле ры. Вообще rоворя, процессор ARM7 является самым распространённым из коrдалибо выпускавшихся 32битных встраиваемых процессоров  каждый rод выпускалось и продолжает выпускаться более 1 миллиарда процессоров, находя щих применение в самых различных устройствах, от мобильных телефонов до автомобилей. Предполаrается, что процессор CortexM3 будет иметь не меньший успех, по скольку он позволяет создавать микроконтроллеры, предлаrающие более про стую модель проrраммирования и отладки и при этом имеющие большие вычис лительные возможности. Кроме Toro, процессор CortexM3 предоставляет ряд функциональных возможностей и технолоrий, востребованных разработчиками микроконтроллеров. Это и наличие немаскируемых прерываний для поддержки критических задач, и поддержка вложенных векторных прерываний с высокой степенью детерминизма, и атомарные битовые операции, и даже опциональный 
1.2. ARM  компания и архитектура. 11 модуль защиты памяти (Memory Protection Unit  MPU). Всё это делает процес сор CortexM3 привлекательным не только для тех, кто уже использует процессо ры ARM, но и для массы новых пользователей, задумывающихся оприменении 32битных микроконтроллеров в своих устройствах. 1.2. ARM ........ компания и архитектура 1.2.1. Историческая справка Чтобы нам было леrче разобраться в мноrообразии процессоров ARM и Bep сий их архитектур, совершим краткий экскурс в историю компании ARM. Компания ARM (Advanced RISC Machines Ltd.) была основана в 1990 rоду как co вместное предприятие компаний Apple Computer, Arcon Computer Group и VLSI Technology. В 1991 rоду компания ARM представила семейство процессоров ARM6, лицензию на выпуск которых первой получила компания VLSI. После Toro как ли цензии на использование процессора ARM приобрели и друrие компании, в том числе Texas Instruments, NEC, Sharp и ST Microelectronics, эти процессоры стали широко применяться в мобильных телефонах, компьютерных жёстких дисках, КПК, бытовой аудио и видеоаппаратуре и прочих потребительских товарах. 
12 . fлава 1. Введение в наши дни партнёры компании ARM ежеrодно поставляют более двух мил лиардов процессоров ARM. В отличие от мноrих друrих полупроводниковых компаний, компания ARM не занимается ни изrотовлением процессоров, ни продажей микросхем. Вместо этоrо ARM предлаrает своим бизнеспартнёрам, в числе которых большинство ведущих мировых полупроводниковых компаний, лицензии на использование разработанных ею процессорных ядер. На основе дe шёвых и экономичных решений от ARM её партнёры создают собственные про цессоры, микроконтроллеры и системы на кристалле. Такая бизнесмодель назы вается лицензированием интеллектуальной собственности (Intellectual Property  IP). Помимо процессорных ядер, компания ARM также лицензирует IРблоки си cTeMHoro уровня и различные проrраммные решения. Для поддержки своей про дукции компания ARM предлаrает разнообразные аппаратные и проrраммные средства, призванные облеrчить партнёрам создание собственных продуктов. 1.2.2. Версии архитектуры На протяжении Bcero времени cBoero существования компания ARM продол жала разработку новых процессоров и системных блоков. Эволюция функцио нальных возможностей и постепенное совершенствование процессоров привело к последовательному появлению нескольких версий архитектуры ARM. Причём, что интересно, номера версий архитектуры никак не привязаны к обозначениям процессоров. Скажем, в основе процессора ARM7TDMI лежит архитектура ARMv4T (буква «Т» указывает на поддержку набора команд ThumЬ Ф ). Архитектура ARMv5E была реализована в процессорах семейства ARM9, в частности в процессорах ARM936ES и ARM946ES. В этой версии архитектуры появилась поддержка «расширенных» команд цифровой обработки сиrналов, предназначенных для реализации мультимедиаприложений. Процессоры следующеrо поколения ARMll имели уже новую архитектуру  ARMv6. В данной версии архитектуры была улучшена подсистема памяти и поя вилась поддержка мультимедийных SIМDкоманд. Архитектуру ARMv6, в част ности, имеют процессоры ARMI136J(F)S, ARMl156T2(F)S и ARMI176JZ(F)S. Буквально сразу же после выпуска на рынок семейства ARMll руководство компании пришло к выводу, что мноrие новые технолоrии, в частности оптими зированный набор команд Thumb2, были бы востребованы и в бюджетных cer ментах рынков микроконтроллеров и компонентов для автомобильной электро ники. Также было принято решение о необходимости разработки процессорных архитектур, которые бы максимально полно удовлетворяли требованиям KOH кретных классов приложений. Наличие таких архитектур позволило бы созда вать как содержащие малое число вентилей процессоры для cerMeHToB рынка, критичных к стоимости компонентов, так и высокопроизводительные и MHoro функциональные процессоры для устройств BepxHero ценовоrо диапазона. За последние несколько лет компания ARM значительно расширила HOMeH клатуру своей продукции путём диверсификации процесса разработки ЦП 
1.2. ARM  компания и архитектура · 13 в новой версии в рамках единой архитектуры было выделено три подсемейства (профиля): . Профuль А  для высокопроизводительных открытых платформ. . Профuль R  для мноrофункциональных встраиваемых систем, работающих в режиме реальноrо времени. . Профuль М  для встраиваемых систем на базе микроконтроллеров. Рассмотрим сферы применения различных профилей более подробно: . Профuль А (ARMv7A)  прикладные процессоры, предназначенные для под держки сложных приложений, в частности «тяжёлых» встраиваемых опера ционных систем, таких как Symbian, Linux и Windows Embedded. От этих про цессоров требуются максимальная вычислительная мощность, поддержка си стемы виртуальной памяти посредством модулей управления памятью (MMU) и, по возможности, расширенная поддержка языка Java и обеспечение безопасной среды выполнения проrраммы. В качестве примера целевых устройств можно указать дороrие мобильные телефоны и электронные KO шельки для проведения финансовых операций. . Профuль R (ARMv7R)  высокопроизводительные процессоры, предназна ченные для создания устройств, работающих в условиях жёсткоrо реальноrо времени!), таких как системы торможения современных автомобилей и KOH троллеры жёстких дисков. Подобные приложения требуют большой вычисли тельной мощности, высокой надёжности и как можно меньшей латентности. . Профuль М (ARMv7M)  процессоры для бюджетных приложений, в KOTO рых, помимо высокой производительности, критичными являются такие па раметры, как стоимость, энерrопотребление, время реакции на прерывания и простота использования, а также процессоры для систем управления произ водственными процессами, в том числе систем управления реальноrо BpeMe ни. Семейство Cortex является первым семейством, имеющим архитектуру у7, при этом процессор CortexM3 основан на профиле ARMv7M, предназначенном для микроконтроллеров. Эта книrа посвящена процессоруСоrtехМ3, но не стоит забывать, что данный процессор является Bcero лишь одним из представителей семейства, имеющеrо архитектуру ARMv7. Помимо CortexM3, существует ещё CortexA8 (прикладной процессор), основанный на профиле ARMv7A, и CortexR4 (процессор реальноrо времени), основанный на профиле ARMv7R (Рис. 1.2). l)Вообщето это большой вопрос, можно ли получить систему «реальноrо времени», используя процессоры общеrо назначения. По определению, термин «реальное время» означает, что система может получить отклик в течение rарантированноrо интервала времени. В любых системах, основанных на использовании процессоров, возможность получения или неполучения TaKoro отклика будет зависеть от выбранной ОС, величины задержки обработки прерываний или от времени доступа к памяти, не rоворя уже о том, что в требуемый момент времени процессор может быть занят обработкой прерывания с более высоким приоритетом. 
14 . rлава 1. Введение Архитектура у4/У4Т Архитектура У5/у5Е Архитектура v6 Архитектура у7 v7A (Application) Например, CortexA8 v7R (RealTime) Например, CortexR4 АRМ7ТDМI, 920Т, IntelStrongARM ARMl136,1176, 1156T2 rl I Архитектура yM I I I I I I I I I I CortexMO, I I CortexM 1 (FPGA) I I I Рис. 1.2. Эволюция архитектуры процессоров ARM. y7M (Microcontroller) Например, CortexM3 Примеры ARM926, 946, 966, Intel XScale Архитектура ARMv7M подробно описана в руководстве [2]. Этот документ можно свободно заrрузить с вебсайта компании ARM после несложной реrи страции. В данном документе подробно рассмотрены следующие ключевые эле менты архитектуры: · модель проrраммирования; · набор команд; · модель памяти; · архитектура отладки. Информация, относящаяся к рассматриваемому нами процессору, скажем дe тальное описание ero интерфейса и значения временных параметров, содержит ся в справочном руководстве [1]. Данный документ можно свободно заrрузить с вебсайта компании. В руководстве по процессору CortexM3 также описыва ются некоторые особенности реализации ядра, не указанные в спецификации ap хитектуры. В частности, в этом документе приводится список поддерживаемых команд, поскольку не все команды, описанные в спецификации ARMv7M, явля ются обязательными к реализации в устройствах, имеющих данную архитектуру. 1.2.3. Обозначения процеССОрО8 е caMoro начала компания ARM использовала для обозначения своих процес соров порядковые номера. Для указания индивидуальных особенностей процес соров в 90x rодах ИСПОЛЬЗ0вались буквенные суффиксы. Например, в обозначе нии процессора ARM7TDMI буква «Т» указывает на поддержку набора команд Thumb, «D» указывает на возможность отладки по интерфейсу JT AG, «М» означа ет наличие быстроrо умножителя, а «1»  наличие BCTpoeHHoro модуля ICE. Поз же было принято решение сделать все эти возможности стандартными для буду щих процессоров, и надобность в подобных суффиксах отпала. Взамен была раз работана новая схема обозначений, отражающая различия в реализации интер фейса памяти, кэшпамяти и тесно связанной памяти (тем). 
1.2. ARM  компания и архитектура . 1S Например, процессорам ARM с кэшпамятью и MMU были присвоены коды 26 или 36, тоrда как процессоры с MPU получили код 46 (например, ARM946E5). Кроме Toro, были введены новые суффиксы, отражающие использование TeXHO лоrии синтезируемоrо 1 ) кода (5) и технолоrии Jazelle (J). Различные названия про цессоров сведены в Табл. 1.1. Таблица 1.1. Обозначении процессоров ARM Название Версия Возможности по управлению Прочие возможности процессора архитектуры памятью ARM7TDMI ARMv4T   ARM7TDMIS ARMv4T   ARM7EJS ARMv5E  DSP, J azelle ARM920T ARMv4T MMU  ARM922T ARMv4T MMU  ARM926EJS ARMv5E MMU DSP, J azelle ARM946E..S ARMv5E MPU DSP ARM966ES ARMv5E DSP  ARM968ES ARMv5E  DMA, DSP ARM966HS ARMv5E MPU (опция) DSP ARMI020E ARMv5E MMU DSP ARMI022E ARMv5E MMU DSP ARMI026EJ"S ARMv5E MMU или MPU DSP, J azelle ARMl136J(F)S ARMv6 MMU DSP, J azelle ARMl176JZ(F)S ARMv6 MMU + TrustZone DSP, J azelle ARMll MPCore ARMv6 MMU + поддержка DSP, J azelle мноrопроцессорноrо кэша ARMl156T2(F)S ARMv6 MPU DSP CortexMO ARMv6M  NVIC CortexMl ARMv6M FPGA ТСМинтерфейс NVIC Cortex М3 ARMv7..M MPU (опция) NVIC Cortex R4 ARMv7R MPU DSP CortexR4F ARMv7R MPU DSP + поддержка операций с плавающей точкой DSP, Jazelle, NEON + CortexA8 ARMv7..A MMU + TrustZone поддержка операций с плавающей точкой MMU + TrustZone + поддержка DSP, Jazelle, NEON + CortexA9 ARMv7A мноrопроцессорных поддержка операций конфиrураций с плавающей точкой 1) Синтезируемое процессорное ядро поставляется в виде поведенческоrо описания, выполненноrо на языке описания аппаратуры, таком как Verilog или VHDL. Посредством проrраммысинтезатора это описание может быть преобразовано в список соединений (электрическую схему) процессора. 
16 . Тлава 1. Введение Начиная с 7й версии архитектуры, компания решила полностью отказаться от этой сложной числовой схемы, требующей расшифровки, и перешла к исполь зованию названий семейств процессоров, первым из которых стало семейство Cortex. Помимо указания на совместимость между отдельными процессорами, эта система исключает путаницу между номером версии архитектуры и число вым кодом, обозначающим семейство. К примеру, популярный процессор ARM7TDMI имеет архитектуру v4T, а вовсе не v7, как можно ошибочно предпо ложить. 1.3. Развитие набора команд Совершенствование и расширение наборов команд, используемых в процес сорах ARM, было одной из основных причин появления новых версий архитек туры (Рис. 1.3). ДRM v4 v4T v5 v5E vб v7 / / / Добавлены Добавлены SIМDкоманды  «расширенные» И по.цдержка команды цое подсистемы памяти у6 / / Представлена ./ технолоrия i/ Thumb2 Реализован набор команд Thumb Thumb  Эволюция архитектуры Рис. 1.3. Развитие набора команд. Исторически сложилось (начиная с ARM7TDMI), что процессоры ARM под держивают два различных набора команд: 32битный набор команд ARM и 16битный набор команд 1humb. При выполнении проrраммы процессор MO жет «на лету» переключаться между состояниями ARM и 1humb для использова ния Toro или иноrо набора команд. Набор команд 1humb является Bcero лишь подмножеством команд ARM, однако он обеспечивает б6льшую плотность кода, что немаловажно для устройств, имеющих память небольшоrо объёма. По мере появления новых версий архитектуры в обоих наборах команд появ лялись новые инструкции. Некоторые сведения об изменении набора команд 1humb в процессе эволюции архитектуры приведены в Приложении Б. В 2003 ro ду компания ARM анонсировала набор команд 1humb2, являющийся расшире нием набора команд 1humb и содержащий как 16, так и 32битные команды. 
1.4. Технолоzuя 7humb2 и архитектура набора команд · 17 Подробная информация о системе команд содержится в справочном PYKOBOД стве по архитектуре ARM «Тhe ARM Architecture Refereпce Maпual», также называ емом «ARM ARM». Этот документ обновлялся одновременно с выпуском на pы нок очередной архитектуры ARMv5, ARMv6 и ARMv7. С появлением архитекту ры ARMv7 это руководство было разбито на отдельные документы изза появле ния различных профилей. Собственно набор команд процессора CortexM3 под робно описан в руководстве [2]. Вся информация, касающаяся набора команд, KO торая необходима для разработки проrраммноrо обеспечения, также приведена в Приложении А данной книrи. 1.4. Технолоrия Thumb..2 и архитектура набора команд Внедрение технолоrии 1humb21) значительно расширило архитектуру систе мы команд (Instruction Set Architecture  ISA) 1humb и позволило получить BЫ сокоэффективный и мощный набор команд, обладающий серьёзными преиму ществами перед своим предшественником в части простоты использования, плотности кода и производительности (Рис. 1.4). Расширенный набор команд 1humb2 является надмножеством 16битноrо набора команд 1humb, в который были добавлены как дополнительные 16битные, так и новые 32битные KOMaH ды. Новый набор команд позволяет выполнять в состоянии 1humb более слож ные операции, обеспечивая, таким образом, большую эффективность за счёт уменьшения числа переключений между состояниями ARM и 1humb. ... ,; ,; " " / I I I I \ \ \ \ , , .... ... ... ... СоrtехМЗ  Архитектура ARMv7M Технолоrия Thumb2, З26итные и 1 б6итные команды Thumb ............ ........ ........--....----........--........ Рис. 1.4. Взаимосвязь между наборами команд 1humb и 1humb2. В связи с тем, что процессор CortexM3 рассчитан на применение в устрой ствах с малыми объёмами памяти, таких как микроконтроллеры, а также с целью уменьшения занимаемой им площади кристалла данный процессор поддержива ет только набор команд 1humb2 (наряду с традиционным 1humb). Поэтому CortexM3 использует команды набора 1humb2 для выполнения любых опера ций, тоrда как прежним процессорам для выполнения некоторых операций при ходилось задействовать команды ARM. Как следствие, между процессором 1) Thumb и Thumb2 являются зареrистрированными товарными знаками компании ARM. 
18 . Тлава 1. Введение CortexM3 и традиционными процессорами ARM отсутствует обратная COBMe стимость. То есть процессор CortexM3 не сможет выполнить код) предназначен ный для процессора ARM7. В то же время CortexM3 может выполнять практиче ски все 16битные команды набора Thumb) включая все команды) поддерживае мые семейством ARM7, что облеrчает перенос приложений. С появлением набора 1humb2) содержащеrо как 16) так и 32битные KOMaH ды) отпала необходимость в переключении процессора между состояниями 1humb (16битные команды) и ARM (32битные команды). Так) в случае исполь зования процессора семейства ARM7 или ARM9) для выполнения сложных BЫ числений или большоrо числа условных операций без потери производительно сти моrло потребоваться переключение в состояние ARM. При использовании же процессора CortexM3 вы можете свободно смешивать 32битные и 16битные KO манды без необходимости смены состояния, получая без всяких проблем BЫCO кую плотность кода и высокую производительность. Набор команд 1humb2  очень важный элемент архитектуры ARMv7. По сравнению с командами) поддерживаемыми процессорами семейства ARM7 (ap хитектура ARMv4T)) набор команд процессора CortexM3 имеет MHoro новых возможностей. Прежде Bcero) это команда аппаратноrо деления и несколько KO манд аппаратноrо умножения) позволяющие ускорить сложные вычисления. Кроме Toro) процессор CortexM3 поддерживает обращение к невыровненным данным (ранее эта возможность имелась только в самых старших процессорах). 1.5. Области применения процессора Cortex..M3 Имея высокую производительность) обеспечивая высокую плотность кода и занимая небольшую площадь на кристалле) процессор CortexM3 является иде альным выбором для самых различных приложений: · НедОРО2ие микроконтроллеры. Процессор CortexM3 замечательно подходит для создания недороrих микроконтроллеров) повсеместно используемых в ca мых разных потребительских товарах  от иrрушек до электроприборов. На этом рынке существует очень сильная конкуренция со стороны широко pac пространенных 8 и 16битных микроконтроллеров друrих производителей. Малая мощность) потребляемая процессором CortexM3) ero высокая произ водительность и простота применения стимулирует переход разработчиков встраиваемых устройств на 32битную платформу и разработку изделий уже на базе архитектуры ARM. · Автомобильная электроника. Ещё одной областью применения, как будто специально созданной для процессора CortexM3) является автомобильная промышленность. Процессор CortexM3 имеет очень высокую производи тельность и малое время реакции на прерывания) что позволяет использовать ero в системах реальноrо времени. Поддержка процессором до 240 внешних прерываний) наличие в нём BCTpoeHHoro контроллера с поддержкой вложен ных прерываний) а также наличие опциональноrо модуля MPU делает CortexM3 идеальным кандидатом на использование в чувствительных к CTO 
1.6. Структура KHUZU . 19 имости устройствах автомобильной электроники с высокой степенью инте rрации. . Передача данных. Малое энерrопотребление процессора и ero высокая эффек тивность) а также наличие команд работы с битовыми полями) появившими ся В наборе 1humb2) делает CortexM3 идеальным выбором для большинства коммуникационных приложений) таких как Bluetooth и ZigBee. . Автоматизация производства. Ключевыми факторами для устройств управ ления промышленным оборудованием являются простота) время реакции и надёжность. И опять же) наличие в процессоре CortexM3 продвинутоrо контроллера прерываний) малое время реакции на прерывание и расширен ные средства обеспечения отказоустойчивости делают этот процессор OCHOB ным кандидатом на использование в данной области. . Потребительские товары. Во мноrих потребительских товарах используется один или несколько высокопроизводительных микропроцессоров. Процессор CortexM3) будучи небольшим по размеру) имеет высокую эффективность и малое энерrопотребление. Кроме Toro) этот процессор поддерживает выпол нение сложноrо проrраммноrо обеспечения) рассчитанноrо на использование модуля MPU) обеспечивая надёжную защиту памяти. На рынке уже предлаrается MHoro изделий) содержащих процессор CortexM3) включая устройства начальноrо уровня) стоимость которых не превышает OДHO ro доллара США. То есть стоимость микроконтроллеров ARM сравнялась или дa же опустилась ниже стоимости большинства 8битных микроконтроллеров. 1.6. Структура книrи Данная книrа содержит общую информацию о процессоре CortexM3) KOTO рая структурирована следующим образом: . [лавы 1 и 2  Введение и обзор CortexM3. . [лавы 3...6  Основы CortexM3. . [лавы 7...9  Исключительные ситуации и прерывания. . [лавы 10 и 11  Проrраммирование CortexM3. . [лавы 11...14  Аппаратные особенности CortexM3. . [лавы 15 и 16  Поддержка отладки в CortexM3. . [лавы 17.. .21  Разработка приложений с использованием CortexM3. . Приложения. 1.7. Дополнительная литература Эта книrа никоим образом не является исчерпывающим руководством по процессору CortexM3. Цель данной книrи  предоставить начальные сведения тем, кто впервые сталкивается с CortexM3, а также служить дополнительным справочником для разработчиков, использующих микроконтроллеры с ядром CortexM3. Для получения более подробных сведений о процессоре CortexM3 следует обращаться к фирменной документации) которую можно заrрузить с веб сайта компании ARM (www.arт.coт) и вебсайтов её партнёров: 
20 · Тлава 1. Введение · Справочное руководство «Тhe CortexM3 Techпical Refereпce Maпual» [1] coдep жит полную информацию о процессоре) в том числе о модели проrраммиро вания) карте памяти) а также о времени выполнения команд. · Справочное руководство «Тhe ARMv7M Architecture Applicatioп Level Refereпce Maпual» [2] содержит детальную информацию о наборе команд и модели па мяти. · Справочная документация (datasheet) на конкретные микроконтроллеры с ядром CortexM3. Эту документацию можно найти на вебсайте изrотовите ля Toro микроконтроллера, который вы намереваетесь использовать. · Руководства пользователя «CortexM3 User Guide» предоставляются произво дителями микроконтроллеров. В ряде случаев этот документ является частью общеrо руководства на микроконтроллер. В руководстве пользователя) KOTO рое адаптируется каждым производителем в соответствии с конкретными pe ализациями их микроконтроллеров) описывается модель проrраммирования процессора CortexM3 и приводится подробное описание набора команд. · Спецификация «АМБА Speci.ficatioп 2.0» [4] содержит полную информацию о реализации протокола внутренней системной шины АМВА. · Руководство по применению «AN179. CortexM3 Eтbedded Software Developтeпt» [7]) предлаrаемое компанией ARM) содержит полезные советы, касающиеся проrраммирования процессора CortexM3 на языке Си. Данная книrа рассчитана на тех читателей) которые уже имеют некоторый опыт в проrраммировании встраиваемых систем) предпочтительно для процес соров ARM. Если же вы, будучи менеджером или студентом, хотите Bcero лишь ознакомиться с процессором CortexM3 и не желаете тратить время на чтение всей книrи или изучение справочноrо руководства по процессору, то peKOMeH дую прочитать вторую rлаву) в которой приводятся основные сведения о процес соре CortexM3. 
rЛАВА 2 ОБ30Р CORTEX..M3 2.1. Основные сведения Процессор СоrtехТММ3 представляет собой 32битный микропроцессор. Он имеет 32битную шину данных, 32битный банк реrистров и 32битные интер фейсы памяти (Рис. 2.1). СоrtехМЗ Ядро процессора Прерывания о. о I--ct ", :J: 0.",  :s: о 3 Q) с{ АЛУ s  со О а. s u u  а. ..... u 'S Q) -е- а. Q) .....  :s: Система отладки Трассировка ):S: :s: :J: ", CD ::о о. Q) о. .......... E::U 0. > Q)z с:::: .......... с:: о о. 1-- :J: О  :s:  o.ct ож 'f2", .й СЮ О 5 с:::: LQ Банк реrистров Интерфейс памяти Шина команд Модуль защиты памяти (MPU) Шина данных Интерфейс отладки Отладка Межшинные соединения Память проrрамм Подсистема памяти и периферийные устройства Собственные периферийные устройства Опциональные компоненты Рис. 2.1. Упрощённая блоксхема CortexM3. Процессор выполнен по rарвардской архитектуре) т.е. имеет раздельные ши ны команд и данных. Это позволяет осуществлять выборку команд OДHOBpeMeH но с обращением к данным. В результате увеличивается производительность процессора) поскольку операции доступа к данным никак не влияют на конвейер команд. Это позволило реализовать в процессоре Cortex М3 несколько шинных интерфейсов) каждый из которых оптимизирован для выполнения определён ных функций и, В то же время, может использоваться одновременно с друrими 
22 . Тлава 2. Обзор CortexM3 интерфейсами. При этом шины команд и данных разделяют одно и то же aдpec ное пространство (единая система памяти). Друrими словами) наличие раздель ных шинных интерфейсов вовсе не означает) что вы сможете использовать па мять размером 8 [байт. Для поддержки сложных приложений) требующих более развитой системы памяти) в процессоре CortexM3 предусмотрены опциональный модуль защиты памяти (Memory Protection Unit  MPU) и возможность использования внешней кэшпамяти. Поддерживаются системы памяти) использующие как прямой (little endian)) так и обратный (big endian) порядок байтов. В составе процессора CortexM3 имеется ряд встроенных компонентов отлад ки. Эти компоненты осуществляют поддержку основных отладочных операций и возможностей) таких как точки останова (breakpoints) и точки наблюдений (watchpoints). Предусмотрены и опциональные компоненты) поддерживающие расширен ные возможности отладки) в частности трассировку команд) а также различные типы отладочных интерфейсов. 2.2. Реrистры Процессор CortexM3 имеет 16 реrистров с RO по R15 (Рис. 2.2). При этом pe rистр R13 (указатель стека) реализован в виде банка из двух реrистров (в каждый момент времени доступен только один из реrистров). Реrистр RO Rl R2 RЗ R4 R5 Rб R7 R8 R9 Rl0 Rll R12 RlЗ(  RlЗ (PSP) R14 I R15 I Функции Реrистр 06щеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр 06щеrо назначения Реrистр 06щеrо назначения Реrистр 06щеrо назначения Реrистр общеrо назначения Реrистр 06щеrо назначения Реrистр 06щеrо назначения Реrистр 06щеrо назначения Реrистр 06щеrо назначения Реrистр 06щеrо назначения Реrистр 06щеrо назначения Указатель OCHOBHoro стека (MSP), Указатель стека процесса (PSP) Младшие реrистры Старшие реrистры Реrистр связи (LR) Счтчиккоманд(РС) Рис. 2.2. Pezucтpbl процессора Cortex М3. 
2.2. Pezucтpbl · 23 2.2.1. RO...R12....... реrистры общеrо назначения Реrистры с RO по R12 являются 32битными реrистрами общеrо назначения) предназначенными для хранения обрабатываемых данных. Некоторые 16бит ные команды Thumb@ MorYT обращаться только к младшим реrистрам (RO...R7). 2.2.2. R13 ....... указатели стека Процессор CortexM3 содержит два указателя стека (RI3). Они объединены в банк) поэтому в каждый момент времени виден только один из них: . Основной указатель стека (Main Stack Pointer  MSP)  указатель стека) ис пользуемый ядром операционной системы и обработчиками исключитель ных ситуаций. . Указатель стека процесса (Process Stack Pointer  PSP)  указатель стека) ис пользуемый прикладной проrраммой. Два младших бита указателей стека всеrда сброшены в О) т.е. эти указатели всеrда выровнены на rраницу 32битноrо слова. 2.2.3. R14 ....... реrистр связи в этом реrистре при вызове подпроrраммы запоминается адрес возврата. 2.2.4. R15 ....... счётчик команд Счётчик команд (Program Counter  РС) содержит адрес выполняемой в дaH ный момент команды. Этот реrистр может быть изменён для управления ходом выполнения проrраммы. 2.2.5. Реrистры специальноrо назначения в процессоре CortexM3 также имеется несколько реrистров специальноrо Ha значения (Рис. 2.3): . реrистры состояния проrраммы (xPSR); . реrистры маскирования прерываний (PRIMASK) FAULTMASK и BASEPRI); . реrистр управления (CONTROL). Эти реrистры выполняют специальные функции и для обращения к ним необ ходимо использовать особые команды. Указанные реrистры не MorYT задейство ваться для обработки и хранения обычных данных (Табл. 2.1). Реrистр Функции xPSR Реrистры состояния nporpaMMbI PRIMASK Реrистрымаскирования прерываний Реrистры специальноrо назначения FAULTMASK BASEPRI CONTROL Реrистр управления Рис. 2.3. Pezucтpbl специальноzо назначения процессора CortexM3. 
24 · Тлава 2. Обзор CortexM3 Таблица 2.1. Реrистры специальноrо назначения и их функции Реrистр Назначение Содержат флаrи результатов выполнения арифметических и лоrических xPSR операций (флаr нуля и флаr переноса), состояние выполнения проrраммы и номер обрабатываемоrо в данный момент прерывания PRIMASK Запрещает все прерывания, за исключением немаскируемоrо прерывания (NMI) и исключения Hard Fault FAULTMASK Запрещает все прерывания, за исключением NMI BASEPRI Запрещает все прерывания, имеющие уровень приоритета, равный или меньший заданноrо CONTROL Определяет уровень доступа и используемый указатель стека Примечание. Более подробно эти реrистры рассмотрены в [лаве 3. 2.3. Режимы работы Процессор CortexM3 имеет два режима работы и поддерживает два уровня доступа к коду проrраммы. Режимы работы 1hread (режим потока) и Handler (pe жим обработчика) определяют, какой код выполняет процессор в данный момент времени  код обычной проrраммы или же код обработчика исключительной ситуации, такой как прерывание или системное исключение (Рис. 2.4). Два ypOB ня доступа к коду (привилеrированный и пользовательский) обеспечивают безо пасное обращение к критическим областям памяти, а также реализуют базовую модель механизма защиты. При выполнении обработчика исключительной ситуации При выполнении прочеzо кода (например, основной пpozpaMMbI) Привипеrиро ванный доступ Режим обработчика (Handler) Режим потока (rh read) Непривипеrиро ванный доступ Рис. 2.4. Режимы работы и уровни доступа к коду процессора CortexM3. При работе процессора в режиме потока допускается как привилеrированное, так и непривилеrированное выполнение проrраммы, тоrда как обработка исклю чительных ситуаций всеrда осуществляется на привилеrированном уровне. После сброса процессор находится в режиме потока справами привилеrированноrо дo ступа к коду. В состоянии привилеrированноrо доступа проrрамма может обра щаться к любым областям памяти (за исключением тех, доступ к которым запре щён настройками модуля MPU) и использовать все поддерживаемые команды. Проrраммное обеспечение, выполняющееся на привилеrированном уровне, может переключиться на пользовательский уровень, используя реrистр управле ния. В случае возникновения исключительной ситуации процессор автоматиче ски переключится на привилеrированный уровень, а при выходе из обработчи ка  вернётся на исходный. Пользовательская проrрамма не может самостоя тельно переключиться на привилеrированный уровень посредством записи в pe rистр управления (Рис. 2.5). Для этоrо необходим обработчик исключительной ситуации, который заrрузит в реrистр управления такое значение, чтобы при 
2.4. Встроенный контроллер вложенных векторных прерываний · 2S возврате в режим потока процессор переключился на привилеrированный ypo вень. Начало ( сброс) Рис. 2.5. Диаzрамма допустимых переходО8 между режимами работы процессора CortexM3. Наличие двух уровней доступа увеличивает надёжность системы, запрещая непроверенному коду доступ к реrистрам, определяющим конфиrурацию систе мы. При наличии модуля MPU он может использоваться совместно с привилеrи рованным уровнем доступа для защиты критических секций памяти, например содержащих исполняемый код и данные ядра ОС. Так, на привилеrированном уровне доступа, обычно используемом ядром операционной системы, допускается обращение к любым областям памяти, не за блокированным настройками модуля MPU. При запуске системой пользователь cKoro приложения, оно, в большинстве случаев, выполняется на непривилеrиро ванном (пользовательском) уровне, что позволяет защитить систему от возник новения сбоев изза HeKoppeKTHoro функционирования пользовательских про rpaMM. 2.4. Встроенный контроллер вложенных v векторных прерывании в составе процессора CortexM3 имеется контроллер вложенных векторных прерываний (Nested Vectored Interrupt Controller  NVIC). Он тесно связан с ядром процессора и выполняет следующие функции: . поддержка вложенных прерываний; . поддержка векторных прерываний; . поддержка динамическоrо изменения приоритетов; . уменьшение задержки обработки прерывания; . маскирование прерываний. 2.4.1. Поддержка ВI10женных прерываний Контроллер NVIC обеспечивает поддержку вложенных прерываний. Всем внешним прерываниям и большинству системных исключений MorYT быть Ha значены различные уровни приоритета. При возникновении прерывания KOH троллер сравнивает ero приоритет с приоритетом прерывания, обрабатываемоrо 
26 . fлава 2. Обзор CortexM3 в данный момент. Если новое прерывание имеет более высокий приоритет, то об работка текущеrо прерывания приостанавливается и запускается обработчик HOBoro прерывания. 2.4.2. Поддержка векторных прерываний в процессоре CortexM3 реализована поддержка векторных прерываний. В случае возникновения разрешённоrо прерывания стартовый адрес COOTBeT ствующей процедуры обработки прерывания (Interrupt Service Routine  ISR) бе рётся из таблицы векторов, расположенной в памяти. Причём, определение CTap TOBoro адреса ISR и переход на Hero осуществляется полностью аппаратно, что ускоряет обслуживание запроса прерывания. 2.4.3. Поддержка динамическоrо изменения приоритетов Уровни приоритета прерываний MorYT изменяться проrраммно. При этом aK тивация обслуживаемых в данный момент прерываний блокируется до выхода из процедуры обработки прерывания, что исключает нежелательный повторный вызов обработчиков прерываний при изменении приоритетов. 2.4.4. Уменьшение времени реакции на прерывание в процессоре CortexM3 также реализованы определённые решения, позволя ющие уменьшить задержку обработки прерываний. Это автоматическое coxpa нение и восстановление содержимоrо некоторых реrистров, уменьшение задерж ки при переходе от одной процедуры обработки прерывания к друrой, а также обработка «опоздавших» прерываний. Более подробно эти возможности процес сора рассматриваются в [лаве 9. 2.4.5. Маскирование прерываний Прерывания и системные исключения MorYT быть маскированы в COOTBeT ствии с их уровнями приоритета или же полностью при помощи реrистров Ma скирования BASEPRI, PRIMASK и FAULTMASK. Эти реrистры MorYT использо ваться для Toro, чтобы исключить прерывание cTporo оrраниченных во времени задач, тем самым rарантируя их своевременное завершение. 2.5. Карта памяти в процессоре CortexM3 используется фиксированное распределение aдpec Horo пространства. Это позволяет обращаться к встроенным периферийным устройствам, таким как контроллер прерываний и компоненты системы отладки, посредством обычных команд доступа к памяти. То есть большинство системных функций можно использовать напрямую из проrрамм, написанных на языке Си. Предопределённая карта памяти также обеспечивает чрезвычайно высокую CKO рость работы процессора и облеrчает ero интеrрацию в системы на кристалле (System оп а Chip  SoC). 
2.6. Интерфейсы шин · 27 Распределение общеrо адресноrо пространства размером 4 rбайт показано на Рис. 2.6. OxFFFFFFFF ОхЕООООООО OxDFFFFFFF ОхАООООООО Ox9FFFFFFF Ох60000000 Ox5FFFFFFF Ох40000000 ОхЗFFFFFFF Ох20000000 Ox1FFFFFFF ОхОООООООО Системная область Внешние устройства Внешнее ОЗУ Периферийные устройства СОЗУ Код Собственная периферия, включая встроенный контроллер прерываний (NVIC), реrистры управления MPU и компоненты отладки Используется внешними периферийными устройствами Используется внешней памятью Используется различными периферийными устройствами Используется, в основном, внутренним статическим ОЗУ Используется, в основном, для хранения кода проrраммы. После включения процессора содержит также таблицу векторов прерываний Рис. 2.6. Карта памяти процессора CortexM3. Процессор CortexM3 имеет внутреннюю шинную инфраструктуру, которая оптимизирована для использования памяти, распределённой в соответствии с Рис. 2.6. Кроме Toro, конструкция процессора позволяет задействовать указан ные области различным образом. Так, память данных может быть размещена в секции кода, а код проrраммы может запускаться из секции внешнеrо 03 В системных областях памяти располаrаются контроллер прерываний и KOM поненты отладки. Эти устройства имеют фиксированные адреса, полная инфор мация о которых приведена в rлаве 5. Размещение этих периферийных устройств по фиксированным адресам значительно облеrчает перенос приложений между микроконтроллерами различных производителей. 2.6. Интерфейсы шин в процессоре CortexM3 реализовано несколько шин, что позволяет ему ocy ществлять выборку команд одновременно с обращением к данным. Можно Bыдe лить следующие основные интерфейсы шин: . шины памяти кода; . системная шина; . шина собственных периферийных устройств. 
28 · rлава 2. Обзор CortexM3 Шины памяти кода предназначены для обеспечения доступа к одноимённой области памяти и физически реализованы в виде двух шин, называемых ICode и DCode. Такое решение позволило уменьшить время выборки команд, увели чив тем самым быстродействие процессора. Системная шина используется для доступа к памяти и периферийным устрой ствам. С её помощью производятся обращения к статическому ОЗУ (СОЗУ), пе риферии, внешнему ОЗУ, внешним устройствам, а также к некоторым системным областям памяти. Шина собственных периферийных устройств обеспечивает доступ к опреде лённой части памяти, зарезервированной для использования встроенными пе риферийными устройствами процессора, такими как компоненты отладки. 2.7. Модуль защиты памяти MPU в процессоре CortexM3 предусмотрен опциональный модуль защиты памяти MPU. Этот модуль позволяет задавать правила доступа к памяти на привилеrи рованном и пользовательском уровнях. При нарушении правил доступа rенери руется исключение отказа, в обработчике KOToporo можно проанализировать проблему и, по возможности, скорректировать её. Модуль MPU можно задействовать различным образом. В общем случае ОС может настроить MPU для защиты данных, используемых ядром ОС и друrими привилеrированными процессами, от недостаточно надёжных пользовательских проrрамм. Помимо этоrо, модуль MPU может применяться для перевода опреде лённых областей памяти в режим «только для чтения», позволяя тем самым пре дотвратить случайное повреждение данных или же изолировать области памяти различных задач в мноrозадачной системе. В общем и целом, модуль MPU помо raeT повысить надёжность и отказоустойчивость встроенных систем. Модуль MPU является необязательным компонентом процессора, и решение о ero использовании принимается на этапе реализации микроконтроллера или системы на кристалле. Более подробно о модуле MPU рассказывается в [лаве 13. 2.8. Набор команд Процессор CortexM3 поддерживает набор команд Thumb2. Это одна из наи более важных особенностей процессора, поскольку позволяет совместно исполь зовать 16 и 32битные команды, обеспечивая одновременно как высокую эффек тивность, так и высокую плотность кода. Набор Thumb2  rибкий, мощный и при этом простой в использовании набор команд. В предыдущих процессорах компании ARM центральный процессор (ЦПУ) Mor находиться в одном из двух состояний: 32битном состоянии ARM и 16бит ном состоянии Thumb. В состоянии ARM все команды являются 32битными, что обеспечивает очень высокую производительность. В состоянии Thumb команды являются 16битными, позволяя получить более высокую плотность кода. OДHa ко эти команды имеют оrраниченную функциональность по сравнению с KOMaH дами ARM, поэтому для выполнения определённых операций может потребо ваться большее число команд. 
2.8. Набор команд . 29 Для использования преимуществ обоих состояний код большинства прило жений состоит из смеси команд ARM и Thumb. Однако такой подход не всеrда ce бя оправдывает. На переключение процессора между состояниями расходуется как время, так и место в памяти (Рис. 2.7). К тому же наличие двух наборов KO манд может потребовать разбиения исходноrо кода на отдельные файлы, каждый из которых будет скомпилирован с использованием соответствующеrо набора. Это усложняет разработку проrраммноrо обеспечения и уменьшает максималь ную производительность ядра ЦП Состояние Thumb (16битные команды) Основная nporpaMMa в состоянии Thumb  Издержки  Код, критичный ко Возврат времени выполнения, (например, ВХ LR) в состоянии ARM I il   I I Переход I со сменой состояния : (например, BLX) I I I I I Основная nporpaMMa в состоянии Thumb Состояние ARM (З2битные команды) I I I I I I I  I I I . Время Рис. 2.7. Переключение между состояниями ARM и 1humb 8 классическом процессоре ARM, таком как ARM7. С появлением набора команд Thumb2 стало возможным выполнять все необ ходимые операции, находясь в одном состоянии,  необходимость в переключе нии между двумя рабочими состояниями полностью исчезла. Следует отметить, что процессор CortexM3 вообще не поддерживает набор команд ARM. Даже пре рывания теперь обрабатываются в состоянии Thumb (ранее при входе в процеду ры обработки прерываний процессор переключался в состояние ARM). Посколь ку процессору Cortex  М3 не требуется переключаться между рабочими состояни  ями, он имеет ряд преимуществ по сравнению с традиционными процессорами ARM: . отсутствуют накладные расходы на переключения между состояниями, в pe зультате чеrо уменьшается время выполнения и размер кода проrраммы; . отсутствует необходимость разделения исходных файлов на файлы с кодом ARM и файлы с кодом Thumb, что облеrчает разработку проrрамм и их даль нейшее сопровождение; . упрощается достижение максимальной эффективности и производительно сти, что, в свою очередь, облеrчает разработку проrраммноrо обеспечения (не требуется перепрыrивать с одноrо набора команд на друrой, пытаясь достичь лучшеrо соотношения между размером кода и производительностью). Процессор CortexM3 поддерживает ряд интересных и мощных команд. Вот только некоторые из них: · UBFX, BFI и BFC  извлечение, вставка и очистка битовоrо поля; 
30 . fлава 2. Обзор CortexM3 . UDIV и SDIV  беззнаковое и знаковое деление; . WFE, WFI и SEV  ожидание события, ожидание прерывания и rенерация co бытия; эти команды используются для перевода процессора в режим пони женноrо энерrопотребления и для поддержки синхронизации между задача ми в мноrопроцессорных системах; . MSR и MRS  пересылка данных между реrистрами общеrо назначения и реrи страми специальноrо назначения. Поскольку процессор CortexM3 поддерживает только набор команд Thumb2, то для использования существующеrо кода, предназначенноrо для друrих про цессоров ARM, требуется ero перенос на новую архитектуру. В большинстве слу чаев процедура переноса заключается в перекомпиляции исходных текстов на языке Си с применением HOBoro компилятора, поддерживающеrо процессор CortexM3. Некоторые фраrменты проrраммы, написанные на ассемблере, при дётся переписать с учётом новой архитектуры и HOBoro унифицированноrо язы ка ассемблера. Обратите внимание, что в процессоре CortexM3 реализованы не все команды из набора Thumb2. В соответствии с [2] обязательным к реализации является только определённое подмножество команд Thumb2. В частности, в процессоре CortexM3 отсутствует поддержка команд сопроцессора (MorYT быть подключены внешние устройства обработки данных), а также не реализованы SIМDкоманды (один поток команд  несколько потоков данных). Кроме Toro, не поддержива ются некоторые команды Thumb, такие как команда перехода BLX (использова лась для переключения процессора из состояния Thumb в состояние ARM), ряд команд изменения состояния процесс а (CPS), а также команды изменения пред ставления мноrобайтных чисел (SETEND), появившиеся в архитектуре у6. Полный список поддерживаемых команд приведён в Приложении А. 2.9. Прерывания и исключения в процессоре CortexM3 реализована новая модель исключений, разработан ная для архитектуры ARMv7M. Данная модель отличается от классической MO дели исключений ARM и обеспечивает очень эффективную поддержку исключи тельных ситуаций. В этой модели предусмотрено несколько системных исключе ний плюс некоторое количество внешних запросов прерываний (входы внешних прерываний). В процессоре CortexM3 отсутствует быстрое прерывание FIQ, имеющееся в процессорах ARM7/ARM9/ARMI0/ARMll. С друrой стороны, он поддерживает приоритеты прерываний, а также вложенные прерывания. Поэто му не составляет никакоrо труда реализовать систему с поддержкой вложенных прерываний (прерывание с более высоким приоритетом может приостановить выполнение обработчика прерывания с более низким приоритетом), которые бу дут вести себя аналоrично прерыванию PIQ в предыдущих процессорах ARM. За поддержку прерываний в процессоре CortexM3 отвечает контроллер пре рываний NVIC. Помимо внешних прерываний, процессор также поддерживает несколько внутренних источников исключений, предназначенных, в частности, для обработки системных отказов. Соответственно, в процессоре имеется He сколько предопределённых типов исключений (Табл. 2.2). 
2.9. Прерывания и исключения · 31 Таблица 2.2. Типы исключений CortexM3 Номер Тип исключения Приоритет* Описание исключения О   Исключение отсутствует 1 Reset 3 (Наивысший) Сброс 2 NMI 2 Немаскируемое прерывание (вход внешнеrо немаскируемоrо прерывания) 3 Hard Fault 1 Любой отказ, если соответствующий обработчик не разрешён Отказ системы управления памятью; 4 MemManage Fault Проrраммируемый нарушение правил доступа, заданных модулем MPU, или обращение по некорректномуадресу 5 Bus Fault Проrраммируемый Отказ шины (отказ предвыборки или отказ данных) 6 U sage Fault Проrраммируемый Отказ проrраммы 7.. .10 Зарезервировано  Зарезервировано 11 SVCall Проrраммируемый Вызов супервизора Исключение монитора отладки (точки 12 Debug monitor Проrраммируемый останова, точки наблюдения или внешняя команда отладки) 13 Зарезервировано  Зарезервировано 14 PendSV Проrраммируемый Запрос системной службы 15 SYSTICK Проrраммируемый Системный таймер 16 IRQ #0 Проrраммируемый Внешнее прерывание NQO 17 IRQ #1 Проrраммируемый Внешнее прерывание NQl . . . . . . . . . . . . 255 IRQ #239 Проrраммируемый Внешнее прерывание NQ239 * Если допускает проrраммирование, то по умолчанию равен О. Примечание. Количество входов внешних прерываний определяется изrотовителями микросхем (поддерживается до 240 входов). Кроме Toro, CortexM3 имеет вход немаскируемоrо прерывания NMI, при активации KOToporo в обязательном порядке запускается обработчик немаскируемоrо прерывания. 2.9.1. Низкое знерrопотребпение и высокая знерrозффективность в процессоре CortexM3 применён ряд решений, позволяющих разработчи кам создавать экономичные и энерrоэффективные изделия. Прежде Bcero, это наличие двух режимов пониженноrо энерrопотребления, позволяющих исполь зовать различные стратеrии для уменьшения потребления во время простоя. BOBTOpЫX, снижению потребляемой мощности способствует относительно небольшое число лоrических вентилей, образующих процессор, а также опреде лённые схемотехнические решения, позволяющие уменьшить активность OT дельных ero узлов. Кроме Toro, процессор CortexM3 обеспечивает высокую плот насть кода, что снижает требования к объёму памяти проrрамм. В т'о же время все эти особенности позволяют ускорить выполнение различных задач обработ 
32 . rлава 2. Обзор CortexM3 ки данных и, соответственно, возврат процессора в спящий режим для сокраще ния энерrопотребления. В результате энерrоэффективность процессора CortexM3 оказывается лучшей, нежели у большинства 8 и 16битных микрокон троллеров. Во второй ревизии процессора CortexM3 появился новый модуль  контрол лер «пробуждающих» прерываний (Wakeup Interrupt Controller  WIC). Этот MO дуль позволяет отключать питание процессорноrо ядра с сохранением состояния процессора, а также обеспечивает практически мrновенный возврат процессора в активное состояние при возникновении прерывания. Подобная возможность позволяет использовать процессор CortexM3 во мноrих приложениях со CBepx низким потреблением, которые прежде моrли быть выполнены только на 8 или 16битных микроконтроллерах. 2.10. Возможности отладки Процессор CortexM3 поддерживает различные функции отладки, такие как управление процессом выполнения проrраммы, включая останов и пошаrовое исполнение, точки останова и точки наблюдения данных, обращение к реrистрам процессора и к памяти «на лету», профилирование и трассировку. Аппаратные средства отладки процессора CortexM3 базируются на архитек туре СоrеSight ТМ . В отличие от традиционных процессоров ARM, в самом ядре процессора интерфейс JTAG отсутствует. Вместо этоrо интерфейс отладки реали зован в виде отдельноrо модуля, для связи с которым в процессоре предусмотрен специальный интерфейс, называемый портом доступа к средствам отладки (Debug Access Port  DAP). С помощью указанноrо интерфейса внешние отлад чики MorYT обращаться как к реrистрам управления аппаратных средств отлад ки, так и к системе памяти даже во время выполнения процессором проrраммы. Управление данным интерфейсом осуществляется через внешний порт отладки (Debug Port  DP). В настоящее время реализованы следующие порты: Serial Wire JTAG Debug Port (SWJDP), поддерживающий как традиционный протокол JTAG, так и протокол SerialWire, и SWDP (поддерживает только протокол Serial Wire). Также можно использовать модуль JTAGDP из семейства продукции СоrеSight ТМ от ARM. Производители микроконтроллеров MorYT реализовать ин терфейс отладки на базе любоrо из указанных модулей. Для обеспечения возможности трассировки команд производители микро схем MorYT также включать в свои изделия модуль встроенной макроячейки тpac сировки (Embedded Trace Macrocell  ЕТМ). Трассировочная информация BЫBO дится через модуль интерфейса порта трассировки (Trace Port Interface Unit  TPIU). Далее информация о выполненных командах с помощью внешнеrо аппа paTHoro трассировщика передаётся хосту отладки, в качестве KOToporo обычно применяется персональный компьютер. В самом процессоре для запуска отладочных действий MorYT использоваться различные события. Источниками этих событий MorYT служить точки останова, точки наблюдения, отказы или сиrналы от внешнеrо отладчика. При возникнове нии любоrо из указанных событий процессор может либо перейти в режим OCTa нова, либо запустить обработчик исключения монитора отладки. 
2.11. Резюме. 33 Функция точек наблюдения данных реализуется модулем просмотра и тpac сировки данных (Data Watchpoint and Trace  DWT) процессора CortexM3. Этот модуль может быть задействован для останова процессора (или для запуска обра ботчика исключения монитора отладки) или же для rенерации информации о трассировке данных. При осуществлении трассировки соответствующая ин формация выводится через модуль TPIU. Следует отметить, что в архитектуре CoreSight единственный порт трассировки может использоваться совместно He сколькими устройствами трассировки. Помимо описанных базовых средств отладки, в процессоре CortexM3 также имеется модуль коррекции флэшпамяти и задания точки останова (Flash Patch and Breakpoint  FPB). Этот модуль может использоваться для установки про стых точек останова или же для переназначения адресов команд из области флэш памяти в область 03 Макроячейка инструментальной трассировки (Instrumentation Trace Macro сеll  ITM) предоставляет разработчику новый канал для передачи данных в OT ладчик. Данные, записываемые в реrистры модуля ITM, MorYT быть получены OT ладчиком по интерфейсу трассировки для их последующеrо отображения или обработки. Этот метод прост в использовании и более быстрый, нежели вывод по интерфейсу JTAG. Управление всеми указанными компонентами отладки осуществляется по шине интерфейса DAP процессора CortexM3 или же проrраммой, выполняемой процессором. Вся информация о процессе трассировки может быть получена из модуля TPIU. 2.11. Резюме Почему процессор CortexM3 считается революционным устройством? Какие преимущества даёт ero использование? Ответы на эти и аналоrичные вопросы можно найти в данном разделе. 2.11.1. Высокая производитепьность Процессор CortexM3 обеспечивает высокое быстродействие микроконтрол леров: . Большинство команд, включая команды умножения, выполняются за один такт. По данному параметру CortexM3 опережает большинство популярных микроконтроллеров. . Раздельные шины команд и данных позволяют одновременно выполнять опе рации выборки команд и обращения к данным. . Набор команд Thumb2 исключает непроизводительные издержки на пере ключение состояний процессора. Больше не нужно тратить время на переход между 32битным состоянием ARM и 16битным состоянием ТЬиmЬ, что YBe личивает скорость выполнения проrраммы и уменьшает её размер. ЭТО HOB шество также упрощает разработку проrраммноrо обеспечения, что, в свою очередь, сокращает время выхода продукции на рынок и облеrчает последую щее сопровождение кода. 
34 . rлава 2. Обзор CortexM3 · Набор Thumb2 является чрезвычайно rибким. Мноrие операции MorYT быть выполнены с использованием меньшеrо числа команд. Как следствие, CortexM3 обеспечивает большую плотность кода и требует меньше памяти для хранения проrрамм. · Выборка команд осуществляется 32битными словами, соответственно, за один такт может быть выбрано до двух команд. В результате обеспечивается более высокая пропускная способность для передачи данных. · Конструкция процессора CortexM3 позволяет создавать микроконтроллеры, работающие на высокой частоте (при использовании современных техпроцес сов  более 100 М[ц). Но даже при работе на той же частоте, что и большин ство друrих микроконтроллеров, CortexM3 имеет лучшее соотношение числа тактов на одну команду (CPI). Это позволяет выполнять большее число опера ций в пересчёте на меrаrерц тактовой частоты или же даёт возможность сни зить тактовую частоту для уменьшения энерrопотребления. 2.11.2. Развитые средства поддержки прерываний Средства поддержки прерываний в процессоре CortexM3 леrки в использо вании, обладают большой rибкостью и обеспечивают высокую производитель ность при обработке прерываний: · Встроенный контроллер прерываний NVIC поддерживает до 240 входов внешних прерываний. Поддержка векторных прерываний значительно YMeHЬ шает задержку обработки прерываний, поскольку выбор необходимоrо обра ботчика осуществляется полностью аппаратно. Кроме Toro, не требуется при беrать к проrраммным ухищрениям для обеспечения поддержки вложенных прерываний. · Процессор CortexM3 при входе в процедуру обработки прерывания aBTOMa тически сохраняет в стеке реrистры RO.. .R3, R12, LR, PSR и РС и извлекает их из стека при выходе из обработчика. Это уменьшает задержку обработки за про са прерывания и даёт возможность описывать обработчик прерывания в виде обычной функции на языке Си (см. [лаву 8). · Система прерываний является чрезвычайно rибкой, поскольку NVIC позво ляет задавать приоритет индивидуально для каждоrо прерывания. Поддер живаются не менее 8 уровней приоритета, причём приоритет может изме няться динамически. · Для уменьшения задержки обработки прерываний используются такие спе циальные методы, как принятие «опоздавших» прерываний и прямой переход (tailchain) от одноrо обработчика прерывания к друrому. · Допускается прерывание некоторых операций, выполняемых за несколько тактов, в том числе операций заrрузки/сохранения нескольких реrистров (LDM/STM) и операций сохранения в стеке и извлечения из стека (PUSH/POP). При появлении запроса немаскируемоrо прерывания rарантируется HeMeд ленный запуск обработчика этоrо прерывания, если только система не является полностью заблокированной. Наличие немаскируемоrо прерывания является 
2.11. Резюме . 35 очень важным фактором для большинства приложений, предъявляющих повы шенные требования к безопасности. 2.11.3. Низкое знерrопотребление Процессор CortexM3 может использоваться в самых разных приложениях, требующих низкоrо энерrопотребления: . Процессор CortexM3 позволяет создавать устройства с низким энерrопотре блением, поскольку содержит относительно небольшое число лоrических BeH тилей. . Процессор Cortex М3 имеет два режима пониженноrо потребления (SLEEPING и SLEEPDEEP). ДЛЯ перехода в эти режимы используются команды WFI или WFE. Конструкцией процессора предусмотрено раздельное тактирование ero основных блоков, что позволяет останавливать большинство узлов процессо ра на время спящеrо режима. . Полностью статическое, синхронное и синтезируемое ядро позволяет леrко изrотавливать данный процессор как по специальному (lowpower), так и по стандартному техпроцессам. 2.11.4. Системные возможности в процессоре CortexM3 реализованы определённые возможности, позволяю щие использовать ero в самых разных приложениях: . Поддерживается прямой доступ к битам данных (метод bitband), хранение данных в формате с обратным порядком и неизменным расположением бай тов (byteinvariant big endian), а также обращения к невыровненным данным. . Расширенная поддержка обработки системных отказов, в том числе наличие разных типов исключений и реrистров состояния отказов, облеrчает обнару жение источника проблемы. . Блаrодаря наличию TeHeBoro указателя стека, области стека ядра ОС и пользо вательских процессов MorYT быть изолированы друr от друrа. При использо вании опциональноrо модуля MPU возможностей процессора оказывается более чем достаточно для разработки отказоустойчивоrо проrраммноrо обе спечения и надёжных устройств. 2.11.5. Поддержка отладки Процессор CortexM3 имеет боrатые функции отладки, облеrчающие пользо вателям разработку своих устройств: . Поддерживает отладочные интерфейсы JTAG или SerialWire. . Блаrодаря использованию технолоrии отладки CoreSight, состояние процессо ра и содержимое памяти может быть получено без останова ядра процессора. . Имеется встроенная поддержка до шести точек останова и до четырёх точек наблюдения. . Имеется опциональный модуль ЕТМ дЛЯ трассировки команд и модуль DWT дЛЯ трассировки данных. 
36 . Тлава 2. Обзор CortexM3 · Новые возможности отладки, включая реrистры состояния отказов, новые ис ключения отказов и поддержка функций коррекции флэшпамяти (Flash Patch) значительно облеrчают процесс отладки. · Модуль ITM предоставляет удобный способ вывода отладочной информации из TecToBoro кода. · Схема выборки значений счётчика команд и счётчики, имеющиеся в модуле DWT, предоставляют информацию, необходимую для профилирования кода. 
rлдвд 3 OCHOBbl CORTEX..M3 3.1. Реrистры Как мы уже знаем, процессор СоrtехТММ3 имеет 16 реrистров с RO по R15 и He сколько реrистров специальноrо назначения. Реrистры с RO по R12 являются pe rистрами общеrо назначения. Ряд команд набора Thumb  MorYT обращаться толь ко к младшим реrистрам RO.. .R7, тоrда как 32битные команды Thumb2 MorYT работать со всеми реrистрами. Реrистры специальноrо назначения выполняют предопределённые функции и для обращения к ним необходимо использовать особые команды. 3.1.1. Реrистры общеrо назначения с RO по R7 Реrистры общеrо назначения с RO по R7 также называются младшими pe2и страми. Обращаться к этим реrистрам MorYT все команды как 16битноrо набора Thumb, так и 32битноrо набора Thumb2. Все указанные реrистры имеют разряд ность 32 бита, состояние реrистров после сброса может быть любым. 3.1.2. Реrистры общеrо назначения с R8 по R12 Реrистры общеrо назначения с R8 по R12 также называются старшими pe2и страми. Обращаться к этим реrистрам MorYT все команды набора Thumb2 и He которые команды набора Thumb. Все указанные реrистры имеют разрядность 32 бита, состояние реrистров после сброса может быть любым (Рис. 3.1). 3.1.3. Указатель стека R13 Реrистр процессора R13 используется в качестве указателя стека, причём в процессоре CortexM3 имеется два таких указателя. Наличие двух указателей позволяет реализовать два независимых стека. Используя идентификатор R13, можно обращаться только к текущему указателю, друrой указатель при этом бу дет недоступен. Обратиться к недоступному в данный момент указателю можно только с помощью команд пересылки между реrистром общеrо назначения и ре- rистром специальноrо назначения (MSR и MRS). Итак, в процессоре CortexM3 имеются следующие указатели стека: 
38 . Тлава 3. Основы CortexM3 Функции Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Реrистр общеrо назначения Основной указатель стека (MSP), Указатель стека процесса (PSP) Реrистр RO Rl R2 RЗ R4 R5 R6 R7 R8 R9 Rl0 Rll R12 RlЗ (MSP) I RlЗ (PSP) R14 R15 Реrистр связи (LR) Счётчик команд (РС) I xPSR I PRIMASK I FAULTMASK I BASEPRI I CONTROL Реrистры состояния проrраммы Реrистрымаскирования прерываний Реrистр управления Младшие реrистры Старшие реrистры Реrистры специальноrо назначения Рис. 3.1. Pezucтpbl процессора CortexM3. · Основной указатель стека MSP (в документации ARM он обозначается как SP main). Это указатель, используемый по умолчанию. Он используется ядром операционной системы, обработчиками исключительных ситуаций, а также всеми проrраммными модулями, требующими привилеrированноrо доступа к памяти. · Указатель стека процесса PSP (в документации ARM он обозначается как SP process). Этот указатель используется прикладной проrраммой (если толь ко не выполняется обработчик исключительной ситуации). Разумеется, совсем необязательно использовать оба указателя стека. В про стых приложениях вполне можно обойтись одним указателем, MSP. В любом слу чае указатели стека применяются при операциях со стеком, таких как помещение в стек и извлечение из стека. 
3.1. Pezucтpbl · 39 в процессоре CortexM3 для работы со стеком предусмотрены команды PUSH (заrрузка реrистров в стек) и РОР (извлечение реrистров из стека). Эти команды имеют следующий синтаксис (текст после каждоrо символа «;» является KOMMeH тарием): PUSH {RO} ; R13 = R13  4, затем Memory[R13] = RO РОР {RO} ; RO = Memory[R13], затем R13 = R13 + 4 В процессоре CortexM3 реализован «полный» убывающий стек (более под робно об этом можно узнать из раздела 3.6 «Операции со стеком»). COOTBeTCTBeH но, указатель стека при помещении HOBoro значения в стек декрементируется. Ko манды PUSH и РОР обычно используются для сохранения содержимоrо реrистров в стеке при входе в подпроrрамму и последующеrо восстановления содержимоrо этих реrистров из стека перед выходом из подпроrраммы. С помощью одной KO манды можно заrрузить в стек или восстановить из стека сразу несколько реrи стров: subroutine 1 PUSH {ROR7, R12, R14} , РОР ВХ {ROR7, R12, R14} R14 Сохраняем реrистры I Выполняем требуемые действия Восстанавливаем реrистры Возвращаемся в вызвавшую функцию 
40 · Тлава 3. Основы CortexM3 Вместо названия реrистра RIЗ в проrрамме можно использовать символиче ское имя SP, эти обозначения полностью эквивалентны. И к указателю MSP, и к указателю PSP из проrраммы можно обращаться как к RIЗ/SР. Тем не менее, используя команды доступа к реrистрам специальноrо назначения (MRS/MSR), можно обратиться к конкретному указателю. Указатель MSP, также называемый SP тaiп в документации ARM, является указателем стека по умолчанию после включения процессора; он используется ядром ОС и обработчиками исключений. Указатель PSP, также называемый SP process в документации ARM, обычно задействуется пользовательскими про цессами при наличии встроенной операционной системы. Поскольку операции сохранения реrистров в стеке и восстановления реrи стров из стека всеrда выровнены на rраницу 32битноrо слова (их адреса должны быть равны Охоо, ОхО4, ОхО8, .. .), биты О и 1 реrистра SP/R13 аппаратно сброшены во. 3.1.4. Реrистр связи R14 Реrистр R14 используется в качестве реrистра связи (Link Register  LR). В ac семблерной проrрамме вы можете использовать любое из обозначений реrи стра  R14 или LR. Реrистр связи при меняется для сохранения адреса возврата при вызове процедуры или функции, например при выполнении команды пере хода со ссылкой (BL): main Основная проrрамма BL functionl Вызываем functionl, используя команду перехода со ссылкой ; РС = адрес functionl, а ; LR = адрес следующей команды в main functionl ; Тело подпроrраммы functionl ВХ LR ; Возвращаемся Несмотря на то что бит О счётчика команд всеrда сброшен в о (поскольку KO манды выровнены на rраницу слова или полуслова), бит О реrистра LR доступен как для чтения, так и для записи. Это связано с тем, что в наборе команд ТЬитЬ Ой бит часто используется для указания состояния ARM/Thumb процессора. Чтобы проrраммы, написанные для процессора CortexM3, моrли запускаться на друrих процессорах ARM, поддерживающих технолоrию Тbиmb2, младший бит реrистра связи сделан доступным и для чтения, и для записи. 3.1.5. Счётчик команд R15 Реrистр R15 служит в качестве счётчика команд РС. ДЛЯ обращения к дaHHO му реrистру можно использовать любое из обозначений  R15 или РС. Изза Ha личия в процессоре CortexM3 конвейера значение, считанное из этоrо реrистра, будет отличаться от адреса исполняемой в данный момент команды (как прави ло, на 4). Охl000 : MOV RO, РС ; RO = Охl004 
3.2. Pezucmpbl специальноzо назначения · 41 в друrих командах, в частности выполняющих заrрузку констант (чтение ячей ки памяти по адресу, задаваемому относительно текущеrо значения Ре), действи тельное значение Ре может не быть равным адресу команды, увеличенному на 4, изза выравнивания при вычислении адреса. Но в любом случае значение Ре, как минимум, на 2 байта превышает значение адреса исполняемой команды. Запись в счётчик команд вызовет переход (LR при этом не изменяется). По скольку адрес команды должен быть выровнен на rраницу полуслова, младший бит значения, считываемоrо из РС, всеrда сброшен в О. Однако при выполнении перехода, как при помощи команды перехода, так и путём непосредственной за писи в ре, младший бит конечноrо адреса должен быть установлен в 1, посколь ку он используется для индикации состояния ТЬиmЬ. Если этот бит окажется сброшенным в О, то процессор попытается переключиться в состояние ARM, что вызовет rенерацию исключения отказа. 3.2. Реrистры специапьноrо назначения в процессоре CortexM3 имеются следующие реrистры специальноrо назначе ния (Рис. 3.3 и 3.4): . реrистры состояния проrраммы (xPSR); . реrистры маскирования прерываний (PRIMASK, FAULTMASK и BASEPRI); . реrистр управления (CONTROL). 31 30 29 28 27 26:25 24 23:20 19: 16 15: 1 О 9 8 7 6 5 4:0 APSR N Z ( V Q IPSR Номер исключения EPSR I(I/IT Т I(I/IT Рис. 3.3. ОтдеЛЬНblе pezucmpbl состояния npozpaMMbl процессора CortexM3. 31 30 29 28 27 26:25 24 23:20 19: 16 15: 1 О 9 8 7 6 5 4:0 xPSR N Z ( V Q I(I/IT Т 1(I/lT Номер исключения Рис. 3.4. ОбъединёННblе pezucmpbl состояния npozpaMMbl (xPSR) процессора CortexM3. Указанные реrистры не имеют собственных адресов, поэтому для обращения к ним необходимо использовать команды MSR и MRS: MRS <reg>, <specialreg>; Чтение реrистра специальноrо назначения MSR <specialreg>, <reg>; Запись в реrистр специальноrо назначения 3.2.1. Реrистры состояния npOrpaMMbI rруппу реrистров состояния проrраммы составляют три реrистра: . реrистр состояния приложения APSR; . реrистр состояния прерывания IPSR; . реrистр состояния выполнения EPSR. 
42 . Тлава 3. Основы CortexM3 Обращения к этим трём реrистрам производятся посредством команд MSR и MRS, причём обращаться можно как к каждому реrистру по отдельности, так и одновременно ко всем реrистрам rруппы. В последнем случае используется обозначение xPSR. С помощью команды MSR можно выполнять чтение всех реrистров состояния проrраммы, а используя команду MRS, можно осуществлять запись в реrистр APSR (реrистры IPSR и EPSR доступны только для чтения). Например: MRS rO, APSR Считать состояние флаrов в RO MRS rO, IPSR Считать состояние исключения/прерывания MRS rO, EPSR Считать состояние выполнения MSR APSR, rO Записать состояние флаrов При одновременном обращении ко всем реrистрам состояния используется обозначение PSR: MRS rO, PSR ; Чтение всех реrистров состояния проrраммы MSR PSR, rO ; Запись во все реrистры состояния проrраммы Назначение битов реrистров состояния проrраммы указано в Табл. 3.1. Таблица 3.1. Биты реrистров состояния nporpaMMhI Бит Описание N Отрицательное значение Z Нулевое значение С Перенос/заём V Переполнение Q Насыщение ICIIIT Состояние команды, возобновляемой после прерывания (ICI); состояние команды 1FTHEN (1Т) Т Признак состояния ТЬиmЬ, всеrда установлен в 1. Попытка сброса этоrо бита вызовет rенерацию исключения отказа Номер Содержит номер исключения, обрабатываемоrо процессором в данный момент исключения Если сравнить эти реrистры с реrистром текущеrо состояния проrраммы CPSR процессора ARM7, то можно заметить отсутствие некоторых битов. Так, были убраны биты режима (М), поскольку CortexM3 не имеет режимов работы в том виде, в котором они были определены в процессоре ARM7. Бит Thumb (Т) был перемещён в 24й бит реrистра. Биты состояния прерывания (1 и Р) были за менены новым реrистром PRIMASK. ДЛЯ сравнения, на Рис. 3.5 показаны форма ты реrистра CPSR традиционных процессоров ARM. 31 30 29 28 27 26:25 24 23:20 19: 16 15: 1 О 9 8 7 6 5 4:0 ARM N Z С V Q 'т J 3арезе GЕ[З:О] 'Т Е Д F Т м [4:0] (обобщённый) вировано АRМ7ТDМI N Z С V F Т м [4:0] Рис. 3.5. Pezucmpbl сосmояния npozpaMMbl 8 традиционных процессорах ARM. 
3.2. Pezucтpbl специальноzо назначения · 43 3.2.2. Реrистры PRIMASK, FAULTMASK и BASEPRI Реrистры PRIMASK, FAULTMASK и BASEPRI используются для запрещения исключений (Табл. 3.2). Таблица 3.2. Реrистры маскирования прерываний Реrистр Описание Однобитный реrистр, который, будучи установлен в 1, разрешает rенерацию только немаскируемоrо прерывания и исключения Hard Fault; все остальные прерывания и исключения маскируются. По умолчанию этот реrистр содержит О, что означает отсутствие маскирования Однобитный реrистр, который, будучи установлен в 1, разрешает rенерацию только немаскируемоrо прерывания; все прерывания и системные исключения маскируются. По умолчанию этот реrистр содержит О, что означает отсутствие маскирования Реrистр разрядностью до 8 бит (зависит от разрядности реrистров, используемых для задания уровня приоритета). Данный реrистр определяет уровень приоритета маскируемых прерываний. Запись в этот реrистр значения, отличноrо от нуля, запрещает все прерывания, имеющие такой же или меньший приоритет (большее значение уровня приоритета). Прерывания с более высоким приоритетом при этом разрешены. При наличии в реrистре нулевоrо значения (состояние по умолчанию) маскирование прерываний отключено PRIMASK FAULTMASK BASEPRI Реrистры PRIMASK и BASEPRI полезны для BpeMeHHoro запрещения преры ваний в задачах, критичных ко времени исполнения. Операционная система MO жет использовать реrистр FAULTMASK дЛЯ BpeMeHHoro запрещения обработки отказов при аварийном завершении задачи. В этом случае MorYT возникать раз личные исключения. Однако после Toro, как ядром ОС был запущен процесс BOC становления из HeKoppeKTHoro состояния, прерывание ero работы друrим исклю чением, вызванным «упавшим» процессом, может оказаться нежелательным. Ta ким образом, реrистр FAULTMASK предоставляет ядру ОС время, необходимое для принятия соответствующих мер при возникновении сбоя. Для обращения к реrистрам PRIMASK, FAULTMASK и BASEPRI используют ся специальные функции, которые входят в состав библиотек, предоставляемых изrотовителями микроконтроллеров. Например: х = getBASEPRI(); // Чтение реrистра BASEPRI х = getPRIМARK(); // Чтение реrистра PRIМASK х = getFAULTМASK(); // Чтение реrистра FAULTМASK set BASEPRI(x); // Запись HOBoro значения в BASEPRI set PRIМASK(x); // Запись HOBoro значения в PRIМASK set FAULTМASK(x); // Запись HOBoro значения в FAULTМASK disableirq(); // Очистка PRIМASK, разрешение прерываний enableirq(); // Установка PRIМASK, запрещение прерываний Более подробно эти функции доступа к реrистрам процессорноrо ядра описа ны в Приложении ж. Достаточно полные сведения о стандарте CMSIS (Cortex Microcontroller Software Interface Standard  стандарт nporpaMMHoro интерфейса микроконтроллеров с ядром Cortex) можно найти в [лаве 10. В ассемблерных проrраммах для этих же целей используются команды MRS и MSR, например: 
44 . fлава 3. Основы CortexM3 MRS rO, BASEPRI ; Считать реrистр BASEPRI в RO MRS rO, PRlМASK Считать реrистр PRIМASK в RO МRS rO, FAULTМASK Считать реrистр FAULTМASK в RO MSR BASEPRI, rO Записать RO в реrистр BASEPRI MSR PRlМASK, rO Записать RO в реrистр PRlМASK MSR FAULTМASK, rO Записать RO в реrистр FAULTМASK Реrистры PRIMASK, FAULTMASK и BASEPRI недоступны на пользователь ском (непривилеrированном) уровне доступа. 3.2.3. Реrистр управления CONTROL Реrистр управления используется для задания уровня доступа и выбора YKa зателя стека. Этот реrистр содержит два бита, назначение которых указано в Табл. 3.3. Таблица 3.3. Реrистр управления CortexM3 Бит Описание Состояние стека: 1  используется альтернативный стек; CONTROL[l] О  используется основной стек (MSP). При работе процессора в режиме потока альтернативным стеком является PSP. ДЛЯ режима обработчика дополнительный стек не определён, поэтому при работе процессора в режиме обработчика этот бит должен быть сброшен в О О  привилеrированный уровень доступа в режиме потока; CONTROL[O] 1  пользовательский уровень доступа в режиме потока. В режиме обработчика процессор всеrда работает на привилеrированном уровне доступа CONTROL[1] При нахождении процессора CortexM3 в режиме обработчика бит CONTROL[I] всеrда сброшен в О. в режиме потока этот бит может быть равным как О, так и 1. Этот бит доступен для записи только при работе ядра процессора в режиме потока на привилеrированном уровне. При работе на пользовательском уровне или в режиме обработчика запись в указанный бит запрещена. Изменить данный бит можно не только записью в реrистр, но и изменив 2й бит реrистра LR при возврате из обработчика исключения. Более подробно об этом будет сказано в [лаве 8, посвящённой исключениям. CONTROL[O] Бит CONTROL[Q] доступен для записи только в привилеrированном состоя нии. После переключения процессора на пользовательский уровень доступа единственный способ возврата в прежнее состояние состоит в rенерации преры вания и изменении состояния процессора в обработчике этоrо прерывания. Для обращения к реrистру управления из проrрамм на языке Си в CMSIS совместимых библиотеках драйверов устройств предусмотрены следующие функции: х = getCONTROL(); // Считать текущее значение реrистра CONTROL 
3.3. Режимы работы . 4S setCONTROL(x); // Заrрузить в реrистр CONTROL значение х В ассемблерных проrраммах для обращения к реrистру управления использу ются команды MRS и MSR: MRS rO, CONTROL Прочитать содержимое реrистра CONTROL в RO MSR CONTROL, rO ; Записать RO в реrистр CONTROL 3.3. Режимы работы Процессор CortexM3 поддерживает два режима работы и два уровня доступа к коду проrраммы (Рис. 3.6). Привилеzированный Пользоваrпельский При выполнении обрабоrпчика исключения Режим обработчика (CONTROL[1] = О) При выполнении НЕ обрабоrпчика исключения (например, ОСН. пpozpaMMbI) Режим потока (CONTROL[O] = О) Режим потока (CONTROL[O] = 1) CONTROL[1] можеrп быrпь О или 1 Рис. 3.6. Режимы работы и уровни доступа к коду процессора CortexM3. При работе процессора в режиме потока он может находиться как на привиле rированном, так и на пользовательском уровне, тоrда как обработка исключи тельных ситуаций всеrда осуществляется на привилеrированном уровне. После сброса процессор находится в режиме потока справами привилеrированноrо дo ступа к коду. На пользовательском уровне доступа (режим потока) обращения к простран ствууправления системой (System Control Space  SCS)  области памяти, coдep жащей реrистры конфиrурации и компоненты отладки,  заблокированы. Более Toro, на этом уровне запрещено даже использование команд, обращающихся к реrистрам специальноrо назначения (таких как MSR, за исключением обраще ний к реrистру APSR). Если проrрамма, выполняющаяся на пользовательском уровне доступа, попытается обратиться к пространству SCS или к реrистрам спе циальноrо назначения, то будет сrенерировано исключение отказа. Проrраммное обеспечение, работающее на привилеrированном уровне, MO жет переключиться на пользовательский уровень, используя реrистр управле ния. При возникновении исключительной ситуации процессор всеrда переклю чается на привилеrированный уровень, а при выходе из обработчика исключе ния  возвращается на исходный. Пользовательская проrрамма не может сама переключиться на привилеrированный уровень, выполнив запись в реrистр управления. Она должна воспользоваться обработчиком исключения, который запроrраммирует реrистр CONTROL так, чтобы процессор переключился на привилеrированный уровень при возврате в режим потока (Рис. 3.7). 
46 . Тлава 3. Основы CortexM3 Переключаемся Привилеrир. уровень в пользовательский режим, Режим обработчика выполнив запись в реrистр CONTROl Привилеrир. уровень  C    .  I         Р тартовыи + ежим потока код Исключение Перепроrраммируем реrистр CONTROl Пользоват.уровень Режим потока Привилеrиро ванный поток Рис. З.7: Переключение режимов работы процессора. Поддержка процессором двух уровней доступа обеспечивает более безопас ную и надёжную архитектуру. Например, при некорректной работе пользова тельской проrраммы она никоrда не сможет повредить содержимое реrистров управления контроллера прерываний. А при наличии модуля MPU можно вооб ще заблокировать пользовательским проrраммам доступ к областям памяти, ис пользуемым привилеrированными процессами. В простых приложениях нет нужды разделять привилеrированный и пользо вательский уровни доступа. В таких случаях пользовательский уровень доступа не используется и, соответственно, проrраммирование реrистра управления не требуется. Вы можете отделить стек пользовательскоrо приложения от стека ядра опера ционной системы, чтобы предотвратить крах системы изза некорректной рабо ты со стеком в пользовательской проrрамме. В этом случае пользовательская проrрамма, работающая в режиме потока, будет использовать указатель PSP, а обработчики исключений  указатель MSP. Переключение между указателями стеков осуществляется автоматически при входе в обработчики и при выходе из них (см. подраздел 3.6.3). Более подробно этот вопрос рассматривается в [лаве 8. Режим работы процессора и уровень доступа к коду определяются реrистром управления. Если Ой бит реrистра управления сброшен в О, то при rенерации ис ключения режим процессора будет изменён (Рис. 3.8 и 3.9). Привилеrир.уровень Режим обработчика Привилеrиро ванный поток Пользоват.уровень Режим потока Рис. З.8. Простая npozpaMMa, не использующая пользовательский уровень доступа в режиме потока. 
3.4. Исключения и прерЫ8ания . 47 Событие, вызвавшее Основная преРЫВJие nporpaMMa Возврат из прерывания Процедура обработки I прерывания (lSR) : Режим обработчика (привилеrированный) Восста новл(tн ие контекста: I I I I I I Сохранение контекста Режим потока (привилеrированный) . Время Режим потока (привилеrированный) Рис. 3.9. Переключение режима работы процессора в прерываниu. Если ОЙ бит реrистра управления установлен в 1, то при rенерации исключе ния будут изменены и режим процессора, и уровень доступа (Рис. 3.10). Основная nporpaMMa Событие, вызвавшее прерывание  Возврат из прерывания Процедура обработки : прерывания (lSR) I Режим потока (пользовательский) Режим обработчика (привилеrированный) Восстановлtние контекста: I I : Режим потока I (пользовательский) I . Время Сохранение контекста Рис. 3.10. Переключение режима работы процессора и уровня доступа в прерывании. Запись в Ой бит реrистра управления допускается только на привилеrирован ном уровне (см. Рис. 2.5). Чтобы проrрамма, выполняющаяся на пользователь ском уровне, смоrла переключиться в привилеrированное состояние, она должна сrенерировать прерывание (например, посредством команды вызова супервизо ра svc) и изменить бит CONTROL[O] в обработчике прерывания. 3.4. Исключения и прерывания Процессор CortexM3 поддерживает определённое число исключений, в том числе фиксированное количество системных исключений и ряд прерываний, обычно называемых IRQ. Количество входов прерываний в микроконтроллерах с процессором CortexM3 зависит от конкретной реализации. Прерывания, reHe рируемые периферийными устройствами процессора, за исключением системно ro таймера, тоже подключаются к входам прерываний. Как правило, использует ся 16 или 32 входа прерываний. Однако вы вполне можете встретить микрокон троллеры, имеющие большее (или меньшее) число прерываний. 
48 . Тлава 3. Основы CortexM3 Помимо входов обычных прерываний, в процессоре также имеется вход HeMa скируемоrо прерывания (NMI). Фактическое использование немаскируемоrо прерывания зависит от KOHKpeTHoro микроконтроллера или системы на кристал ле. В большинстве случаев вход NMI может быть подключён к сторожевому тай меру или блоку контроля напряжения питания, который сообщит процессору о падении напряжения ниже заданноrо уровня. Немаскируемое прерывание MO жет быть активировано в любой момент времени, в том числе сразу же после BЫ хода процессора из состояния сброса. Перечень исключений, поддерживаемых процессором CortexM3, приведён в Табл. 3.4. Некоторые системные исключения предназначены для обработки OT казов процессора и MorYT rенерироваться при возникновении различных He штатных ситуаций. В контроллере NVIC также имеется несколько реrистров co стояния отказов, с помощью которых обработчики исключений MorYT опреде лить причину возникновения исключительной ситуации. Более подробно исключения процессора CortexM3 рассматриваются в rлавах 7.. .9. Таблица 3.4. Типы исключений в процессоре CortexM3 Номер Тип исклю исклю Приоритет Описание чения чения 1 Reset 3 (наивысший) Сброс 2 NMI 2 Немаскируемое прерывание Любой отказ, если соответствующий обработчик не 3 Hard Fault 1 может быть запущен (исключение в данный момент запрещено или маскировано) Отказ системы управления памятью; нарушение пра MemManage Проrраммируе вил доступа, заданных модулем MPU, или обращение 4 Fault мый по некорректному адресу (например, при выборке KO манды из области памяти, не предназначенной для храненияисполняемоrокод 5 Bus Fault Проrраммируе Отказ шины; возникает при отказе предвыборки мый команды или при ошибке доступа к данным Отказ проrраммы; обычно возникает при попытке 6 Usage Fault Проrраммируе исполнить неверную команду или переключиться мый в недопустимое состояние (скажем, переключить процессор CortexM3 в состояние ARM) 7.. .10   Зарезервировано 11 SVCall Проrраммируе Вызов супервизора посредством команды SVC мый 12 Debug Проrраммируе Исключение монитора отладки monitor мый 13   Зарезервировано 14 PendSV Проrраммируе Запрос системной службы мый 15 SYSTICK Проrраммируе Системный таймер мый 16.. .255 IRQ Проrраммируе Вход прерывания NQO...239 мый 
3.5. Таблица векторов · 49 3.5. Таблица векторов При возникновении события, rенерирующеrо исключение (если данное ис ключение разрешено), запускается обработчик соответствующеrо исключения. Для определения начальноrо адреса обработчика предназначена таблица BeKTO ров. Таблица векторов представляет собой массив 32битных значений, располо женных в системной области памяти, каждое из которых является начальным адресом обработчика одноrо KOHKpeTHoro исключения. Положение таблицы BeK торов можно изменять  оно определяется реrистром смещения таблицы BeKTO ров VTOR контроллера NVIC. После сброса этот реrистр содержит нулевое зна чение, поэтому при включении процессора таблица векторов располаrается, Ha чиная с адреса ОхОО (см. Табл. 3.5). Таблица 3.5. Таблица векторов после сброса Номер исключения Смещение Вектор обработчика исключения 18.. .255 Ох48.. .Ox3FF IRQ N22.. .239 17 Ох44 IRQ N21 16 Ох40 IRQ N20 15 Ох3С SYSTICK 14 Ох38 PendSV 13 Ох34 Зарезервировано 12 Ох30 Debug monitor 11 Ох2С SVCall 7.. .10 ОхlС.. .Ох28 Зарезервировано 6 Ох18 Usage Fault 5 Ох14 Bus Fault 4 Охl0 MemManage Fault 3 ОхОС Hard Fault 2 ОхО8 NMI 1 Ох04 Сброс О ОхОО НачальноезначениеSР К примеру, если событие сброса является исключением с номером 1, то адрес вектора сброса равен 1 х 4 (каждое слово содержит 4 байта), т.е. ОхОООООО04. BeK тор NMI (номер 2) расположен по адресу 2 х 4 = ОхОООООО08. Адрес ОхОООООООО используется для хранения начальноrо значения OCHoBHoro указателя стека. Младший бит каждоrо вектора указывает, в каком состоянии должен выпол няться соответствующий обработчик. Поскольку процессор CortexM3 поддер живает только команды Thumb, младшие биты всех векторов исключений долж ны быть установлены в 1. 3.6. Стек Процессор CortexM3 поддерживает обычные проrраммноуправляемые опе рации заrрузки в стек и извлечения из стека. Кроме Toro, операции заrрузки в стек и извлечения из стека выполняются автоматически при входе и выходе из 
50 · fлава 3. Основы CortexM3 обработчика исключения/прерывания. В данном разделе мы рассмотрим про rраммную работу со стеком (стековые операции при обработке исключений pac сматриваются в rлаве 9). 3.6.1. Основные стековые операции в общем случае стековые операции представляют собой операции записи или чтения памяти по адресу, определяемому указателем стека. Содержимое реrи стров сохраняется в стеке посредством операции заrрузки в стек и может быть восстановлено позже посредством операции извлечения из стека. При выполне нии этих операций указатель стека изменяется автоматически таким образом, чтобы мноrократная заrрузка данных в стек не привела к стиранию ранее coxpa нённых данных. Стек предназначен для BpeMeHHoro сохранения содержимоrо реrистров в па мяти и последующеrо ero восстановления после завершения некоторой задачи. При обычном использовании стека каждой операции заrрузки должна COOTBeT ствовать своя операция извлечения, причём адрес, используемый в этих опера циях, должен быть одним и тем же (Рис. 3.11). При выполнении команд PUSH/POP указатель стека инкрементируется и декрементируется автоматически. Основная nporpaMMa ; RO BL Х, Rl У, R2 functionl z Подпроrрамма  functionl PUSH PUSH PUSH РОР РОР РОР ВХ {RO} Сохраняем RO в стеке (SP инкрементируется) {Rl} ; Сохраняем Rl в стеке (SP инкрементируется) {R2} Сохраняем R2 в стеке (SP инкрементируется) Выполняем задачу (RO, Rl и R2 можно изменять) {R2} Восстанавливаем R2 (SP декрементируется) {Rl} ; Восстанавливаем Rl (SP декрементируется) {RO} ; Восстанавливаем RO (SP декрементируется) LR ; Возврат  ; Вернулись в основную проrрамму ; RO Х, Rl У, R2 Z ... , Следующие команды Рис. 3.11. ОСНО8ные стеКО8ые операции: одна операция  один pezucтp. При возврате управления в основную проrрамму содержимое реrистров RO.. .R2 будет таким же, что и до вызова подпроrраммы. Обратите внимание на порядок выполнения операций: операции извлечения из стека выполняются в обратном порядке по сравнению с операциями заrрузки в стек. Данный процесс можно упростить, так как команды PUSH и РОР поддержива ют сохранение и восстановление нескольких реrистров. В этом случае порядок 
3.6. Стек · S1 реrистров, восстанавливаемых из стека, автоматически изменяется процессором на обратный (Рис. 3.12). Основная nporpaMMa ; RO BL Х, Rl У, R2 functionl z Подпроrрамма  function 1 PUSH {RO R2} ; Сохраняем RO, Rl, R2 в стеке Выполняем задачу (RO, Rl и R2 можно изменять) {RO R2} Восстанавливаем RO, Rl, R2 LR ; Возвращаемся РОР ВХ  ; Вернулись в основную проrрамму ; RO Х, Rl У, R2 z ... , Следующие команды Рис. 3.12. Основные стековые операции: одна операция  несколько pezucmpoB. Вы также можете объединить операцию возврата из подпроrраммы с опера цией извлечения из стека. Для этоrо необходимо сохранить содержимое реrистра LR в стеке и извлечь ero в счётчик команд в конце подпроrраммы (Рис. 3.13). Основная nporpaMMa ; RO Х, Rl У, R2 z BL functionl Подпроrрамма  functionl PUSH {RO R2, LR} ; Сохраняем реrистры, ; включая реrистр связи Выполняем задачу (RO, Rl и R2 ; можно изменять) РОР {RO R2, РС} Восстанавливаем реrистры и возвращаемся  ; Вернулись в основную проrрамму ; RO Х, Rl У, R2 z ; Следующие команды Рис. 3.13. Основные стековые операции: объединение операции извлечения из стека с операцией возврата. 3.6.2. Реализация стека в процессоре Cortex..M3 в процессоре CortexM3 используется модель «полноrо» убывающеrо стека. Указатель стека указывает на последнее значение, помещённое в стек, и инкре ментируется перед выполнением новой операции заrрузки в стек. В качестве при мера на Рис. 3.14 показано выполнение команды PUSH {RO}. 
52 · Тлава 3. Основы CortexM3 RO I Ох12З45678 Адрес в памяти Занято Занято Последние (охран. данные ...... .....    PUSH {RO} SP с) Занято Занято Занято Ох12З45678 SP [L Рост стеКе Рис. 3.14. Реализация операции заzрузки в стек. Во время операции извлечения из стека данные считываются из памяти по адресу, определяемому указателем стека, после чеrо указатель инкрементируется. Содержимое ячейки памяти не изменяется, однако оно будет перезаписано при выполнении последующей операции заrрузки в стек (Рис. 3.15). Адрес в памяти Занято Занято Занято Ох12З45678 ...... .....  РОР {RO} с) Занято Занято Занято Ох12З45678 u SP SP RO RO I Рис. 3.15. Реализация операции извлечения из стека. Поскольку при выполнении каждой операции заrрузки в стек и извлечения из стека осуществляется пересылка 4 байт данных (каждый реrистр содержит одно слово, или 4 байт), значение указателя стека уменьшается/увеличивается на 4 или, при одновременном сохранении/восстановлении нескольких реrистров, на величину, кратную четырём. В процессоре CortexM3 в качестве указателя стека используется реrистр R13. При возникновении прерывания некоторые реrистры будут автоматически co хранены в стеке. При возврате из обработчика прерывания эти реrистры также автоматически будут восстановлены из стека, а значение указателя стека изме нится соответствующим образом. 3.6.3. Два стека процессора Cortex..M3 Как уже было сказано, в процессоре CortexM3 имеется два указателя стека: основной MSP и дополнительный PSP. Используемый в настоящий момент указа тель определяется битом 1 реrистра управления (далее этот бит обозначается как CONTROL[I]). Если бит CONTROL[I] сброшен в О, то указатель MSP используется в обоих pe жимах работы процессора (Рис. 3.16). В этом случае и основная проrрамма, и об работчики исключений задействуют под стек одну и ту же область памяти. Такое поведение используется по умолчанию после включения процессора. 
3.6. Стек . 53 Основная проrрамма Событие, вызвавшее прерывание  Возврат из прерывания Процедура обработки : прерывания (lSR) I Режим потока (используется MSP) Режим обработчика (используется MSP) ВосстановлEtние контекста: I I : Режим потока : (используется MSP) . Время Сохранение контекста Рис. 3.16. CONTROL[1] = о; основной стек используется и в режиме потока, и в режиме обработчика. Если бит CONTROL[I] установлен в 1, то в режиме потока используется указа тель PSP (Рис. 3.17). В этом случае основная проrрамма и обработчики прерыва ний задействуют под стеки разные области памяти. Это позволяет предотвратить порчу стека, используемоrо операционной системой, при наличии ошибок в пользовательской проrрамме (предполаrается, что пользовательская проrрам ма выполняется только в режиме потока, а ядро ОС выполняется в режиме обра ботчика). Основная проrрамма Событие, вызвавшее прерывание  Возврат из прерывания Процедураобработки : прерывания (lSR) I Режим потока (используется PSP) Режим обработчика (используется MSP) Восстановление контекста: I I I I Режим потока I I (используется PSP) . Время Сохранение контекста Рис. 3.17. CONTROL[l] = 1; в режиме потока используется стек процесса, а в режиме обработчика  основной стек. Заметьте, что в этом случае при автоматическом сохранении и восстановле нии реrистров будет использоваться дополнительный стек, тоrда как при CTeKO вых операциях внутри обработчиков  основной стек. В процессоре предусмотрена возможность непосредственной записи/чтения указателей MSP и PSP, независимо от Toro, на какой из них ссылается в данный момент реrистр R13. При работе на привилеrированном уровне для доступа к co дерЖИМQМУ указателей MSP и PSP можно использовать следующие функции: х = getMSP(); // Чтение значения MSP set MSP(x); // Установка значения MSP   х = getPSP(); // Чтение значения PSP 
54 · fлава 3. Основы CortexM3 setPSP(x); // Установка значения PSP Вообще rоворя, изменять значение текущеrо указателя стека внутри Си функций крайне не рекомендуется, поскольку в стеке MorYT храниться локальные переменные. Для обращения к указателям стека из ассемблерноrо кода можно ис пользовать уже известные нам команды MRS и MSR: MRS RO, MSP ; Чтение OCHoBHoro указателя стека в RO MSR MSP, RO Запись RO в основной указатель стека MRS RO, PSP Чтение указателя стека процесса в RO MSR PSP, RO Запись RO в указатель стека процесса Считав значение PSP посредством команды MRS, ОС может прочитать данные, помещённые в стек пользовательской проrраммой (скажем, содержимое реrи стров перед вызовом супервизора командой SVC). Более Toro, ОС может изменить значение указателя PSP, например при переключении контекста в мноrозадачной системе. 3.7. ЦИКЛ сброса После выхода процессора из состояния сброса он считывает из памяти два 32битных значения (Рис. 3.18): · по адресу ОхОООООООО  начальное значение R13 (указателя стека); · по адресу ОхОООООО04  вектор сброса (адрес, с KOToporo начинается выполне ние проrраммы; младший бит значения должен быть установлен в 1 для YKa зания состояния Thumb). Выборка начальноrо Выборка значения SP вектора сброса Выборка команды --..----..--.............. I Адрес = , вектор сброса I I LI Адрес = ОхОООООООО Адрес = ОхООООООО4 . Время Рис. 3.18. Цикл сброса. Эта последовательность отличается от поведения традиционных процессоров ARM. Предыдущие процессоры компании ARM выполняли проrраммный код, Ha чиная с нулевоrо адреса. Более Toro, таблица векторов предыдущих процессоров ARM содержала команды (вы должны были поместить в таблицу команду перехода на начало обработчика исключения, расположенноrо в какомнибудь друrом месте). В процессоре же CortexM3 в самом начале карты памяти размещается началь ное значение MSP, после Hero располаrается таблица векторов (позже, во время BЫ полнения проrраммы, таблица векторов может быть перемещена в друrое место). К тому же в таблице векторов содержатся не команды перехода, а значения адресов. Первым вектором в таблице является вектор сброса, который представляет собой второе значение, считываемое процессором при выходе из состояния сброса. Поскольку в процессоре CortexM3 реализована модель «полноrо» убывающе ro стека (указатель стека декрементируется перед заrрузкой значения в стек), Ha 
3.?: Цикл сброса · ss чальное значение указателя должно указывать на первую ячейку памяти, распо ложенную выше области стека. Например, если вы отвели под стек область памя ти с адресами Ох20007СОО.. .Ox20007FFF (1 Кбайт), то начальное значение указате ля стека будет равно Ох20008000. Таблица векторов располаrается сразу же после начальноrо значения указате ля стека. Первым вектором в таблице является вектор сброса. Не забывайте, что младшие биты адресов в таблице векторов процессора CortexM3 должны быть установлены в 1, указывая на использование кода ТЬитЬ. По этой причине значе ние вектора сброса в предыдущем при мере равно Охl0l, тоrда как код заrрузчика располаrается, начиная с адреса Охl00 (Рис. 3.19). После выборки вектора сброса процессор может приступить к выполнению проrраммы, начиная с адреса, pac положенноrо по указанному вектору. Столь ранняя инициализация указателя стека необходима, потому что некоторые исключения (такие как NMI) MorYT воз никнуть сразу же после сброса процессора, а обработчикам этих исключенй MO жет потребоваться стек. Остальная память Начальное значение SP ........ Ох20008000 Ох20008000 Ох20007 FFC Ох20007 FF8 1 й элемент в стеке 2й элемент в стеке Стек Стек растёт вниз i i I I Ох20007 СОО I I JJ Остальная память Флэшпамять ОхОООООl00 3аrрузчик ] Вектор сброса Вектора остальных исключений ОхОООООО04 ОхОООООООО ОхОООООl0l Ох20008000 Рис. 3.19. Начальные значения указателя стека и счётчика команд. в различных средствах разработки проrраммноrо обеспечения MorYT исполь зоваться разные способы задания начальноrо значения указателя стека и значе ния вектора сброса. Если вам необходима более подробная информация по этому вопросу, то лучше Bcero обратиться к при мерам, входящим в состав используе Moro пакета. В [лавах 10 и 20 данной книrи приведены простые при меры для средств разработки компании ARM, а в [лаве 19  для инструментария GNU. 
rЛАВА 4 НАБОР КОМАНД 4.1. ОСНОВЫ языка ассемблера в данном разделе вы познакомитесь с базовыми синтаксическими KOHCTPYK циями языка ассемблера ARM, что поможет вам понять фраrменты кода, coдep жащиеся в последующих rлавах книrи. Большая часть ассемблерноrо кода из данной книrи рассчитана на использование средств разработки компании ARM. Исключение составляет ряд примеров из [лавы 19, демонстрирующих примене ние инструментария GNU. 4.1.1. Язык ассемблера: основы синтаксиса в ассемблерных проrраммах при записи команд обычно используется следую щее форматирование: <метка> <кодоперации> операндl, операнд2, ...; Комментарий Элемент <метка> является необязательным. Метки MorYT размещаться перед некоторыми командами для Toro, чтобы с их помощью можно было определять адреса этих команд. После необязательной метки располаrается <код опера ции> (команда), сопровождаемый некоторым количеством операндов. Как пра вило, первый операнд является приёмником результата операции. Число операн дов зависит от типа команды, формат записи операндов также может быть раз личным. Скажем, константы обычно записываются в виде #число, как показано в следующем примере: MOV RO, #Ox12 ; 3аrрузить в RO число Ox12 (шестнадцатеричная константа) MOV Rl, #'А' ; 3аrрузить в Rl символ ASCII 'А' Текст после символа «;» является комментарием. Эти комментарии не влияют на выполнение проrраммы, однако позволяют сделать текст проrраммы более по нятным для человека. Вы можете определить константу с помощью директивы ассемблера EQU, а за тем использовать её в проrрамме. Например: NVICIRQSETENO EQU OxEOOOEIOO NVICIRQOENABLE EQU Oxl 
4.1. ОСНОВЬ! ЯЗblка ассемблера . 57 LOR RO, =NVICIRQSETENO LOR является псевдокомандой, которая преобразуется ассемблером в команду за:rрузки, использующую адресацию относительно РС MOV Rl, #NVICIRQOENABLE Пересылка константы в ре:rистр STR Rl, [RO] Разрешаем IRQO, записывая Rl по адресу, содержащемуся в RO Имеется также несколько директив описания данных, предназначенных для вставки констант непосредственно в ассемблерный код. Так, директива DCI (Define Constant Instruction) может применяться для вставки команды в том слу чае, если используемый вами ассемблер не может сrенерировать нужную KOMaH ду и если вы знаете её двоичный код. OCI ОхВЕОО ; Точка останова (ВКРТ О), lббитная команда Для определения в коде проrраммы однобайтных констант, например симво лов, можно использовать директиву DCB (Define Constant Byte), а для определения 32битных констант  директиву DCD (Define Constant Data): LOR Rз,=МУNUМВЕR Получаем адрес константы MYNUMBER LOR R4, [R3] Считываем значение Ох12345б78 в R4 LOR RO,=HELLOTXT BL PrintText Получаем начальный адрес строки HELLO ТХТ Вызываем функцию PrintText для отображения строки МУ NUMBER ОСО Ox12345678 HELLO ТХТ ОСВ «Hello\n»,O ; Строка, завершающаяся нулевым символом Следует заметить, что синтаксис языка ассемблера зависит от используемоrо инструментария. В данном случае описывается синтаксис ассемблера ARM. Изу чение синтаксиса друrих ассемблеров лучше Bcero начинать с рассмотрения при меров проrрамм, поставляемых вместе со средствами разработки. 4.1.2. Язык ассемблера: использование суффиксов в ассемблере для процессоров ARM при записи мнемоник команд MorYT ис пользоваться дополнительные суффиксы, указанные в Табл. 4.1. Таблица 4.1. Суффиксы мнемоник команд Суффикс Описание S Изменить реrистр состояния приложения APSR (флаrи операций), например: AOOS RO, Rl ; Эта команда повлияет на содержимое APSR EQ, NE, LT, GT Условное выполнение; EQ = «Равно», NE = «Не равно», LT = «Ме'ньше», GT = «Больше» и т.д. Например: и Т.п. BEQ <Label> ; Перейти, если «равно» Суффиксы условноrо выполнения в процессоре CortexM3 обычно использу ются В командах переходов. Тем не менее, эти суффиксы MorYT при меняться и в друrих командах, если те располаrаются внутри блока IFTHEN (мы познако 
58 . Тлава 4. Набор команд мимся С данной конструкцией чуть позже). При этом суффикс S и суффиксы условноrо выполнения MorYT использоваться одновременно. В общей сложности имеется 15 условий выполнения команд, которые будут описаны далее. 4.1.3. Язык ассемблера: унифицированный язык ассемблера Для поддержки набора команд ThumЬФ2 и использования всех предоставляе мых этим набором преимуществ, компания ARM разработала унифицированный язык ассемблера (Unified Assembler Language  UAL). Применение данноrо языка облеrчает переход между кодами ARM и ТЬиmЬ за счёт использования одинако Boro синтаксцса для обоих наборов команд. АDD RO, R1 ; RO = RO + R1, используется традиционный синтаксис Thumb АDD RO, RO, R1 ; Эквивалентная команда, использующая синтаксис UAL При этом, как и прежде, можно использовать традиционный синтаксис ТЬиmЬ. Для указания Toro, каким образом ассемблер должен интерпретировать текст проrраммы, обычно применяются специальные директивы. Так, для acceM блера ARM наличие директивы СОDЕlб в заrоловке проrраммы означает исполь зование в проrрамме традиционноrо синтаксиса ТЬиmЬ, тоrда как директива THUMB указывает на использование HOBoro синтаксиса UAL. При применении традиционных команд 1humb не забывайте, что некоторые из них изменяют флаrи реrистра APSR независимо от наличия суффикса s. В син таксисе UAL влияние команды на флаrи состояния всеrда определяется этим суффиксом. Например: AND RO, R1 ; Традиционный синтаксис Thumb ANDS RO, RO, R1 ; Эквивалентный синтаксис UAL (указан суффикс S) В связи с появлением в наборе Тbитb2 новых команд некоторые операции Te перь MorYT быть выполнены как при помощи команд ТЬитЬ, так и при помощи команд Тbитb2. К примеру, операция инкрементирования RO = RO + 1 может быть реализована посредством 16битной команды 1humb или же 32битной KO манды 1humb2. Для указания разрядности команды в UAL предусмотрены спе циальные суффиксы: ADDS RO, #1 Используем 1ббитную команду Thumb по умолчанию для получения более компактноrо кода ADDS.N RO, #1 Используем 1ббитную команду Thumb; N = Narrow (узкая) ADDS.W RO, #1 Используем 32битную команду Thumb2; W = Wide (широкая) Суффикс . w указывает на использование 32битной команды. При отсутствии суффикса ассемблер может вставить команду любой разрядности; как правило, по умолчанию применяются 16битные команды ТЬитЬ для уменьшения разме ра кода. Для явноrо указания 16битных команд ТЬитЬ вы также можете исполь зовать суффикс . N, при условии, что этот суффикс поддерживается ассемблером. Ещё раз подчеркну, что всё сказанное выше относится к ассемблеру ARM. Прочие ассемблеры MorYT использовать друrой синтаксис. Если суффикс не YKa зан, то ассемблер может сам выбрать необходимую команду. В большинстве случаев приложения пишутся на языке Си, а компиляторы с этоrо языка везде, rде только можно, задействуют 16битные команды для полу 
4.2. Список команд · S9 чения наиболее компактноrо кода. Команды Тbиmb2 вставляются компилято ром при использовании непосредственных значений, выходящих за rраницы определённоrо диапазона, а также в тех случаях, коrда 32битные команды позво ля ют выполнить требуемую операцию наиболее эффективным образом. Команды Тbиmb2 MorYT быть выровнены на rраницу полуслова, например: Охl000 LDR rO, [rl] 16битная команда (располаrается по адресам ; Oxl000Oxl00l) Охl002 RBIT.W rO З2битная команда Thumb2 (располаrается по адресам Охl002. ..Охl005) Большинство 16битных команд MorYT обращаться только к реrистрам RO.. .R7, тоrда как 32битные команды не имеют подобноrо оrраничения. Тем не менее, в некоторых командах не допускается использование счётчика команд (RI5). Бо лее подробно этот вопрос рассмотрен в [2] (раздел А.4.6). 4.2. Список команд Команды, поддерживаемые процессором CortexM3, перечислены в Табл. 4.2.. .4.9. Подробное описание всех команд процессора можно найти в [2]. Кроме Toro, основная информация о поддерживаемых командах содержится в Приложении А данной книrи. Таблица 4.2. Команды обработки данных (16битные) Мнемоника Описание АDС Сложение с переносом АОО Сложение ADR Сложение РС и константы с заrрузкой результата в реrистр AND Лоrическое И A8R Арифметический сдвиr вправо BIC Очистка битов (операция «Лоrическое И» между одним значением и результатом лоrической инверсией друrоrо значения) CMN Сравнение с отрицательным операндом (сравнение одноrо значения с дополнительным кодом друrоrо значения и изменение флаrов) смр Сравнение (сравнение двух значений и изменение флаrов) Копирование (появилась в архитектуре v6; пересылает содержимое одноrо сру старшеrо или младшеrо реrистра в друrой старший или младший реrистр); синоним команды MOV EOR Исключающее ИЛИ 181 Лоrический сдвиr влево 18R Лоrический сдвиr вправо MOV Пересылка (может использоваться для пересылки данных между реrистрами или для заrрузки констант) MU1 Умножение MVN Пересылка с инверсией (пересылает результат лоrической инверсии значения) NEG Отрицание (вычисляет дополнительный код значения), эквивалент команды R8B ORR Лоrическое ИЛИ R8B Обратное вычитание 
60 · fлава 4. Набор команд Таблица 4.2. Команды обработки данных (16битные) (продолжение) Мнемоника Описание ROR Циклический сдвиr вправо SBC Вычитание с переносом SUB Вычитание TST Проверка битов (выполняет операцию «Лоrическое И»; влияет на флаr Z, результат операции не сохраняется) REV Перестановка байтов в 32битном реrистре (появилась в архитектуре у6) REV16 Перестановка байтов в каждом полуслове 32битноrо реrистра (появилась в архитектуре У6) REVSH Перестановка байтов в младшем полуслове 32битноrо реrистра и расширение знака результата (появилась в архитектуре У6) SXTB Расширение знака байта (появилась в архитектуре У6) SXTH Расширение знака полуслова (появилась в архитектуре У6) UXTB Дополнение нулями байта (появилась в архитектуре У6) UXTH Дополнение нулями полуслова (появилась в архитектуре У6) Таблица 4.3. Команды для ветвления (16битные) Мнемоника Описание В Переход B<cond> Условный переход Переход со ссылкой; вызывает подпроrрамму и сохраняет адрес возврата в LR В1 (в действительности это 32битная команда, но она также имеется в наборе Thumb традиционных процессоров ARM) В1Х Косвенный переход со ссылкой и изменением состояния (только В1Х <reg»* ВХ <reg> Косвенный переход с изменением состояния CBZ Сравнение и переход, если ноль (архитектура У7) CBNZ Сравнение и переход, если не ноль (архитектура У7) IT Блок 1 FTHEN (архитектура У7) * Команда BLX с использованием непосредственноrо значения не поддерживается, поскольку при её выполнении происходит переключение в состояние ARM) не поддерживаемое процессором CortexM3. Попытка использования команды BLX <reg> для переключения процессора в состояние ARM вызовет rенерацию исключен ия U sage Fault. Таблица 4.4. Команды заrрузки и сохранения (16битные) Мнемоника Описание 1DR Заrрузка слова из памяти в реrистр 1DRH Заrрузка полуслова из памяти в реrистр LDRB Заrрузка байта из памяти в реrистр LDRSH Заrрузка полуслова из памяти в реrистр с расширением знака LDRSB Заrрузка байта из памяти в реrистр с расширением знака STR Сохранение слова из реrистра в памяти STRH Сохранение полуслова из реrистра в памяти STRB Сохранение байта из реrистра в памяти 
4.2. Список команд . 61 Таблица 4.4. Команды заrрузки и сохранения (16битные) (продолжение) Мнемоника Описание 1DM/1DMIA Заrрузка нескольких реrистров/Заrрузка нескольких реrистров с постинкрементом STM/STMIA Сохранение нескольких реrистров/Сохранение нескольких реrистров с пост инкрементом PUSH Заrрузка реrистров в стек РОР Извлечение реrистров из стека Таблица 4.5. Прочие 16битные команды Мнемони Описание ка SVC Вызов супервизора SEV rенерация события WFE Ожидание события при нахождении в спящем режиме WFI Ожидание прерывания при нахождении в спящем режиме Точка останова; если отладка разрешена) то эта команда переводит процессор ВКРТ в режим отладки (останова) или же) если разрешено исключение монитора отладки) вызывает исключение отладки. В противном случае) rенерируется исключение отказа NOP Нет операции CPSIE Разрешение прерываний) очищает реrистр PRIMASK (CPSIE i)/FAULTMASK (CPSIE f) CPSID Запрещение прерываний) устанавливает реrистр PRIMASK (CPSIE i)/FAULTMASK (CPSIE f) в 1 Таблица 4.6. Команды обработки данных (32битные) Мнемоника Описание ADC Сложение с переносом ADD Сложение ADDW Сложение с 12битной константой ADR Сложение РС и константы с заrрузкой результата в реrистр AND Лоrическое И ASR Арифметический сдвиr вправо BIC Очистка битов (операция «Лоrическое И» между одним значением и результатом лоrической инверсии друrоrо) BFC Очистка битовоrо поля BFI Вставка битовоrо поля CMN Сравнение с отрицательным операндом (сравнение одноrо значения с дополнительным кодом друrоrо и изменение флаrов) СМР Сравнение (сравнение двух значений и изменение флаrов) C1Z Подсчёт ведущих нулевых битов EOR Исключающее ИЛИ 1S1 Лоrический сдвиr влево 
62 . Тлава 4. Набор команд Таблица 4.6. Команды обработки данных (32битные) (продолжение) Мнемоника Описание LSR Лоrический сдвиr вправо MLA Умножение со сложением MLS Умножение с вычитанием MOV Пересылка MOVW Пересылка 16битной константы в реrистр MOVT Пересылка старшеrо полуслова (заrрузка константы в старшее полуслово реrистра) MVN Пересылка с инверсией MUL Умножение ORR Лоrическое ИЛИ ORN Лоrическое ИЛИ с инверсией RBIT Перестановка битов REV Перестановка байтов слова REV16 Перестановка байтов в каждом полуслове REVSH Перестановка байтов в младшем полуслове и расширение знака ROR Циклический сдвиr вправо RSB Обратное вычитание RRX Расширенный циклический сдвиr вправо SBFX Извлечение битовоrо поля со знаком SDIV Знаковое деление SMLAL Длинное знаковое умножение со сложением SMULL Длинное знаковое умножение SSAT Знаковое насыщение SBC Вычитание с переносом SUB Вычитание SUBW Вычитание 12битной константы SXTB Расширение знака байта SXTH Расширение знака полуслова TEQ Проверка на равенство (выполняет операцию «Исключающее ИЛИ»; влияет на флаrи, результат операции не сохраняется) TST Про верка битов (выполняет операцию «Лоrическое И»; влияет на флаr Z, результат операции не сохраняется) UBFX Извлечение беззнаковоrо битовоrо поля UDIV Беззнаковое деление UMLAL Длинное беззнаковое умножение со сложением UMULL Длинное беззнаковое умножение USAT Беззнаковое насыщение UXTB Дополнение нулями байта UXTH Дополнение нулями полуслова 
4.2. Список команд . 63 Таблица 4.7. Команды заrрузки и сохранения (32битные) Мнемоника Описание LDR Заrрузка слова из памяти в реrистр LDRT Заrрузка слова из памяти в реrистр (непривилеrированный уровень доступа) LDRB Заrрузка байта из памяти в реrистр LDRBT Заrрузка байта из памяти в реrистр (непривилеrированный уровень доступа) LDRH Заrрузка полуслова из памяти в реrистр LDRHT Заrрузка полуслова из памяти в реrистр (непривилеrированный уровень доступа) LDRSB Заrрузка байта из памяти в реrистр с расширением знака LDRSBT Заrрузка байта из памяти в реrистр с расширением знака (непривилеrированный уровень доступа) LDRSH Заrрузка полуслова из памяти в реrистр с расширением знака LDRSHT Заrрузка полуслова из памяти в реrистр с расширением знака (непривилеrированный уровень доступа) LDM/LDMIA Заrрузка нескольких реrистров с пост инкрементом LDMDB Заrрузка нескольких реrистров с преддекрементом LDRD Заrрузка двух слов из памяти в реrистры STR Сохранение слова из реrистра в памяти STRT Сохранение слова из реrистра в памяти (непривилеrированный уровень доступа) STRB Сохранение байта из реrистра в памяти STRBT Сохранение байта из реrистра в памяти (непривилеrированный уровень доступа) STRH Сохранение полуслова из реrистра в памяти STRHT Сохранение полуслова из реrистра в памяти (непривилеrированный уровень доступа) STM/STMIA Сохранение нескольких реrистров с постинкрементом STMDB Сохранение нескольких реrистров с преддекрементом STRD Сохранение двух слов из реrистров в памяти PUSH Заrрузка реrистров в стек РОР Извлечение реrистров из стека Таблица 4.8. Команды ветвления (32битные) Мнемоника Описание В Переход B<cond> Условный переход BL Переход со ссылкой твв Табличный переход с однобайтными смещениями; переход в прямом направлении с использованием таблицы, содержащей однобайтные смещения твн Табличный переход с 2байтными смещениями; переход в прямом направлении С использованием таблицы, содержащей 2байтные смещения 
64 . fлава 4. Набор команд Таблица 4.9. Прочие 32битные команды Мнемоника Описание LDREX Монопольная заrрузка в реrистр LDREXH Монопольная заrрузка полуслова в реrистр LDREXB Монопольная заrрузка байта в реrистр STREX Монопольное сохранение реrистра STREXH Монопольное сохранение полуслова из реrистра STREXB Монопольное сохранение байта из реrистра CLREX Блокирование монопольноrо доступа для локальноrо процессора MRS Пересылка из РСН в РОН MSR Пересылка из РОН в РСН NOP Нет операции SEV rенерация события WFE Перевод в спящий режим и ожидание события WFI Перевод в спящий режим и ожидание прерывания ISB Барьер синхронизации команд DSB Барьер синхронизации данных DMB Барьер памяти данных 4.2.1. Неподдерживаемые команды Некоторые команды ТЬитЬ не поддерживаются процессором CortexM3; эти команды перечислены в Табл. 4.10. Таблица 4.10. Неподдерживаемые команды Thumb Мнемоника Описание Это команда перехода со ссылкой и изменением состояния. При использовании в качестве операнда непосредственноrо значения эта команда всеrда переводит BLX label процессор в состояние ARM. Поскольку процессор CortexM3 не поддерживает состояние ARM, все команды, пытающиеся переключить ero в данное состояние, вызывают rенерацию исключения Usage Fault Эта команда ТЬитЬ, появившаяся в архитектуре v6, изменяет порядок байтов мноrобайтных значений во время выполнения проrраммы. Поскольку SETEND процессор Cortex М3 не поддерживает динамическое изменение порядка байтов, попытка выполнения команды SETEND вызовет rенерацию исключения Usage Fault Ряд команд, описанных в [2], также не поддерживаются процессором CortexM3. Так, в архитектуре ARM y7M предусмотрены команды сопроцессора, однако в процессоре CortexM3 поддержка сопроцессора полностью отсутствует. Соответственно, попытка исполнения любой из команд сопроцессора, перечис ленных в Табл. 4.11, вызовет rенерацию исключения Usage Fault с одновременной установкой бита NOCP в реrистре UFSR контроллера NVIC. 
4.3. Описание команд . 65 Таблица 4.11. Неподдерживаемые команды сопроцессора Мнемоника Описание MCR Пересылка данных из процессора ARM в сопроцессор MCR2 Пересылка данных из процессора ARM в сопроцессор MCRR Пересылка в сопроцессор двух реrистров ARM MRC Пересылка данных из сопроцессора в реrистр ARM MRC2 Пересылка данных из сопроцессора в реrистр ARM MRRC Пересылка данных из сопроцессора в два реrистра ARM LDC 3аrрузка сопроцессора; заrрузка последовательно расположенных данных из памяти в сопроцессор STC Сохранение сопроцессора; сохранение данных из сопроцессора в памяти по последовательно расположенным адресам Некоторые из команд изменения состояния процесса (Cps) также не поддер живаются процессором CortexM3 (см. Табл. 4.12). Это связано с изменением KOH цепции реrистра состояния проrраммы (PSR) и, соответственно, с отсутствием в процессоре CortexM3 некоторых битов, определённых в архитектуре ARM v6. Таблица 4.12. Неподдерживаемые команды изменения состояния процесса Мнемоника Описание CPS<IEIID>.W А В процессоре CortexM3 бит А отсутствует CPS. W #mode В реrистре PSR процессора Cortx М3 биты режима отсутствуют Кроме Toro, командыподсказки (hiпtкоманды), перечисленные в Табл. 4.13, исполняются процессором CortexM3 как команда NOP. Таблица 4.13. Неподдерживаемые HintKoMaHAbI Мнемоника Описание DBG Hint  команда системы отладки и трассировки PLD Предварительная заrрузка данных; hint команда для кэшпамяти. Поскольку в про цессоре CortexM3 кэшпамять отсутствует, эта команда эквивалентна команде NOP Предварительная заrрузка команды; hintкоманда для кэшпамяти. Поскольку PLI в процессоре CortexM3 кэшпамять отсутствует, эта команда эквивалентна команде NOP Нintкоманда, позволяющая мноrопоточному приложению информировать YIELD процессор о завершении задачи, которая может быть выrружена для улучшения общей производительности системы При попытке исполнения всех остальных неопределённых команд rенериру ется исключение Usage Fault. 4.3. Описание команд в этом разделе мы познакомимся с основными командами, которые наиболее широко применяются в ассем6лерных проrраммах. Некоторые команды Moryr иметь различные опции, в частности использовать предварительный сдвиr опе 
66 . rлава 4. Набор команд рандов; подобные варианты использования команд в этом разделе практически не рассматриваются. 4.3.1. Язык ассемблера: пересыпка данных Одной из основных функций процессора является пересылка данных. Про цессор CortexM3 поддерживает следующие типы пересылок: · пересылка данных между реrистрами общеrо назначения; . пересылка данных между памятью и реrистром общеrо назначения; · пересылка данных между реrистром специальноrо назначения и реrистром общеrо назначения; . пересылка непосредственноrо значения в реrистр общеrо назначения. Для пересылки данных между реrистрами предназначена команда MOV. CKa жем, пересылка содержимоrо реrистра R3 в реrистр R8 записывается следующим образом: MOV R8, RЗ Имеется ещё одна команда пересылки, которая пересылает инверсное значе ние исходноrо содержимоrо реrистра,  это команда MVN. Основными командами, посредством которых выполняются обращения к па мяти, являются команды заrрузки и сохранения. Команда заrрузки (LDR) пересы лает данные из памяти в реrистры процессора, а команда сохранения (STR) пере сылает содержимое реrистров в память. При этом поддерживается пересылка данных любоrо размера (байт, полуслово, слово и двойное слово), как указано в Табл. 4.14. Таблица 4.14. Наиболее часто используемые команды обращения к памяти Пример Описание LDRB Rd, [Rn, #offset] Чтение байта из памяти по адресу Rn + offset LDRH Rd, [Rn, #offset] Чтение полуслова из памяти по адресу Rn + offset LDR Rd, [Rn, #offset] Чтение слова из памяти по адресу Rn + offset LDRD Rdl, Rd2, [Rn, #offset] Чтение двойноrо слова из памяти по адресу Rn + offset STRB Rd, [Rn, #offset] Сохранение байта в памяти по адресу Rn + offset STRH Rd, [Rn, #offset] Сохранение полуслова в памяти по адресу Rn + offset STR Rd, [Rn, #offset] Сохранение слова в памяти по адресу Rn + offset STRD Rdl, Rd2, [Rn, #offset] Сохранение двойноrо слова в памяти по адресу Rn + offset Команды rрупповой заrрузки (LDM) и сохранения (STM) дают возможность за один раз выполнить несколько одноимённых операций, как указано в Табл. 4.15. При этом символ «!» после первоrо операнда указывает на необходимость обнов ления реrистра Rd после выполнения команды. Пусть в R8 содержится значение Ох8000, тоrда: STMIA.W R8!, {RОRЗ} STMIA.W R8 , {RОRЗ} После сохранения данных R8 станет равным Ох8010 (инкрементируется на 4 для каждой операции пересылки) R8 не изменится 
4.3. Описание команд · 67 Таблица 4.15. Команды rрупповой заrрузки/сохранения При мер Описание Чтение нескольких слов из памяти, начиная с адреса, находящеrося в Rd; LDMIA Rd! , <reg list> адрес инкрементируется после (Increment After  IA) каждой пересылки (16битная команда ТЬиmЬ) Сохранение нескольких слов в памяти, начиная с адреса, находящеrося STMIA Rd! , <reg list> в Rd; адрес инкрементируется после (Increment After  IA) каждой пере сылки (16битная команда ТЬиmЬ) Чтение нескольких слов из памяти, начиная с адреса, находящеrося в Rd; LDMIA. W Rd (!), <reg list> адрес инкрементируется после каждой операции чтения (суффикс.W ro ворит о том, что это 32битная команда Тbиmb2) Чтение нескольких слов из памяти, начиная с адреса, находящеrося в Rd; LDMDB. W Rd ( ! ) , <reg list> адрес декрементируется перед (Decrement Before  DB) каждой операци ей чтения (суффикс.W rоворит о том, что это 32битная команда Тbиmb2) Сохранение нескольких слов в памяти, начиная с адреса, находящеrося STMIA.W Rd(!), <reg list> в Rd; адрес инкрементируется после каждой операции записи (суффикс.W rоворит о том, что это 32битная команда Тbиmb2) Сохранение нескольких слов в памяти, начиная с адреса, находящеrося STMDB. W Rd (! ) , <reg list> в Rd; адрес декрементируется перед каждой операцией записи (суффикс .W rоворит о том, что это 32битная команда Тbиmb2) Также процессоры ARM поддерживают обращение к памяти с использовани ем пред и постиндексации. В случае прединдексации содержимое реrистра, в KO тором хранится адрес ячейки памяти, перед выполнением операции изменяется. То есть пересылка данных будет осуществлена уже по новому адресу. Например: LDR.W RO, [Rl, #offset]! ; Читаем из памяти по адресу [Rl+offset], ; после операции Rl становится равным Rl+offset Наличие символа «!» указывает на изменение базовоrо реrистра Rl. Этот сим вол является необязательным, при ero отсутствии команда выполнит обычную операцию пересылки из ячейки памяти, определяемой смещением относительно базовоrо адреса. в rруппе команд обращения к памяти с прединдексацией име ются команды заrрузки и сохранения данных различной разрядности (Табл. 4.16). Таблица 4.16. При меры команд обращения к памяти с прединдексацией Пример Описание LDR. W Rd, [Rn, #offset] ! LDRB . W Rd, [Rn, #offset] ! Команды заrрузки с прединдексацией (слово, байт, LDRH . W Rd, [Rn, #offset] ! полуслово, двойное слово) LDRD. W Rdl, Rd2, [Rn, #offset] ! LDRSB. W Rd, [Rn, #offset] ! Команды заrрузки с пред индексацией LDRSH.W Rd, [Rn, #offset] ! и расширением знака (байт, полуслово) STR.W Rd, [Rn, #offset] ! STRB.W Rd, [Rn, #offset] ! Команды сохранения с прединдексацией (слово, STRH.W Rd, [Rn, #offset] ! байт, полуслово, двойное слово) STRD. W Rdl, Rd2, [Rn, #offset] ! 
68 · fлава 4. Набор команд Команды обращения к памяти с постиндексацией осуществляют пересылку данных с использованием базовоrо адреса, определяемоrо реrистром, после чеrо изменяют содержимое этоrо реrистра. Например, LDR.W RO, [Rl], #offset ; Читаем из памяти по адресу [Rl], после операции ; Rl становится равным Rl+offset При применении команд с постиндексацией нет необходимости в использова нии знака «!», поскольку команды данноrо типа в любом случае изменяют pe rистр, содержащий базовый адрес, тоrда как в случае команд с прединдексацией вы сами решаете, изменять этот реrистр или нет. Как и в rруппе команд с прединдексацией, в rруппе команд с постиндексаци ей имеются команды пересылки данных различной разрядности (Табл. 4.17). Таблица 4.17. Примеры команд обращения к памяти спостиндексацией При мер Описание LDR.W Rd, [Rn] , #offset LDRB.W Rd, [Rn] , #offset Команды заrрузки с постиндексацией (слово, байт, LDRH.W Rd, [Rn] , #offset полуслово, двойное слово) LDRD. W Rdl, Rd2, [Rn] , #offset LDRSB.W Rd, [Rn] , #offset Команды заrрузки с постиндексацией и расширением LDRSH.W Rd, [Rn] , #offset знака(байт,полуслово) STR.W Rd, [Rn] , #offset STRB.W Rd, [Rn] , #offset Команды сохранения с постиндексацией (слово, байт, S TRH . W Rd, [Rn] , #offset полуслово, двойное слово) STRD.W Rdl, Rd2, [Rn] , #offset К классу операций с памятью относятся также операция заrрузки данных в стек и операция извлечения данных из стека. Для выполнения этих операций предназначены команды PUSH и РОР соответственно. Например, PUSH {RO, R4R7, R9} ; Заrружаем RO, R4, R5, R6, R7, R9 в стек РОР {R2,RЗ} ; Извлекаем R2 и RЗ из стека Как правило, команде PUSH соответствует команда РОР с тем же списком apry ментов, однако это не является обязательным. В качестве примера подобноrо ис ключения из правил можно указать использование команды РОР для возврата из подпроrраммы: PUSH {RОRЗ, LR} ; Сохраняем содержимое реrистров в начале подпроrраммы Выполняем требуемые действия РОР {RОRЗ, РС} Восстанавливаем содержимое реrистров и возвращаемся В этом случае вместо восстановления содержимоrо реrистра LR и последую щеrо перехода по данному адресу мы заrружаем адрес возврата непосредственно в счётчик команд. Как было сказано в [лаве 3, процессор CortexM3 имеет несколько реrистров специальноrо назначения. Для обращения к этим реrистрам используются KO манды MRS и MSR. Например, MRS RO, PSR ; Считать состояние процессора в RO MSR CONTROL, Rl ; Записать содержимое Rl в реrистр управления 
4.3. Описание команд. 69 Ещё раз напомню, что обращение ко всем реrистрам специальноrо назначе ния, кроме реrистра APSR, допускается только в привилеrированном режиме. Очень часто возникает необходимость заrрузки в реrистр непосредственноrо значения. Скажем, для Toro чтобы обратиться к реrистру периферийноrо устрой ства, вам необходимо сначала заrрузить в реrистр процессора требуемый адрес. Для заrрузки значений разрядностью 8 бит и менее вы можете использовать KO манду MOVS. Например, MOVS RO, #Ох12 ; 3аrружаем Ох12 в RO ДЛЯ заrрузки значений большей разрядности (более 8 бит) вам придётся BOC пользоваться командой пересылки из набора 1humb2. Например, MOVW.W RO, #Ох789А ; 3аrружаем Ох789А в RO В случае 32битной константы вы можете использовать две команды для за rрузки старшей и младшей частей значения: MOVW.W RO,#Ox789A 3аrружаем Ох789А в младшие 16 бит RO MOVT.W RО,#ОхЗ456 ; 3аrружаем ОхЗ456 в старшие 16 бит RO ; Теперь RO = ОхЗ456789А В качестве альтернативы вы можете воспользоваться псевдокомандой LDR, имеющейся в ассемблере ARM. Например, LDR RO, =ОхЗ456789А Это не ассемблерная команда; ассемблер преобразует указанную инструкцию в команду заrрузки значения с использованием адресации относительно РС. Данный способ rенерации 32битных констант является более предпочтитель ным, нежели применение пары команд MOVW. W и MOVT . W, поскольку обеспечивает лучшую читаемость, а также позволяет уменьшить расход памяти в случае, если данное значение используется в разных местах проrраммы. 4.3.2. Псевдокоманды LDR и ADR Обе команды LDR и ADR MorYT применяться для заrрузки в реrистры значений адреса памяти. Однако синтаксис и поведение этих команд различаются. При ис пользовании команды LDR, если адрес расположен в области кода проrраммы, ac семблер автоматически установит младший бит заrружаемоrо значения в 1. Ha пример, LDR RO, =address1 3аrружаем Ох4001 в RO address1 MOV RO, R1 ; Метка соответствует адресу Ох4000 address1 содержит код проrраммы Вы сможете увидеть, что команда LDR заrрузит в Rl значение Ох4001; младший бит устанавливается в 1, указывая на использование кода 1humb. Если addressl является адресом в области данных, то младший бит значения не изменяется. Ha пример, LDR RO, =address1 3аrружаем Ох4000 в RO address1 Метка соответствует адресу Ох4000 
70 . fлава 4. Набор команд DСD ОхО ; addressl содержит данные Используя команду ADR, вы можете заrрузить в реrистр значение адреса про rpaMMbI без автоматическоrо изменения младшеrо бита. Например, ADR RO, addressl addressl MOV RO, Rl Метка соответствует адресу Ох4000 addressl содержит код проrраммы При использовании команды ADR в реrистр будет заrружено значение Ох4000. Обратите внимание на отсутствие в выражении знака равенства. Команда LDR размещает константу в коде проrраммы и заrружает её значение в реrистр, используя адресацию относительно РС. Команда ADR пытается сфор мировать значение константы с помощью команд сложения и вычитания (напри мер, основываясь на текущем значении РС). Как следствие, используя команду ADR, нельзя получить любые значения, т.е. искомый адрес должен находиться на небольшом расстоянии от команды. Тем не менее, команда ADR может rенериро вать более компактный код по сравнению с командой LDR. Команда ADR является 16битной и требует, чтобы конечный адрес был BЫpOB нен на rраницу слова (кратен четырём). Если конечный адрес не выровнен на rpa ницу слова, то вы можете использовать 32битный вариант команды  ADR. w. Ec ли конечный адрес расположен за пределами области в :t4095 байт относительно текущеrо значения РС, то можно задействовать псевдокоманду ADRL, которая по зволяет обращаться к адресам в диапазоне :tl Мбайт. 4.3.3. Язык ассемблера: обработка данных Процессор CortexM3 поддерживает множество самых разных команд, пред назначенных для обработки данных. В настоящем подразделе будут рассмотрены наиболее часто используемые из этих команд. Следует отметить, что большин ство команд обработки данных MorYT иметь несколько форматов записи. Напри мер, команда сложения АОD может выполнять операцию между двумя реrистра ми или же между реrистром и непосредственным значением: АDD RO, RO, Rl RO  RO + Rl ADDS RO, RO, #Ох12 ; RO  RO + Ох12 ADD.W RO, Rl, R2 ; RO  Rl + R2 Все команды из приведённоrо примера являются командами АОО, однако они имеют разные форматы записи и разное двоичное представление. При использовании 16битноrо кода Thumb и традиционноrо синтаксиса для записи команд Thumb команда АDD влияет на флаrи в реrистре состояния процес сора. В то же время 32битный код Thumb2 может изменять эти флаrи, а может и не изменять. Если выполнение последующих операций зависит от состояния флаrов, то следует использовать суффикс S, указывающий на необходимость их изменения: ADD.W RO, Rl, R2 Не влияет на состояние флаrов ADDS.W RO, Rl, R2 Влияет на состояние флаrов 
4.3. Описание команд · 71 Помимо команды АDD, процессор CortexM3 поддерживает такие команды арифметических операций, как команда вычитания (SUB), команда умножения (MUL), а также команды беззнаковоrо и знаковоrо деления (UDIV/SDIV). HeKOTO рые наиболее широко используемые команды арифметических операций приве дены в Табл. 4.18. Таблица 4.18. При меры команд арифметических операций Команда Операция АDD Rd, Rn, Rm ; Rd = Rn + Rm АDD Rd, Rd, Rm ; Rd = Rd + Rm Сложение АDD Rd, #immed ; Rd = Rd + #immed АDD Rd, Rn, # immed ; Rd = Rn + #immed АDС Rd, Rn, Rm ; Rd = Rn + Rm + перенос АDС Rd, Rd, Rm ; Rd = Rd + Rm + перенос Сложение с переносом АDС Rd, #immed ; Rd = Rd + # immed + пере нос ADDW Rd, Rn, #immed ; Rd = Rn + #immed Сложение реrистра и 12битной константы SUB Rd, Rn, Rm ; Rd = Rn  Rm SUB Rd, #immed ; Rd = Rd  #immed Вычитание SUB Rd, Rn, #immed ; Rd = Rn  # immed SBC Rd, Rm ; Rd = Rd  Rm  заём SBC.W Rd, Rn, #immed ; Rd = Rn  #immed  заём Вычитание с заёмом (инверсия переноса) SBC . W Rd, Rn, Rm ; Rd = Rn  Rm  заём RSB . W Rd, Rn, #immed ; Rd = #immed  Rn RSB . W Rd, Rn, Rm Rd = Rm  Rn Обратное вычитание ; MUL Rd, Rm ; Rd = Rd * Rm Умножение MUL . W Rd, Rn, Rm ; Rd = Rn * Rm UDIV Rd, Rn, Rm ; Rd = Rn/Rm SDIV Rd, Rn, Rm Rd Rn/Rm Деление ; = Эти команды MorYT применяться как с суффиксом S, указывающим на то, что команда воздействует на реrистр APSR, так и без данноrо суффикса. В большин стве случаев при использовании синтаксиса UAL и отсутствии в мнемонике KO манды суффикса S в код будет вставлен 32битный вариант команды, поскольку практически все 16битные команды Thumb влияют на состояние реrистра APSR. Также процессор CortexM3 поддерживает команды 32битноrо умножения и умножения со сложением, формирующие 64битный результат. Имеются как знаковые, так и беззнаковые варианты этих команд (Табл. 4.19). Таблица 4.19. Команды 32битноrо умножения Команда Операция SMULL RdLo, RdHi, Rn, Rm ; {RdHi, RdLo} = Rn * Rm Команды 32битноrо умножения SMLAL RdLo, RdHi, Rn, Rm . {RdHi, RdLo} t= Rn * Rm чисел со знаком , UMULL RdLo, RdH i , Rn, Rm ; {RdHi,RdLo} = Rn * Rm Команды 32битноrо умножения UMLAL RdLo, RdH i, Rn, Rm ; {RdHi,RdLo} += Rn * Rm чисел без знака 
72 · rлава 4. Набор команд Ко второй rруппе команд обработки данных относятся команды лоrических операций и сдвиrа. Некоторые из наиболее широко используемых команд данной rруппы приведены в Табл. 4.20. Эти команды тоже MorYT применяться с суффик сом S, указывающим на необходимость изменения реrистра APSR. При использо вании синтаксиса UAL и отсутствии в записи команды суффикса S в код будет вставлен 32битный вариант команды, поскольку все 16битные команды лоrиче ских операций влияют на состояние реrистра APSR. Таблица 4.20. Команды лоrических операций Команда Операция AND Rd, Rn ; Rd == Rd & Rn AND. W Rd, Rn,#irnrned ; Rd == Rn & # irnrned Побитовое И AND. W Rd, Rn, Rrn ; Rd == Rn & Rd ORR Rd, Rn ; Rd == Rd I Rn ORR. W Rd, Rn, #irnrned ; Rd == Rn I #irnrned Побитовое ИЛИ ORR. W Rd, Rn, Rrn ; Rd == Rn I Rd BIC Rd, Rn ; Rd == Rd & (--- Rn) BIC.W Rd, Rn,#irnrned ; Rd == Rn & (---# irnrned) Очистка битов BIC.W Rd, Rn, Rrn ; Rd == Rn & (---Rd) ORN . W Rd, Rn,#irnrned ; Rd == Rn I (---# irnrned) ORN . W Rd, Rn, Rrn Rd == Rn I (---Rd) Побитовое ИЛИ с инверсией ; EOR Rd, Rn ; Rd == Rd л Rn EOR.W Rd, Rn, #irnrned . Rd == Rn I # irnrned Побитовое «Исключающее ИЛИ» , EOR. W Rd, Rn, Rrn ; Rd == Rn I Rd Как уже было сказано, в процессоре CortexM3 имеются команды простоrо и циклическоrо сдвиrа. В некоторых случаях операция циклическоrо сдвиrа MO жет объединяться с друrими операциями, например при вычислении смещения адреса для команд заrрузки/сохранения. При меры команд, выполняющих опера ции сдвиrа, приведены в Табл. 4.21. И опять же, при использовании синтаксиса UAL и отсутствии в мнемонике команды суффикса S в код вставляется 32бит ный вариант команды. Таблица 4.21. Команды сдвиrа Команда Операция A5R Rd, Rn, # irnrned ; Rd == Rn » irnrned A5R Rd, Rn ; Rd == Rd » Rn Арифметический сдвиr вправо A5R.W Rd, Rn, Rrn ; Rd == Rn » Rrn L5L Rd, Rn, #irnrned ; Rd == Rn « irnrned L5L Rd, Rn ; Rd == Rd « Rn Лоrический сдвиr влево LSL.W Rd, Rn, Rrn ; Rd == Rn « Rrn L5R Rd, Rn, #irnrned ; Rd == Rn » irnrned LSR Rd, Rn ; Rd == Rd » Rn Лоrический сдвиr вправо LSR.W Rd, Rn, Rrn ; Rd == Rn » Rrn 
4.3. Описание команд . 73 Таблица 4.21. Команды сдвиrа (продолжение) Команда Операция ROR Rd, Rn ; Rd = Rd rot Ьу Rn ROR.W Rd, Rn, #immed . Rd = Rn rot Ьу immed Циклический сдвиr вправо , ROR.W Rd, Rn, Rm ; Rd = Rn rot Ьу Rm RRX.W Rd, Rn ; {С, Rd} = {Rn, С} Расширенный циклический сдвиr вправо При использовании синтаксиса UAL и при наличии суффикса S команды обычноrо и циклическоrо сдвиrов также MorYT изменять состояние флаrа пере носа (16битные команды Thumb всеrда влияют на этот флаr), как показано на Рис. 4.1. При сдвиrе содержимоrо реrистра на несколько битов состояние флаrа переноса С будет равно значению последнеrо бита, выдвинутоrо из реrистра. Лоrический сдвиr влево (LSL) I С 14 1 Реrистр 14 О Лоrический сдвиr вправо (LSR) О .1 Реrистр 1 .1 с I Циклический сдвиr вправо (ROR) 1 Р1 с .1 Реrистр 1 Арифметический сдвиr вправо (ASR) I .0 Реrистр I .1 с 1 Расширенный циклический 1 .СЬ сдвиr вправо (RRX) .! 1 Реrистр Рис. 4.1. Команды обычноzо u цuклuческоzо caBuza. Для изменения разрядности знаковоrо значения с байта или полуслова до сло- ва в процессоре CortexM3 предусмотрено две команды, приведённые в Табл. 4.22. Имеются как 16битный, так и 32битный варианты этих команд, причём 16бит ные команды MorYT обращаться только к младшим реrистрам. 
74 . rлава 4. Набор команд Таблица 4.22. Команды расширения знака Команда Операция SXTB Rd, Rm ; Rd == signext (Rm [7: О]) Расширение знака байта до слова SXTH Rd, Rm ; Rd == signext(Rm[15:0]) Расширение знака полуслова до слова Ещё 9дна rруппа команд обработки данных предназначена для перестановки байтов содержимоrо реrистра (Табл. 4.23). Эти команды обычно используются для преобразования данных с прямым порядком байтов в данные с обратным по рядком байтов, и наоборот (Рис. 4.2). Имеются как 16битный, так и 32битный варианты этих команд, причём 16битные команды MorYT обращаться только к младшим реrистрам. Таблица 4.23. Команды изменения порядка байтов Команда Операция REV Rd, Rn ; Rd == rev (Rn) Перестановка байтов слова REV16 Rd, Rn ; Rd == rev16 (Rn) Перестановка байтов каждоrо полуслова REVSH Rd, Rn ; Rd == revsh (Rn) Перестановка байтов младшеrо полуслова и расширение знака результата REV.W (Перестановка байтов слова) RЕV1б.W (Перестановка байтов полуслова) REVSH.W (Перестановка байтов младшеrо полуслова и расширение знака результата) Биты [З 1 :24] Биты [2З:1 б] Биты [15:8] Биты [7:0] оо Расширение знака Рис. 4.2. Команды перестановкu байтов. Последнюю rруппу команд обработки данных составляют команды операций с битовыми полями. Все команды из этой rруппы перечислены в Табл. 4.24. При меры использования этих команд при водятся в последнем разделе rлавы. 
4.3. Описание команд. 75 Таблица 4.24. Команды операций с битовыми полями Команда Операция BFC . W Rd, Rn, #<width> Очистка битовоrо поля в реrистре BFI . W Rd, Rn, #<lsb>, #<width> Вставка битовоrо поля в реrистр CLZ. W Rd, Rn Подсчёт ведущих нулевых битов RBIT. W Rd, Rn Перестановка битов в реrистре SBFX. W Rd, Rn, #<lsb>, #<width> Копирование битовоrо поля из реrистра  источника и расширение ero знака UBFX.W Rd, Rn, #<lsb>, #<width> Копирование битовоrо поля из реrистраисточника 4.3.4. Язык ассемблера: вызов nOAnporpaMM и безусловный переход Наиболее часто в проrраммах используются следующие команды ветвления: в label ; Переход по адресу, обозначенному меткой ВХ reg ; Переход по адресу, определяемому реrистром В случае команды ВХ младший бит значения, находящеrося в реrистре, опре деляет следующее состояние (1humbIARM) процессора. Поскольку процессор CortexM3 всеrда работает в состоянии 1humb, этот бит должен быть установлен в 1. Если он окажется сброшенным, то произойдёт rенерация исключения Usage Fault, поскольку в данном случае команда попытается переключить процессор в состояние ARM. ДЛЯ вызова функции следует использовать команду перехода со ссылкой. BL label Переход по адресу, обозначенному меткой, с сохранением адреса возврата в LR Переход по адресу, определяемому реrистром, с сохранением адреса возврата в LR При выполнении этих команд адрес возврата сохраняется в реrистре связи (LR), что даёт возможность вернуться в вызвавший подпроrрамму процесс с по мощью команды ВХ LR. При использовании команды BLX необходимо убедиться, что младший бит содержимоrо реrистра установлен в 1. В противном случае, бу дет сrенерировано исключение Usage Fault, поскольку команда попытается пере ключить процессор в состояние ARM. Операции перехода также можно выполнять, используя команды MOV и LDR, например MOV R15, RO LDR R15, [RO ] BLX reg РО Р { R15 } Переход по адресу, содержащемуся в RO Переход по адресу, содержащемуся в ячейке памяти с адресом, определяемым RO Извлекаем значение адреса возврата из стека в счётчик команд Выполняя переходы с помощью указанных методов, не забывайте о необходи мости установки младшеrо бита HOBoro значения счётчика команд в 1. В против ном случае, будет rенерироваться исключение Usage Fault, поскольку команды будут пытаться переключить процессор в состояние ARM, которое им не поддер живается. 
76 . rлава 4. Набор команд 4.3.5. Язык ассемблера: условное выполнение и переходы Большинство команд условных переходов в процессорах ARM принимают pe тение о выполнении перехода на основании состояний флаrов реrистра APSR. Этот реrистр содержит пять флаrов, четыре из которых используются KOMaHдa ми условных переходов (Табл. 4.25). Таблица 4.25. Флаrи реrистра APSR, используемые при выполнении условных переходов Флаr Позиция Описание N 31 Отрицательное значение (результатом последней операции было отрицательное значение) Z 30 Ноль (результатом последней операции было нулевое значение) С 29 Перенос (последняя операция вызвала перенос или заём) V 28 Переполнение (последняя операция вызвала переполнение) в 27M бите реrистра расположен пятый флаr  Q. Этот флаr предназначен для выполнения математических операций с насыщением и не при меняется в KO мандах условных переходов. 
4.3. Описание команд . 77 Различные комбинации четырёх флаrов (N, Z, С и У) позволяют определить 15 условий переходов (Табл. 4.26). Используя эти условия, команды ветвления MorYT быть записаны следующим образом: BEQ label ; Переход по адресу 'label', если флаr Z установлен Таблица 4.26. Условия для команд переходов и прочих условно выполняемых операций Мнемоника Условие Флаr EQ Равно Z установлен NE Не равно Z сброшен С5/Н5 Перенос/выше или то же С установлен (беззнаковое «») CC/LO Нет переноса/ниже (беззнаковое С сброшен «<» ) МI Минус/отрицательное значение N установлен PL Плюс/положительное значение N сброшен или ноль У5 Переполнение V установлен УС Нет переполнения V сброшен НI Выше (беззнаковое «>>» С установлен и Z сброшен L5 Ниже или то же (беззнаковое «») С сброшен или Z установлен GE Больше или равно (знаковое «») N установлен и V установлен или N сброшен и V сброшен (N == У) LT Меньше (знаковое «<») N установлен и V сброшен или N сброшен и v установлен (N != У) 
78 . fлава 4. Набор команд Таблица 4.26. Условия для команд переходов и прочих условно выполняемых операций (продолжение) Мнемоника Условие Флаr Z сброшен и либо N установлен и V GT Больше (знаковое «>>» установлен, либо N сброшен и V сброшен (Z == О, N == У) Z сброшен или либо N установлен и V сброшен, LE Меньше или равно (знаковое «») либо N сброшен и V установлен (Z == 1 или N != У) AL Всеrда (безусловное выполнение)  Если конечный адрес расположен достаточно далеко, то можно использовать 32битные варианты этих команд, например BEQ.W label ; Переход по адресу 'label', если флаr Z установлен Условия переходов также MorYT использоваться в условных блоках IFTHEN ELSE. Например, смр RO, Rl ITTEE GT Сравниваем RO и Rl Проверяем условие RO > Rl: ; если истина, то выполняются две первые команды, если ложь, то выполняются две оставшиеся команды MO VGT R2, RO R2 = RO MO VGT RЗ, Rl RЗ = Rl MO VLE R2, Rl R2 = Rl MOV LE RЗ, RO RЗ = RO Состояние флаrов APSR может изменяться в следующих случаях: . при выполнении большинства 16битных команд арифметических и лоrиче ских операций; . при выполнении 32битных (Thumb2) команд в случае указания суффикса S, например ADDS. W; . при выполнении команд сравнения (например, смр) и проверки (например, TST и TEQ); . при непосредственной записи в реrистр APSR/xPSR. Большинство 16битных команд Thumb влияют на состояние флаrов N, Z, С и у. Команды Thumb2 MorYT влиять на эти флаrи, а MorYT и не влиять. Например: ADDS.W RO, Rl, R2 ; Эта З2битная команда Thumb влияет на состояние флаrов ADD.W RO, Rl, R2 ; Эта З2битная команда Thumb не влияет на состояние флаrов Будьте внимательны при повторном использовании ранее написанноrо кода из старых проектов. Если в старом проекте использовался традиционный син таксис Thumb, то АОD RO, Rl ; Эта lббитная команда Thumb влияет на состояние флаrов АОD RO, #Oxl ; Эта lббитная команда Thumb влияет на состояние флаrов Если же вы вставите этот код в nporpaMMY, использующую синтаксис UAL (в проrрамме имеется директива ассемблера THUMB), то АОD RO, Rl Эта lббитная команда Thumb влияет на состояние флаrов АОD RO, #Охl Эта запись соответствует З2битной команде Thumb, которая не влияет на состояние флаrов 
4.3. Описание команд · 79 Чтобы rарантировать получение корректно работающеrо кода при использо вании различных средств разработки, вы должны всеrда явно указывать суф фикс S, если для выполнения последующих команд, таких как команды условно ro перехода, требуются актуальные значения флаrов. Команда сравнения (СМР) вычитает одно значение из друrоrо и обновляет фла rи (аналоrично команде SUBS), однако результат вычитания ниrде не сохраняет ся. Команда СМР имеет следующие форматы записи: смр RO, R1 ; Вычисляет RO  R1 и обновляет флаrи смр RO, #Ох12 ; Вычисляет RO  Ох12 и обновляет флаrи Похожая команда CMN сравнивает одну величину с отрицательным значением (дополнением до двух) друrой величины; флаrи обновляются, однако результат ниrде не сохраняется. CMN RO, R1 ; Вычисляет RO  (R1) и обновляет флаrи CMN RO, #Ох12 ; Вычисляет RO  (Ox12) и обновляет флаrи Команда проверки TST очень похожа на команду AND. Она выполняет побито вую операцию И между двумя значениями и обновляет флаrи, однако результат этой операции ниrде не сохраняется. Как и команда СМР, данная команда имеет два формата записи: TST RO, R1 Вычисляет RO AND R1 и обновляет флаrи TST RO, #Ох12 ; Вычисляет RO AND Ох12 и обновляет флаrи 4.3.6. Язык ассемблера: объединение операций сравнения и условноrо перехода В процессоре CortexM3 имеются две новые команды, выполняющие cpaBHe ние с нулем и последующий переход в зависимости от результата сравнения. Это команды CBZ (сравнение и переход, если ноль) и CBNZ (сравнение и переход, если не ноль). Команды сравнения и перехода поддерживают переходы только в прямом Ha правлении. Возьмём, к примеру, такой фраrмент проrраммы на языке Си: i == 5; while (i !== О { func1 () ; // Вызов функции l; } В результате компиляции может быть получен следующий код: MOV RO, #5 Инициализируем счётчик цикла loop1 CBZ RO, loop1exit Если счётчик == О, то выходим из цикла BL func1 Вызываем функцию SUB RO, #1 Декрементируем счётчик цикла В loop1 ; К следующей итерации loop1exit Использование команды CBNZ полностью аналоrично использованию KOMaH ды CBZ, за исключением Toro, что переход выполняется при сброшенном флаrе Z (результат не равен нулю). К примеру, фраrмент исходноrо текста: 
80 . fлава 4. Набор команд status = strchr(ernailaddress, '@'); if (status == О) { // status = О, если в ernail address отсутствует символ @ showerrorrnessage(); exit(l); } может быть скомпилирован следующим образом: BL strchr CBNZ RO, ernail looksokay ; Переходим, если результат не равен нулю BL showerrorrnessage BL exit ernaillooksokay Команды CBZ и CBNZ не влияют на содержимое реrистра APSR. Язык ассембпера: усповное выпопнение с испопьзованием команд IT Такие конструкции, как Iтблоки (IFTHEN), очень полезны для реализации небольших по объёму фраrментов условно выполняемоrо кода. Они позволяют избавиться от недостатков, связанных с использованием команд перехода, по скольку не вмешиваются в ход выполнения проrраммы. Эти блоки MorYT coдep жать до четырёх условно выполняемых команд. В первой строке Iтблока располаrается команда IT, после которой указывает ся проверяемое условие. Первое выражение после команды IT выполняется в слу чае истинности проверяемоrо условия. Последующие выражения (со BToporo по четвёртое) MorYT выполняться либо в случае истинности условия, либо при ero ложности. В команде IT это указывается в виде ITxyz, rде истинности COOTBeT ствует символ «Т» (THEN), а ложности  символ «Е» (ELSE): IT<x><y><z> <cond> Команда IT «х>, <у>, <z> ; MorYT быть Т или Е) instrl<cond> <operands> lя команда (условие <cond> должно быть таким же, как в команде IT) instr2<cond или not cond> <operands> 2я команда (условие может быть таким же, как в команде IT, или обратным) instr3<cond или not cond> <operands> 3я команда (условие может быть таким же, как в команде IT, или обратным) instr4<cond или not cond> <operands> ; 4я команда (условие может быть таким же, как в команде IT, или обратным) Если выражение должно выполняться в случае ложности условия <cond>, то суффикс условия команды должен быть обратным тому условию, которое указа но в команде IT. Так, для условия EQ обратным является условие NE, для условия GT  LE и т.д. Ниже приведён простой пример использования условноrо выпол нения команд: if (Rl<R2) then R2=R2Rl R2=R2/2 else 
4.3. Описание команд . 81 Rl=RlR2 Rl=Rl/2 На языке ассемблера этот код будет выrлядеть следующим образом: смр Rl, R2 Если Rl < R2 (меньше чем), ITTEE LT то выполняются команды 1 и 2 ; (на это указывает символ Т), иначе выполняются команды 3 и 4 (на это указывает символ Е) lя команда 2я команда Зя команда (обратите внимание, что условие GE противоположно условию LT) LSRGE.W Rl,#l 4я команда Допускается использование меньшеrо числа условно выполняемых команд, но не менее одной. При этом количество символов «Т» И «Е» в мнемонике команды IT должно соответствовать числу используемых команд. При возникновении исключения внутри Iтблока состояние процесса выпол нения блока будет запоминаться в битовом поле ICI реrистра PSR, значение KOTO poro сохраняется в стеке. Блаrодаря этому после завершения обработчика исклю чения и возобновления выполнения Iтблока остальные команды блока будут выполнены корректно. Если исключение возникнет во время исполнения KOMaH ды, выполняющейся за несколько тактов (например, команды rрупповой заrруз ки и сохранения), то выполнение данной команды будет полностью прервано и запущено повторно после завершения обработки прерывания. SUBLT.W R2,Rl LSRLT.W R2,#1 SUBGE.W Rl,R2 4.3.7. Язык ассемблера: команды барьерной синхронизации Процессор CortexM3 поддерживает несколько команд барьерной синхрони зации. Необходимость в этих командах вызвана постоянно растущей сложно стью систем памяти процессоров. В ряде случаев, если не использовать команды барьерной синхронизации, возможно возникновение «rOHOK». Например, если допускается переключение карты памяти с помошью аппа paTHoro реrистра, то после записи в этот реrистр вы должны использовать KOMaH ду DSB. В противном случае, если операция записи в реrистр переключения памя ти буферирована и выполняется за несколько тактов, а следующая команда сразу же обращается к переключённой области памяти, то обращение произойдёт с ис пользованием старой карты памяти. В ряде случаев, если переключение памяти произойдёт одновременно с обращением к ней, это может вызвать ошибку ДOCTY па. Использование в данной ситуации команды DSB позволит rарантировать, что запись в реrистр переключения карты памяти будет завершена до выполнения следующей команды. Процессором CortexM3 поддерживаются три команды барьерной синхрони зации: . DMB; . DSB; . 1 SB. 
82 . rлава 4. Набор команд Все эти команды описаны в Табл. 4.27. Таблица 4.27. Команды барьерной синхронизации Команда Описание DМВ Барьер памяти данных; обеспечивает завершение всех операций с памятью до выполнения HOBoro обращения к ней DSB Барьер синхронизации данных; rарантирует, что все операции с памятью будут завершены до исполнения следующей команды ISB Барьер синхронизации команд; очищает конвейер и rарантирует завершение всех предыдущих команд перед выполнением новых команд Команды барьерной синхронизации MorYT использоваться в еипроrраммах посредством вызова соответствующих функций еМSISсовместимой библиоте ки драйвера устройства: void DMB(void); // Барьер памяти данных void DSB(void); // Барьер синхронизации данных void ISB(void); // Барьер синхронизации команд Команды DSB и 1 SB MorYT потребоваться в случае самомодифицирующеrося кода. Предположим, к примеру, что проrрамма изменяет свой собственный код, и следующая исполняемая команда должна соответствовать новому коду. OДHa ко, поскольку в процессоре имеется конвейер, в нём может уже находиться старое содержимое модифицированной ячейки памяти. Использование команды DSB, а затем 1SB позволит rарантировать, что команда модифицированноrо кода будет считана в конвейер повторно. е точки зрения архитектуры, команда 1SB должна при меняться после каждо ro изменения реrистра eONTROL. В процессоре CortexM3 это правило не явля ется cTporo обязательным к выполнению. И всё же, если вы хотите обеспечить пе рено сим ость cBoero приложения, вы должны обеспечить наличие команды 1SB после каждоrо изменения реrистра CONTROL. Команда ОМВ чрезвычайно полезна в мноrопроцессорных системах. Напри мер, задача, выполняемая отдельным процессором, может использовать для вза имодействия с друrими задачами разделяемую область памяти. В такой среде по рядок доступа к разделяемой области памяти может оказаться чрезвычайно важ ным. Команда DMB может применяться между обращениями к разделяемой памя ти, обеспечивая необходимую последовательность этих операций. Более подробно вопрос использования команд барьерной синхронизации рассмотрен в [2]. 4.3.8. Язык ассемблера: операции насыщения Процессор eortexM3 поддерживает две команды, обеспечивающие выполне ние операции насыщения для знаковых (SSAT) и беззнаковых (USAT) данных. Наиболее часто арифметика с насыщением используется при обработке сиr налов, скажем, при их усилении. При усилении сиrнала всеrда существует Bepo ятность Toro, что выходной сиrнал выйдет за пределы допустимоrо диапазона. Если корректировка значений осуществляется простым отбрасыванием неис 
4.3. Описание команд · 83 пользуемых старших битов, то в результате переполнения мы получим COBep шенно искажённый сиrнал (Рис. 4.3). Без насыщения     Динамический диапазон О Усиление Со знаковым насыщением о Рис. 4.3. Операция знаКО8020 наСblщения. Операция насыщения не предотвращает искажение сиrнала, однако она, по крайней мере, значительно уменьшает степень этих искажений. Синтаксис команд SSAT и USAT описан далее, а также в Табл. 4.28. Таблица 4.28. Команды насыщения Команда Описание SSAT. W <Rd>, #<immed>, <Rn>, {,<shift>} Насыщение знаковоrо значения USAT. W <Rd> , #<immed>, <Rn>, {,<shift>} Насыщение знаковоrо значения в пределах беззнаковоrо диапазона Rn  входное значение; shift  операция сдвиrа входноrо значения перед выполнением насыщения; необязательная; может быть #L8L N или #A8R N; immed  позиция бита, при достижении которой производится насыщение; Rd  реrистр приёмник. Операция влияет не только на содержимое реrистраприёмника, но и на co стояние флаrа Q реrистра APSR. Этот флаr устанавливается в 1, если при выпол нении операции произошло насыщение (Табл. 4.29). Флаr Q может быть сброшен непосредственной записью в реrистр APSR. Например, если необходимо выпол нить насыщение 32битноrо значения в пределах 16битноrо знаковоrо диапазо на, то можно использовать следующую команду: SSAT.W R1, #16, RO 
84 . fлава 4. Набор команд Таблица 4.29. Некоторые результаты выполнения операции знаковоrо насыщения ВХОД (RO) ВЫХОД (Rl) БитQ ОхООО20000 OxOOOO7FFF Устанавливается ОхОООО8000 OxOOOO7FFF Устанавливается OxOOOO7FFF OxOOOO7FFF Не изменяется ОхОООООООО ОхОООООООО Не изменяется OxFFFF8000 OxFFFF8000 Не изменяется OxFFFF7FFF OxFFFF8000 Устанавливается OxFFFEOOOO OxFFFF8000 Устанавливается Аналоrично, если необходимо выполнить насыщение 32битноrо значения в пределах 16битноrо беззнаковоrо диапазона, то можно использовать команду: USAT.W R1, #16, RO Последняя команда выполняет операцию насыщения в соответствии с Рис. 4.4. Некоторые выходные значения для этой команды приведены в Табл. 4.30.  - Динамический диапазон Усиление о o (беззнаковым насыщением о Рис. 4.4. Операция беззнаковО20 наСblщения. Таблица 4.30. Некоторые результаты выполнения операции беззнаковоrо насыщения ВХОД (RO) ВЫХОД (Rl) БитQ ОхООО20000 OxOOOOFFFF Устанавливается ОхОООО8000 ОхОООО8000 Не изменяется OxOOOO7FFF OxOOOO7FFF Не изменяется ОхОООООООО ОхОООООООО Не изменяется OxFFFF8000 ОхОООООООО Устанавливается OxFFFF8001 ОхОООООООО Устанавливается OxFFFFFFFF ОхОООООООО Устанавливается Команды насыщения также MorYT использоваться для преобразования типов данных. В частности, их можно использовать для преобразования 32битноrо цe лоrо значения в 16битное. Однако компиляторы языка Си MorYT оказаться не в состоянии напрямую использовать эти команды, что потребует использования встроенных либо ассемблерных функций (или же BCTpoeHHoro ассемблера) для выполнения преобразования. 
4.4. Некоторые полезные команды процессора CortexM3 · 85 4.4. Некоторые полезные команды процессора Cortex..M3 в этом разделе мы познакомимся с несколькими полезными командами Thumb2, появившимися в архитектурах у6 и у7. 4.4.1. Команды MSR и MRS Эти две команды обеспечивают доступ к реrистрам специальноrо назначения процессора CortexM3. Они имеют следующий синтаксис: MRS <Rn>, <SReg> ; Пересылка из реrистра специальноrо назначения MSR <SReg>, <Rn> ; Запись в реrистр специальноrо назначения rде в качестве <SReg> может использоваться одно из символических имён, пере численных в Табл. 4.31. Таблица 4.31. Обозначения реrистров специальноrо назначения для команд MRS иМSR Обозначение Описание IPSR Реrистр состояния прерывания EPSR Реrистр состояния выполнения проrраммы (читается как О) APSR Флаrи результата предыдущей операции IEPSR Объединённые реrистры IPSR и EPSR IAPSR Объединённые реrистры IPSR и APSR EAPSR Объединённые реrистры EPSR и APSR PSR Объединённые реrистры APSR, EPSR и IPSR MSP Основной указатель стека PSP Указатель стека процесс а PRIMASK Реrистр маскирования исключений BASEPRI Реrистр маскирования низкоприоритетных исключений BASEPRIMAX Тот же реrистр маскирования низкоприоритетных исключений, но с функцией условной записи (новый уровень приоритета должен быть выше cTaporo уровня) FAULTMASK Реrистр маскирования исключений отказов (также запрещает обычные прерывания) CONTROL Реrистр управления Например, для инициализации указателя стека процесса может при меняться следующий код: LDR RO,=Ox20008000 ; Новое значение для указателя стека процесса (PSP) MSR PSP, RO Обращения ко всем реrистрам специальноrо назначения, за исключением pe rистра APSR, с помощью команд MSR и MRS допускаются только в привилеrиро ванном режиме. В противном случае, операция будет проиrнорирована, а воз вращаемое значение (в случае команды MRS) будет равно нулю. После изменения содержимоrо реrистра CONTROL рекомендуется вставлять команду синхронизации ISB, чтобы обеспечить немедленное вступление в силу сделанных изменений. Правда, при использовании процессора CortexM3 это 
86 · fлава 4. Набор команд следует делать исключительно из соображений переносимости кода (если ero предполаrается использовать с друrими процессорами ARM). 4.4.2. Ещё раз об IТ..бпоке Мы уже вкратце ознакомились с командой IFTHEN в подразделе «Язык acceM блера: условное выполнение с использованием команд IT». В этом подразделе мы рассмотрим данную команду более детально. Команда IFTHEN (IT) позволяет сделать условно выполняемыми до четырёх последовательно расположенных команд, образующих Iтблок. Эта команда MO жет иметь различные форматы, представленные в Табл. 4.32, в которой: · <х> определяет условие выполнения второй команды блока; · <у> определяет условие выполнения третьей команды блока; · < z > определяет условие выполнения четвёртой команды блока; · <cond> определяет базовое условие для блока команд; первая команда блока, расположенная после команды IT, выполняется в том случае, если условие <cond> истинно. Таблица 4.32. Различные размеры IТблока Формат команды Число команд в блоке (каждый из <Х>, <у> и <z> может быть Примеры т (THEN), либо Е (ELSE» Одна условно выполняемая IT <cond> IT EQ команда instr1<cond> ADDEQ RO, RO, R1 Две условно выполняемые IT<x> <cond> ITE GE instr1<cond> ADDGE RO, RO, R1 команды instr2<cond или (cond» ADDLT RO, RO, R3 IT<x><y> <cond> ITET GT Три условно выполняемые instr1<cond> ADDGT RO, RO, R1 команды instr2<cond или (cond» ADDLE RO, RO, R3 instr3<cond или (cond» ADDGT R2, R4, #1 IT<x><y><z> <cond> ITETT NE Четыре условно выполняемые instr1<cond> ADDNE RO, RO, R1 instr2<cond или  (cond» ADDEQ RO, RO, R3 команды instr3<cond или  (cond) > ADDNE R2, R4, #1 instr4<cond или  (cond» MOVNE R5, R3 Для задания условия <cond> используют такие же аббревиатуры, что и в KO мандах условных переходов. Если в качестве <cond> задано условие AL, то для условноrо управления нельзя использовать символ «Е», поскольку в этом случае он означает, что соответствующая команда никоrда не будет выполнена. На месте каждоrо из элементов <х>, <у> и <z> может располаrаться символ «Т» (THEN) или «Е» (ELSE), которые относятся к базовому условию <cond>, тоrда как для задания <cond> используются традиционные обозначения, такие как EQ, NE, GT и т.п. Приведём пример использования команды IT: if (RO equal Rl) then { R3 R4 + R5 RЗ = RЗ/2 
4.4. Некоторые полезные команды процессора CortexM3 · 87 else { R3 = Rб + R7 RЗ = RЗ/2 } На языке ассемблера данную конструкцию можно записать следующим обра зом: СМР RO, R1 Сравниваем RO и R1 ITTEE EQ Если RO = R1, «То»«То»«Иначе»«Иначе» ADDEQ RЗ, R4, R5 Сложить, если «равно» ASREQ RЗ, R3, #1 Сдвинуть вправо, если «равно» ADDNE RЗ, Rб, R7 Сложить, если «не равно» ASRNE RЗ, RЗ, #1 Сдвинуть вправо, если «не равно» Команда IT используется также при переносе ассемблерноrо кода с процессо ра ARM7TDMI на процессор CortexM3. Ассемблер ARM (входящий, в том числе, в состав пакета RVMDK компании КеН, которому посвящена rлава 20) при обна ружении в коде «отдельно стоящей» условно выполняемой команды может aBTO матически вставить требуемую команду IT (см. при мер в Табл. 4.33). Эта особен ность ассемблера позволяет, не модифицируя старый код, использовать ero с про цессором CortexM3. Таблица 4.33. Автоматическая вставка команды IT ассемблером ARM ИСХОДНЫЙ ассемблерный Дизассемблированный КОД из сrенерированноrо ассемблером КОД объектноI'О файла смр R1, #2 смр R1, #2 АDDЕО RO, R1, #1 IT EQ . . . ADDEQ RO, R1, #1 Заметьте, что 16битные команды обработки данных не влияют на флаrи реrи стра APSR при их использовании внутри Iтблока. Если вы укажете в условно BЫ полняемой команде суффикс S, то ассемблер вставит 32битную версию команды. 4.4.3. Команды SDIV и UDIV Команды знаковоrо и беззнаковоrо деления имеют следующий синтаксис: SDIV.W <Rd>, <Rn>, <Rm> UDIV.W <Rd>, <Rn>, <Rm> Результат деления Rn/Rm сохраняется в реrистре Rd, например: LDR RО,=ЗОО ; 300 десятичное MOV R1, #5 UDIV.W R2, RO, R1 В итоrе мы получим в R2 число 60 (Ох3С). Если установить бит DIVBYZERO в реrистре управления конфиrурацией NVIC, то при делении на ноль будет rенерироваться исключение Usage Fault. В противном случае, при делении на ноль в реrистре Rd будет просто возвра щаться нулевое значение. 
88 . rлава 4. Набор команд 4.4.4. Команды REV, REVH и REVSH Команда REV изменяет порядок байтов в 32битном слове, а команда REVH пе реставляет байты в полусловах. Например, если в реrистре RO содержится значе ние Ох78563412, то после выполнения команд REV Rl, RO REVH R2, RO содержимое реrистра Rl будет равно Ох78563412, а реrистра R2  Ох34127856. Ko манды REV и REVH используются, в частности, для изменения формата хранения данных (с прямым/обратным порядком байтов). Команда REVSH похожа на команду REV, если не считать Toro, что она пере ставляет байты только в младшем полуслове, а затем расширяет знак результата. Например, если в RO содержится Ох33448899, то после выполнения команды REVSH Rl, RO содержимое реrистра Rl будет равно OxFFFF9988. 4.4.5. ПерестаНО8ка битов Команда RBIT изменяет порядок битов в слове данных. Эта команда имеет следующий синтаксис: RBIT.W <Rd>, <Rn> Команда RBIT часто используется для обработки битовых потоков при пере даче данных. К примеру, если RO равен ОхВ4ЕI0С23 (двоичное значение 10110100111000010000110000100011), то после выполнения команды RBIT.W RO, Rl в реrистре Rl окажется значение OxC430872D (двоичное значение 11 00  0100  00 11 0000 1000  О 111 0010 110 1). 4.4.6. Команды SXTB, SXTH, UXTB и UXTH Четыре команды SXTB, SXTH, UXTB и UXTH используются для расширения oд HO и двухбайтных значений до слова. Эти команды имеют следующий синтак сис: SXTB <Rd>, <Rn> SXTH <Rd>, <Rn> UXTB <Rd>, <Rn> UXTH <Rd>, <Rn> При помощи команд SXTB/SXTH производится расширение знака значения, ис пользуя 7й и 15й биты содержимоrо Rn соответственно. Команды USTB/UXTH дo полняют исходное значение нулями до 32 бит. Например, если RO содержит Ох55АА8765, то: SXTB Rl, RO Rl = ОхОООООО65 SXTH Rl, RO Rl = OxFFFF8765 UXTB Rl, RO Rl = ОхОООООО65 UXTH Rl, RO Rl = ОхОООО8765 
4.4. Некоторые полезные команды процессора Cortex..M3 · 89 4.4.7. Очистка и вставка битовоrо попя Команда очистки битовоrо поля BFC обнуляет от 1 до 31 расположенных под ряд битов, начиная с любоrо бита. Команда имеет следующий синтаксис: BFC.W <Rd>, <#lsb>, <#width> Например: LDR RO,=Ox1234FFFF BFC.W RO, #4, #8 В результате мы получим RO = ОхI234РООР. Команда вставки битовоrо поля BFI копирует от 1 до 31 бита (#width) из OДHO ro реrистра в любое место (#lsb) друrоrо реrистра. Эта команда имеет следующий синтаксис: BFI.W <Rd>, <Rn>, <#lsb>, <#width> Например: LDR RO,=Ox12345678 LDR R1,=Ox3355AACC BFI.W R1, RO, #8, #16 ; Вставляем RO[15:0] в R1[23:8] В результате мы получим RO = Ох335678СС. 4.4.8. Команды UBFX и SBFX Команды UBFX и SBFX используются для извлечения беззнаковоrо и знаково ro битовоrо поля соответственно. Команды имеют следующий синтаксис: UBFX.W <Rd>, <Rn>, <#lsb>, <#width> SBFX.W <Rd>, <Rn>, <#lsb>, <#width> Команда UBFX извлекает из реrистра битовое поле любоrо размера (#width), начиная с любоrо бита (определяется значением #lsb), дополняет это значение нулями до 32 бит и помещает ero в реrистрприёмник. Например: LDR RO,=Ox5678ABCD UBFX.W R1, RO, #4, #8 В результате мы получим Rl = ОхООООООВС. Аналоrично, команда SBFX извлекает из реrистра битовое поле, расширяет знак полученноrо значения до 32 бит и помещает результат в реrистрприёмник. Например: LDR RO,=Ox5678ABCD SBFX.W R1, RO, #4, #8 В результате мы получим Rl = ОхРРРРРРВС. 4.4.9. Команды LDRD и STRD Команды LDRD и STRD предназначены для пересылки двух слов данных между двумя реrистрами и памятью. Команды имеют следующий синтаксис: LDRD.W <Rxf>, <Rxf2>, [Rn, #+/offset] {!} Прединдексация LDRD.W <Rxf>, <Rxf2>, [Rn], #+/offset ; Постиндексация STRD.W <Rxf>, <Rxf2>, [Rn, #+/offset]{!} Прединдексация STRD.W <Rxf>, <Rxf2>, [Rn], #+/offset Постиндексация 
90 · fлава 4. Набор команд rде <Rxf>  первый реrистрприёмник/реrистристочник, а <Rxf2>  второй. Изза ошибки в ядре CortexM3 ревизий 0...2 при использовании команды LDRD в качестве <Rxf> и <Rxf2> нельзя указывать один и тот же реrистр. В следующем фраrменте выполняется чтение 64битноrо значения, располо женноrо по адресу Охl000, в реrистры RO и Rl: LDR R2,=Oxl000 LDRD.W RO, Rl, [R2] ; В результате RO = memory[Oxl000], ; а Rl = memory[Oxl004] Точно так же мы можем использовать команду STRD для сохранения 64бит Horo значения в памяти. В следующем при мере при меняется адресация с предин дексацией: LDR R2,=Oxl000 Базовый адрес STRD.W RO, Rl, [R2, #Ох20] В результате memory[Oxl020] = RO, а memory[Oxl024] = Rl 4.4.10. Команды табпичноrо перехода ТВВ и твн Команды ТВВ и ТВН предназначены для реализации таблиц переходов. KOMaH да твв использует таблицу с однобайтными значениями смещений, а команда твн  с двухбайтными значениями. Поскольку Ой бит счётчика команд всеrда равен нулю, значение из таблицы перед прибавлением к РС умножается на два. Ну, а поскольку текущее значение Ре равно адресу текущей команды плюс четы ре, диапазон переходов для команды ТВВ составляет (2 х 255) + 4 = 514 байт, а для команды ТВН  (2 х 65535) + 4 = 131 074 байт. Обе команды поддерживают пере ходы только в прямом направлении. Команда ТВВ имеет следующий синтаксис: TBB.W [Rn, Rm] rде Rn  адрес начала таблицы, а Rm  индекс в таблице. Искомый элемент табли цы переходов располаrается по адресу Rn + Rm. Выполнение этой команды при использовании в качестве Rn счётчика команд показано на Рис. 4.5. РС Rn = (РС+4) Rm=N твв [РС, Rm] V AL0[7:0] VAL 1 [7:0] l ХОД nporpaMMbl Rn + Rm VALN[7:0] НОВЫЙ РС = (РС + 4) + 2 х V ALN[7:0] Рис. 4.5. Выполнение команды ТВВ. Команда ТВН выполняет аналоrичные операции, за исключением Toro, что элемент таблицы располаrается по адресу Rn + 2 х Rm, а смещения MorYT иметь 
4.4. Некоторые полезные команды процессора CortexM3 · 91 большие значения. Выполнение команды ТВН при использовании в качестве Rn счётчика команд показано на Рис. 4.6. Rm=N t ХОД nporpaMMbl РС ТВН [РС, Rm, LSL #1] Rn = (РС + 4) VAL0[15:0] VAL 1[15:0] Rn + 2 х Rm VALN[15:0] НОВЫЙ РС = (РС + 4) + 2 х V ALN[15:0] Рис. 4.6. Выполнение команды ТВН. Если в командах табличноrо перехода в качестве операнда Rn указывается pe rистр R15, то изза наличия конвейера значение, используемое при выполнении команды, будет равно РС + 4. Эти две команды в большей степени ориентирова ны на использование Сикомпиляторами для rенерации кода операторов ветвле ния switch. Поскольку значения, хранящиеся в таблице переходов, задаются OT носительно текущеrо значения счётчика команд, то ручное кодирование этой Ta блицы на ассемблере является довольно сложной задачей. Основные трудности связаны с тем, что на этапе ассемблирования/компиляции подчас невозможно определить величины смещений, особенно если место перехода находится в дpy rOM исходном файле. Синтаксические конструкции, используемые для задания содержимоrо таблиц переходов, зависят от применяемоrо средства разработки. Так, при использовании ассемблера ARM таблица переходов для команды ТВВ может быть описана следующим образом: TBB.W [рс, rO] Во время исполнения этой команды РС равен ; branchtable branchtable ОСВ ((destO  branchtable)/2) Поскольку значения смещений 8битные, используются директивы ОСВ ОСВ ((destl  branchtable)/2) ОСВ ((dest2  branchtable)/2) ОСВ ((dеstЗ  branchtable)/2) destO Выполняем, если rO = О destl Выполняем, если rO = 1 dest2 Выполняем, если rO 2 dеstЗ ; Выполняем, если rO = 3 
92 . Тлава 4. Набор команд При исполнении команды ТВВ текущее значение РС равно адресу, помеченно му меткой branchtable (изза наличия в процессоре конвейера). Команда ТВН может использоваться аналоrичным образом: TBH.W [рс, rO, 181 #1] branchtable DCI ((destO  branchtable)/2) Поскольку значения смещений 1ббитные, используются директивы DCI DCI ( (de s t 1  branchtable)/2) DCI ( (dest2  branchtable)/2) DCI ((dеstЗ  branchtable)/2) destO Выполняем, если rO = О dest1 Выполняем, если rO = 1 dest2 Выполняем, если rO = 2 dеstЗ Выполняем, если rO = 3 
rлдвд 5 СИСТЕМА ПАМЯТИ 5.1. Основные особенности системы памяти Архитектура памяти, реализованная в процессоре CortexM3, отличается от архитектуры, использующейся в традиционных процессорах ARM. Вопервых, процессор CortexM3 имеет фиксированную карту памяти, которая определяет, какой шинный интерфейс должен использоваться при обращении к тому или иному участку памяти. Эта особенность также позволяет процессору оптимизи ровать операции обращения к различным устройствам. Ещё одной особенностью системы памяти процессора CortexM3 является поддержка доступа к отдельным битам памяти (метод bitband). Это позволяет выполнять атомарные операции с битами памяти или битами реrистров перифе рийных устройств. Правда, необходимо заметить, что операции прямоrо доступа к битам поддерживаются только для определённых областей памяти. Чуть позже мы рассмотрим данный вопрос более подробно. Система памяти процессора CortexM3 также поддерживает пересылку HeBЫ ровненных данных и операции монопольноrо доступа; эти возможности являют ся частью архитектуры y7M. И наконец, процессор CortexM3 поддерживает па мять, использующую как прямой, так и обратный порядок хранения байтов. 5.2. Карта памяти в процессоре CortexM3 используется фиксированная карта памяти (Рис. 5.1). Это облеrчает перенос кода между устройствами на базе CortexM3, выпускаемы ми различными производителями. Например, компоненты, описанные в преды дущих rлавах, такие как контроллер прерываний NVIC и модуль защиты памяти MPU, всеrда будут располаrаться по одним и тем же адресам, независимо от про изводителя. В то же время используемое распределение карты памяти обеспечи вает rибкость, достаточную для выделения продукции одних производителей среди продукции друrих. 
94 · [лава 5. Система памяти Ох EOOFFOOO OxEOOFEFFF Ох ЕО042000 ОхЕ0О41000 Ох ЕО040000 Таблица ПЗУ Внешняя шина собственных периферийных устройств ЕТМ TPIU OxE003FFFF Ох EOOOFOOO Ох ЕОООЕООО OxEOOOOFFF Ох ЕОО03000 ОхЕОО02000 ОхЕОО01000 Ох ЕООООООО Зарезервировано NVIC Зарезервировано FPB OWТ ITM Ox43FFFFFF Область доступа к битам Ох42000000 Ox41FFFFFF Ох40100000 32 Мбайт 31 Мбайт Ох40000000 Область хранения битов 1 Мбайт Ох2ЗFFFFFF Область доступа к битам Ох 22000000 Ox21FFFFFF Ох20100000 32 Мбайт 31 Мбайт Ох 20000000 Область хранения битов 1 Мбайт OxFFFFFFFF Определяется производителем Шина собственной периферии: компоненты отладки/внешняя ОхЕ0100000 OxEOOFFFFF Ох ЕО040000 OxE003FFFF Ох ЕООООООО OxOFFFFFFF Шина собственной периферии: внутренняя Внешние устройства 1 rбайт ОхАООООООО Ox9FFFFFFF Внешнее ОЗУ 1 rбайт Ох60000000 Ox5FFFFFFF Периферийные устройства 0.5 rбайт Ох40000000 Ox3FFFFFFF СОЗУ 0.5 rбайт Ох20000000 Ox1FFFFFFF Код 0.5 rбайт ОхОООООООО Рис. 5.1. Предопределённая карта памяти процессора CortexM3. Некоторые участки памяти зарезервированы для использования BCTpoeHHЫ ми периферийными устройствами, такими как компоненты отладки. Эти устрой ства располаrаются в одноимённой области памяти. К указанным компонентам отладки относятся следующие модули: · модуль коррекции флэшпамяти и задания точки останова (РРВ); · модуль просмотра и трассировки данных (DWT); · модуль трассировки (ITM); · модуль встроенной ячейки трассировки (ЕТМ); · модуль интерфейса порта трассировки (TPIU); · таблица ПЗУ: Более детально эти компоненты будут рассмотрены в друrих rлавах, посвя щённых возможностям отладки. 
5.2. Карта памяти . 9S Процессор CortexM3 имеет адресное пространство размером 4 rбайт. Про rpaMMa может располаrаться в области кода, области статическоrо ОЗУ (созу) или области внешнеrо оз Однако наилучшим местом для размещения про rpaMMbI является всё же область кода, поскольку в этом случае операции выбор ки команд и обращения к данным cMorYT выполняться одновременно) используя различные интерфейсы шин. Область статическоrо ОЗУ предназначена для подключения внутренней опе ративной памяти. Обращение к области СОЗУ осуществляется по системной ши не. В этой области имеется участок размером 32 Мбайт, предназначенный для об ращения к области с побитовой адресацией (область хранения битов). Каждое слово внутри указанноrо диапазона соответствует одному биту в IМбайт обла сти хранения битов. Все операции записи в область доступа к битам преобразу ются в атомарные операции вида «чтениемодификациязапись» в области хранения битов, воздействующие на состояния отдельных битов физической па мяти. Обратите внимание, что операции побитовоrо доступа поддерживаются только для данных, но никак не для команд! Размещая булевы переменные (оди ночные биты) в области с побитовой адресацией, мы можем «упаковать» несколь ко переменных в одно слово данных. При этом каждую из этих переменных мож но будет изменять независимо от друrих, используя область доступа к битам. В результате экономится память микроконтроллера, поскольку нам не требуется проrраммно реализовывать операции вида «чтениемодификациязапись». Более подробно работа с битадресуемой памятью будет рассмотрена ниже. Ещё одна область памяти размером 0.5 rбайт выделена для периферийных устройств. Как и область статическоrо озу, область периферийных устройств поддерживает доступ к отдельным битам с использованием метода bitband, а об ращения к этой области осуществляются по системной шине. Однако размеще ние исполняемоrо кода в указанной области не допускается. Наличие в области периферийных устройств секции с побитовой адресацией значительно упрощает работу с битами реrистров периферийных устройств, облеrчая написание функ ций для управления данными устройствами. Две области памяти размером по 1 rбайт выделены для внешнеrо озу и внеш них периферийных устройств. Различие между этими областями заключается в том, что из области внешних периферийных устройств не допускается исполне ние кода проrраммы. Также имеются некоторые различия в стратеrии кэширова ния. Последняя распределённая область памяти размером 0.5 rбайт предназначена для системных компонентов, внешних и внутренних шин встроенных перифе рийных устройств процессора, а также для периферийных устройств системноrо уровня, определяемых производителем. При этом шина собственных перифе рийных устройств (Private Peripheral Bus  РРВ) состоит из двух cerMeHToB: . усовершенствованная высокопроизводительная шина (шина АНВ), предназна ченная для подключения исключительно внутренних АНВсовместимых пе риферийных устройств процессора, к которым относятся контроллер NVIC и модули РРВ, DWT и ITM; 
96 · [лава 5. Система памяти · усовершенствованная шина nериферии (шина АРВ)) предназначенная для под ключения как внутренних АРВсовместимых модулей, так и внешней (по OT ношению к процессору CortexM3) периферии. Процессор CortexM3 позволя ет производителям микросхем подключать к данной шине дополнительные периферийные устройства, поддерживающие спецификацию АРВ. Контроллер NVIC располаrается в области памяти, называемой простран ством управления системой (System Control Space  SCS), см. Рис. 5.2. Помимо контроллера NVIC) в этой области располаrаются реrистры управления модулей SYSTICK и MPU) а также компоненты управления отладкой. Шина собственных Пространство периферийных устройств (РВВ) управления OxEOOOEFFF системой OxEOOFFFFF OxFFFFFFFF Внешняя NVIC, CPUID, Системный Ох ЕО040000 РРВ SYSTICK, уровень .......... MPU, комп. OxEOO3FFFF OxEOOFFFFF .......................... Внутренняя отладки, и т .д. РРВ Ох ЕООООООО ОхЕООООООО ОхЕОООЕООО Рис. 5.2. Пространство управления системой (SCS). Оставшуюся часть адресноrо пространства производители микросхем MorYT задействовать по своему усмотрению. Для обращения к данной области памяти используется интерфейс системной шины) однако исполнение кода из этой обла сти не допускается. В процессоре CortexM3 предусмотрен опциональный модуль защиты памяти MPU. Наличие или отсутствие указанноrо модуля в конкретном устройстве зави сит от производителя данноrо микроконтроллера. Описанное распределение карты памяти процессора можно считать cBoero рода шаблоном; более подробные карты памяти) в том числе реальное положение и размеры областей ПЗУ и ОЗУ, а также расположение периферийных устройств приводятся изrотовителями микросхем в документации на конкретные изделия. 5.3. Атрибуты доступа к памяти Карта памяти показывает) что именно расположено по тем или иным адресам. При этом она не только предоставляет информацию, к какому блоку памяти или устройству производится доступ, но И определяет атрибуты доступа к каждой из областей памяти. Процессором CortexM3 используются следующие атрибуты: · Буферируемая  запись в память может производиться из буфера, в то время как процессор будет выполнять следующую команду. · Кэшируемая  данные, полученные при чтении из памяти, MorYT быть coxpa нены в кэшпамяти. В итоrе при следующем обращении к этим данным их можно будет считать из кэша, ускоряя тем самым процесс выполнения про rpaMMbI. · Исполняемая  из этой области памяти процессор может осуществлять BЫ борку и исполнение кода проrраммы. 
5.3. Атрибуты доступа к памяти · 97 . Разделяемая  данные в этой области памяти MorYT совместно использовать ся несколькими контроллерами шины. Система памяти должна обеспечивать KorepeHTHocTb данных, хранящихся в разделяемой области памяти) для всех контроллеров шины. Интерфейсы шин процессора CortexM3 предоставляют системе памяти ин формацию о перечисленных атрибутах при каждой пересылке команды или дaH ных. Значения атрибутов памяти, присущих отдельным областям, MorYT пере определяться модулем MPU (при ero наличии), если ero конфиrурация отличает ся от принятой по умолчанию. Несмотря на то что в процессоре CortexM3 нет ни кэша, ни контроллера кэшпамяти, в микроконтроллер может быть добавлен блок внешней кэшпамяти, характер обращений к которой будет определяться атрибутами соответствующей области памяти. Более Toro, атрибуты кэшпамяти MorYT также влиять на работу контроллеров встроенной и внешней памяти  это зависит от архитектуры контроллеров памяти, используемых производителями микросхем. Ниже перечислены атрибуты доступа к памяти для каждой из областей карты памяти: . Область кода (ОхОООООООО.. .0хlРРРРРРР)  является исполняемой, а атрибут кэширования имеет значение «кэшируемая со сквозной записью» (Write Through  WT). Вы также можете размещать в этой области данные. Обраще ния к данным) расположенным в указанной области, осуществляются по ин терфейсу шины данных. Операции записи в данную область памяти буфери зуются. . Область СОЗУ (Ох20000000.. .Ох3РРРРРРР)  предназначена для подключе ния BCTpoeHHoro ОЗ Операции записи в эту область буферизуются, а атри бут кэширования имеет значение «кэшируемая С обратной записью и разме щением записываемых данных» (WBWA). Указанная область является испол няемой) так что вы можете скопировать в неё код проrраммы и исполнять ero уже оттуда. . Область перифериЙНblХ устройств (Ох40000000.. .Ох5РРРРРРР)  предназна чена для размещения периферийных устройств. Обращения к этой области памяти не кэшируются, и исполнение кода из неё не допускается (в ДOKYMeH тации ARM неисполняемая память имеет атрибут XN) являющийся сокраще нием от eXecute Never). . Область внешнеzо ОЗУ (Ох60000000.. .Ох7РРРРРРР)  предназначена для встроенной или внешней памяти данных. Обращения к указанной области памяти MorYT кэшироваться (WBWA), из этой области также допускается BЫ полнение кода. . Область внешнеzо ОЗУ (Ох80000000.. .Ох9РРРРРРР)  предназначена для встроенной или внешней памяти данных. Обращения к этой области памяти MorYT кэшироваться (WT), из данной области также допускается выполнение кода. . Область внешних устройств (ОхАООООООО...ОхВРРРРРРР)  предназначена для внешних устройств и/или разделяемой памяти) к которой необходимо 
98 · fлава 5. Система памяти обеспечить упорядоченный и небуферизованный доступ. Эта область также является исполняемой. · Область внешних устройств (ОхСООООООО.. .0xDFFFFFFF)  предназначена для внешних устройств и/или разделяемой памяти, к которой необходимо обеспечить упорядоченный и небуферизованный доступ. Область также яв ляется исполняемой. · Системная область (ОхЕООООООО.. .ОхРРРРРРРР)  предназначена для соб ственных периферийных устройств процессора, а также для модулей, опреде ляемых производителем. Исполнение кода из этой области памяти не допу скается. В диапазоне адресов, выделенных шине РВВ, обеспечивается cTporo упорядоченный доступ к памяти (некэшируемая и небуферируемая память). В диапазоне адресов, выделенных для изrотовителей кристаллов, память яв ляется буферируемой, но некэшируемой. Замечу, что, начиная с lй ревизии процессора CortexM3, атрибуты памяти области кода (кэшируемая и небуферируемая)) транслируемые внешней подси стеме памяти, задаются аппаратно и не MorYT быть переопределены модулем MPU. Это касается только подсистем памяти, расположенных вне процессора (например, кэшпамяти 2ro уровня и некоторых типов контроллеров памяти с поддержкой кэширования). В процессоре в любом случае имеется внутренний буфер, который может использоваться при операциях записи в область кода. 5.4. Права доступа к памяти, принятые по умолчанию Каждой из областей карты памяти процессора CortexM3 назначены опреде лённые права доступа, используемые по умолчанию. Это позволяет предотвра тить обращение пользовательской проrраммы, работающей на непривилеrиро ванном уровне, к системным областям памяти, например к реrистрам контролле ра NVIC. Права доступа, принятые по умолчанию, используются при отсутствии модуля MPU или же в том случае, если он отключён. Если модуль MPU присутствует и включён, то возможность доступа со CTOpO ны пользователя к той или иной области памяти определяется конфиrурацией модуля. Права доступа к различным областям памяти, установленные по умолчанию, указаны в Табл. 5.1. Таблица 5.1. Права доступа к памяти, установленные по умолчанию Область памяти Диапазон адресов Доступ из пользовательской проrраммы Область OxEOIOOOOO.. .ОхРРРРРРРР Полный доступ изrотовителя Таблица ПЗУ OxEOOFFOOO.. .OxEOOFFFFF Заблокирован; при попытке обращения rенерируется исключение Bus Fault Внешняя шина РРВ ОхЕОО42000.. .OxEOOFEFFF Заблокирован; при попытке обращения rенерируется исключение Bus Fault 
5.5. Операции по6итовО20 доступа . 99 Таблица 5.1. Права доступа к памяти, установленные по умолчанию (продолжение) Область памяти Диапазон адресов Доступ из пользовательской проrраммы ЕТМ OxE0041000.. ...OxEOO41FFF Заблокирован; при попытке обращения rенерируется исключение Bus Fault TPIU ОхЕОО40000.. .ОхЕОО40РРР Заблокирован; при попытке обращения rенерируется исключение Bus Fault Внутренняя шина OxEOOOFOOO.. .OxEOO3FFFF Заблокирован; при попытке обращения РРВ rенерируется исключение Bus Fault Заблокирован; при попытке обращения rенерируется исключение Bus Fault. NVIC ОхЕОООЕООО.. .ОхЕОООЕРРР Исключение  реrистр проrраммноrо запуска прерывания STIR) доступ к которому со стороны пользователя может быть разрешён РРВ ОхЕООО2000.. ...ОхЕООО3РРР Заблокирован; при попытке обращения rенерируется исключение Bus Fault DWT OxEOOOIOOO.. .OxEOOOIFFF Заблокирован; при попытке обращения rенерируется исключение Bus Fault Разрешено чтение; запись иrнорируется) за ITM ОхЕООООООО.. .ОхЕООООРРР исключением операций записи в порты стимулов при условии) что доступ к ним со стороны пользователя разрешён Внешние устройства ОхАООООООО.. .OxDFFFFFFF Полный доступ Внешнее ОЗУ Ох60000000.. .Ox9FFFFFFF Полный доступ Периферийные Ох40000000.. .Ох5РРРРРРР Полный доступ устройства Статическое ОЗУ Ох20000000.. .Ox3FFFFFFF Полный доступ Код ОхОООООООО.. .OxlFFFFFFF Полный доступ Примечание. Если доступ со стороны пользователя заблокирован) то исключение отказа rенерируется немедленно. 5.5. Операции побитовоrо доступа Поддержка метода побитовоrо доступа bitband позволяет использовать обыч ные операции заrрузки/сохранения для обращения (чтение/запись) к отдельным битам данных. В процессоре CortexM3 побитовый доступ к памяти поддержива ется только для двух предопределённых областей памяти, называемых областя ми хранения битов. Одна из этих областей расположена в IM меrабайте aдpeCHO ro пространства СО3У, а друrая  в 1  м меrабайте адресноrо пространства пери  ферийных устройств. В принципе, эти области можно использовать как обычную память, однако к ним можно обращаться и посредством специальной области па мяти, называемой областью доступа к битам (Рис. 5.3). При использовании aдpe са, расположенноrо в области доступа к битам, младший бит адресуемоrо значе ния обращается к отдельному биту области хранения битов. 
100 . fлава 5. Система памяти 31 24 Биты 16 8 о Ox200FFFFC . Адрес в области : хранения битов : . . . Ох20000008 Ох20000004 Ох20000000 Ох22000080 Ох2200002С Ох22000010 Ох22000000  АдреСВО6ласти доступа к битам Рис. 5.3. Обращение к области хранения битов посредством области доступа к битам. Например, для установки 2ro бита слова данных, расположенноrо по адресу Ох20000000, вместо трёх команд (чтение значения, установка бита и сохранение результата), можно использовать Bcero одну команду (Рис. 5.4). Фраrменты ac семблерноrо кода, соответствующие обоим вариантам, приведены на Рис. 5.5. Без использования метода bitband с использованием метода bitband / Чтение содержимоrо по адресу Ох20000000 в буфер Преобразуется в 2 пересылки по шине  3апись из буфера по адресу Ох20000000 с установкой бита 2 Рис. 5.4. Запись в область доступа к битам. Без использования метода bitband с использованием метода bitband LDR RO, Ox20000000 LDR R1, [RO ] ORR.W Rl, #Ох4 STR R1, [RO] Задаём адрес Читаем Изменяем бит Сохраняем результат LDR MOV STR RO, Ox22000008 R1, #1 Rl, [RO] Задаём адрес Задаём данные Пишем Рис. 5.5. Запись бита с использованием метода bitbaпd и без Hezo. Аналоrичным образом, использование метода bitband может упростить код проrраммы при необходимости чтения отдельноrо бита памяти. Так, если нам нужно узнать состояние 2ro бита слова, расположенноrо по адресу Ох20000000, мы можем воспользоваться одним из способов, показанных на Рис. 5.6. Фраrмен ты ассемблерноrо кода, соответствующие обоим способам, приведены на Рис. 5.7. 
5.5. Операции побитовО20 доступа · 101 Без использования метода bitband с использованием метода bitband Преобразуется в 1 пересылку по шине . Чтение содержимоrо по адресу Ох20000000 и извлечение бита 2 в реrистр Рис. 5.6. Чтение из области доступа к битам. Без использования метода bitband с использованием метода bitband LDR RO, Ox20000000 LDR Rl, [RO ] UBFX.W Rl, Rl, #2, #1 ; 3адаём адрес Читаем Выделяем бит 2 LDR LDR RO, Ox22000008 Rl, [RO ] Задаём адрес Читаем Рис. 5.7. Чтение бита с использованием метода bitbaпd и без Hezo. Метод bitband, реализованный в процессоре CortexM3, не является чемто новым. На самом деле, аналоrичная возможность уже более 30 лет имеется в 8битных микроконтроллерах, в частности в микроконтроллерах семейства 8051. Хотя в процессоре CortexM3 и нет специальных команд для манипуляций с битами, в ero адресном пространстве предусмотрены особые области, обраще ния к которым автоматически преобразуются в обращения к отдельным битам. Ещё раз напомню, что при адресации памяти посредством метода bitband ис пользуются следующие понятия: . Область хранения битов (bitband region)  область памяти, поддерживаю щая доступ по методу bitband. . Адрес доступа к биту (bitband alias)  обращение по этому адресу вызывает обращение к области хранения битов (т.е. производится переадресация). Каждое слово области хранения битов представлено младшими битами 32 слов области доступа к битам. При обращении по адресу, находящемуся в об ласти доступа к битам, производится переадресация на область хранения битов. При операциях чтения производится чтение слова, после чеrо искомый бит BЫ двиrается в младший бит возвращаемоrо значения. При записи значение coxpa няемоrо бита сдвиrается на заданную позицию, после чеrо выполняется опера ция «чтениемодификациязапись». В адресном пространстве процессора имеется две области памяти, поддержи вающие побитовую адресацию: . Ох20000000.. .Ox200FFFFF (созу, 1 Мбайт); . Ох40000000.. .Ox400FFFFF (периферийные устройства, 1 Мбайт). Соответствие адресов в области хранения битов, расположенной в адресном пространстве созу, адресам области доступа к битам указано в Табл. 5.2. 
102 · fлава 5. Система памяти Таблица 5.2. Переназначение адресов области хранения битов на область СО3У Область хранения битов Область доступа к битам Ох20000000,бит[0] Ох22000000,бит[0] Ох20000000, бит [1] Ох22000004,бит [О] Ох20000000, бит [2] Ох22000008,бит[0] . . . . . . Ох20000000, бит [31] Ох2200007С,бит[0] Ох20000004,бит[0] Ох22000080,бит [О] . . . . . . Ох20000004, бит [31] Ох220000РС, бит [О] . . . . . . Ох200РРРРС, бит [31] Ox23FFFFFC, бит [О] Аналоrичным образом, к области с побитовой адресацией, расположенной в адресном пространстве периферийных устройств, можно обращаться посред ством соответствующей области доступа к битам, как указано в Табл. 5.3. Таблица 5.3. Переназначение адресов области хранения битов на область периферифных устройств Область хранения битов Область доступа к битам Ох40000000,бит[0] Ох42000000, бит [О] Ох40000000, бит [1] Ох42000004,бит [О] Ох40000000, бит [2] Ох42000008,бит [О] . . . . . . Ох40000000, бит [31] Ох4200007С, бит [О] Ох40000004,бит [О] Ох42000080,бит [О] . . . . . . Ох40000004, бит [31] Ох420000РС, бит [О] . . . о. . Ox400FFFFC, бит [31] Ox43FFFFFC, бит [О] Рассмотрим простой при мер: 1. Запишем по адресу Ох20000000 значение Ох3355ААСС. 2. Прочитаем слово с адреса Ох22000008. При этом в действительности будет выполнено чтение с адреса Ох20000000. Возвращаемое значение равно 1 (2й бит значения Ох3355ААСС). 3. Запишем ОхО по адресу Ох22000008. Эта операция прео6разуется в операцию вида «чтениемодификациязапись» по адресу Ох20000000. Значение Ох3355ААСС считывается из памяти, 2й бит сбрасывается и полученное значение (Ох3355ААС8) записывается обратно по адресу Ох20000000. 4. Теперь выполним чтение с адреса Ох200000. В результате получим число Ох3355ААС8 (2й бит сброшен). При обращении к адресам, расположенным в области доступа к битам, ис пользуются только младшие (нулевые) биты значений. Кроме Toro, обращения 
5.5. Операции пo6umoBozo доступа · 103 к области доступа к битам всеrда должны быть выровнены; в противном случае, результат операции будет непредсказуем. 5.5.1. Преимущества использования метода bit..band Итак, что же нам даёт возможность выполнения операций с отдельными бита ми! В частности, мы можем использовать эти операции для Toro, чтобы орrани зовать обмен данными с последовательными устройствами при помощи портов ввода/вывода общеrо назначения (GeneralPurpose Input/Output  GPIO). По скольку обращения к линии данных и линии TaKToBoro сиrнала MorYT быть раз делены, код проrраммы значительно упрощается. Битовые операции MorYT также использоваться при орrанизации ветвлений. Например, если переход должен осуществляться на основании значения одноrо из битов реrистра состояния периферийноrо устройства, то вместо трёх опера ций: . чтение Bcero содержимоrо реrистра; . маскирование остальных битов; . сравнение и переход; вам достаточно выполнить Bcero две операции: . чтение бита состояния с использованием метода bitband (получаем О или 1); . сравнение и переход. Помимо Toro, что метод bitband ускоряет выполнение битовых операций, по зволяя обойтись меньшим числом команд, он также иrрает важную роль при op rанизации COBMecTHoro использования какихлибо ресурсов несколькими про цессами. Одним из важнейших достоинств битовых операций с применением Me тода bitband является их атомарность. Друrими словами, выполнение последова тельности «чтениемодификациязапись» не может быть прервано никакими друrими операциями на шине. В противном случае, скажем, при проrраммной реализации последовательности «чтениемодификациязапись», MorYT воз никнуть определённые проблемы. Предположим, что Ой бит обычноrо порта BЫ вода используется основной проrраммой, а lй бит  обработчиком прерывания. При проrраммной реализации операции «чтениемодификациязапись» MO rYT возникать конфликты по данным, как показано на Рис. 5.8. 
104 · [лава 5. Система памяти Без использования метода bitband Режим обработчика Режим потока / Бит 1 изменяется \ в обработчике прерывания t' , Обработчик прерывания Чтение порта вывода Запись в порт вывода Основная проrрамма БитО устанавливается осн. проrраммой t' , Порт вывода считывается в реrистр t' Запись Порт вывода считывается в порт вывода в реrистр Бит О Изменения, сделанные сбрасывается обработчиком преры осн. проrраммой вания, теряются     Запись в порт вывода Состояние выходноrо порта ОхО1 ОхОЗ ОхОО . Время Рис. 5.8. Потеря данных при изменении содержuмоzо разделяемой ячейки памяти обработчиком исключения. Блаrодаря поддержке процессором CortexM3 метода bitband можно избе жать подобных состояний rOHoK, поскольку операции «чтениемодификация запись» реализуются на аппаратном уровне и являются атомарными  обе пере сылки, осуществляемые при выполнении операции, неотделимы друr от друrа и возникновение прерываний между этими пересылками исключено (Рис. 5.9). с использованием метода bitband Режим обработчика \ Режим поток а / Обработчик прерывания Бит 1 изменяется в обработчике прерывания посредством записи в область доступа к битам Основная проrрамма Бит О устанавливается основной Запись в порт вывода проrраммой посредством посредством области записи в область доступа к битам доступа к битам Заблокированная операция Iзаблокированная операция I Заблокированная операция «чтениемодиФикациязаПИСЬ»f(чтениемодификациязапись «чтениемодификациязапись» (  (  Состояние I ОхОО ОхО1 ОхОО ОхО2 порта вывода   . Время Рис. 5.9. Предотвращение потери данных блаzодаря использованию метода bitband. 
5.5. Операции no6umoBozo доступа. 105 Похожую проблему можно наблюдать в мноrозадачных системах. Так, если Ой бит порта вывода используется процессом А, а lй бит порта  процессом В, то в случае проrраммной реализации операции «чтениемодификацияза пись» точно так же может возникнуть конфликт по данным (Рис. 5.10). Без использования метода bitband Текущая задача Задача А I Задача В Задача А Задача В I Задача А Задача В Бит 1 изменяется ('задачей В, Чтение Запись порта вывода в порт вывода Задача Д Бит О уаанавливается задачей Д (' , Порт вывода Запись считывается в реrиар в порт вывода БитО сбрасывается (' задачей Д   Порт вывода считывается в реrиар Изменения, сделанные задачей В, теряются Соаояние выходноrо порта , Запись в порт вывода ОхОО Ох01 ОхОЗ ОхОО . Время Рис. 5.10. Потеря данных при изменении разными задачами содержиМО20 разделяемой ячейки памяти. и точно так же использование метода bitband позволяет обеспечить полную независимость битовых операций, выполняемых разными задачами. Это rapaH тирует отсутствие конфликта по данным (Рис. 5.11). с использованием метода bitband Текущая задача Задача А Задача В Задача А Задача В Задача А Задача В Бит 1 изменяется задачей В посредавом записи в облааь доступа к битам Задача Д Бит О уаанавливается задачей Д Запись в порт вывода посредавом записи посредавом облааи в облааь доступа к битам доступа к битам Заблокированная операция Iзаблокированная операция I Заблокированная операция «чтениемодификация запись)+«чтениемодификациязаПИСЬ)t «чтениемодификациязапись» t  t  Соаояние ОхОО ОхО 1 О 00 порта   вывода Ох02 . Время Рис. 5.11. Предотвращение потери данных бла20даря использованию метода bitband. 
106 . [лава 5. Система памяти Метод bitband может применяться не только для ввода/вывода данных, но и для хранения и обработки булевых данных в области СОЗ В частности, для экономии памяти несколько булевых переменных можно «упаковать» В одно сло во данных. И в то же время, используя область доступа к битам, каждым битом можно будет оперировать независимо от остальных. И в заключение пара замечаний для разработчиков систем на кристалле. При создании устройства, поддерживающеrо побитовый доступ с использованием метода bitband, адрес области памяти этоrо устройства должен располаrаться в области хранения битов. При этом необходимо контролировать сиrнал блоки ровки (HMASTLOCK) от интерфейса шины АНВ, чтобы при выполнении забло кированных пересылок изменение содержимоrо реrистров устройства, доступ ных для записи, осуществлялось бы только шиной. 5.5.2. Битовые операции с данными разной разрядности При выполнении битовых операций MorYT использоваться не только 4байт ные, но также двухбайтные и однобайтные пересылки. Скажем, при обращении к области доступа к битам с помощью однобайтных команд (LDRB/STRB) итоrовая пересылка в/из области хранения битов будет также однобайтной. То же спра ведливо и для двухбайтных пересылок (LDRH/STRH). Тем не менее, даже если раз мер пересылки, осуществляемой при обращении к области доступа к битам, не равен слову, адрес всё равно должен быть выровнен на rраницу слова. 5.5.3. Битовые операции в Си..проrраммах В большинстве компиляторов с языка Си отсутствует поддержка битовых операций с применением метода bitband. В частности, компиляторы не понима ют, как к одной и той же ячейке памяти можно обращаться, используя два разных адреса. Также они не MorYT знать, что при адресации области доступа к битам в действительности производится обращение только к младшему биту ячейки памяти. Чтобы воспользоваться в Сипроrраммах возможностями, обеспечивае мы ми методом bitband, можно объявить пару указателей  на адрес в области хранения битов и на соответствующий ему адрес в области доступа к битам. Ha пример: #define DEVICE REGO * ((volatile unsigned long *) (Ох40000000)) #define DEVICE REGO BITO * ((volatile unsigned long *) (Ох42000000)) #define DEVICEREGOBITl * ((volatile unsigned long *) (Ох42000004)) DEVICE REGO = ОхАВ; // Обращение к реrистру периферийноrо устройства // с использованием обычной адресации DEVICE REGO DEVICE REGO I Ох2; // Установка бита 1 без использования // метода bitband DEVICE REGO BITl = Охl; // Установка бита 1 с использованием метода bitband // (обращение к адресу в области доступа к битам) 
5.6. Обращения к невыровненным данным . 107 Можно упростить использование битадресуемых областей памяти, написав пару макроопределений. Один из макросов будет вычислять адрес в области дo ступа к битам на основе адреса слова из области хранения битов и номера бита, а второй  преобразовывать значение адреса ячейки памяти в указатель: // Вычисляет адрес в области хранения битов, используя адрес // в битадресуемой области и номер бита #define BITBAND(addr,bitnum) ((addr & OxFOOOOOOO) + Ох2000000 + ((addr & OxFFFFF) «5) + (bitnum «2)) // Преобразует адрес в указатель #define МЕМ  ADDR (addr) * ((volatile unsigned long *) (addr)) Перепишем код предыдущеrо примера, используя эти макросы: #define DEVICE REGO Ох40000000 #define BITBAND(addr,bitnum) ((addr & OxFOOOOOOO) + ОхО2000000 + ((addr & OxFFFFF)«5) + (bitnum«2)) #define МЕМ  ADDR (addr) * ((volatile unsigned long *) (addr)) MEMADDR(DEVICEREGO) = ОхАВ; // Обращение к реrистру периферийноrо устройства // с использованием обычной адресации // Установка бита 1 без использования метода bitband МЕМ ADDR(DEVICE REGO) = МЕМ ADDR(DEVICE REGO) I Ох2;     // Установка бита 1 с использованием метода bitband MEMADDR(BITBAND(DEVICEREGO,l)) = Охl; Обратите внимание, что при использовании метода bitband переменные, раз мещаемые в битадресуемой области, должны быть объявлены как volatile. Компиляторы ведь не знают, что к одним и тем же данным можно обращаться по двум различным адресам, а применение модификатора volatile позволяет ra рантировать, что при каждом обращении к такой переменной процессор будет обращаться непосредственно к ячейке памяти, а не к локальной копии этой пере менной. Для поддержки битадресуемой памяти в компилятор ARM был добавлен HO вый атрибут для переменных   attribute   ((bitband)) и новый ключ командной строки   bitband (см. [6]). Пакет ARM RVDS начал поддерживать эти расширения языка, начиная с версии 4.0, а пакет КеН MDKARM  с версии 3.8. В руководстве по применению компилятора ARM RealView Compiler Tools [7] вы найдёте дополнительные примеры реализации обращений к битадресуемой памяти с использованием макросов. 5.6. Обращения к невыровненным данным Процессор CortexM3 поддерживает пересылку невыровненных данных за oд но обращение к памяти. Как известно, классические процессоры ARM, такие как ARM7/ARM9/ARMll, поддерживают обращения только к выровненным данным. Это означает, что при обращении к слову два младших бита адреса должны быть сброшены в О, а при обращении к полуслову младший бит адреса должен быть сброшен в о. Например, 32битное значение может располаrаться по адресу 
108 . fлава 5. Система памяти Охl000 или Охl004, но никак не по адресу Охl00l, Охl002 или Охl003. Аналоrично, 16битное значение может иметь адрес Охl000 или Охl002, но не Охl00l. Что же собой представляет невыровненная пересылка? Ответ на этот вопрос можно получить из Рис. 5.12...5.16. При использовании 32битной памяти HeBЫ ровненная пересылка производится при выполнении любой операции чтения/ записи слова, адрес KOToporo не кратен 4 (Рис. 5.12.. .5.14). Точно так же, HeBыpOB ненной является пересылка полуслова, адрес KOToporo не кратен двум (Рис. 5.15, 5.16). Байт 3 Байт 2 Байт 1 Байт О Адрес N + 4 Адрес N Невыровненное слово по адресу N + 1 Рис. 5.12. Невыровненные данные, пример 1. Байт 3 Байт 2 Байт 1 Байт О Адрес N + 4 Адрес N Невыровненное слово по адресу N + 2 Рис. 5.13. Невыровненные данные, пример 2. Байт 3 Байт 2 Байт 1 Байт О Адрес N + 4 Адрес N Невыровненное слово по адресу N + 3 Рис. 5.14. Невыровненные данные, пример 3. Байт 3 Байт 2 Байт 1 Байт О Адрес N + 4 Адрес N Невыровненное полуслово по адресу N + 1 Рис. 5.15. Невыровненные данные, пример 4.  i-< _ __ ilk. !; j Байт З Байт 2 Байт 1 Байт О Невыровненное полуслово по адресу N + 3 Рис. 5.16. Невыровненные данные, пример 5. Любые однобайтные пересылки в процессоре CortexM3 являются BыpOBHeH ными, поскольку минимальная разница между двумя адресами равна одному байту. В процессоре CortexM3 невыровненные пересылки осуществляются обыч ными командами обращения к памяти, такими как LDR, LDRH, STR и STRH. При этом имеются некоторые оrраничения: . невыровненные пересылки не поддерживаются командами rрупповой заrруз ки/сохранения; . операции со стеком (команды PUSH/POP) должны быть выровнены; Адрес N + 4 Адрес N 
5.7. Монопольный доступ . 109 . команды монопольноrо доступа, такие как LDREX или STREX, должны обра щаться только к выровненным данным; в противном случае, будет возникать исключение Usage Fault; . невыровненные пересылки не поддерживаются при побитовых операциях с использованием метода bitband. Если вы всё же попытаетесь так сделать, то результат будет непредсказуемым. Любое обращение к невыровненным данным преобразуется интерфейсом ши ны в последовательность из нескольких выровненных пересылок, причём это преобразование является абсолютно прозрачным для пользователя. Поскольку при любом обращении к невыровненным данным в действительности осуществ ляется несколько пересылок, то для выполнения такой операции требуется боль шее число тактов, что в ряде случаев может оказаться нежелательным. Следова тельно, для достижения максимальной производительности лучше всё же BыpaB нивать данные соответствующим образом. Кроме Toro, можно сконфиrурировать контроллер NVIC так, чтобы при обра щении к невыровненным данным возникало исключение. Для этоrо необходимо установить бит UNALIGNTRP реrистра управления конфиrурацией CCR (OxEOOOEDI4) в 1. В таком случае при каждой попытке обращения к HeBыpOBHeH ным данным процессор будет rенерировать исключение Usage Fault. Указанная возможность используется на этапе разработки и отладки ПО для Toro, чтобы OT слеживать формирование проrраммой невыровненных пересылок. 5.7. МОНОПОЛЬНЫЙ доступ Вы моrли заметить, что в наборе команд процессора CortexM3 отсутствует команда SWP, которая в традиционных процессорах ARM, таких как ARM7TDMI, применялась для реализации семафоров. В новом процессоре для этих же целей используются команды монопольноrо доступа. Впервые поддержка операций монопольноrо доступа появилась в архитектуре у6 (в частности, в процессоре ARMI136). Семафоры обычно используются для управления доступом к разделяемым ресурсам. Если разделяемый ресурс может обслуживать только одноrо клиента или процесс, то такой семафор также называется семафором взаимноrо исключе ния, или мьютексом (от аН2Л. MUTual EXclusion). В таких случаях при использо вании ресурса одним из процессов данный ресурс блокируется этим процессом и не может обслуживать друrие процессы до тех пор, пока не будет разблокиро ван. Для реализации мьютекса требуется одна ячейка памяти, которая задейству ется в качестве флаrа блокировки, указывающеrо, заблокирован соответствую щий разделяемый ресурс какимлибо процессом или нет. Если процесс или при ложение хотят задействовать такой ресурс, то они должны сначала проверить ero состояние. Если ресурс не используется, то процесс или приложение устанавли вает флаr, показывая, что ресурс теперь заблокирован. В традиционных процес сорах ARM обращения к флаrу блокировки осуществлялись командой SWP. Эта команда обеспечивала атомарность операций записи и чтения, что позволяло ис ключить одновременную блокировку ресурса двумя процессами. 
110 . fлава 5. Система памяти в новых процессорах ARM операции чтения/записи MorYT осуществляться по разным шинам. Это делает невозможным использование команды SWP для opra низации aToMapHoro доступа к памяти, поскольку операции чтения и записи при выполнении блокированной пересылки должны осуществляться по одной и той же шине. Соответственно, блокированные пересылки заменяются операциями монопольноrо доступа. Концепция, лежащая в основе таких операций, достаточ но проста и при этом отличается от концепции команды SWI: обращения к ячей ке памяти, в которой расположен семафор, допускаются со стороны друrоrо Be дущеrо шины или друrоrо процесса, выполняемоrо тем же процессором (Рис. 5.17). Читаем флаr блокировки Монопольное чтение (например, LDREX) Флаr уаановлен? Отказ: флаr блокировки уже уаановлен, показывая, что запрашиваемый ресурс используется друrим процессом или процессором Да Уаанавливаем флаrблокировки Монопольная запись (например,SТRЕХ) Статус операции монопольной записи = О (успешна)? Отказ: к облааи памяти, в которой располаrается флаr блокировки, успел обратиться друrой процесс или процессор Нет Успех:флаrблокировки уаановлен и процессор может обращаться к разделяемому ресурсу Рис. 5.17. Команды монопольноzо доступа и мьютексы. Чтобы обеспечить корректное выполнение операций монопольноrо доступа в мноrопроцессорной среде, требуется дополнительный аппаратный модуль, Ha зываемый монитором монопольноrо доступа. Этот монитор контролирует обра щения к разделяемым ячейкам памяти и сообщает процессору об успешном BЫ полнении операций. В интерфейсах шин процессора также предусмотрены дo полнительные сиrналы управления l ) этим монитором, которые используются для индикации пересылок, осуществляемых в монопольном режиме. Если между операциями монопольноrо чтения и монопольной записи к памя ти обратится друrой ведущий шины, то при попытке процессора выполнить MO нопольную запись монитор передаст по шине сообщение об отказе в монополь ном доступе. В итоrе статус выполнения операции монопольной записи окажет l)Сиrналы монопольноrо доступа имеются в системной шине (сиrналы EXREQS и EXRESPS) и шине DCode (сиrналы EXREQD и EXRESPD) процессора CortexM3. Шина ICode, используемая для выборки команд, не может rенерировать транзакции монопольноrо доступа. 
5.8. Порядок расположения байтов. 111 ся равным 1. В случае неудачной попытки монопольной записи монитор также блокирует запись по адресу, используемому для монопольноrо доступа. В процессоре CortexM3 предусмотрено три команды монопольноrо чтения  LDREX (слово), LDREXB (байт), LDREXH (полуслово) и три команды монопольной записи  STREX (слово), STREXB (байт), STREXH (полуслово). Эти команды имеют следующий синтаксис: LDREX <Rxf>, [Rn, #offset] STREX <Rd>, <Rxf>, [Rn, #offset] В реrистре Rd возвращается статус выполнения монопольной записи (О  успех, 1  неудача). При мер использования команд монопольноrо доступа можно найти в fлаве 10. Для вызова команд монопольноrо доступа из проrрамм на языке Си можно за действовать встроенные функции из СМSISсовместимых библиотек, предостав ляемых производителями микроконтроллеров: LDREX, LEDEXH,   LDREXB,   STREX,   STREXH,   STREXB. Более подробно эти функции описаны в Приложении ж. При осуществлении монопольноrо доступа внутренние буферы записи интер фейсов шин процессора CortexM3 не используются, даже если модуль MPU определяет указанную область памяти как буферируемую. Это rарантирует, что информация о семафоре, хранящаяся в физической памяти, всеrда будет aKTY альной и непротиворечивой для разных контроллеров шин. Разработчики си стем на кристалле, использующие процессор CortexM3 в мноrопроцессорных системах, должны обеспечить непротиворечивость данных при осуществлении пересылок монопольноrо доступа. 5.8. Порядок расположения байтов Собственно процессор CortexM3 поддерживает как прямой, так и обратный порядок байтов. Однако тип памяти, используемый конкретным микроконтрол лером, зависит и от остальных ero компонентов (шинной инфраструктуры, KOH троллеров памяти, периферии и т.п.). Не забудьте внимательно изучить справоч ную документацию на применяемый микроконтроллер, прежде чем приступать к разработке проrраммноrо обеспечения. В большинстве случаев в микрокон троллерах с процессором CortexM3 используется прямой порядок байтов (little endian). В этом режиме первый байт слова данных располаrается в младшем бай те 32битной ячейки памяти (Табл. 5.4). Таблица 5.4. Процессор CortexM3) прямой порядок байтов (little endian)  данные в памяти Адрес Биты 31...24 Биты 23...16 Биты 15...8 Биты 7...0 ОхlООЗ.. .OxlOOO Байт  ОхlООЗ Байт  OxlOO2 Байт  OxlOOl Байт  OxlOOO Oxl007.. .OxlOO4 Байт  OxlOO7 Байт  OxlOO6 Байт  OxlOO5 Байт OxlOO4 . . . Байт  4хN+З Байт  4xN+2 Байт  4xN+l Байт  4xN 
112 . fлава 5. Система памяти Также встречаются микроконтроллеры, использующие обратный порядок байтов (big endian). В таких микроконтроллерах первый байт слова данных pac полаrается в старшем байте 32битной ячейки памяти (Табл. 5.5). Таблица 5.5. Процессор CortexM3, обратный порядок байтов (big endian)  данные в памяти Адрес Биты 31...24 Биты 23...16 Биты 15...8 Биты 7...0 Охl003.. .Охl000 Байт  Охl000 Байт  Охl00l Байт  Охl002 Байт  Охl00З Охl007.. .Охl004 Байт  Охl004 Байт  Охl005 Байт  Охl006 Байт  Охl007 . . . Байт  4xN Байт  4xN+l Байт  4xN+2 Байт  4хN+З в процессоре CortexM3 подруrому определяется обратный порядок байтов, нежели в процессоре ARM7. Если в процессоре ARM7TDMI используется формат с неизменным расположением слов (wordinvariant big endian), обозначаемый в дo кументации ARM как BE32, то в процессоре CortexM3  формат с неизменным расположением байтов (byteinvariant big endian), обозначаемый в документации как BE8 (этот формат поддерживается архитектурами ARM у6 и У7). С точки зре ния расположения байтов в памяти, эти форматы полностью идентичны  отли чается только использование байтовых трактов шины при пересылке данных (Табл. 5.6 и 5.7). Таблица 5.6. Процессор CortexM3 (обратный порядок с неизменным расположением байтов, BE8)  данные на шине АНВ Адрес Биты 31...24 Биты 23...16 Биты 15...8 Биты 7...0 Охl000,слово Биты данных [7:0] Биты данных [15:8] Биты данных [23:16] Биты данных [31:24] Охl000, Биты данных [7:0] Биты данных [15:8]   полуслово Охl002, Биты данных [7:0] Биты данных [15:8]   полуслово Охl000,байт    Биты данных [7:0] Охl00l, байт   Биты данных [7:0]  Охl002,байт  Биты данных [7:0]   Охl003,байт Биты данных [7:0]    Таблица 5.7. Процессор ARM7TDMI (обратный порядок с неизменным расположением слов, BE32)  данные на шине АНВ Адрес Биты 31...24 Биты 23...16 Биты 15...8 Биты 7...0 Охl000,слово Биты данных [7:0] Биты данных [15:8] Биты данных [23: 16] Биты данных [31:24] Охl000, Биты данных [7:0] Биты данных [15:8]   полуслово Охl002, Биты данных [7:0] Биты данных [15:8]   полуслово Охl000,байт Биты данных [7:0]    Охl00l, байт  Биты данных [7:0]   Охl002,байт   Биты данных [7:0]  Охl003,байт    Биты данных [7:0] 
5.8. Порядок расположения байтов · 113 Обратите внимание, что при пересылке данных по шине АНВ в режиме BE8 используются те же байтовые тракты шины, что и в режиме с прямым порядком байтов. Однако байты данных внутри полуслова или слова располаrаются в об ратном порядке (Табл. 5.8). Таблица 5.8. Процессор CortexM3) прямой порядок байтов  данные на шине АНВ Адрес Биты 31...24 Биты 23...16 Биты 15...8 Биты 7...0 Охl000, Биты данных [31:24] Биты данных [23:16] Биты данных [15:8] Биты данных [7:0] слово Охl000, Биты данных [15:8] Биты данных [7:0]   полуслово Охl002, Биты данных [15:8] Биты данных [7:0]   полуслово Охl000, Биты данных [7:0] байт    Охl00l, Биты данных [7:0] байт    Охl002, Биты данных [7:0] байт    Охl003, Биты данных [7:0]    байт в процессоре CortexM3 формат хранения данных фиксируется в момент BЫ хода процессора из состояния сброса, после чеrо изменить ero уже нельзя (дина мическое изменение формата хранения данных не допускается и команда SETEND не поддерживается). При выборке команд всеrда используется прямой порядок байтов, так же как и при обращении к данным, расположенным в пространстве управления системой (скажем, при обращении к модулям NVIC и FPB) и в диапа зоне адресов внешней шины РРВ (в диапазоне адресов от ОхЕООООООО до OxEOOFFFFF данные всеrда хранятся в формате с прямым порядком байтов). Если ваша система на кристалле не поддерживает обратный порядок байтов, а одно или несколько из используемых периферийных устройств используют этот формат, то вы можете леrко преобразовать данные из одноrо формата в дpy rой с помощью специальных команд преобразования данных, имеющихся в про цессоре CortexM3. В частности, для подобных преобразований часто использу ют команды REV и RЕVlб. 
rЛАВА б ОСОБЕННОСТИ РЕАЛИ3АЦИИ CORTEX..M3 Данная rлава предназначена, rлавным образом, для разработчиков систем на кристалле (SoC), которые хотели бы использовать процессор СоrtехТММ3 в своих проектах. Обычным разработчикам знать тонкости реализации ядра Соrtех ТМ  М3, вообще rоворя, нет никакой необходимости. Однако если вам действительно ин тересно, как устроен и как работает процессор CortexM3, то вы сможете почерп нуть из настоящей rлавы немало полезноrо. 6.1. Конвейер в процессоре CortexM3 реализован трёхступенчатый конвейер. Обработка каждой команды в конвейере осуществляется в три этапа: выборка, декодирова ние и выполнение (Рис. 6.1). Команда N I Выборка Декоди Исполнение рование Выборка Декоди Исполнение рование Выборка Декоди Исполнение рование Выборка Декоди Исполнение рование Команда N + 1 Команда N + 2 Команда N + З Рис. 6.1. Трёхступенчатый конвейер процессора CortexM3. KTOTO может возразить, что таких этапов на самом деле четыре, поскольку есть ещё этап взаимодействия конвейера с интерфейсом шины при обращении к памяти. Однако выполнение данноrо этапа происходит за пределами процессо ра, поэтому конвейер всё же считается трёхступенчатым. Если понаблюдать за процессом выполнения проrраммы, содержащей в OCHOB ном 16битные команды, то можно заметить, что выборка команд не всеrда про исходит на каждом такте. Это связано с тем, что процессор может выбирать до двух команд за один раз (32битная шина), так что после выборки одной команды следующая тоже окажется в процессоре. В такой ситуации интерфейс шины про цессора может либо попытаться осуществить выборку последующей команды, либо, если буфер команд полон, перейти в состояние ожидания. Для выполнения некоторых команд требуется несколько тактов; в этом случае работа конвейера приостанавливается. 
6.1. Конвейер · 115 При выполнении команды ветвления конвейер очищается, после чеrо процес сор должен будет вновь заполнить ero командами, начиная с Toro адреса, по KOTO рому был осуществлён переход. Однако процессор CortexM3 поддерживает He сколько команд архитектуры y7M, которые в ряде случаев позволяют заменить короткие переходы на условно выполняемые команды!). Изза наличия в процессоре конвейера, а также для обеспечения совместимо сти проrрамм с набором команд Thumb @ при чтении счётчика команд во время исполнения команды возвращаемое значение будет равно адресу команды плюс четыре. Если счётчик команд задействуется для формирования адреса при обра щении к памяти, то будет использовано значение адреса команды, выровненное на rраницу слова и увеличенное на четыре. Это смещение постоянно и не зависит от сочетания 16битных команд Thumb и 32битных команд Thumb2. Такой под ход rарантирует совместимость обоих наборов команд. В блоке выборки команд процессора предусмотрен специальный буфер (Рис. 6.2), который позволяет орrанизовать очередь из предварительно выбран ных команд. Этот буфер предотвращает останов конвейера при наличии в после довательности команд 32битных команд Thumb2, не выровненных на rраницу слова. Однако он не является дополнительной ступенью конвейера и, следова тельно, не увеличивает штраф ветвления. Байт Память команд N N+4 N+8 N + Ох( О 2 3 Невыровненные З2битные команды Thumb2 в памяти Исполнение Декодирование Выборка Буфер команд (ком. (v Этапы конвейера Кома нда Выборка команды (ком. (2 и О) Декодиро вание (ком. В) Исполнение (ком. Д) Рис. 6.2. Использование буфера блока выборки команд для более эффективной обработки 32битных команд. 1) См. разделы [лавы 4, посвящённые команде IFTHEN (IT). 
116 . rлава б. Особенности реализации CortexM3 6.2. Подробная бпок..схема В состав процессора CortexM3 входит не только процессорное ядро, но и раз личные компоненты управления системой, а также компоненты поддержки OT ладки (Рис. 6.3). Все эти компоненты соединены между собой шинами АНВ и АРВ. Указанные шины являются составной частью усовершенствованной шин ной архитектуры для микроконтроллеров (Advanced Microcontroller Bus Architecture  АМВА) [4]. ВЫХОД NMI NVIC СМЗСоrе ЕТМ TPIU трасси ровки Преры вания Интерфейс OWТ 'ТМ отладки SWJDP/ SWDP FPB Таблица ПЗУ Схема коммутации ДНВ (внутренний BusMatrix) Внутренняя шина собственных периф. устройств (АНВ) Мост ДHBДPB Внешняя шина собственных периф. устройств (АРВ) Шина команд Шина данных Системная Шина собственных (ICode) (DCode) шина периф. устройств (РРВ) Рис. 6.3. Блоксхема процессора CortexM3. Обратите внимание, что модули MPU, WIC и ЕТМ являются опциональными блоками, которые MorYT быть включены в микроконтроллер на этапе ero реали зации. Некоторые новые компоненты перечислены в Табл. 6.1. Таблица 6.1. Сокращения и обозначения, использованные в блоксхеме Обозначение Описание CM3Core Ядро центральноrо процессора CortexM3 NVIC Контроллер вложенных векторных прерываний SYSTICK Системный таймер) который может использоваться операционными системами WIC Контроллер «пробуждающих» прерываний (опция) MPU Модуль защиты памяти (опция) BusMatrix Внутренняя схема коммутации шин АНВ Мост AHBAPB Мост) преобразующий сиrналы шины АНВ в сиrналы шины АРВ 
6.2. Подробная блоксхема · 117 Таблица 6.1. Сокращения и обозначения, использованные в блоксхеме (продолжение) Обозначение Описание Интерфейс Интерфейс порта отладки Serial Wire/Serial Wire + JT AG. Связь с интерфейсом отладки осуществляется по протоколу Serial Wire или по стандартному SWDP/SWJDP протоколу JT AG (для SWJ  DP) AHBAP Порт доступа АНВ; преобразует команды от интерфейса SW/SWJ в транзакции шины АНВ ЕТМ Встроенная макроячейка трассировки; модуль) обеспечивающий возможность трассировки команд при отладке (опциональный) DWT Модуль просмотра и трассировки данных; модуль) реализующий поддержку точек наблюдения данных при отладке ITM Модуль трассировки Instrumentation Trace Macrocell Модуль интерфейса порта трассировки; интерфейсный модуль) TPIU осуществляющий передачу данных отладки внешнему аппаратному трассировщику FPB Модуль коррекции флэшпамяти и задания точки останова Таблица ПЗУ Небольшая таблица) содержащая информацию о конфиrурации процессора Процессор CortexM3 предлаrается в виде процессорной подсистемы (Рис. 6.3). Собственно ядро ЦПУ тесно связано с контроллером прерываний NVIC и раз личными блоками поддержки отладки: . CM3Core  ядро CortexM3, содержащее реrистры) АЛУ, тракт данных и ин терфейс шины. . NVIC  встроенный контроллер прерываний. Число поддерживаемых пре рываний определяется конкретным изrотовителем микросхем. Контроллер NVIC тесно связан с ядром ЦПУ и содержит несколько реrистров управления системой. Этот контроллер поддерживает обработку вложенных прерываний, что значительно упрощает обработку таких прерываний процессором. Кроме Toro, контроллер NVIC является контроллером векторных прерываний. Это означает, что при возникновении прерывания можно сразу же перейти к про цедуре обработки этоrо прерывания (нет необходимости использовать общий обработчик для определения типа прерывания). . SYSTICK  системный таймер, представляющий собой обычный вычитаю щий счётчик, который может использоваться для rенерации прерываний че рез равные интервалы времени, даже во время нахождения системы в спящем режиме. Наличие TaKoro таймера значительно упрощает перенос операцион ных систем на различные микроконтроллеры с процессором CortexM3, по скольку исключает необходимость изменения кода, отвечающеrо за поддерж ку системноrо таймера ОС. Таймер SYSTICK входит в состав контроллера NVIC. . WIC  модуль, взаимодействующий с контроллером прерываний NVIC и при этом отделённый от основной схемы процессора. Этот модуль предназначен для вывода системы из спящеrо режима при появлении прерывания даже в том случае, если процессор (включая контроллер NVIC) полностью OCTaHOB 
118 . Fлава 6. Особенности реализации CortexM3 лен или отключён. Модуль WIC появился во второй ревизии ядра CortexM3 и является опциональным. · МРИ  модуль MPU является опциональным. Это означает, что в какихто pe ализациях процессора CortexM3 этот модуль может присутствовать, а в какихто нет. При наличии модуля MPU он может использоваться для за щиты содержимоrо памяти, например, запрещая запись в определённые обла сти памяти или предотвращая доступ пользовательских проrрамм к данным привилеrированных приложений. · BusMatrix  этот модуль является «сердцем» системы внутренних шин про цессора CortexM3. Он представляет собой схему коммутации шин АНВ, обе спечивающую возможность одновременной пересылки данных по различным шинам при обращении обоих ведущих шины к разным областям памяти. Mo дуль BusMatrix также осуществляет дополнительное управление передачей данных, обеспечивая, помимо Bcero прочеrо, буфер записи, а также осущест вляет поддержку биториентированных операций (bitband). · AHBAPB  мост между шинами АНВ и АРВ; используется для подключения различных АРВустройств, таких как компоненты отладки) к шине BCTpoeH ных периферийных устройств процессора CortexM3. Кроме Toro, KOHCTPYK цИЯ процессора позволяет производителям микросхем подключать дополни  тельные АРВустройства к внешней шине встроенных периферийных устройств (РРВ) с помошью этой шины АРВ. Остальные компоненты, изображённые на блоксхеме, предназначены для поддержки отладки и, как правило, не используются прикладными проrрам мами: · SWDP/SWJDP  порт отладки SerialWire (SWDР)/порт отладки SerialWire и JTAG (SWJDP); работает совместно с портом доступа АНВ (AHBAP), KOTO рый позволяет внешним отладчикам формировать транзакции на шине АНВ для управления процессом отладки. В самом процессорном ядре CortexM3 нет тракта сканирования JTAG; управление большинством отладочных функ ций осуществляется реrистрами NVIC по шине АНВ. Модуль SWJDP поддер живает протоколы SerialWire и JTAG, тоrда как модуль SWDP поддерживает только протокол Serial Wire. · AHBAP  модуль AHBAP обеспечивает доступ ко всей памяти процессора CortexM3 посредством нескольких реrистров. Этот блок управляется MOДY лем SWDP/SWJDP по отладочному интерфейсу общеrо назначения) который называется портом доступа к средствам отладки (DAP). ДЛЯ выполнения своих функций внешний аппаратный отладчик должен обращаться к модулю AHBAP через SWDP/SWJDP, чтобы rенерировать требуемые транзакции на шине АНВ. · БУМ  модуль ЕТМ является опциональным компонентом, обеспечивающим возможность трассировки команд, поэтому в некоторых устройствах на базе CortexM3 поддержка трассировки команд в реальном времени может OTCYT ствовать. Данные трассировки выводятся в порт трассировки через модуль 
6.3. Интерфейсы шин 8 процессоре CortexM3 · 119 TPIU. Реrистры управления ЕТМ отображены на адресное пространство па мяти процессора и MorYT управляться отладчиком через интерфейс DAP. . DWT  модуль DWT реализует функции точек наблюдения данных. При об наружении равенства адреса или величины переменной заданному значению этот модуль может rенерировать события точки наблюдения, используемые для активации отладчика) rенерации информации о трассировке данных или для активации модуля ЕТМ. . IТМ  модуль ITM может использоваться двумя способами. Вопервых, про rpaMMHoe обеспечение может напрямую выполнять запись в этот модуль для вывода информации в порт TPIU. BOBTOpЫX, по событию совпадения от MO дуля DWT в модуле ITM MorYT rенерироваться пакеты с информацией о Tpac сировке данных для их вывода в выходной поток. . TPIU  модуль TPIU обеспечивает взаимодействие с внешними аппаратными устройствами трассировки. Трассировочная информация, являющаяся BHY тренней для процессора CortexM3, имеет вид пакетов, передаваемых по yco вершенствованной шине трассировки (Advanced Trace Bus  АТВ), а модуль TPIU переформатирует данные таким образом, чтобы они моrли быть счита ны внешним устройством. . РРВ  модуль РРВ используется для реализации функций Flash Patch и зада ния точки останова. Функция Flash Patch означает) что при обращении цeH тральноrо процессора по некоторому адресу операция может быть переадре сована в друrую область памяти) в результате будет выбрано друrое значение. Также совпадение адреса может быть использовано для rенерации события точки останова. . Таблица ПЗУ  это небольшая таблица, в которой содержится информация о распределении памяти для различных системных устройств и компонентов отладки. Средства отладки используют эту таблицу для определения адресов, по которым расположены компоненты отладки. В большинстве случаев при меняется стандартная карта памяти, описанная в [1]. Однако поскольку HeKO торые компоненты отладки являются опциональными и, кроме Toro, возмож но использование дополнительных компонентов, отдельные производители MorYT реализовывать отладочные возможности своих микросхем в COOTBeT ствии со своими предпочтениями. В этом случае таблица ПЗУ должна быть скорректирована таким образом, чтобы проrраммные средства отладки cMor ли определить реальное распределение карты памяти и, соответственно, име ющиеся в устройстве компоненты отладки. 6.3. Интерфейсы шин в процессоре CortexM3 Если только вы не занимаетесь разработкой систем на кристалле с использо ванием процессора CortexM3, то вряд ли коrданибудь сможете напрямую ис пользовать сиrналы интерфейсов шин) описанных в этом разделе. Как правило, изrотовители микросхем подключают все сиrналы шин к блокам памяти и пери ферийным устройствам. И лишь в очень редких случаях изrотовители решают 
120 · rлава 6. Особенности реализации CortexM3 соединить системную шину с мостом, позволяющим подключать к устройству внешние системы шин. Интерфейсы шин процессора CortexM3 базируются на протоколах AHBLite и АРБ, спецификация которых содержится в [4]. 6.3.1. Шина I..Code Шина ICode  это 32битная шина, использующая протокол AHBLite) KOTO рая предназначена для выборки команд из памяти в диапазоне адресов от ОхОООООООО до OxlFFFFFFF. Выборка производится 32битными словами, даже в случае 16битных команд Thumb. Соответственно, во время выполнения про rpaMMbI цпу может одновременно выбирать до двух команд Thumb. 6.3.2. Шина D..Code Шина DCode является 32битной шиной, использующей протокол AHBLite, которая предназначена для обращения к данным в диапазоне адресов от ОхОООООООО до OxlFFFFFFF. Несмотря на то что процессор CortexM3 поддержи вает обращения к невыровненным данным) вы не сможете обнаружить таких пе ресылок на шине, поскольку интерфейс шины в процессорном ядре преобразует их в выровненные. Соответственно, устройства (такие как память), подключае мые к этой шине, должны поддерживать только выровненные пересылки соrлас но протоколу AHBLite (АМВА 2.0). 6.3.3. Системная шина Системная шина  это 32битная шина, использующая протокол AHBLite, которая предназначена для выборки команд и обращения к данным в диапазоне адресов от Ох20000000 до OxDFFFFFFF и от ОхЕОI00000 до OxFFFFFFFF. Анало rично шине DCode, пересылки по системной шине всеrда выравниваются на rраницу слова. 6.3.4. Внешняя шина РРВ Внешняя шина собственных периферийных устройств работает по протоколу АРВ. Эта шина предназначена для обращений к периферийным устройствам в диапазоне адресов от ОхЕО040000 до OxEOOFFFFF. В связи с тем) что некоторые области памяти в указанном диапазоне адресов уже используются модулями TPIU) ЕТМ и таблицей пзу, для подключения дополнительных устройств к этой шине может задействоваться только участок памяти в диапазоне адресов от ОхЕО042000 до OxEOOFFOOO. Пересылки по шине РВВ всеrда выравниваются на rраницу слова. 6.3.5. Шина DAP Шина DAP  это 32битная шина, поддерживающая расширенную версию спецификации АРБ. Эта шина предназначена исключительно для подключения модулей интерфейса отладки, таких как SWJDP или SWDP. Использовать дaH ную шину для друrих целей нельзя. Дополнительную информацию об интерфей се шины DAP можно найти в [лаве 15) а также в [3]. 
6.4. ДРУ2ие uнтерфейсы процессора CortexM3 · 121 6.4. Друrие интерфейсы процессора Cortex..M3 ПОМИМО интерфейсов шин) в процессоре CortexM3 имеется ряд друrих ИН терфейсов, используемых для разных целей. Сиrналы данных интерфейсов вряд ли окажутся на выводах микросхемы, поскольку их подключают, большей ча стью, к различным узлам SoC или же оставляют неподключёнными. Подробная информация об указанных сиrналах содержится в [1]. Краткое описание HeKOTO рых из них приведено в Табл. 6.2. Таблица 6.2. Некоторые сиrналы интерфейсов fруппасиrналов Назначение Межпроцессорный Сиrналы синхронизации задач) выполняющихся на разных обмен (TXEV) RXEV) процессорах Сиrналы перехода Состояние режима пониженноrо энерrопотребления для системы в спящий режим (SLEEPING) SLEEPDEEP) управления питанием Сиrналы BHYTpeHHero состояния Состояние прерывания) используются для работы модуля ЕТМ (ETMINTNUM) ETMINTSTATE) и для отладки CURRPRI) Запрос сброса Выход запроса на сброс от контроллера NVIC (SYSRESETREQ) Состояниеблокировки* Показывают) что процессорное ядро перешло в состояние блокировки и останова (LOCKUP) (изза ошибок при выполнении обработчика исключения Hard Fault HALTED) или обработчика немаскируемоrо прерывания) или состояние останова (для отладочных операций) Формат хранения Задаёт формат хранения мноrобайтных значений (прямой/обратный данных (ENDIAN) порядок байтов») используемый процессором CortexM3 после выхода из состояния сброса Интерфейс ЕТМ Подключается к модулю ЕТМ для трассировки команд АТВ представляет собой один из протоколов архитектуры отладки Интерфейс АТВ модуля CoreSight компании ARM) предназначенный для передачи данных трассировки. В данном случае этот интерфейс обеспечивает вывод ITM данных трассировки из модуля ITM процессора CortexM3) подключённоrо к модулю TPIU *Более подробно состояние блокировки рассматривается в [лаве 12. 6.5. Внешняя шина РРВ Процессор CortexM3 имеет интерфейс внешней шины РРБ. Данный интер фейс базируется на протоколе АРБ из спецификации АМБА версии 2.0 (для реви зий О и 1 процессора CortexM3) или версии 3.0 (для ревизии 2 процессора). Ши на РРВ предназначена для подключения системных устройств, не являющихся разделяемыми ресурсами, таких как компоненты отладки. Данный интерфейс поддерживает использование СоrеSightсовместимых компонентов отладки. В связи с этим он несколько отличается от интерфейса обычной шины АРВ тем, что имеет дополнительный сиrнал, называемый 
122 · Тлава 6. Особенности реализации CortexM3 PADDR31, который указывает на источник пересылки. Если указанный сиrна равен О, значит, пересылка была сrенерирована проrраммой, выполняемой про цессором. Если этот сиrнал равен 1) значит, пересылка была сrенерирована аппа ратными средствами отладки. Блаrодаря наличию данноrо сиrнала периферий ное устройство может быть спроектировано таким образом, чтобы ero Mor задей ствовать только отладчик или же чтобы при использовании устройства про rраммными средствами была доступна лишь часть ero функций. Эта шина не предназначена для обычноrо использования, скажем для под ключения периферийных устройств общеrо назначения. В принципе, ничто не мешает разработчику микросхем спроектировать и подключить к данной шине обычное периферийное устройство. Однако в дальнейшем пользователи TaKoro устройства MorYT столкнуться с проблемами, связанными с особенностями управления доступом на привилеrированном уровне, например при проrрамми ровании устройства на пользовательском уровне или же при отделении устрой ства от остальных областей памяти посредством MMU. Внешняя шина РРВ не поддерживает обращения к невыровненным данным. Поскольку шина содержит 32 линии данных и базируется на протоколе АРВ, при разработке периферийных устройств, предназначенных для подключения к этой области памяти, необходимо предусмотреть выравнивание адресов всех реrи стров устройства на rраницу слова. Кроме Toro, при разработке устройства, допу скающеrо обращения со стороны проrраммноrо обеспечения, рекомендуется) чтобы все обращения к данному устройству были 32битными. При работе с ши ной РРВ всеrда используется прямой порядок байтов. 6.6. Типичная схема подключения процессора Изза Toro, что в процессоре CortexM3 имеется множество интерфейсов шин, можно леrко запутаться, пытаясь понять, как соединить ero с друrими компонен тами системы, такими как память или периферийные устройства. В качестве при мера на Рис. 6.4 приведена блоксхема простой системы на базе процессора CortexM3. Поскольку обращения к области памяти Code MorYT осуществляться как по шине команд (при выборке команд)) так и по шине данных (при обращении к дaH ным), необходим некий переключатель шин АНВ, называемый BusMatrix 1 ») или же обычный мультиплексор шины АНВ. При использовании компонента BusMatrix, входящеrо в состав па кета разработки АМВА 2) (ADK), обращения к флэшпамяти и дополнительному СОЗУ (при ero наличии) MorYT производить ся по любой шине. В случае одновременноrо обращения обеих шин к одному и тому же устройству памяти запросы шины данных должны иметь более BЫCO кий приоритет  при этом обеспечивается большая производительность. 1) Компонент BusMatrix, требуемый в данном случае, отличается от одноимённоrо компонента, входящеrо в состав процессора CortexM3 (Рис. 6.4). Внутренний BusMatrix спроектирован специально для использования в процессоре и отличается от стандартноrо компонента из состава па кета разработки АМБА (АМБА Design Kit  ADK). 2)Пакет ADK содержит набор компонентов для поддержки архитектуры АМВА и при меры rOToBbIx систем, написанные на VHDL/Verilog. 
6.6. Типичная схема подключения процессора . 123 СоrtехМЗ Дополнительные компоненты отладки Шина команд Шина данных Системная шина Внешняя шина собственных периферйных устройств Мультиплексор шины или ДНВ BusMatrix Статическое ОЗУ Контроллер внешней памяти Устройство NOl Устройство N°2 Мост ДHBДPB Флэш память Дополнительное статическое ОЗУ (опция) Внешнее ОЗУ 1/0 UART Таймер Рис. 6.4. Блоксхема системы на базе процессора Cortex М3. Компонент BusMatrix позволяет при обращении шин к разным устройствам памяти (например) при выборке команды из флэшпамяти по шине команд с oд новременным чтением данных из дополнительноrо СО3У по шине данных) пере сылать данные по обеим шинам одновременно. При использовании мультиплек сора шины одновременная пересылка данных по обеим шинам будет невозмож на, однако схема при этом будет иметь меньшие размеры. В обычных микрокон троллерах с ядром CortexM3 оперативная память подключается к системной шине. Основной блок СО3У должен подключаться через интерфейс системной ши ны в диапазоне адресов, выделенных под оперативную память. Это даёт возмож ность обращаться к данным одновременно с выборкой команд. Кроме Toro, такое подключение СО3У позволяет работать с булевыми типами данных, используя побитовый доступ по методу bitband. В некоторых микроконтроллерах может присутствовать внешний интерфейс памяти. Это требует использования контроллера внешней памяти, ПОСКОЛЬКУ вы не можете подключать внешние запоминающие устройства напрямую к шине АНВ. Контроллер внешней памяти может быть подключён к системной шине процессора. Дополнительные АНВсовместимые устройства также MorYT быть леrко подключены к системной шине без использования компонента BusMatrix. Простые периферийные устройства MorYT подключаться к процессору через мост AHBAPB. Это позволяет использовать для обращения к ним более простой протокол АРВ. 
124 . rлава 6. Особенности реализации CortexM3 Блоксхема) приведённая на Рис. 6.4, является Bcero лишь простым примером; разработчики микросхем MorYT реализовывать и друrие варианты подключения к шинам процессора. Однако вам это не потребуется  единственное) что вам He обходимо для разработки проrраммноrо обеспечения, это информация о карте распределения памяти. Компоненты, изображённые на блоксхеме, такие как BusMatrix, мост AHBAPB, контроллер памяти, интерфейс ввода/вывода, таймер и модуль уни версальноrо асинхронноrо приёмопередатчика (UART), предлаrаются компани ей ARM, а также друrими компаниями, разрабатываюшими IРблоки. Поскольку в микроконтроллерах MorYT использоваться периферийные устройства разных производителей, при разработке проrраммноrо обеспечения необходимо внима тельно изучить справочную документацию на при меняемый микроконтроллер. 6.7. Виды сброса и сиrналы сброса в системах с процессором CortexM3 используются разные виды сброса. HeKO торые устройства MorYT поддерживать большее число разновидностей сброса по сравнению с друrими  это определяется реализацией схемы сброса микрокон троллера или SoC (Рис. 6.5). Однако в любой системе имеется, по крайней мере) три вида сброса, перечисленные в Табл. 6.3. Таблица 6.3. Виды сброса, имеющиеся в любой системе Сиrнал сброса Вид сброса процессора Описание CortexM3 Сброс по Сброс) выполняемый при включении питания устройства; включению PORESETn сбрасывается ядро процессора) периферийные устройства питания и система отладки. Активируется при включении устройства Системный сброс; сбрасывается всё устройство) кроме системы Сброс отладки) в том числе ядро процессора) контроллер NVIC (за SYSRESETn исключением реrистров управления отладкой») модуль MPU) системы периферия. Активируется при включении устройства) а также по запросу от отладчика через реrистр AIRCR контроллера NVIC Бит Сброс процессорноrо ядра; сбрасывается весь процессор) кроме VECTRESET системы отладки) в том числе ядро процессора) контроллер NVIC Сброс в реrистре (за исключением реrистров управления отладкой) и модуль MPU. процессора AIRCR Активируется по запросу от отладчика через реrистр AIRCR контроллера контроллера NVIC  этот вид сброса предназначен дЛЯ NVIC использования отладчиком Сброс JTAG nTRST Сиrнал сброса от контроллера порта JT AG (только при наличии интерфейса JT AG) 
6.7. Виды сброса и сиzнаЛbl сброса. 125 nTRS (от JT А SYSRESETn '' .... I : I 1 са r енератор PORESEТn 1 I I П роцессорное I .... ....1 I I ...... сброса ....1 I 1 ядро I ...... 1 I I ..... 1 I Запрос 1 1 LJ сброса СоrtехМЗ системы 11 1 Встроенная I 1 I 1 I Т . 1 I Интерфейс . i система отладки I ..... I G) ..... LJ отладки ..... ...... . Опциональная . система отладки Ми кроконтроллер/SоС Внешний сиrнал сбро Рис. 6.5. Внутренние сиzнаЛbl сброса типичноzо микроконтроллера с ядром CortexM3. Более подробно сиrналы сброса процессора CortexM3 описаны в [1]. Все сиr налы сброса процессора подключаются к схеме сброса внутри микроконтроллера или SoC. rOToBoe устройство имеет Bcero один или два внешних сиrнала сброса. 
rЛАВА 7 ИСКЛЮЧЕНИЯ 7.1. Типы исключений Архитектура исключений, реализованная в процессоре CortexM3, поддержи вает несколько системных исключений и большое число внешних прерываний. Каждое исключение имеет свой порядковый номер, при этом исключения с HOMe рами от 1 до 15 являются системными, а с номерами 16 и более  соответствуют входам внешних прерываний. Большинство исключений имеют проrраммируе мый приоритет и лишь некоторые  фиксированный приоритет. Кристаллы с процессором CortexM3 MorYT иметь разное количество входов внешних прерываний (от 1 до 240) и разное число уровней приоритета. Это по зволяет разработчикам микросхем конфиrурировать исходный код процессора в соответствии со своими нуждами. Как уже rоворилось, исключения с номерами от 1 до 15 являются системными исключениями (исключения с номером О не существует), которые перечислены в Табл. 7.1. Исключения с номерами 16 и более соответствуют входам внешних прерываний (Табл. 7.2). Номер исключения, обрабатываемоrо в данный момент времени, содержится в реrистре состояния прерывания IPSR процессора, а также в реrистре управле ния и состояния прерывания ICSR контроллера NVIC (поле VECTACTIVE). Обратите внимание, что в данной rлаве номера прерываний (скажем, преры вание NQO) соответствуют номерам входов прерываний контроллера NVIC. В pe альных микроконтроллерах или системах на кристалле номера входов внешних прерываний MorYT не соответствовать номерам входов прерываний контролле ра. Например, несколько первых входов прерываний MorYT быть назначены BHY тренним периферийным устройствам, а выводы внешних прерываний MorYT быть подключены к следующей rруппе входов контроллера NVIC. ДЛЯ уточнения нумерации прерываний необходимо обратиться к документации на конкретное устройство. При возникновении разрешённоrо исключения, которое не может быть обра ботано немедленно (например, в том случае, коrда выполняется процедура обра ботки прерывания с более высоким приоритетом или установлен реrистр маски 
7.1. Типы исключений . 127 рования прерываний), данное исключение будет отложено (это не касается ряда системных исключений 1 )). Таблица 7.1. Системные исключения Номер исклю Тип исключения Приоритет Описание чения 1 Reset 3 (Наивысший) Сброс 2 NMI 2 Немаскируемое прерывание (вход внешнеrо немаскируемоrо прерывания) 3 Hard Fault 1 Любой отказ, если соответствующий обработчик не разрешён Отказ системы управления памятью; 4 MemManage Fault Проrраммируемый нарушение правил доступа, заданных модулем MPU, или обращение по некорректному адресу Отказ шины; происходит при получении интерфейсом шины АНВ сиrнала ошибки от ведомоrо устройства на шине (также 5 Bus Fault Проrраммируемый называется отказом предвыборкu, если ошибка возникла при выборке команды, или отказом данных, если ошибка возникла при обращении к данным) Ошибка в проrрамме или попытка обращения 6 U sage Fault Проrраммируемый к сопроцессору (процессор CortexM3 не поддерживает сопроцессор) 7. ..10 Зарезервировано   11 SVCall Проrраммируемый Вызов супервизора Исключение монитора отладки (точки 12 Debug monitor Проrраммируемый останова, точки наблюдения или внешняя команда отладки) 13 Зарезервировано   14 PendSV Проrраммируемый Запрос системной службы 15 SYSTICK Проrраммируемый Системный таймер Таблица 7.2. Внешние прерывания Номер исключения Тип исключения Приоритет Описание 16 IRQ #0 Проrраммируемый Внешнее прерывание N20 17 IRQ #1 Проrраммируемый Внешнее прерывание N21 . . . . . . . . . . . . 255 IRQ #239 Проrраммируемый Внешнее прерывание N2239 1) В некоторых случаях описанный сценарий нарушается. Если при возникновении отказа соответствующий обработчик не может быть сразу же запущен изза Toro, что выполняется обработчик исключения с более высоким приоритетом, то вместо требуемоrо обработчика отказа возможен запуск обработчика исключения Hard Fault (исключение отказа с наивысшим приоритетом). Более подробно этот вопрос мы рассмотрим чуть позже, коrда будем rоворить об исключениях отказов; исчерпывающая же информация, как обычно, содержится в [2]. 
128 . Тлава 7. Исключения Откладывание исключения означает, что запрос на ero обработку будет хранить ся в специальном реrистре до тех пор, пока не появится возможность обработки данноrо исключения. Такое поведение отличается от поведения традиционных процессоров ARM. Ранее компоненты схемы, которые rенерировали запросы обычноrо/быстроrо (IRQ/FIQ) прерываний, должны были удерживать данный запрос до начала ero обработки. Теперь же, блаrодаря наличию в контроллере NVIC реrистров, обеспечивающих работу с отложенными исключениями, воз никшее прерывание будет обработано даже в том случае, если источник преры вания снимет свой сиrнал запроса. 7.2. Приоритеты исключений в процессоре CortexM3 очерёдность обработки исключений, а также сама возможность обработки KOHKpeTHoro исключения определяется приоритетом этоrо исключения. Исключения с более высоким приоритетом (меньшим значе нием уровня приоритета) MorYT прерывать обработку исключения, имеющеrо меньший приоритет (большее значение уровня приоритета), т.е. поддерживаются вложенные исключения/прерывания. Некоторые типы исключений (Reset, NMI и Hard Fault) имеют фиксированные значения приоритета, которые представле ны отрицательными числами, отражая тот факт, что данные исключения облада ют наивысшим приоритетом среди всех остальных. Прочие исключения имеют проrраммируемые уровни приоритета. Процессор CortexM3 поддерживает три фиксированных уровня с наивыс шим приоритетом и до 256 уровней с проrраммируемым приоритетом (до 128 уровней вложенности). Однако большинство микросхем с ядром CortexM3 име ют rораздо меньшее число уровней, например 8, 16, 32 и Т.д. Требуемое число уровней задаётся разработчиком при проектировании микроконтроллера или системы на кристалле. Уменьшение числа уровней приоритета осуществляется отключением соответствующеrо числа младших битов реrистров приоритета. Например, если для задания уровня приоритета в устройстве используется толь ко три бита, то формат реrистра приоритета будет таким, как показано на Рис. 7.1. Реализованы Бит 7 Бит 6 Бит 5 Рис. 7.1. Pezucmp приоритета, в котором реализовано 3 бита. Поскольку биты о. . .4 реrистра не реализованы, при их чтении всеrда возвраща ется ноль, а запись в эти биты иrнорируется. При такой конфиrурации процессора в нашем распоряжении будут следующие уровни приоритета: ОхОО (наивысший приоритет), Ох20, Ох40, Ох60, Ох80, ОхАО, ОхСО и ОхЕО (наименьший приоритет). Аналоrичным образом, при использовании четырёх битов для задания ypOB ня приоритета формат реrистра приоритета будет соответствовать показанному на Рис. 7.2. 
7.2. Приоритеты исключений . 129 Бит 7 Бит 6 Бит 5 Бит 4 Реализованы Рис. 7.2. Pezucmp приоритета, в котором реализовано 4 бита. Чем больше битов реrистров приоритета будет реализовано, тем больше OKa жется в нашем распоряжении уровней приоритета (Рис. 7.3). Однако увеличение числа используемых битов реrистров приоритета влечёт за собой увеличение числа вентилей и, соответственно, потребляемой мощности. Для процессора CortexM3 минимальное число реализованных битов реrистров приоритета paB но трём (8 уровней). Ох20 Ох40 Ох60 Ох80 ОхАО ОхСО ОхЕО OxFF Наивысший приоритет Реализованные уровни при использовании 3 бит для задания приоритета )( з )( 2 )( 1 РеаЛИЗ0ванныеуровни при использовании 4 бит для задания приоритета )( з )( 2 )( 1 О )( Охl0 )( Ох20 )( ОхЗО )( Ох40 )( Ох50 )( Ох60 )( Ох70 )( Ох80 )( Ох90 )( ОхАО )( ОхВО )( ОхСО )( ОхОО )( ОхЕО )( OxFO з 2 1 О О )( Ох20 )( Ох40 )( Ох60 ПроrрамМИ руемы, исключения )( Ох80 )( ОхАО )( ОхСО )( ОхЕО Наименьший приоритет Рис. 3. Возможные уровни приоритета при 3 и 46итHЫX pezucmpax приоритета. Отключение младших, а не старших битов реrистров позволяет упростить пе ренос проrраммы с одноrо устройства с ядром CortexM3 на друrое. Очевидно, 
130 . [лава 7. Исключения что при таком подходе проrрамма, написанная для устройства с 4битными реrи страми приоритета, нормально запустится на устройстве с 3битными реrистра ми приоритета. Если бы вместо младших битов отключались старшие биты, то при переносе проrраммы с одноrо устройства на друrое моrла бы произойти ин версия приоритетов. Предположим, что в проrрамме используется прерывание IRQ #0 с уровнем приоритета Ох05 и прерывание IRQ #1 с уровнем приоритета Ох03, Т.е. прерывание IRQ #1 имеет более высокий приоритет. Однако при удале нии 2ro бита (старшеrо) уровень приоритета прерывания IRQ #0 стал бы равен ОхОl, в результате чеrо это прерывание получило бы более высокий приоритет, чем IRQ #1. Примеры возможных значений уровней приоритета для устройств с 3, 5 и 8битными реrистрами приоритета приведены в Табл. 7.3. Таблица h3. Доступные уровни приоритета для устройств с 3, 5 и 8битными реrистрами приоритета Устройства Устройства Устройства Уровень Тип исключения с 3битными с 5битными С 8битными приоритета реrистрами реrистрами реrистрами приоритета приоритета приоритета 3 Reset 3 3 3 (наивысший) 2 NMI 2 2 2 1 Hard Fault 1 1 l Исключения ОхОО, Ох20, о.. ОхОО, Ох08, ... ОхОО, Ох01, Ох02, О, 1, о.. OxFF с проrраммируемым ОхЕО OxF8 Ох03, ... OxFE, уровнем приоритета ОхРР Наиболее внимательные читатели MorYT спросить: если реrистры приоритета являются 8битными, то почему поддерживается только 128 уровней вложенно сти? Это связано с тем, что содержимое 8битных реrистров делится на две части: прuоритет zpynnbl и субпрuорuтет. Разбиение реrистров приоритета исключений, имеющих проrраммируемый приоритет, определяется полем PRIGROUP реrистра AIRCR контроллера NVIC (Табл. 7.4). При этом старшая часть реrистра (левые биты) определяет приоритет rруппы, а младшая (правые биты)  субприоритет (Табл. 7.5). Значение уровня приоритета zpynnbl определяет возможность возникнове ния прерывания, если в данный момент уже выполняется обработчик друrоrо прерывания. Значение уровня субпрuорuтета используется только в случае oд HOBpeMeHHoro возникновения нескольких исключений с одинаковыми значения ми уровня приоритета rруппы. При этом исключение с более высоким субприо ритетом (с меньшим значением уровня) будет обработано первым. Изза zруппuрованuя приоритетов максимальное число битов, которое может использоваться для задания приоритета rруппы, равно 7, что и даёт нам уже упо мянутые 128 уровней вложенности. При значении PRIGROUP = 7 все исключения с проrраммируемым уровнем приоритета будут иметь один и тот же уровень. В результате ни одно из этих исключений не сможет быть прервано никаким дpy rим исключением, кроме Hard Fault, NMI и Reset, которые имеют приоритеты 3, 2 и 1 соответственно. 
7.2. Приоритеты исключений . 131 Таблица 7.4. Реrистр управления прерываниями и сбросом AIRCR (ОхЕОООЕООС) Значение Биты Обозначение Тип после Описание сброса Ключ доступа; при записи в реrистр в этом поле 31:16 УЕСТКЕУ R/W должно быть записано значение Ox05FA, иначе  запись будет иrнорирована. При чтении реrистра в данном поле возвращается значение OxFA50 Отображает формат хранения данных: 1  обратный порядок байтов (BE8), 15 ENDIANNESS R  О  прямой порядок байтов; этот бит может быть изменён только в момент сброса 10:8 PRIGROUP R/W О Установки rруппирования приоритетов 2 SYSRESETREQ W  Формирует запрос на rенерацию сиrнала сброса Очищает всю активную информацию о состоянии исключений; обычно используется при отладке 1 VECTCLRACTIVE W  или операционной системой для восстановления после системной ошибки (сброс является более безопасным методом) Сбрасывает процессор CortexM3 О VECTRESET W (за исключением компонентов отладки), однако  не сбрасывает блоки, внешние по отношению к процессору Таблица 7.5. Поля приоритета rруппы и субприоритета в реrистрах приоритета Значение Поле приоритета rруппы Полесубприоритета PRIGROUP О Биты [7:1] Бит [О] 1 Биты [7:2] Биты [1:0] 2 Биты [7:3] Биты [2:0] 3 Биты [7:4] Биты [3:0] 4 Биты [7:5] Биты [4:0] 5 Биты [7:6] Биты [5:0] 6 Бит [7] Биты [6:0] 7 Отсутствует Биты [7:0] При выборе необходимых значений уровня приоритета rруппы и уровня суб приоритета необходимо учитывать следующее: . разрядность реrистров приоритета; . параметры rруппирования приоритетов (значение PRIGROUP). Так, если разрядность реrистров приоритета равна 3 (доступны биты 7...5), а в поле PRIGROUP будет записано 5, то в вашем распоряжении окажется 4 ypOB ня приоритета rруппы (биты 7.. .6), в каждом из которых будет по два уровня суб приоритета (бит 5). Уровни приоритета, доступные при такой конфиrурации реrистров приори тет а (Рис. 7.4), показаны на Рис. 7.5. Если же в поле PRIGROUP записать ОхОl, то в нашем распоряжении окажется Bcero 8 уровней приоритета rруппы и ни OДHO 
132 . [лава 7. Исключения ro уровня субприоритета (биты 1:0 реrистра, используемые для задания субпри оритета, всеrда равны О). Формат реrистров приоритета для такой конфиrурации показан на Рис. 7.6, а возможные уровни приоритета  на Рис. 7.7. Бит7 Бит6 Бит 5 Приоритет rруппы Субприо ритет Рис. 7.4. Определение полей в 3битном pezucтpe приоритета при PRIGROUP = 5. Наивысший приоритет з 2 1 Ох20 Реализованные уровни при использовании 3 бит для задания приоритета )( )( )( )( Уровни приоритета rруппы при PRIGROUP = 5 )( з )( 2 )( 1  )( О з 2 Уровни субприоритета 1 О O- Ох20 )( )( )( Ох20 Ох40 )( Ох40 )( Ох40  )( Ох40 Ох60 )( Ох60 )( Ох60 Проrрамми руемые Ох80 исключения )( Ох80 )( Ох80  )( Ох80 ОхАО )( ОхАО )( ОхАО ОхСО ОхЕО OxFF )( )( ОхСО  ОхЕО )( ОхСО ОхСО )( )( ОхЕО Наименьший приоритет Рис. 7.5. Возможные уровни приоритета при 3битном pezucтpe приоритета и PRIGROUP = 5. Бит7 Бит6 Бит5 Приоритет rруппы [5:3] Рис. 7.6. Определение полей в 3битном pezucтpe приоритета при PRIGROUP = 1. 
7.2. Приоритеты исключений · 133 Реализованные уровни Наивысший при использовании Уровни приоритета приоритет 3 бит для задания rруппы при приоритета PRIGROUP = 1 з >( з >( з 2 >( 2 >( 2 Уровни субприоритета 1 >( 1 >( 1 ............ >( ...................................... >( ................ .  >( О О О Ох20 >( Ох20 >( Ох20 . >( Ох20 Ох80 >( Ох40 >( Ох40 . >( Ох40 Ох40 Ох60 >( Ох60 >( Ох60 . >( Ох60 >( Ох80 >( Ох80 . >( Ох80 ОхАО >( ОхАО >( ОхАО . >( ОхАО ОхСО >( ОхСО >( ОхСО . >( ОхСО ОхЕО >( ОхЕО >( ОхЕО . >( ОхЕО OxFF Наименьший приоритет Рис. 7.7. во3можныle уровни приоритета при 3битном pezucтpe приоритета и PRIGROUP = 1. Если в реrистрах приоритета устройства реализованы все 8 бит, то максималь ное число уровней вложенности, которое может быть использовано в этом устройстве, будет равно 128 (при PRIGROUP = О). Формат реrистров приоритетов для данноrо случая приведён на Рис. 7.8. Бит7 Бит6 Бит5 Бит4 Бит 3 Бит2 Бит 1 БитО Приоритет rруппы Субприоритет Рис. 7.8. Определение полей в 8бuтном pezucтpe приорuтета при PRIGROUP = о. При одновременном появлении двух прерываний, имеющих одинаковые зна чения как уровня приоритета rруппы, так и уровня субприоритета, более BЫCO 
134 . [лава 7. Исключения кий приоритет будет иметь прерывание с меньшим порядковым номером (IRQ #0 имеет более высокий приоритет, нежели IRQ #1). Чтобы не сбить случайно настройки rруппирования приоритетов прерыва ний, соблюдайте осторожность при записи в реrистр AIRCR. В большинстве слу чаев после настройки rруппирования приоритетов TporaTb этот реrистр нет ни какой необходимости, кроме как для rенерации сброса (см. Табл. 7.4). 7.3. Таблица векторов При возникновении исключения процессору необходимо определить началь ный адрес обработчика этоrо исключения. Данная информация хранится в Ta блице векторов, расположенной в памяти процессора. По умолчанию таблица векторов располаrается, начиная с нулевоrо адреса, а адрес каждоrо вектора в указанной таблице равен порядковому номеру исключения, умноженному на 4 (Табл. 7.6). Таблица 7.6. Таблица векторов исключений после включения питания Адрес Номер исключения Значение (32битное) ОхОООООООО  Начальное значение MSP ОхОООООО04 1 Вектор сброса (начальное значение счётчика команд) ОхОООООО08 2 Стартовый адрес обработчика NMI ОхОООООООС 3 Стартовый адрес обработчика исключения Hard Fault .. . .. . Стартовые адреса остальных обработчиков Поскольку адрес ОхОО должен находиться в области заrрузочноrо кода, он, как правило, соответствует флэшпамяти или ПЗУ, и ero содержимое не может изме няться во время выполнения проrраммы. Однако таблица векторов может быть перемещена по друrому адресу в области кода или в области ОЗ В последнем случае мы получим возможность изменять обработчики исключений в процессе выполнения проrраммы. Положение таблицы векторов в памяти определяется реrистром смещения таблицы векторов VTOR контроллера NVIC, который pac положен по адресу OxEOOOED08. Величина смещения должна быть выровнена на размер таблицы векторов и приведена к ближайшему большему значению, явля ющемуся степенью двойки. Например, если в процессоре используется 32 входа прерываний, то общее число исключений с учётом системных будет равно 32 + 16 = 48. Приводя это значение к значению, являющемуся степенью двойки, получаем число 64. Умножая результат на 4 (4 байта на вектор), получаем 256 (OxlOO). Таким образом, величина смещения таблицы векторов может быть равна ОхОО, Охl00, Ох200 и т.д. Описание полей реrистра VTOR приведено в Табл. 7.7. Таблица 7.7. Реrистр смещения таблицы векторов VTOR (ОхЕОООЕОО8) Биты Обозначение Тип Значение после Описание сброса 29 TBLBASE R/W О Таблица расположена в области кода (О) или в области ОЗУ (1) 28:7 TBLOFF R/W О Смещение таблицы относительно начала области кода или области ОЗУ 
7.4. Входы прерЫ8анuй u отложенная обработка прерЫ8анuй · 135 Если вы хотите динамически менять обработчики исключений, то в начале секции заrрузчика должны располаrаться, как минимум, следующие элементы: . начальное значение OCHOBHoro указателя стека; . вектор сброса; . вектор NMI; . вектор исключения Hard Fault. Это требование связано с тем, что немаскируемое прерывание, как и исключе ние Hard Fault, может произойти при выполнении кода заrрузчика. Остальные исключения не cMorYT возникнуть до тех пор, пока не будут разрешены. После завершения процесса заrрузки вы можете выделить часть области ОЗУ под таблицу векторов и переместить таблицу на новое место. 7.4. Входы прерываний и отложенная обработка прерываний В этом разделе описывается поведение входов IRQ и отложенная обработка прерываний. Всё, сказанное в данном разделе, справедливо и для входа NMI, за исключением Toro, что обработка немаскируемоrо прерывания, как правило, за пускается сразу же после ero возникновения. Откладывание немаскируемоrо прерывания происходит только в следующих случаях: . процессор уже выполняет обработчик NMI; . процессор находится в состоянии останова, вызванноrо командой отладчика; . процессор находится в состоянии блокировки изза какоrолибо серьёзноrо системноrо сбоя. При активации входа прерывания это прерывание откладывается, что озна чает перевод прерывания в состояние ожидания обработки запроса процессо ром. Даже если источник снимет запрос прерывания, наличие TaKoro состояния обеспечит последующий запуск обработчика этоrо прерывания в соответствии с заданным приоритетом. После запуска обработчика признак отложенноrо пре рывания снимается автоматически. Данный процесс показан на Рис. 7.9. Запрос прерывания  \ Признак I отложенноrо прерывания I ! / Режим обработчика Режим работы процессора Режим потока Рис. 7.9. Отложенная обработка прерыванuя. Если же признак отложенноrо прерывания окажется сброшен до Toro, как процессор при ступит к обработке этоrо прерывания (например, прерывание не было обслужено сразу после ero возникновения изза установленноrо реrистра PRIMASK/FAULTMASK, а признак отложенноrо прерывания был сброшен про rpaMMHo записью в реrистр управления прерыванием контроллера NVIC), то 
136 · fлава 7. Исключения прерывание будет аннулировано (Рис. 7.10). Признак отложенноrо прерывания хранится в реrистрах контроллера NVIC и доступен для записи, т.е. вы можете проrраммно как сбросить отложенное прерывание, так и перевести новое преры вание в состояние ожидания обработки. Запрос прерывания  I Признак отложенноrо прерывания  Признак отложенноro прерывания сброшен nporpaMMHO Режим работы Режим процессора потока Рис. 7.10. Сброс признака отложенноzо прерывания до начала обработки этоzо прерыlания.. Коrда процессор приступает к обработке прерывания, оно становится актив ным и признак отложенноrо прерывания автоматически сбрасывается (Рис. 7.11). После Toro как прерывание станет активным, вы не сможете повторно запустить обработчик этоrо же прерывания до тех пор, пока процедура обработки преры вания не будет завершена командой возврата из прерывания (также называемой выходом из исключения, см. [лаву 9). После выполнения данной команды признак активности прерывания сбрасывается, и прерывание может быть обработано по вторно, если бит признака отложенноrо прерывания установлен в 1. Прерывание можно повторно перевести в состояние ожидания непосредственно перед BЫXO дОМ из процедуры обработки. Запрос прерывания  Признак \ отложенноrо прерывания Признак активноrо прерывания Режим работы n роцессора Запрос прерывания r сброшен nporpaMMHO Режим потока Режим обработчика Возврат из прерывания Рис. 7.11. Перевод прерывания в активное состояние. Если источник прерывания продолжает удерживать сиrнал запроса прерыва ния в активном состоянии, то в конце процедуры обработки прерывание будет отложено повторно, как показано на Рис. 7.12. Именно так ведёт себя классиче ский процессор ARM7TDMI. Мноrократная установка и снятие запроса прерывания до момента начала ero обработки интерпретируется процессором как единственный запрос прерыва ния (Рис. 7.13). Если запрос прерывания будет снят и на короткое время yCTaHOB 
7.4. Входы прерЫ8анuй u отложенная обработка прерЫ8анuй · 137 лен во время выполнения обработчика прерывания, то прерывание будет снова отложено, как показано на Рис. 7.14. Запрос прерывания  \ Признак отложенноrо прерывания Признак активноrо прерывания Режим работы Режим процессора потока Запрос прерывания оааётся активным Возврат из прерывания Режим обработчика Повторный вход в прерывание Рис. 7.12. Удерживание запроса прерыlания.. Запрос прерывания Признак отложенноrо прерывания Признак активноrо прерывания Режим работы процессора Мноrократная уаановка/ снятие запроса прерывания перед входом в обработчик Режим обработчика Режим потока Рис. 7.13. Мноzократная установка и снятие запроса прерывания. Запрос прерывания  \ Признак П отложенноrо прерывания Режим работы Режим процессора потока Признак активноrо прерывания Повторная уаановка/снятие запросапрерывания П Повторное откладывание прерыван ия I I u Режим обработчикёt 80звратиз прерывания Повторный вход в прерывание Рис. 7.14. Повторная установка запроса прерывания ВО время выполнения обработчика. 
138 · fлава 7. Исключения Прерывание откладывается даже в том случае, если оно запрещено; при по следующем разрешении данноrо прерывания оно будет обработано. Поэтому, прежде чем разрешить какоелибо прерывание, никоrда не помешает убедиться в том, что оно не находится в состоянии ожидания (источник указанноrо преры вания Mor ранее выставить запрос и установить признак отложенноrо прерыва ния). При необходимости вы можете перед разрешением прерывания сбросить этот признак. 7.5. Исключения отказов Некоторые системные исключения предназначены для обработки отказов. Процессор CortexM3 различает следующие виды отказов: . отказы шины (Bus Fault); · отказы системы управления памятью (MemManage Fault); . отказы проrраммы (Usage Fault); . тяжёлые отказы (Hard Fault). 7.5.1. Отказы шины Отказы шины возникают при получении сиrнала ошибки во время обмена по шине АНВ. Это может произойти в следующие моменты: . во время предварительной выборки команды  такой отказ называется oтKa зом предвыборки (prefetch abort); . во время обращения к данным  такой отказ называется отказом данных (data abort). Также отказ шины может возникнуть во время следующих операций: . при сохранении данных в стеке в начале обработки прерывания  такой OT каз называется ошибкой заzрузки в стек (stacking error); . при извлечении данных из стека в конце обработки прерывания  такой OT каз называется ошибкой извлечения из стека (unstacking error); . при чтении адреса вектора прерывания (выборке вектора) во время запуска ядром процесса обработки прерывания (эта особая ситуация классифициру ется как тяжёлый отказ). При возникновении любоrо из этих отказов (за исключением ошибки при BЫ борке вектора) будет запущен обработчик исключения Bus Fault, при условии, что он разрешён и на момент возникновения отказа не выполнялась обработка дpy rих исключений с таким же или более высоким приоритетом. Если обработчик разрешён, но на момент возникновения отказа процессор был занят обработкой исключения с более высоким приоритетом, то исключение Bus Fault будет отло жено. И наконец, если обработчик исключения Bus Fault не разрешён или же если это исключение возникло во время обработки друrоrо исключения с таким же или более высоким приоритетом, то будет запущен обработчик исключения Hard Fault. Если же отказ шины возникнет во время выполнения обработчика Hard Fault, то процессорное ядро перейдёт в состояние блокировки!). 1) Более подробно состояние блокировки рассматривается в [лаве 12. 
7. 5. Исключения отказов . 139 Для разрешения обработчика исключения Bus Fault следует установить бит BUSFAULTENA реrистра управления и состояния системных обработчиков SHCSR контроллера NVIC. Если таблица векторов была перемещена в ОЗУ, то пе ред установкой бита необходимо убедиться, что начальный адрес обработчика исключения присутствует в таблице. Как же нам определить причину, по которой процессору пришлось запустить обработчик исключения Bus Fault? Для этоrо в контроллере NVIC предусмотрено несколько реrистров состояния отказов (xFSR), одним из которых является pe rистр состояния отказа шины BFSR. С помощью указанноrо реrистра обработчик исключения Bus Fault может определить, что послужило причиной возникнове ния отказа: выборка команды, обращение к данным или же прерывание опера ции заrрузки в стек/извлечения из стека. В случае «точноrо» отказа шины адрес команды, вызвавшей ошибку, может быть определён из значения, сохранённоrо в стеке счётчика команд. Если при этом установлен бит BFARVALID реrистра BFSR, то дополнительно можно будет определить адрес памяти, обращение к которому вызвало отказ шины. Значение данноrо адреса содержится в реrистре адреса отказа шины BFAR контроллера NVIC. ДЛЯ «неточных» отказов шины подобная информация недоступна, по скольку на момент получения сообщения об ошибке процессор Mor уже выпол нить несколько друrих команд. Реrистр BFSR (Табл. 7.8) является 8битным реrистром, расположенным по адресу OxEOOOED29. Также к этому реrистру можно обратиться посредством 32битной пересылки по адресу OxEOOOED28 (реrистр будет расположен во BTO 
140 . fлава 7. Исключения ром байте слова). Сброс любоrо бита, используемоrо для индикации ошибки, осуществляется записью в Hero 1. Таблица 7.8. Реrистр состояния отказа шины BFSR (OxEOOOED29) Биты Обозначение Тип Значение после Описание сброса 7 BFARVALID  О Индицирует корректность содержимоrо реrистра BFAR 6:5     4 STKERR R/Wc О Ошибка заrрузки в стек 3 UNSTKERR R/Wc О Ошибка извлечения из стека 2 IMPRECISERR R/Wc О «Неточное» нарушение доступа к данным 1 PRECISERR R/Wc О «Точное» нарушение доступа к данным О IBUSERR R/Wc О Нарушение доступа к команде 7.5.2. Отказы системы управпения памятью Отказы системы управления памятью MorYT быть вызваны обращением к па мяти, конфликтующим с настройкам модуля MPU, или же некорректным обра щением (например, при попытке выполнить код из области памяти, не имеющей такой возможности), которое может rенерировать отказ даже в случае OTCYT ствия модуля MPU. Наиболее частыми отказами, связанными с модулем MPU, являются: . обращение к областям памяти, не заданным в настройках модуля MPU; . запись в области памяти, предназначенные только для чтения; . обращение на пользовательском уровне к области, допускающей обращение только на привилеrированном уровне. При возникновении любой из этих ситуаций будет запущен обработчик ис ключения MemManage Fault, при условии, что он разрешён. Если отказ системы управления памятью произойдёт одновременно с возникновением исключения, имеющеrо более высокий приоритет, то это исключение будет обработано пер вым, а исключение MemManage Fault будет отложено. Наконец, если обработчик исключения MemManage Fault не разрешён или же если это исключение возник ло во время обработки друrоrо исключения с таким же или более высоким прио ритетом, то будет запущен обработчик исключения Hard Fault. Если же отказ си стемы управления памятью возникнет во время выполнения обработчика Hard Fault, то процессорное ядро перейдёт в состояние блокировки. Перед использованием обработчика исключения MemManage Fault ero необ ходимо разрешить. Для этоrо нужно установить бит MEMFAULTENA реrистра SHCSR контроллера NVIC. Если таблица векторов была перемещена в ОЗУ, то пе ред разрешением обработчика необходимо прописать ero начальный адрес в Ta блице. Для определения причины возникновения отказа системы управления па мятью в контроллере NVIC имеется соответствующий реrистр состояния отказа MMFSR. Если этот реrистр показывает, что отказ произошёл при нарушении прав доступа во время обращения к данным (бит DACCVIOL) или к команде (бит 
7.5. Исключения отказов . 141 IACCVIOL), то адрес команды, вызвавшей ошибку, может быть определён из зна чения счётчика команд, сохранённоrо в стеке. Если при этом установлен бит MMARV ALID реrистра MMFSR, то из реrистра адреса отказа системы управле ния памятью MMFAR контроллера NVIC можно будет прочитать адрес памяти, обращение к которому вызвало отказ. Реrистр MMFSR (Табл. 7.9) является 8битным реrистром, расположенным по адресу OxEOOOED28. Также к данному реrистру можно обратиться посредством 32битной пересылки по тому же адресу; в этом случае реrистр будет расположен в младшем байте слова. Как и во всех реrистрах xFSR, сброс любоrо бита, исполь зуемоrо для индикации ошибки, осуществляется записью в Hero 1. Таблица 7.9. Реrистр состояния отказа системы управления памятью MMFSR (ОхЕОООЕО28) Биты Обозначение Тип Значение после Описание сброса 7 MMARV ALID  О Индицирует корректность содержимоrо реrистра MMAR 6:5     4 MSTKERR R/Wc О Ошибка заrрузки в стек 3 MUNSTKERR R/Wc О Ошибка извлечения из стека 2     1 DACCVIOL R/Wc О Нарушение доступа к данным О IACCVIOL R/Wc О Нарушение доступа к команде 7.5.3. Отказы nporpaMMbI Отказы проrраммы MorYT быть вызваны следующими причинами: . вызов неопределённой команды; . вызов команды сопроцессора (в процессоре CortexM3 поддержка сопроцес сора отсутствует; однако, используя механизм исключений, можно обеспе чить выполнение проrраммы, скомпилированной для друrоrо процессора Cortex, посредством проrраммной эмуляции сопроцессора); . попытка переключения в состояние ARM (проrрамма может использовать данный механизм для проверки, поддерживает ли выполняющий её процес сор код ARM; поскольку CortexM3 не поддерживает состояние ARM, то при попытке переключения в это состояние произойдёт отказ проrраммы); . некорректный выход из прерывания (реrистр связи содержит неверное или некорректное значение); . обращение к невыровненным данным в командах rрупповой заrрузки или co хранения. Установкой определённых битов в реrистрах контроллера NVIC можно обе спечить rенерацию отказа проrраммы также в следующих ситуациях: . при делении на ноль; . при любом невыровненном доступе к памяти. В случае возникновения отказа проrраммы будет запущен обработчик исклю чения Usage Fault, при условии, что он разрешён. Если отказ проrраммы произой 
142 . Тлава 7. Исключения дёт одновременно с возникновением исключения, имеющеrо более высокий при оритет, то исключение Usage Fault будет отложено. Наконец, если обработчик ис ключения Usage Fault не разрешён или же если это исключение возникло во Bpe мя обработки друrоrо исключения с таким же или более высоким приоритетом, то будет запущен обработчик исключения Hard Fault. Если же отказ проrраммы возникнет во время выполнения обработчика Hard Fault или обработчика NMI, то процессор перейдёт в состояние блокировки. Разрешение обработчика исключения Usage Fault осуществляется установкой бита USGFAULTENA реrистра SHCSR контроллера NVIC. Если таблица векторов была перемещена в ОЗУ, то перед разрешением обработчика необходимо поме стить в таблицу ero начальный адрес. Для определения причины возникновения отказа в контроллере NVIC преду смотрен соответствующий реrистр состояния отказа проrраммы UFSR. В самом обработчике адрес команды, вызвавшей отказ, можно определить из значения счётчика команд, сохранённоrо в стеке. Реrистр UFSR (Табл. 7.10) занимает 2 байта в памяти и обратиться к нему МОЖ но посредством 16битной пересылки по адресу OxEOOOED2A или 32битной пере сылки по адресу OxEOOOED28. В последнем случае значение реrистра будет coдep жаться в старшем полуслове. Как и в остальных реrистрах xFSR, сброс любоrо би та, используемоrо для индикации ошибки, осуществляется записью в этот бит 1. Таблица 7.10. Реrистр состояния отказа проrраммы UFSR (OxEOOOED2A) Значение Биты Обозначение Тип после Описание сброса Попытка выполнения операции деления на ноль 9 DIVBYZERO R/Wc О (может быть установлен только при установленном бите DIVOTRP) 8 UNALIGNED R/Wc О Отказ HeBbIpoBHeHHoro доступа 7:4     3 NOCP R/Wc О Попытка выполнения команды сопроцессора 2 INVPC R/Wc О Попытка выхода из обработчика исключения с некорректным значением EXCRETURN 
7.5. Исключения отказов · 143 Таблица 7.10. Реrистр состояния отказа nporpaMMbI UFSR (ОхЕОООЕО2А) (продолжение) Значение Биты Обозначение Тип после Описание сброса 1 INVSTATE R/Wc О Попытка переключения в некорректное состояние (например) в состояние ARM) О UNDEFINSTR R/Wc О Попытка выполнения неопределённой команды 7.5.4. Тяжёпые отказы Исключение Hard Fault может быть вызвано отказом проrраммы, отказом ши ны или отказом системы управления памятью в том случае, если выполнение об работчиков указанных системных исключений невозможно. Также тяжёлый OT каз может быть вызван отказом шины во время выборки вектора (чтения значе ния из таблицы векторов). Реrистр состояния тяжёлоrо отказа HFSR контроллера NVIC позволяет определить, был ли вызван данный отказ выборкой вектора. Ec ли нет, то обработчик исключения Hard Fault должен будет проверить содержи мое друrих реrистров xFSR для определения причины возникновения отказа. Биты реrистра HFSR указаны в Табл. 7.11. Как и в прочих реrистрах xFSR, сброс любоrо бита, используемоrо для индикации ошибки, осуществляется за писью в Hero 1. Таблица 7.11. Реrистр состояния тяжёлоrо отказа HFSR (ОхЕОООЕО2С) Значение Биты Обозначение Тип после Описание сброса 31 DEBUGEVT R/Wc О Исключение Hard Fault было вызвано отладочным событием Исключение Hard Fault было вызвано отказом шины) 30 FORCED R/Wc О отказом системы управления памятью или отказом проrраммы 29:2     1 VECTBL R/Wc О Исключение Hard Fault было вызвано ошибкой выборки вектора О     7.5.5. Обработка отказов Если ошибка в проrрамме выявляется на этапе разработки, то мы можем опре делить причину возникновения данной ошибки, используя реrистры xFSR, после чеrо исправить её. Наиболее распространённые причины возникновения раз личных отказов указаны в Приложении Д настоящей книrи. В реальной работа ющей системе ситуация несколько иная. После определения причины отказа проrрамма должна решить, что делать дальше. Если система работает под управ.. лением ОС, то проблемные задачи и приложения MorYT просто останавливаться .1. 
144 . fлава 7. Исключения (выrружаться из памяти). В друrих случаях может потребоваться сброс системы. Вообще rоворя, требования, касающиеся восстановления после сбоев, определя ются конкретным приложением. При правильной реализации этой функции из делие можно сделать более надёжным, однако лучшим выходом всё же будет пре дотвращение самой возможности возникновения отказов. Итак, существуют сле дующие методы восстановления после сбоев: · Сброс. Эту операцию можно выполнить, используя бит SYSRESETREQ реrи стра управления прерываниями и сбросом ЛIRС контроллера NVIC. В резуль тате установки указанноrо бита в 1 будет сброшено большинство узлов систе мы, за исключением компонентов отладки. Если вам не требуется сбрасывать всю систему, то вы можете сбросить только процессор, используя бит VECTERSET Toro же реrистра. · Восстановление. В ряде случаев проблему, вызвавшую исключение отказа, можно разрешить. Скажем, если причиной отказов являются команды сопро цессора, то проблему можно устранить, проrраммно эмулируя эти команды. · Завершение задачи. В системах, использующих ОС, возможно завершение и, при необходимости, повторный запуск задачи, вызвавшей отказ. Содержимое реrистров xFSR сохраняется до тех пор, пока они не будут очище ны проrраммно. После обработки любоrо бита состояния отказа обработчик ис ключения должен ero сбросить. Если этоrо не сделать, то при повторном вызове обработчика в случае возникновения друrоrо отказа он может сделать непра вильный вывод о наличии первоrо отказа и, соответственно, попытается обрабо тать ero повторно. В реrистрах xFSR используется механизм «сброс посредством записи» (writetoclear), при котором сброс бита осуществляется записью в Hero 1. Разработчики микроконтроллеров также MorYT включать в свои изделия допол нительный реrистр состояния отказов AFSR, предназначенный для индикации прочих отказов. Реализация TaKoro реrистра определяется конструктивными особенностями KOHKpeTHoro микроконтроллера. 7.6. Вызов супервизора и системных служб Исключения вызова супервизора (SVCall) и вызова системной службы (PendSV) предназначены для использования системным проrраммным обеспече нием, а также операционными системами. Исключение SVCall при меняется для rенерации вызовов системных функций. Например, вместо Toro, чтобы позво лить пользовательской проrрамме напрямую обращаться к оборудованию, опе рационная система может предоставлять доступ к оборудованию посредством исключения SVCall. То есть, если пользовательской проrрамме необходимо за действовать некое оборудование, то она, используя команду SVC, rенерирует ис ключение SVCall, в результате чеrо запускается обработчик данноrо исключения из состава операционной системы, который и обслуживает запрос пользователь cKoro приложения. В этом случае обращение к аппаратуре находится под управ лением ОС, что увеличивает надёжность системы, предотвращая некорректный доступ пользовательскоrо ПО к оборудованию. 
7.6. Вызов супервизора и системных служб · 145 Исключение SVCall также позволяет сделать проrраммное обеспечение более переносимым, поскольку пользовательской проrрамме не требуется досконально знать, каким образом осуществляется работа с оборудованием. Она должна «знать» только идентификатор АРIфункции и её параметры; собственно взаимо действие с оборудованием на аппаратном уровне осуществляется драйверами устройств (Рис. 7.15). Привилеrированный код Непривилеrи рованный код Ядро ос Аппаратные средства Проrрамма пользователя Периферия Операционная система Рис. 7.15. Исключение SVCall как шлюз для функций ОС. Как уже rоворилось, rенерация исключения SVCall осуществляется вызовом команды svc. Данная команда требует параметра в виде константы, посредством которой осуществляется передача информации в обработчик исключения. Обра ботчик может извлечь это значение и определить требуемое действие. Например: svc #ОхЗ ; Вызов SVСФУНКЦИИ С 10 = З Можно использовать и традиционный синтаксис указанной команды (без символа «#»): SVC ОхЗ ; Вызов SVСФУНКЦИИ С 10 = 3 В проrраммах на языке Си вызов команды SVC можно сrенерировать, исполь зуя встроенную функцию   svc (при работе в среде RVDS компании ARM или MDKARM компании КеН) или же встроенный ассемблер (при работе с друrими компиляторами). В обработчике исключения SVCall вы можете определить значение, передан ное в команде. Для этоrо следует прочитать из стека сохранённое значение счёт чика команд, после чеrо считать код команды по данному адресу, маскируя He нужные биты. Если в системе для пользовательских приложений используется указатель PSP, то вначале вам может потребоваться определить, в каком из стеков был сохранён счётчик команд. Это можно узнать из значения, находящеrося в pe rистре связи, при входе в обработчик исключения (более подробно данный BO прос рассматривается в fлаве 8). 
146 . fлава 7. Исключения Изза приоритетной модели прерываний, реализованной в процессоре CortexM3, вы не можете использовать команду SVC внутри обработчика исклю чения SVCall (поскольку приоритет HOBoro исключения будет таким же, что и у выполняющеrося в данный момент). Если попытаться так сделать, то будет сrенерировано исключение Usage Fault. По этой же причине нельзя использовать команду SVC в обработчике NMI или в обработчике исключения Hard Fault. Исключение PendSV, как и исключение SVCall, предназначено для использова ния в ОС. Однако в то время как исключение SVCall, вызванное командой SVC, не может быть отложено (приложение, вызвавшее SVC, будет ожидать немедленноrо выполнения требуемой задачи), исключение PendSV может быть отложено. Это позволяет операционной системе отложить выполнение требуемых операций до Toro момента, коrда будут завершены друrие важные задачи. Исключение PendSV rенерируется записью 1 в бит PENDSVSET реrистра ICSR контроллера прерыва ний. Типичным использованием исключения PendSV является переключенuе KOH текста (переключение между задачами). Пусть, к примеру, система имеет две aK тивных задачи, переключение между которыми может быть инициировано: · вызовом функции SVC; · системным таймером (SYSTICK) . Рассмотрим вариант переключения контекста по сиrналу системноrо таймера (Рис. 7.16). Приоритет Переключение Переключение Переключение контекаа контекаа контекаа SYSTICK Щ 'oc 'oc I I I I I I I I I I I I I I I IRQ I I I I I I I I I I I I I I I I I I I I I Режим t I t I t I , Задача Д ) Задача В ) Задача Д ) потока Время Рис. 7.16. Использование SYSTICK для переключения между двумя задачами. Если запрос прерывания будет выставлен до возникновения исключения SYSTICK, то последнее вытеснит обработчик IRQ. При этом операционной систе ме уже не нужно будет переключать контекст, иначе обработка прерывания будет приостановлена на некоторое время. В процессоре CortexM3 также предусмо трена возможность rенерации исключения Usage Fault при попытке переключе ния в режим потока при наличии активноrо прерывания (Рис. 7.17). Чтобы исключить задержки при обработке запросов IRQ, некоторые ОС BЫ полняют переключение контекста только в том случае, если ни один из обработ чиков IRQ не выполняется. Однако это может привести к появлению очень боль ших задержек между переключениями задач, особенно если частота появления прерываний близка к частоте rенерации исключения SYSTICK. 
7.6. Вызов супервизора и системных служб · 147 Исключение Usage Fault: возврат в режим потока при наличии активноrо прерывания Приоритет Переключение контекаа  I I I I IRQ I I I I I I I t Задача д) 'с Переключение контекаа Щ I I I I I I I Задача В ) I I  Задача Д ) SYSTICK IRQ Режим потока Время Пауза в обработке IRQ Рис. 7.17. Проблемы переключения контекста при возникновении IRQ. Исключение PendSV решает указанную проблему, приостанавливая обработ ку запроса на переключение контекста на время, необходимое для завершения всех обработчиков IRQ. Для этоrо исключению PendSV назначается минималь ный приоритет. Если ОС обнаруживает, что KaKoeTO прерывание находится в aK тивном состоянии (выполнение обработчика IRQ было прервано исключением SYSTICK), то она задерживает переключение контекста, откладывая исключение PendSV. В качестве примера на Рис. 7.18 показан процесс переключения KOHTeK ста в случае следующей последовательности событий: 1. Задача А выполняет команду SVC для переключения задач (например, ожидая завершения какоrолибо процесса). 2. ОС получает запрос, выполняет подrотовку к переключению контекста и rенерирует исключение PendSV. 3. После выхода из обработчика SVCall ЦПУ сразу же запускает обработчик исключения PendSV, в котором производится переключение контекста. 4. После завершения обработчика исключения PendSV и возврата в режим потока начинает выполняться задача В. 5. Возникает прерывание и запускается ero обработчик. 6. Во время обработки прерывания происходит исключение SYSTICK (тик ОС). 7. Операционная система выполняет необходимые действия, после чеrо откладывает исключение PendSV, rотовясь к переключению контекста. 8. При выходе из исключения SYSTICK управление передаётся обратно в обработчик прерывания. 9. После завершения процедуры обработки прерывания запускается обработчик исключения PendSV, в котором производится переключение контекста. 10. После завершения обработчика исключения PendSV и возврата в режим потока начинает выполняться задача А. 
148 · fлава 7. Исключения Приоритет SYSТlCK Преры вание SVСи PendSV Режим потока ), , [4] , ,  SYSTICK (ОС) [7]р, : \[8] 1[6] 'Продолжается Запускается 15R :  выпол ение 15R р 1[9] 15R завершена , , , , Переключение I [5] Возникло t конте)ст а в Репd5V : прерывание , , : \ [1 О] , , Задача В I  Задача Д j l ) SVC (ОС) Переключение откладывает контекаа PendSV [2] в PendSV [1] !  : [З] , Задача Д : Время Рис. 7.18. Переключение контекста с использованием исключения PeпdSV. 
rЛАВА 8 КОНТРОЛЛЕР вложЕнныx BEKTOPHblX прЕрыАнийй И УПРАВЛЕНИЕ прЕрыАниямии 8.1. Общие сведения о контроллере прерываний Контроллер вложенных векторных прерываний (Nested Vectored Interrupt Controller  NVIC) представляет собой один из компонентов процессора СоrtехТММ3, тесно связанный с лоrикой ядра процессора. Все реrистры контрол лера прерываний отображены на адресное пространство процессора. Помимо реrистров управления обработкой прерываний и соответствующих узлов, KOH троллер NVIC также содержит реrистры управления системным таймером SYSTICK и компонентами отладки. В этой rлаве мы познакомимся с узлами KOH троллера, осуществляющими поддержку обработки прерываний. Модуль защи ты памяти и узлы, выполняющие управление отладкой, обсуждаются в последу ющих rлавах. Контроллер NVIC поддерживает от 1 до 240 входов внешних прерываний, обычно называемых входами запросов прерываний (IRQ). Точное число поддержи ваемых прерываний определяется производителями конкретных микросхем на базе процессора CortexM3. Кроме Toro, в контроллере NVIC имеется вход HeMa скируемоrо прерывания (NonMaskable Interrupt  NMI). Каким образом он будет использоваться, тоже определяется производителем микросхемы. В некоторых устройствах данный вход может быть даже недоступен для внешних сиrналов. Реrистры контроллера NVIC расположены в пространстве управления систе мой, начиная с адреса ОхЕОООЕООО. Большинство реrистров управления и состоя ния прерываний доступны только в привилеrированном режиме, за исключени ем реrистра проrраммной rенерации прерывания STIR, который может быть сконфиrурирован для работы в пользовательском режиме. Для обращения к pe rистрам управления и состояния прерываний MorYT использоваться 1, 2 и 4байтные пересылки. С прерываниями также связаны несколько реrистров маскирования преры ваний. Эти реrистры относятся к rруппе реrистров специальноrо назначения и были рассмотрены в [лаве 3. Для обращения к указанным реrистрам предна значены специальные команды: пересылка содержимоrо реrистра специальноrо назначения в реrистр общеrо назначения (MRS) и пересылка содержимоrо реrи стра общеrо назначения в реrистр специальноrо назначения (MSR). 
150 . fлава 8. Контроллер вложенных векторных прерываний и управление прерываниями 8.2. Базовые средства конфиrурации v прерывании С каждым входом внешнеrо прерывания связаны несколько реrистров: . реrистры разрешения и отмены разрешения прерывания; . реrистры установки и сброса признака отложенноrо прерывания; . реrистр уровня приоритета прерывания; . реrистр активноrо состояния прерывания. Кроме Toro, на процесс обработки прерываний оказывают влияние и друrие реrистры: . реrистры маскирования прерываний (PRIMASK, FAULTMASK и BASEPRI); . реrистр смещения таблицы векторов (VTOR); . реrистр проrраммной rенерации прерывания (STIR); . реrистр управления прерываниями и сбросом (AIRCR). 8.2.1. Разрешение и запрещение прерываний Реrистр разрешения прерывания проrраммируется по двум адресам. Для установки бита разрешения прерывания необходимо выполнить запись по aдpe су реrистра NVICISER, а для сброса этоrо же бита  по адресу реrистра NVICICER. Блаrодаря такому решению разрешение или запрещение KOHKpeTHO ro прерывания не влияет на состояние битов разрешения остальных прерыва ний. Реrистры NVICISER/NVICICER являются 32битными; каждый бит реrи стра соответствует одному входу прерывания. Поскольку в процессоре CortexM3 может быть больше 32 внешних прерыва ний, он может иметь несколько реrистров NVICISER и NVICICER, например NVICISERO, NVICISERl и т.д. (Табл. 8.1). Причём, в реrистрах реализуются би ты разрешения только для существующих прерываний. Соответственно, если у вас Bcero 32 входа прерываний, то вам будут доступны только реrистры NVICISERO и NVICICERO. ДЛЯ обращения к этим реrистрам можно использо вать 1, 2 и 4байтные пересылки. Поскольку первые 16 исключений являются системными, внешнему прерыванию NQO соответствует исключение с номером 16 (Табл. 8.2). 
8.2. Базовые средства конфuzурацuu nрерыванuй · 151 Таблица 8.1. Реrистры разреmения прерываний NVICISERx (ОхЕОООЕI00...0хЕОООЕIIС) и реrистры отмены разреmения прерываний NVICICERx (ОхЕОООЕ180.. .ОхЕОООЕ19С) Значение Адрес Реrистр Тип после Описание сброса Разрешает внешние прерывания с номерами от О до 31: бит [О]  прерывание N20 (исключение N 2 16); бит [1]  прерывание N21 (исключение N 2 17); ОхЕОООЕI00 NVICISERO R/W О . . . бит [31]  прерывание N231 (исключение N 2 47). ДЛЯ установки бита в Hefo необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние Разрешает внешние прерывания с номерами от 32 до 63. ОхЕОООЕI04 NVICISERl R/W О Для установки бита в Hefo необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние Разрешает внешние прерывания с номерами от 64 до 95. ОхЕОООЕI08 NVICISER2 R/W О Для установки бита в Hefo необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние . . .     Отменяет разрешение внешних прерываний с номерами от О до 31: бит [О]  прерывание N20 (исключение N 2 16); бит [1]  прерывание N21 (исключение N 2 17); ОхЕОООЕ180 NVICICERO R/W О . . . бит [31]  прерывание N231 (исключение N 2 47). ДЛЯ сброса бита в Hefo необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние Отменяет разрешение внешних прерываний с номерами от 32 до 63. ОхЕОООЕ184 NVICICERl R/W О Для сброса бита в Hefo необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние Отменяет разрешение внешних прерываний с номерами от 64 до 95. ОхЕОООЕ188 NVICICER2 R/W О Для сброса бита в Hefo необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние     . . . 
152 . [лава 8. Контроллер вложенных векторных прерываний и управление прерываниями Таблица 8.2. Реrистры установки признака отложенноrо прерывания NVICISPRx (ОхЕОООЕ200...0хЕОООЕ21С) и реrистры сброса признака отложенноrо прерывания NVICICPRx (ОхЕОООЕ208.. .ОхЕОООЕ280) Адрес Реrистр Тип Значение Описание после сброса Устанавливает признак отложенноrо прерывания для внешних прерываний с номерами от О до 31: бит [О]  прерывание NQO (исключение N Q I6); ОхЕОООЕ200 NVICISPRO R/W О бит [1]  прерывание NQl (исключение N Q I7); . . . бит [31]  прерывание NQ31 (исключение N Q 47). ДЛЯ установки бита в Hero необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние Устанавливает признак отложенноrо прерывания для внешних прерываний ОхЕОООЕ204 NVICISPRl R/W О с номерами от 32 до 63. Для установки бита в Hero необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние Устанавливает признак отложенноrо прерывания для внешних прерываний ОхЕОООЕ208 NVICISPR2 R/W О с номерами от 64 до 95. Для установки бита в Hero необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние . . .     Сбрасывает признак отложенноrо прерывания для внешних прерываний с номерами от О до 31: бит [О]  прерывание NQO (исключение N Q I6); ОхЕОООЕ280 NVICICPRO R/W О бит [1]  прерывание NQl (исключение N Q I7); . . . бит [31]  прерывание NQ31 (исключение N Q 47). ДЛЯ сброса бита в Hero необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние Сбрасывает признак отложенноrо внешнеrо прерывания для внешних прерываний ОхЕОООЕ284 NVICICPRl R/W О с номерами от 32 до 63. Для сброса бита в Hero необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние Сбрасывает признак отложенноrо внешнеrо прерывания для внешних прерываний ОхЕОООЕ288 NVICICPR2 R/W О с номерами от 64 до 95. Для сброса бита в Hero необходимо записать 1; запись О не имеет смысла. При чтении возвращается текущее состояние . . .     
8.2. Базовые средства конфuzурацuu прерыванuй · 153 8.2.2. Установка/сброс признака отпоженноrо прерывания Если возникшее прерывание не может быть обработано немедленно (напри мер, изза выполнения обработчика прерывания с более высоким приоритетом), то оно будет отложено. Для работы с признаком отложенноrо прерывания пред назначены реrистры установки признака отложенноrо прерывания (NVICISPR) и реrистры сброса признака отложенноrо прерывания (NVICICPR). Аналоrич но реrистрам разрешения/запрещения прерываний, если в процессоре реализо вано более 32 входов внешних прерываний, то таких пар реrистров установки и сброса признака отложенноrо прерывания будет несколько. Значение признака отложенноrо прерывания может быть изменено про rpaMMHo, т.е. вы можете как аннулировать ожидающее своей очереди прерыва ние, используя реrистр NVICICPR, так и проrраммно сrенерировать прерыва ние посредством реrистра NVICISPR (см. Табл. 8.2). 8.2.3. Уровни приоритета Каждому внешнему прерыванию соответствует свой реrистр уровня приори тета, разрядность KOToporo в зависимости от конкретной реализации процессора может варьироваться от 3 до 8 бит. Как уже было сказано в предыдущей rлаве, co держимое этих реrистров может быть разделено на две части (уровень приорите та rруппы и уровень субприоритета) в соответствии с настройками rруппирова ния приоритетов. Для обращения к указанным реrистрам можно использовать 1, 2 и 4байтные пересылки. Общее число реrистров уровня приоритета зависит от количества прерываний, реализованных в конкретной микросхеме (Табл. 8.3). Адреса реrистров уровня приоритета для системных исключений приведены в Приложении r (Табл. [.19). Таблица 8.3. Реrистры уровня приоритета прерываний PRIx (ОхЕОООЕ400.. .OxEOOOE4EF) Адрес Реrистр Тип Значение после Описание сброса ОхЕОООЕ400 PRI О R/W О (8 бит) Уровень приоритета внешнеrо прерывания N20 OxEOOOE401 PRIl R/W О (8 бит) Уровень приоритета внешнеrо прерывания N21 . . .     OxEOOOE41F РRIЗl R/W О (8 бит) Уровень приоритета внешнеrо прерывания N2Зl . . .     8.2.4. Активное состояние Каждое внешнее прерывание имеет бит активноrо состояния. Коrда процес сор начинает выполнение обработчика прерывания, этот бит устанавливается в 1, а при выходе из прерывания он сбрасывается. Однако во время выполнения процедуры обработки прерывания может возникнуть прерывание с более BЫCO 
154 · fлава 8. Контроллер вложенных векторных прерываний и управление прерываниями ким приоритетом, которое приостановит выполнение этоrо обработчика. Во Bpe мя выполнения обработчика более высокоприоритетноrо прерывания первое прерывание будет продолжать считаться активным. Реrистры активноrо состоя ния являются 32битными, однако к ним также можно обращаться посредством 2 или 1 байтных пересылок. Если в конкретной реализации процессора имеется более 32 внешних прерываний, то таких реrистров будет несколько. Реrистры aK тивноrо состояния доступны только для чтения (Табл. 8.4). Таблица 8.4. Реrистры активноrо состояния прерывания NVICIABRx (ОхЕОООЕ300.. .ОхЕОООЕ31С) Адрес Реrистр Тип Значение Описание после сброса Признак активности внешних прерываний с номерами от О до 31: ОхЕОООЕ300 NVICIABRO R О бит [О]  прерывание NQO; бит [1]  прерывание N Q 1; . . . бит [31]  прерывание NQ31. ОхЕОООЕ204 NVICIABRl R О Признак активности внешних прерываний с номерами от 32 до 63 . . .     8.2.5. Реrистры PRIMASK и FAULTMASK Реrистр PRIMASK используется для запрещения всех исключений, кроме He маскируемоrо прерывания и исключения Hard Fault. В действительности, этот реrистр изменяет текущий уровень приоритета, делая ero равным нулю (наивыс ший проrраммируемый уровень). При проrраммировании на языке Си для YCTa новки и сброса реrистра PRIMASK можно использовать встроенные функции из состава СМSISсовместимой библиотеки драйвера устройства или же имеющие ся в компиляторе: void enableirq(); // Очистить PRIМASK void disableirq(); // Установить PRIМASK void sеtРRIМАSК(uiпtЗ2t priMask); // Записать значение в PRIМASK uiпtЗ2t getPRIМASK(void); // Прочитать значение PRIМASK В проrраммах на ассемблере текущее состояние реrистра PRIMASK можно из менить, используя команды изменения состояния процессора: CPSIE 1 ; Очистить PRIМASK (разрешить прерывания) CPSID 1 ; Установить PRIМASK (запретить прерывания) Для обращения к этому реrистру также можно использовать команды MRS и MSR. Например: MOV RO, #1 MSR PRIМASK, RO Записать 1 в PRIМASK дЛЯ запрещения всех прерываний и MOV RO, #0 MSR PRIМASK, RO Записать О в PRIМASK дЛЯ разрешения прерываний 
8.2. Базовые средства конфuzурацuu прерыванuй · 155 Реrистр PRIMASK полезен для BpeMeHHoro запрещения всех прерываний на время выполнения критических задач. При установленном реrистре PRIMASK любое исключение ошибки будет обрабатываться обработчиком Hard Fault. Реrистр FAULTMASK по своему назначению аналоrичен реrистру PRIMASK, за исключением Toro, что он изменяет текущий уровень приоритета на 1, т.е. блокируется даже исключение Hard Fault. Соответственно, при установленном реrистре FAULTMASK MorYT обрабатываться только немаскируемые прерыва ния. Обработчики исключений отказов MorYT использовать данный реrистр для увеличения cBoero уровня приоритета до значения  1, в результате чеrо они по лучают некоторые возможности обработчика исключения Hard Fault (более под робно этот вопрос рассматривается в [лаве 12). При проrраммировании на языке Си для установки и сброса реrистра FAULTMASK можно использовать функции СМSISсовместимой библиотеки: void set FAULTМASK(uint32 t faultMask);    uint32t getFAULTМASK(void); Те, кто использует язык ассемблера, MorYT изменять состояние реrистра FAULTMASK с помощью команд CPS: CPSIE F ; Очистить FAULTМASK CPSID F ; Установить FAULTМASK ДЛЯ обращения к реrистру FAULTMASK также можно использовать команды MRS и MSR. При выходе из обработчика исключения (кроме обработчика немаскируемоrо прерывания) реrистр FAULTMASK очищается автоматически. Ни FAULTMASK, ни PRIMASK не MorYT быть установлены на пользовательском уровне доступа. 8.2.6. Реrистр BASEPRI в некоторых случаях вам может потребоваться запретить только те прерыва ния, приоритет которых меньше HeKoToporo значения. Это можно сделать с по мощью реrистра BASEPRI  для получения требуемоrо результата достаточно просто записать необходимое значение уровня приоритета в данный реrистр. К примеру, если вы хотите заблокировать все исключения с уровнем приоритета не больше Ох60, то достаточно вставить в проrрамму следующие строки: sеtВАSЕРRI(ОхБО); // Запрещаем прерывания с приоритетом ОхБО...ОхFF, // используя функцию CMSIS Или, на языке ассемблера: MOV RO, #ОхБО MSR BASEPRI, RO ; Запрещаем прерывания с приоритетом ОхБО...ОхFF Вы также можете прочитать содержимое реrистра BASEPRI: х = getBASEPRI(void); // Читаем значение BASEPRI ТО же, на языке ассемблера: MRS RO, BASEPRI Чтобы отключить маскирование, просто 06нулите реrистр BASEPRI: setBASEPRI(OxO); // Отключаем маскирование BASEPRI 
156 · Тлава 8. Контроллер вложенных векторных прерываний и управление прерываниями То же на языке ассемблера: MOV RO, #ОхО MSR BASEPRI, RO ; Отключаем маскирование BASEPRI ДЛЯ обращения к реrистру BASEPRI можно также использовать идентифика тор BASEPRIMAX. В принципе, он обозначает тот же самый реrистр, однако при использовании этоrо имени операция записи становится условной. (Хотя имена BASEPRI и BASEPRIMAX относятся к одному реrистру, в машинном коде KO манды они кодируются разными значениями.) При обращении к реrистру BASEPRIMAX процессор автоматически сравнивает текущее значение приори тета с новым и разрешает изменение реrистра только в случае увеличения прио ритета; уменьшить приоритет таким образом невозможно. Например, рассмотрим следующий фраrмент: MOV RO, #ОхБО MSR BASEPRIМAX, RO MOV RO, #OxFO MSR BASEPRIМAX, RO Запрещаем прерывания с приоритетом ОхБО, Охбl, ... и т.д. Эта операция записи будет проиrнорирована, поскольку устанавливаемый приоритет меньше Ох60 MOV RO, #Ох40 MSR BASEPRIМAX, RO Эта операция записи будет выполнена, в результате чеrо уровень маскирования станет равным Ох40 Для изменения уровня приоритета на более низкий или для полноrо отключе ния маскирования при обращении к реrистру необходимо использовать имя BASEPRI. Изменение реrистра BASEPRI/BASEPRIMAX допускается только на привилеrированном уровне доступа. Формат реrистра BASEPRI зависит от разрядности реrистров приоритета. Так, если в реrистрах приоритета реализовано Bcero 3 бита, то реrистр BASEPRI MO жет содержать только следующие значения: ОхОО, Ох20, Ох40, ..., ОхСО, ОхЕО. 8.2.7. Конфиrурационные реrистры остальных v искnючении Исключения Usage Fault, MemManage Fault и Bus Fault разрешаются реrистром SHCSR (OxEOOED24). Признаки состоянии ожидания исключений отказов и при знаки активноrо состояния большинства системных исключений также хранят ся в этом реrистре (Табл. 8.5). Таблица 8.5. Реrистр состояния и управления обработчиков системных исключений SHCSR (OxEOOOED24) Значение Биты Обозначение Тип после Описание сброса 18 USGFAULTENA R/W О Разрешение обработчика исключения Usage Fault 17 BUSFAULTENA R/W О Разрешение обработчика исключения Bus Fault 16 MEMFAULTENA R/W О Разрешение обработчика исключения MemManage Fault Исключение SVCall отложено; обработчик 15 SVCALLPENDED R/W О SVCall выполнялся, но был вытеснен исключением с более высоким приоритетом 
8.2. Базовые средства конфиzурации прерываний . 157 Таблица 8.5. Реrистр состояния и управления обработчиков системных исключений SHCSR (OxEOOOED24) (продолжение) Значение Биты Обозначение Тип после Описание сброса Исключение Bus Fault отложено; обработчик 14 BUSFAULTPENDED R/W О Bus Fault выполнялся, но был вытеснен исключением с более высоким приоритетом Исключение MemManage Fault отложено; 13 MEMFAULTPENDED R/W О обработчик MemManage Fault выполнялся, но был вытеснен исключением с более высоким приоритетом Исключение Usage Fault отложено; обработчик 12 USGFAULTPENDED R/W О Usage Fault выполнялся, но был вытеснен исключением с более высоким приоритетом 11 SYSTICKACT R/W О Читается как 1, если исключение SYSTICK активно 10 PENDSVACT R/W О Читается как 1, если исключение PendSV активно 8 MONITORACT R/W О Читается как 1, если исключение Debug Monitor активно 7 SVCALLACT R/W О Читается как 1, если исключение SVCall активно 3 USGFAULTACT R/W О Читается как 1, если исключение Usage Fault активно 1 BUSFAULTACT R/W О Читается как 1, если исключение Bus Fault активно О MEMFAULTACT R/W О Читается как 1, если исключение MemManage Fault активно Будьте аккуратны при записи в этот реrистр, не измените случайно биты aK тивности системных исключений. В противном случае, если вы вдруr сбросите бит активности системноrо исключения, находящеrося в активном состоянии, то в момент выхода из обработчика системноrо исключения будет сrенерировано исключение отказа. Перевод исключений NMI, SYSTICK и PendSV в состояние ожидания осущест вляется посредством реrистра ICSR. Мноrие битовые поля данноrо реrистра предназначены исключительно для отладки. В прикладных проrраммах, как пра вило, используются только биты, связанные с признаками отложенноrо преры вания (Табл. 8.6). Таблица 8.6. Реrистр управления и состояния прерываний ICSR (OxEOOOED04) Биты . Обозначение Тип Значение Описание после сброса 31 NMIPENDSET R/W О Исключение NMI отложено Запись 1 в этот бит переводит исключение 28 PENDSVSET R/W О PendSV в состояние ожидания. При чтении возвращается текущее состояние 
158 . fлава 8. Контроллер вложенных векторных прерываний и управление прерываниями Таблица 8.6. Реrистр управления и состояния прерываний ICSR (OxEOOOED04) (продолжение) Биты Обозначение Тип Значение Описание после сброса Запись 1 в этот бит очищает признак 27 PENDSVCLR W О отложенноrо прерывания для исключения PendSV Запись 1 в этот бит переводит исключение 26 PENDSTSET R/W О SYSTICK в состояние ожидания. При чтении возвращается текущее состояние Запись 1 в этот бит очищает признак 25 PENDSTCLR W О отложенноrо прерывания для исключения SYSTICK 23 ISRPREEMPT R О Отложенное прерывание станет активным на следующем шаrе (используется для отладки) 22 ISRPENDING R О Имеется отложенное внешнее прерывание 21:12 VECTPENDING R О Номер отложенноrо исключения с наибольшим приоритетом Устанавливается в 1 при выполнении процессором обработчика исключения; 11 RETTOBASE R О обеспечивает переход процессора в режим потока после возврата из прерывания при отсутствии друrих отложенных исключений 9:0 VECTACTIVE R О Номер обрабатываемоrо в данный момент исключения 8.3. Примеры инициализации прерывания в большинстве простых приложений проrрамма располаrается в ПЗУ, поэто му при отсутствии необходимости динамическоrо изменения обработчиков ис ключений вся таблица векторов может быть размещена в области Code (начиная с адреса ОхОООООООО). При этом смещение таблицы всеrда будет равно нулю, а BeK тора прерываний будут располаrаться в ПЗ Соответственно, для настройки лю боrо из прерываний необходимо выполнить следующее: 1. Задать настройки rруппирования приоритетов (этот этап не обязателен). По умолчанию в поле PRIGROUP реrистра AIRCR содержится нулевое значе ние  для задания уровня субприоритета используется только Ой бит реrистров уровня приоритета. 2. Задать уровень приоритета прерывания (этот этап также не обязателен). По умо!учанию все прерывания имеют Ой уровень (наивысший приоритет). 3. Разрешить прерывание. Ниже приведён при мер простой процедуры, выполняющей перечисленные операции: NVICSetPriorityGrouping(5); NVICSetPriority(7, ОхСО); // 3адаём дЛЯ IRQ#7 уровень приоритета, равный ОхСО NVIC EnableIRQ(7); 
8.3. Примеры инициализации прерЫ8ания . 159 Кроме Toro, если вы планируете использовать вложенные прерывания, не за будьте выделить достаточное количество памяти под стек. Поскольку обработчи ки исключений всеrда используют указатель MSP, размер OCHoBHoro стека должен быть достаточным для поддержки максимально возможноrо числа вложенных прерываний. Если обработчики прерываний должны изменяться в процессе выполнения проrраммы, то нам придётся переместить таблицу векторов из ПЗУ в ОЗУ  только так мы сможем модифицировать значения векторов прерываний. В pe зультате процедура инициализации HeMHoro усложнится и нам потребуется: 1. Изменить при необходимости настройки rруппирования приоритетов. По умолчанию в поле PRIGROUP реrистра AIRCR содержится нулевое значение (биты [7:1] реrистра уровня приоритета определяют уровень приоритета rруппы, а бит [О]  уровень субприоритета). 2. Скопировать вектора обработчиков исключений Hard Fault, NMI, а также друrих требуемых исключений в новую таблицу векторов, расположенную вОЗ 3. Изменить содержимое реrистра смещения таблицы векторов VTOR (см. Табл. 7.7) так, чтобы он указывал на новую таблицу векторов. 4. Поместить вектор прерывания в новую таблицу. 5. Задать уровень приоритета прерывания. 6. Разрешить прерывание. Ниже приведён пример подобной процедуры, написанной с использованием функций из СМSISсовместимой библиотеки драйвера устройства (предполаrа ется, что начальный адрес новой таблицы векторов задаётся константой NEW VECTOR TABLE): // HWREG  макрос для преобразования значения адреса в указатель #define HW  REG (addr) (* ((volatile unsigned long *) (addr) ) ) #define NEWVECTTABLE Ох20008000 // Область СОЗУ дЛЯ размещения таблицы векторов NVICSetPriorityGrouping(5); HWREG((NEWVECTTABLE +Ох8)) = HWREG(Ox8); // Копируем вектор NMI HWREG((NEWVECTTABLE +ОхС)) = HWREG(OxC); // Копируем вектор Hard Fault SCB>VTOR = NEWVECTTABLE; // Перемещаем таблицу векторов в СОЗУ HWREG(4*(7+16)) = (unsigned) IRQ7 Handler; // Устанавливаем вектор NVICSetPriority(7, ОхСО); // Задаём дЛЯ IRQ#7 уровень приоритета, равный ОхСО NVIC EnableIRQ(7); Аналоrичный код на ассемблере может выrлядеть следующим образом: LDR RO, =OxEOOOEDOC Реrистр AIRCR LDR Rl, =Ox05FA0500 Поле PRIGROUP = 5 (2/6) STR Rl, [RO] Задаём rруппирование приоритетов MOV R4,#8 LDR R5,=(NEWVECT TABLE+8) Таблица векторов в ПЗУ 
160 . [лава 8. Контроллер вложенных векторных прерыванuй и управление прерываниями LDMIA R4!, {ROR1} STMIA R5!, {RORl} Считываем вектора исключений NMI и Hard Fault Копируем вектора в новую таблицу LDR RO,=OxEOOOED08 LDR R1,=NEWVECTTABLE STR R1, [RO] Реrистр VTOR ; Указываем новое положение таблицы векторов LDR RO,=IRQ7Handler LDR R1,=OxEOOOED08 LDR R1, [R1] АОО R1, R1, # (4 * (7 + 1 б) ) STR RO, [R1] Получаем стартовый адрес обработчика IRQ#7 Ре:rистр VTOR Вычисляем адрес вектора обработчика IRQ#7 Устанавливаем вектор IRQ#7 LDR RO,=OxEOOOE400 Начальный адрес блока ре:rистров приоритета внешних IRQ MOV R1, #ОхО S TRB R 1, [R О , # 7 ] Устанавливаем приоритет IRQ#7, равный ОхО LDR RO,=OxEOOOE100 Ре:rистр SETEN MOV R1,#(1«7) Бит разрешения IRQ#7 (1 сдви:rается на 7 бит влево) STR R1, [RO] Разрешаем прерывание Если проrрамма должна запускаться на различных устройствах, то она, как правило, должна уметь определять: . число прерываний, поддерживаемых устройством; . разрядность реrистров приоритета. В процессоре CortexM3 предусмотрен реrистр типа контроллера прерываний ICTR, который содержит число rрупп входов прерываний, по 32 входа каждая (Табл. 8.7). В качестве альтернативы вы можете определить точное число внешних прерываний, выполняя операцию чтения/записи в реrистры конфиrурации пре рываний, такие как реrистры разрешения прерываний или реrистры приоритета. Таблица 8.7. Реrистр типа контроллера прерываний ICTR (ОхЕОООЕОО4) Биты Обозначение Тип Значение после Описание сброса Количество входов прерываний с шаrом 32: 4:0 INTLINESNUM R  О = от 1 до 32; 1 = от 33 до 64; . . . Для определения числа реализованных битов реrистров приоритета вы може те записать OxFF в любой из реrистров, а затем прочитать ero содержимое и по смотреть число установленных битов. Минимальное число установленных битов равно трём, в этом случае при чтении реrистра должно возвращаться число ОхЕО. 8.4. Проrраммные прерывания Проrраммные прерывания MorYT формироваться различными способами. Первый из этих способов заключается в использовании реrистров NVICISPRx; 
8.5. Системный таймер SYSTICK · 161 второй  в использовании реrистра проrраммной rенерации прерывания STIR (Табл. 8.8). Таблица 8.8. Реrистр проrраммной rенерации прерывания STIR (OxEOOOEFOO) Значение Биты Обозначение Тип после Описание сброса При записи в это поле какоrолибо числа устанавливается бит признака отложенноrо 8:0 INTID W  прерывания для прерывания с соответствующим номером; так, для перевода в состояние ожидания прерывания N20 необходимо записать О Например, вы можете rенерировать прерывание NQ3 посредством выражения: NVIC>STIR = 3; /* NVIC>STIR определено в СМSISсовместимой библиотеке драйвера устройства */ С тем же результатом запись в реrистр NVICISPRx можно выполнить, ис пользуя функцию из СМSISсовместимой библиотеки: NVICSetPendingIRQ(3); Системные исключения (NMI, исключения отказов, PendSV и т.д.) не MorYT быть отложены с использованием данноrо реrистра. По умолчанию пользова тельская проrрамма не может выполнять запись в реrистры контроллера NVIC, однако при необходимости ей можно предоставить доступ к реrистру STIR  для этоrо следует установить бит USERSETMPEND реrистра управления конфиrура цией CCR (OxEOOOEDI4). 8.5. Системный таймер SYSTICK Таймер SYSTICK входит в состав контроллера NVIC и может использоваться для rенерации исключения SYSTICK (исключение N Q I5). Мноrие операционные системы задействуют отдельный аппаратный таймер, rенерирующий периодиче ские прерывания. Блаrодаря этим прерываниям ОС может осуществлять управ ление задачами, например выделять каждой задаче свой временной интервал или же предотвращать блокирование всей системы какойлибо одной задачей. Для этоrо таймер должен быть способен rенерировать прерывания и, по возможно сти, должен быть защищён от воздействия со стороны пользовательских задач, чтобы пользовательский код не Mor влиять на ero работу. в связи с этим в процессор CortexM3 был включён простой таймер SYSTICK. Поскольку данный таймер имеется во всех кристаллах с процессором CortexM3, значительно упрощается перенос проrрамм между подобными устройствами. Этот таймер представляет собой 24битный вычитающий счётчик, который MO жет тактироваться как от BHYTpeHHero TaKToBoro сиrнала процессора, так и от внешнеrо TaKToBoro сиrнала (в [1] этот сиrнал обозначен как STCLK). Поскольку источник TaKTOBoro сиrнала STCLK определяется разработчиком конкретной микросхемы, частота данноrо сиrнала в разных устройствах может быть различ 
162 · fлава 8. Контроллер вложенных векторных nрерываний и управление nрерываниями ной. Соответственно, при выборе источника TaKToBoro сиrнала необходимо вни мательно изучить документацию на используемую микросхему. Таймер SYSTICK может применяться для rенерации прерываний  он имеет своё исключение и отдельный вектор исключения. Указанный таймер облеrчает перенос операционных систем и проrраммноrо обеспечения, поскольку во всех устройствах используется одинаковым образом. Таймер SYSTICK управляется четырьмя реrистрами, формат которых указан в Табл. 8.9.. .8.12. Таблица 8.9. РеI'ИСТР управления и состояния системноI'О таймера SYSTCSR (OxEOOOEOIO) Значение Биты Обозначение Тип после Описание сброса Читается как 1, если с момента предыдущеrо чтения реrистра счётчик успел досчитать до о; 16 COUNTFLAG R О автоматически сбрасывается в О после чтения реrистра или при обнулении текущеrо значения счётчика 2 CLKSOURCE R/W О О  внешний тактовый сиrнал (STCLK); 1  тактовый сиrнал процессора 1  разрешает rенерацию прерывания SYSTICK при 1 TICKINT R/W О достижении таймером нулевоrо значения; О  прерывание не rенерируется О ENABLE R/W О Разрешение таймера SYSTICK Таблица 8.10. РеI'ИСТР значения перезаI'рУЗКИ системноI'О таймера SYSTRVR (ОхЕОООЕОI4) Биты Обозначение Тип Значение Описание после сброса 23:0 RELOAD R/W О Значение, заrружаемое в таймер при достижении им нулевоrо значения Таблица 8.11. РеI'ИСТР текущеI'О значения системноI'О таймера SYSTCVR (ОхЕОООЕОI8) Биты Обозначение Тип Значение Описание после сброса При чтении возвращается текущее значение таймера. При записи в реrистр текущее 23:0 CURRENT R/Wc О значение счётчика обнуляется. Также при записи сбрасывается бит COUNTFLAG реrистра SYSTCSR Таблица 8.12. РеI'ИСТР калибровочноI'О значения системноI'О таймера SYSTCALIB (ОхЕОООЕОIС) Биты Обозначение Тип Значение Описание после сброса 1  внешний тактовый сиrнал отсутствует 31 NOREF R  (сиrнал STCLK недоступен); О  внешний тактовый сиrнал доступен 
8.5. Системный таймер SYSTICK · 163 Таблица 8.12. Реrистр калибровочноrо значения системноrо таймера SYSTCALIB (ОхЕОООЕОIС) (продолжение) Биты Обозначение Тип Значение Описание после сброса 1  калибровочное значение не соответствует 30 SKEW R  10MC интервалу; О  калибровочное значение точное Калибровочное значение для периода 10 мс. Разработчик кристалла должен подать это 23:0 TENMS R/W О значение (в двоичном коде) на соответствующие входы процессора. Если при чтении данноrо поля возвращается О, значит, калибровочное значение недоступно Реrистр калибровки SYSTCALIB позволяет rенерировать прерывания SYSTICK с одним и тем же интервалом при работе проrраммы на различных устройствах с ядром CortexM3. Для использования этой возможности просто запишите содержимое поля TENMS в реrистр значения перезаrрузки SYSTRVR; в результате вы получите интервал между прерываниями, равный примерно 10 мс. Для получения друrих интервалов проrрамма должна будет сама рассчи тать новое значение из калибровочноrо. Однако битовое поле TENMS может быть реализовано не во всех устройствах с процессором CortexM3 (в этом случае на входы калибровочноrо значения подаётся сиrнал низкоrо уровня), поэтому перед использованием указанной возможности убедитесь в её наличии по ДOKY ментации производителя. Вообще rоворя, таймер SYSTICK может использоваться не только как систем ный таймер для операционных систем. В частности, он может применяться в Ka честве сиrнальноrо таймера, для измерения временных интервалов, а также для друrих целей. Обратите внимание, что при останове процессора (во время отлад ки) таймер SYSTICK тоже останавливается. В зависимости от реализации микро контроллера таймер SYSTICK также может останавливаться при переходе про цессора в определённые режимы пониженноrо энерrопотребления. Инициализацию системноrо таймера рекомендуется выполнять в следующей последовательности: 1. Запретить таймер SYSTICK, записав О в реrистр управления и состояния SYSTCSR. 2. Записать новое значение перезаrрузки в реrистр SYSTRVR. 3. Записать любое значение в реrистр SYSTCVR для обнуления текущеrо значения таймера. 4. Записать в реrистр управления и состояния SYSTCSR соответствующее значение для запуска таймера SYSTICK. Эта последовательность применима ко всем реализациям процессора CortexM3. Более подробно процесс настройки SYSTICK рассматривается в rла ве 14. 
rЛАВА 9 ПРЕРЬIВАНИЯ 9.1. Последовательность обработки прерываний/исключений При возникновении исключительной ситуации (исключения) процессор BЫ полняет следующие операции: · сохраняет контекст в стеке (заrружает содержимое восьми реrистров в стек); · осуществляет выборку вектора (считывает адрес обработчика исключитель ной ситуации из таблицы векторов); · модифицирует указатель стека, реrистр связи (LR) и счётчик команд (РС). 9.1.1. Сохранение контекста При возникновении исключительной ситуации содержимое реrистров RO. . .R3, R12, LR, Ре и PSR сохраняется в стеке. Если в исполняемом коде используется указатель PSP, то реrистры будут сохранены в стеке процесса, иначе  в OCHOB ном стеке. Обработчики исключительных ситуаций всеrда используют основной стек, поэтому во вложенных прерываниях будет задействован именно он. Блок из восьми слов данных, сохраняемых в стеке, обычно называется CTeKO вым фреймом. До появления 2й ревизии процессора CortexM3 стековый фрейм по умолчанию Mor начинаться с любоrо адреса, KpaTHoro слову. Во второй реви зии процессора стековый фрейм по умолчанию выравнивается на rраницу двой Horo слова, однако такое выравнивание можно отключить, сбросив бит STKALIGN реrистра управления конфиrурацией CCR контроллера NVIC. Такое выравнивание cTeKoBoro фрейма доступно и в lй ревизии CortexM3, только ero надо разрешить, установив бит STKALIGN. Более подробно использование реrи стра CCR рассматривается в [лаве 12. Расположение данных внутри cTeKoBoro фрейма исключения показано на Рис. 9.1, а последовательность заrрузки данных в стек представлена на Рис. 9.2 (предполаrается, что после возникновения исключительной ситуации значение указателя стека равно N). Изза конвейерноrо характера интерфейса шины АНВ адрес и данные оказываются сдвинутыми друr относительно друrа на одну CTY пень конвейера. 
9.1. Последовательность обработки nрерываний/исключений . 165 Дополнительное выравнивание указателя аека не требуется Адрес ) сох::::=ные данные Требуется дополнительное выравнивание указателя аека ) Свободная облааь аека Новое положение SP Адрес 1 Ранее сохранённые данные Не исполь зуется Новое положение SP Предыдущее положение SP Предыдущее положение SP Старый указатель аека указывал на ячейку памяти с адресом, кратным двойному слову или STКALIGN = О ) Свободная облааь аека Старый указатель аека указывал на ячейку памяти с адресом, не кратным двойному слову, и STКALIGN = 1 Рис. 9.1. Стековый фрейм исключения. Шина данных Шина адреса  Время Рис. 9.2. Последовательность сохранения контекста в стеке. Первыми в стек заrружаются значения РС и PSR  это позволяет уже на ca мом начальном этапе начинать выборку команд (что требует модификации РС) и изменять содержимое реrистра IPSR. После сохранения указанных реrистров значение указателя стека корректируется, и в стек заrружаются остальные дaH ные (см. Рис. 9.1). Сохранение содержимоrо именно реrистров RO.. .R3, R12, R13, LR, РС и PSR pe rламентируется соrлашением AAPCS [5], которое определяет эти реrистры как сохраняемые вызывающей процедурой (callersaved registers). Используемое co rлашение позволяет описывать обработчики прерываний в виде обычных Си функций, поскольку реrистры, которые MorYT быть изменены обработчиком ис ключительной ситуации, в любом случае сохраняются в стеке. Реrистры общеrо назначения RO.. .R3 и R12 располаrаются в конце cTeKoBoro фрейма, что облеrчает обращение к ним с использованием адресации относи тельно SP. Как следствие, с помощью этих реrистров можно леrко орrанизовать передачу параметров в проrраммные прерывания. 
166 . fлава 9. Прерыванuя 9.1.2. Выборка вектора в то время, пока шина данных «занимается» сохранением реrистров в стек, шина команд выполняет друrую важную задачу  по этой шине производится выборка вектора (начальноrо адреса обработчика исключительной ситуации) из таблицы векторов прерываний. Поскольку сохранение контекста и выборка BeK тора осуществляются разными интерфейсами шин, эти операции MorYT выпол няться одновременно. 9.1.3. Обновление реrистров После Toro как будет сохранён контекст проrраммы и выбран вектор из табли цы векторов, процессор приступит к обработке исключительной ситуации. На момент входа в обработчик будут изменены следующие реrистры: · SP  во время сохранения контекста указатель стека (MSP или PSP) устанавли вается на новую позицию. Если процедура обработки исключительной ситуации обращается к стеку, то она будет использовать основной стек и указатель MSP. · PSR  в реrистр IPSR (младший байт реrистра PSR) заносится номер возник шеrоисключения. · РС  после выборки вектора ero значение будет заrружено в счётчик команд, в pe зультате чеrо начнётся выборка команд обработчика исключительной ситуации. · LR  в реrистр связи заносится специальное значение, называемое EXCRETURNl). Это значение управляет процессом возврата из прерывания (реально используются только 4 младших бита реrистра). Более подробно об EXCRETURN будет рассказано в разделе 9.3 данной rлавы. Помимо рассмотренных реrистров, также изменяются некоторые реrистры контроллера NVIC. В частности, сбрасывается бит признака отложенноrо преры вания и устанавливается бит активноrо состояния. 9.2. ВЫХОД И3 исключения После завершения обработки исключительной ситуации необходимо осуще ствить выход из обработчика (в некоторых процессорах эта операция называется возвратом из прерывания) для восстановления исходноrо состояния системы, что позволит возобновить нормальное выполнение прерванной проrраммы. Имеется три способа возврата из прерывания; все они используют значение EXCRETURN, сохраняемое в реrистре LR при входе в обработчик исключения (Табл.9.1). Некоторые микропроцессорные архитектуры имеют специальные команды для возврата из прерывания (например, команда reti в процессоре Intel 8051). В процессоре CortexM3 для этой цели применяется обычная команда возврата, что, при использовании языка Си, позволяет описывать обработчик исключи тельной ситуации как обыкновенную подпроrрамму. 1) Биты [31:4] значения EXCRETURN всеrда установлены в 1) т.е. это значение имеет вид ОхРРРРРРРх. Информация для возврата содержится в 4 младших битах. Более подробно значение EXCRETURN будет рассмотрено ниже в этой rлаве. 
9.3. Вложенные прерЫ8анuя . 167 Таблица 9.1. Команды для запуска процесса возврата из прерывания Команда Описание возврата ВХ reg Если значение EXCRETURN всё ещё хранится в реrистре LR) то мы можем использовать для возврата из прерывания команду ВХ LR Очень часто содержимое LR сохраняется в стеке после входа в обработчик РОР {РС} или исключения. В этом случае для заrрузки значения EXCRETURN в счётчик РОР {... , РС} команд мы можем использовать команду РО Р. В результате процессор выполнит возврат из прерывания LDR или LDM Возврат из прерывания также можно выполнить) используя команду LDR/LDM с РС в качестве реrистра  приёмника При выполнении команды возврата из прерывания производится BOCCTaHOB ление контекста из стека и изменение реrистров контроллера NVIC (Табл. 9.1): 1. Восстановление контекста из стека  восстанавливаются значения реrистров, помещённые в стек. Также восстанавливается исходное значение указателя стека. 2. Обновление pezucmpoe NVIC  бит активности исключения сбрасывается. В случае внешнеrо прерывания, если вход этоrо прерывания всё ещё активен, будет повторно установлен бит признака отложенноrо прерывания, что приведёт к повторному запуску обработчика прерывания. 9.3. Вложенные прерывания Поддержка вложенных прерываний встроена непосредственно в процессор ное ядро CortexM3 и контроллер NVIC. То есть для использования вложенных прерываний больше не требуется написание дополнительноrо ассемблерноrо KO да. Нужно только задать соответствующий уровень приоритета для каждоrо ис точника прерывания. Вопервых, декодирование приоритетов осуществляется контроллером NVIC автоматически. Так что при обработке какойлибо исключи тельной ситуации все остальные исключения с таким же или меньшим приорите том блокируются. BOBTOpЫX, аппаратнореализованное сохранение и BOCCTaHOB ление контекста позволяет обработчикам вложенных прерываний не заботиться о сохранности данных в реrистрах. Необходимо помнить только об одном  о выделении достаточноrо количе ства памяти под основной стек при наличии нескольких уровней вложенных прерываний. Каждый уровень использует восемь слов стека, да ещё и самим об работчикам исключений может потребоваться стек  в итоrе расход стека может оказаться большим, нежели предполаrалось изначально. Повторный вход в обработчик исключительной ситуации в процессоре CortexM3 не допускается. Поскольку каждому исключению соответствует опре делённый уровень приоритета, а во время обработки исключительной ситуации все прерывания с таким же или меньшим приоритетом блокируются, то обрабо тать это же исключение можно будет только после выхода из текущеrо 06pa60T чика. В частности, поэтому нельзя выполнить команду SVC в обработчике исклю чения SVCall  при такой попытке будет сrенерирована исключительная ситуа ция Hard Fault. 
168 . fлава 9. Прерыванuя 9.4. «Цепочечная» обработка прерываний , в процессоре Cortex М3 применены различные решения, позволяющие YMeHЬ шить задержку обработки прерываний. Первым решением, которое мы paCCMO трим, является механизм «цепочечной» (tailchaining) обработки прерываний (Рис. 9.3). Прерывание N21 п Прерывание N22 Прерывающее событие N O l Процедура обработки Процедура обработки прерывания N21 прерывания N22 Выход из прерывания Соаояние процессора Основная nporpaMMa Сохранение контекаа Основная nporpaMMa I I I I Режим обработчика I I I Восаановление контекаа Режим потока I I I I Режим обработчика I I I Режим потока Рис. 9.3. «Цепочечная» обработка исключений. Если исключение возникает в тот момент, коrда процессор занят обработкой исключительной ситуации с таким же или более высоким приоритетом, то оно переводится в состояние ожидания (откладывается). После завершения текуще ro обработчика процессор может приступить к обработке отложенноrо прерыва ния. И вот здесь вместо Toro, чтобы восстанавливать содержимое реrистров из стека, а затем снова сохранять ero в стеке, процессор, пропуская эти операции, сразу переходит к обработчику отложенноrо прерывания. В результате значи тельно уменьшается временной интервал между последовательным выполнени ем двух обработчиков прерываний. 9.5. «Опоздавшие» исключения Ещё одним механизмом, увеличивающим эффективность подсистемы обра ботки прерываний, является поддержка «опоздавших» исключений. Если во Bpe мя сохранения контекста для обработки какойлибо исключительной ситуации возникнет исключение с более высоким приоритетом, то процессор сначала обра ботает это «опоздавшее» исключение. Например, если исключение N21 (меньший приоритет) возникнет на несколько тактов раньше исключения NQ2 (больший приоритет), то процессор поведёт себя так, как показано на Рис. 9.4, т.е. после сохранения контекста будет запущен об работчик исключения NQ2. 
9.6. Ещё раз о значении EXCRETURN · 169 Прерывание NOl (НИЗКИЙ приоритет) Прерывание N02 (ВЫСОКИЙ приоритет) Соаояние процессора Режим потока Запуск обработки исключения Обработчик N 0 2 Шина данных Шина команд ОСНОВНОЙ поток Выборка команд обработчика Выборка вектора Рис. 9.4. Обработка «опоздавшеzо» исключения. 9.6. Ещё раз о значении EXCRETURN При входе в обработчик исключительной ситуации в реrистр LR заносится специальное значение, называемое EXeRETURN, старшие 28 бит KOToporo YCTa новлены в 1. При завершении обработчика это значение заrружается в счётчик команд, запуская процесс выхода из исключения. Для выхода из обработчика исключительной ситуации MorYT использоваться следующие команды: . POP/LDM; . LDR с Ре в качестве реrистраприёмника; . ВХ с любым реrистром в качестве операнда. Биты [31:4] значения EXCRETURN всеrда установлены в 1, а биты [3:0] coдep жат информацию, необходимую для выполнения операции возврата (Табл. 9.2). При входе в обработчик прерывания содержимое LR обновляется автоматиче ски, так что вручную записывать эти значения не нужно. Таблица 9.2. Назначение битов EXCRETURN Биты 31:4 3 2 1 О Описание охррррррр Режим возврата (по Стек Зарезервировано; Состояние процес тока/обработчика) возврата должен быть О сора (ARM/Thumb) Бит О значения EXeRETURN определяет состояние, в котором должен OKa заться процессор после возврата из обработчика исключения. Поскольку процес сор eortexM3 поддерживает только состояние Thumb, бит О всеrда должен быть установлен в 1. Допустимые для процессора CortexM3 значения EXCRETURN указаны в Табл. 9.3. 
170 . fлава 9. Прерывания Таблица 9.3. Допустимые значения EXCRETURN дЛЯ CortexM3 Значение Описание OxFFFFFFFl Возврат в режим обработчика OxFFFFFFF9 Возврат в режим потока с использованием OCHoBHoro стека при возврате OxFFFFFFFD Возврат в режим потока с использованием стека процесса при возврате Если в режиме потока используется основной стек, то при входе в обработчик первоrо прерывания в реrистр LR будет записано значение ОхРРРРРРР9, а при BXO де в обработчики последующих вложенных прерываний  ОхРРРРРРРl (Рис. 9.5). Прерывание NOl (НИЗКИЙ приоритет) I Прерывание N02 (ВЫСОКИЙ приоритет) Рабочее состояние Процедура обработки прерывания N02 Выход из прерывания Выход из прерывания Процедура обработки прерывания N O l Основная nporpaMMa ( ОСНОВНОЙ стек л ОСНОВНОЙ стек ............... I \ ( I Режим I I обработ I I I I чика I ОСНОВНОЙ стек л ) ) ( : Режим Режим потока I обработ : чика LR = OxFFFFFFF9 : Режим I обработчика : LR = OxFFFFFFFl Режим потока Рис. 9.5. Заzрузка EXCRETURN 8 LR при 8ходе 8 обработчик (8 режиме потока используется основной стек). Если в режиме потока используется стек процесса, то содержимое LR будет paB но OxFFFFFFFD при входе в обработчик первоrо прерывания и ОхРРРРРРРl при BXO де в обработчики последующих вложенных прерываний, как показано на Рис. 9.6. Изза используемоrо формата EXCRETURN мы не сможем выполнить воз врат по адресу из диапазона ОхРРРрррро.. .0хРРРРРРРР. Но, поскольку данные адреса расположены в неисполняемой области памяти, в этом нет ничеrо страш Horo. 
9.7. Задержка обработки прерЫ8ания . 171 Прерывание N Q l (НИЗКИЙ приоритет) I Прерывание N Q 2 (ВЫСОКИЙ приоритет) Рабочее соаояние Процедура обработки прерывания N Q 2 Выход ИЗ прерывания Выход ИЗ прерывания Процедура обработки прерывания N Q l Основная nporpaMMa ( ОСНОВНОЙ аек л ОСНОВНОЙ аек /"о... 1 ( Режим : обработ I I чика I ОСНОВНОЙ аек л 1 1( : Режим Режим потока I обработ I I чика LR = OxFFFFFFFD : Режим I обработчика : LR = OxFFFFFFFl Режим потока Рис. 9.6. Заzрузка EXCRETURN 8 LR при 8ходе 8 обработчик (8 режиме потока используется стек процесса). 9.7. Задержка обработки прерывания Термин задержка обработки прерЫ8ания (interrupt latency) обозначает интер вал между появлением запроса прерывания и началом исполнения обработчика этоrо прерывания. В процессоре CortexM3 при условии, что память имеет нуле вую латентность, и учитывая, что архитектура шин позволяет одновременно ocy ществлять выборку вектора и сохранение контекста проrраммы, минимальная величина задержки обработки прерывания составляет 12 тактов. Это время yxo дит на сохранение реrистров в стеке, выборку вектора и выборку первых команд обработчика прерывания. В то же время указанная величина зависит от наличия циклов ожидания при обращении к памяти и ряда друrих факторов. При «цепочечной» обработке прерываний время переход а от одноrо обработ чика прерывания к друrому может быть уменьшено до 6 тактов, поскольку в этом случае не требуется выполнять лишние операции сохранения/восстановления содержимоrо реrистров. Если процессор исполняет команду, для выполнения которой требуется He сколько тактов, например команду деления, то выполнение подобной команды может быть прервано и возобновлено после завершения обработки прерывания. Это также касается команд заrрузки/сохранения двойных слов LORO/STRD. ДЛЯ уменьшения задержки обработки исключений процессор CortexM3 дo пускает возникновение исключения во время выполнения команд rрупповой за rрузки и сохранения (LDM/STM). В этом случае при возникновении исключитель ной ситуации процессор завершит текущее обращение к памяти и запомнит HO мер следующеrо реrистра в поле ICI реrистра xPSR, который будет сохранён в CTe ке. После завершения обработчика исключения выполнение команды заrрузки/ восстановления возобновится с Toro места, rде был остановлен процесс пересыл 
172 . fлава 9. Прерыванuя ки. В крайнем случае, если прерванная команда rрупповой заrрузки/сохранения была условно выполняемой (т.е. входила в состав IТблока), то её выполнение бу дет прекращено, а после завершения обработчика прерывания запущено заново. Это связано с тем, что поле ICI расположено в тех же битах реrистра EPSR, KOTO рые используются для хранения состояния процесса выполнения команды IT. Кроме Toro, при наличии незавершённой пересылки по шине, скажем при BЫ полнении буферированной записи, процессор будет ожидать её завершения. Это необходимо для Toro, чтобы в случае нештатной ситуации обработчик исключе ния Bus Fault прервал бы корректный процесс. Разумеется, прерывание может оказаться блокированным, если процессор уже занят обработкой исключительной ситуации с таким же или более высоким приоритетом или если запрос прерывания маскируется реrистром маскирова ния прерываний. В таких случаях обработка прерывания будет отложена дО MO мента снятия блокировки. 9.8. Отказы, связанные с прерываниями Во время обработки исключений MorYT возникать различные отказы. Давайте познакомимся с ними. 9.8.1. Сохранение контекста При возникновении отказа шины во время сохранения реrистров в стеке, про цесс сохранения контекста прерывается и запускается (или откладывается) вы  полнение обработчика исключения Bus Fault. Если это исключение запрещено, то будет запущен обработчик исключения Hard Fault. В противном случае, если ис ключение Bus Fault имеет приоритет, который выше приоритета текущеrо исклю чения, то будет запущен обработчик исключения Bus Fault; если же нет  то об работка этоrо исключения будет отложена до завершения текущеrо обработчика. Такое состояние, называемое ошибкой заzрузки в стек (stacking error), индициру ется битом STKERR (бит 4) реrистра состояния отказа шины BFSR (OxEOOOED29). Если ошибка заrрузки в стек была вызвана конфликтом с настройками MOДY ля защиты памяти, то будет запущен обработчик исключения MemManage Fault с одновременной установкой бита MSTKERR (бит 4) реrистра состояния отказа управления памятью MMFSR (OxEOOOED28). Если исключение MemManage Fault запрещено, то будет запущен обработчик исключения Hard Fault. 9.8.2. Восстановление контекста При возникновении отказа шины во время извлечения реrистров из стека (при возврате из прерывания) процесс восстановления контекста прерывается и запускается (или откладывается) выполнение обработчика исключения Bus Fault. Если это исключение запрещено, то будет запущен обработчик исключения Hard Fault. В противном случае, если приоритет исключения Bus Fault выше при оритета текущеrо исключения (при наличии вложенных прерываний процессор к этому моменту уже может начать обработку HOBoro исключения), то будет запу щен обработчик исключения Bus Fault. Данная ситуация, называемая ошибкой 
9.8. Отказы, связанные с nрерыванuямu . 173 извлечения из стека (unstacking error), индицируется битом UNSTKERR (бит 3) реrистра состояния отказа шины BFSR (OxEOOOED29). Аналоrично, если ошибка извлечения из стека была вызвана конфликтом с Ha стройками модуля защиты памяти, то будет запущен обработчик исключения MemManage Fault с одновременной установкой бита MUNSTKERR (бит 3) реrи стра состояния отказа системы управления памятью MMFSR (OxEOOOED28). Если исключение MemManage Fault запрещено, то будет запущен обработчик исклю чения Hard Fault. 9.8.3. Выборка вектора Если во время выборки вектора произойдёт отказ шины или отказ системы управления памятью, то будет запущен обработчик исключения Hard Fault. Эта ситуация индицируется битом VECTTBL (бит 1) реrистра состояния тяжёлоrо отказа HFSR (OxEOOOED2C). 9.8.4. Некорректный возврат Если значение EXCRETURN некорректно или не соответствует состоянию процессора (скажем, равно OxFFFFFFFl при возврате в режим потока), то будет сrенерировано исключение Usage Fault. Если данное исключение не разрешено, то будет запущен обработчик исключения Hard Fault. При возникновении отказа устанавливается бит INVPC (бит 2) или INVSTATE (бит 1) реrистра UFSR (OxEOOOED2A), в зависимости от причины отказа. 
rлдвд 1 О проrРАММИРОВАНИЕ CORTEX..M3 10.1. Общие сведения Для проrраммирования процессора CortexM3 можно использовать язык ac семблера, язык Си или любой друrой язык BbIcoKoro уровня, наподобие языка среды LabVIEW компании National Instruments. Проrраммный код большинства встраиваемых приложений может быть целиком написан на Си. Разумеется, встречаются разработчики, предпочитающие проrраммировать исключительно на ассемблере или же использующие в своих проектах смесь языков Си и acceM блера. Процесс создания проrраммноrо кода и заrрузки полученных двоичных образов в конечное устройство в значительной мере определяется используемым набором инструментов. Хотя это и HeMHoro выходит за рамки данной книrи, в rлавах 19 и 20 приведены простые примеры использования набора инструмен тов GNU и среды разработки компании КеН. А в fлаве 21 содержатся базовые CBe дения о применении среды LabVIEW для проrраммирования устройств с ядром CortexM3. 10.2. Типичный процесс разработки ПО Для разработки приложений под процессор CortexM3 существует множество различных проrраммных средств. Однако во всех этих средствах при rенерации проrраммноrо кода применяются одни и те же принципы. Как минимум, вам по требуется ассемблер, компилятор с языка Си, компоновщик (редактор связей), а также утилиты для rенерации двоичноrо файла. Процесс создания проrрамм с использованием таких решений компании ARM, как RealView Development Suite (RVDS) или RealView Compiler Tools (RVCT), показан на Рис. 10.1. Помимо указанных компонентов, в состав па кета RVDS также входит боль шое число разнообразных утилит, включая интеrрированную среду разработки (ИСР) и отладчики. Для получения более подробной информации посетите сайт компании ARM (www.arт.coт). 
10.3. Использование языка Си . 175 Сифайлы (.с) D Объектные файлы (.0) [J Ассемблерные файлы (.5) D (компилятор) исполняемои проrраммы Сценарий компоновщика (.аю /.elf) fromelf Распреде q armlink q [] ление (компо памяти новщик) Объектные файлы ('V a D (ассемблер) Двоичный образ проrраммы (.bin) [] Дизассембли рованный код (.txt) Рис. 10.1. Создание ПО с использованием средств разработки компании ARM. 10.3. Использование языка Си Для тех, кто делает первые шаrи в проrраммировании для встраиваемых си стем, наилучшим выбором для разработки ПО под процессор CortexM3 будет язык Си. Проrраммирование на Си для устройств с процессором CortexM3 Becь ма облеrчается тем, что подавляющее большинство производителей микрокон троллеров предоставляют rOToBbIe библиотеки для управления периферийными устройствами. В дальнейшем разработчик может подключать эти библиотеки к своим проектам. Поскольку современные компиляторы языка Си rенерируют очень эффективный код, лучше проrраммировать на Си, чем тратить кучу BpeMe ни, пытаясь написать сложные подпроrраммы на ассемблере, которые к тому же подвержены ошибкам и обладают меньшей переносимостью. В этой rлаве мы сначала рассмотрим процесс создания простой проrраммы на языке Си. Затем коснёмся некоторых аспектов проrраммирования на языке Си, включая использование библиотек драйверов устройств и стандарт CMSIS. По сравнению с языком ассемблера язык Си обеспечивает лучшую переноси мость проrрамм и облеrчает реализацию сложных операций. Поскольку язык Си является языком проrраммирования общеrо назначения, в нём отсутствуют какиелибо средства для определения процесса инициализации процессора. Эта задача решается поразному, в зависимости от используемоrо инструментария. Для начала лучше Bcero будет ознакомиться с примерами проrрамм. Те, кто работает в средах разработки на базе компилятора ARM С, таких как RVDS или MDKARM, MorYT воспользоваться учебными проrраммами, входящими в co став пакетов. Для тех же, кто предпочитает компилятор GNU, в fлаве 19 будет описан процесс создания простой проrраммы в пакете Sourcery G++ компании CodeSourcery. 
176 . Тлава 10. Проzраммuрованuе CortexM3 10.3.1. Компиляция простой Си..проrраммы в пакете RVDS Нормальная проrрамма на языке Си для процессора CortexM3 содержит, как минимум, «основную» процедуру и таблицу векторов. Давайте попробуем напи сать проrрамму, которая включала бы светодиод в миrающем режиме: #define LED *((volatile unsigned int *) (OxDFFFOOOC)) int main (void) int 1; volatile int J; /* Счётчик циклов для функции задержки */ /* Переменная описана как volatile, чтобы */ /* во время оптимизации компилятор не убрал бы пустые циклы, формирующие задержки*/ while (1) { LED = ОхОО; for (i=0;i<10;i++) {j=O;} LED = ОхО1; for (i=0;i<10;i++) {j=O;} /* Переключаем СИД */ /* Формируем задержку */ /* Переключаем СИД */ /* Формируем задержку */ return О; } Назовём этот файл blinky.c. Таблицу векторов мы опишем в отдельном фай ле, который назовём vectors. с. Помимо таблицы векторов, в данном файле TaK же будут описаны несколько пустых обработчиков исключений (их можно будет определить позже при написании KOHKpeTHoro приложения): typedef void(* const ExecFuncPtr) (void) irq; extern int main(void); /* * Пустые обработчики исключений */ irq void NMIHandler(void) { while (1); } irq void HardFaultHandler(void) { whi le (1); } irq void SVCHandler(void) { while (1); } irq void DebugMonHandler(void) { whi le (1); } irq void PendSVHandler(void) { whi le ( 1); } irq void SysTickHandler(void) { whi le ( 1); } irq void ExtIntOIRQHandler(void) { whi le ( 1); } irq void ExtInt1IRQHandler(void) { whi le ( 1); } irq void ExtInt2IRQHandler(void) { while (1); } irq void ЕхtIпtЗIRQНапdlеr(vоid) 
10.3. Использование языка Си . 177 { while (1); } #pragma arm section rodata=»exceptionsarea» ExecFuncPtr exceptiontable[] = { /* Таблица векторов */ (ExecFuncPtr)Ox20002000, (ExecFuncPtr) main, NMIHandler, /* NMI */ HardFault Handler, О, /* MemМanageHandler в СоrtехМЗ */ О, /* BusFaultHandler в СоrtехМЗ */ О, /* UsageFaultHandler в СоrtехМЗ */ О, /* Зарезервировано */ О, /* Зарезервировано */ О, /* Зарезервировано */ О, /* Зарезервировано */ SVCHandler, О, /* DebugMonHandler в СоrtехМЗ */ О, /* Зарезервировано */ PendSVHandler, SysTickHandler, /* Внешние прерывания */ ExtIntOIRQHandler, ExtInt1 IRQHandler, ExtInt2IRQHandler, ЕхtIпtЗ IRQHandler } ; #pragma arm section При использовании компилятора RVDS для компиляции указанных файлов можно использовать следующие командные строки: $> armcc c g w blinky.c o blinky.o $> armcc c g w vectors.c o vectors.o Для rенерации образа проrраммы необходима отдельная проrрамма, называ емая компоновщиком, или линкером. Чтобы сообщить этой проrрамме о распре делении памяти и разместить таблицу векторов в начале образа, используется файл сценария компоновщика led.scat, представляющий собой обычный TeKCTO вый файл: #define НЕАР BASE Ох20001000 #define STACK BASE Ох20002000 #define НЕАР SIZE ((STACKBASEHEAPBASE) /2) #define STACKSIZE ((STACKBASEHEAPBASE)/2) LOAD REGION ОхОООООООО ОхО0200000 { VECTORS ОхО ОхСО { Provided Ьу the user in vectors.c * (exceptionsarea) } СОDЕ ОхСО FIXED { * ( + RO ) 
178 · Тлава 10. Проzраммuрованuе CortexM3 DATA Ох20000000 OxOOOlOOOO { * (+RW, +Z1) ;; Неар starts at 4КВ and grows upwards ARМ L1B НЕАР НЕАР BASE ЕМРТУ НЕАР S1ZE ........   ........ { } " Stack starts at the end of the 8КВ of RAМ " And grows downwards for 2КВ ARМ L1B STACK STACK BASE ЕМРТУ STACK S1ZE    { } А командная строка для запуска линкера будет иметь вид: $> arrnlink scatter led.scat «keep=vectors.o(exceptionsarea)>> blinky.o vectors.o o blinky.elf В результате мы получим образ исполняемой проrраммы blinky.elf. Ис пользуя утилиту frornelf, мы можем преобразовать ero в двоичный файл, а TaK же дизассемблировать: /* Создаём двоичный файл */ $> frornelf bin blinky.elf output blinky.bin /* Создаём дизассемблированный файл */ $> fromelf c blinky.elf > list.txt В предыдущих процессорах ARM, поддерживающих два состояния (ARM и Thumb), код для каждоrо из состояний необходимо было компилировать по OT дельности. Процессор CortexM3 всеrда находится в состоянии Thumb, что значи тельно упрощает управление файлами, входящими в проект. При разработке приложений на языке Си рекомендуется использовать стек, выровненный на rраницу двойноrо слова (определяется битом STKALIGN реrи стра CCR контроллера NVIC). Начиная со 2й ревизии процессора CortexM3, этот бит установлен по умолчанию. При использовании процессора lй ревизии указанный бит необходимо устанавливать вручную, скажем в самом начале про rpaMMbI. Более подробно об использовании данноrо бита было рассказано в rла ве 9. SCB>CCR = SCB>CCR I Ох200; /* Установили STКAL1GN */ /* SCB>CCR определено в библиотеке драйвера устройства */ Следующие строки выполняют ту же операцию, но уже без использования СМSISсовместимоrо драйвера устройства: #define NV1CCCR *((volatile unsigned long *) (OxEOOOED14)) NV1CCCR = NV1CCCR I Ох200; /* Установили STKAL1GN */ Выравнивание стека на rраницу двойноrо слова обеспечивает соответствие кода проrраммы соrлашениям AAPCS (более подробно об этом будет рассказано в [лаве 12). 
10.3. Использование языка Си . 179 10.3.2. КОМПИЛЯЦИЯ простой Си..проrраммы в па кете MDK..ARM Приведённую выше проrрамму можно скомпилировать и в пакете MDKARM компании КеН. Необходимо будет только скорректировать формат командной строки и некоторые определения в файле сценария компоновщика. Так, файл led. scat должен выrлядеть следующим образом: #define НЕАР BASE Ох20001000 #define STACK BASE Ох20002000 #define HEAPSIZE ((STACKBASEHEAPBASE) /2) #define STACKSIZE ((STACKBASEHEAPBASE) /2) LOAD REGION ОхОООООООО ОхОО200000 { VECTORS ОхО ОхСО { Provided Ьу the user in vectors.c * (exceptionsarea) СОDЕ ОхСО FIXED { * ( + RO ) DАТА Ох20000000 ОхОООl0000 { * (+ RW, + Z 1) ;; Неар starts at 4КВ and grows upwards HeapMeт HEAPBASE ЕМРТУ HEAPSIZE { } " Stack starts at the end of the 8КВ of RAМ " And grows downwards for 2КВ Stack Мет STACK BASE ЕМРТУ STACK SIZE    { } А для компиляции проrраммы можно создать пакетный файл DOS, содержа щий следующие команды: SET PATH=C:\Keil\ARМ\BIN40\;%PATH% SET RVCT40INC=C:\Keil\ARМ\RV31\INC SET RVCT40LIB=C:\Keil\ARМ\RV31\LIB SET СРИ TYPE=CortexM3 SET СРИ VENDOR=ARМ ЗЕТ UV2TARGETTarget 1 SET СРИ CLOCK=OxOOOOOOOO C:\Keil\ARМ\BIN40\armcc c оз W ч Otime device DLM vectors.c C:\Keil\ARМ\BIN40\armcc c оз w ч Otime device DLM blinky.c 
180 . [лава 10. Проzраммuрованuе CortexM3 C:\Keil\ARМ\BIN40\armlink device DLM «keep=Startup.o(RESET)>> «first=Startup.o(RESET)>> scatter led.scat map vectors.o blinky.o o blinky.elf C:\Keil\ARМ\BIN40\fromelf bin blinky.elf o blinky.bin Конечно же, для создания и компиляции проектов rораздо удобнее использо вать ИСР Vision, нежели командную строку. Для начинающих разработчиков, собирающихся разрабатывать ПО с использованием среды MDKARM компании КеН, предназначена [лава 20 данной книrи. 10.3.3. Отображённые в память реrистры и язык Си Существуют различные способы для обращения к реrистрам периферийных устройств, отображённых в память процессора, из проrрамм на языке Си. Проде монстрируем их на при мере реrистров системноrо таймера (SYSTICK) процессо ра CortexM3. Это обычный 24битный таймер, который имеет Bcero 4 реrистра. Конкретно функциональные возможности таймера SYSTICK будут рассмотрены в [лаве 14. В предыдущих при мерах мы уже использовали простейший метод об ращения к реrистрам, заключающийся в описании каждоrо реrистра как указате ля. Опишем таким образом и реrистры модуля SYSTICK (Рис. 10.2). #define SYSTICKaRL (*((volatile unsigned long *)(ОхЕОООЕОl О))) #define SYSTICKLOAD (*((volatile unsigned long *)(ОхЕОООЕО14))) #define SYSTICK V AL (*((volatile unsigned long *)(ОхЕОООЕО18))) #define SYSTICKCALIB (*((volatile unsigned long *)(ОхЕОООЕОl С))) /* Инициализируем SYSTICK */ SYSTICKLOAD = OxFFFF; // 3адаём значение перезаrрузки SYSTICKVAL = ОхО; // Сбрасываем текущее значение SYSTICKaRL = Ох5; // Разрешаем SYSTICK и выбираем такт. сиrнал CALIB ОхЕОООЕОlС VALUE ОхЕОООЕО18 Реrистры таймера RELOAO ОхЕОООЕО14 SYSTICK CТRL ОХ ЕОООЕО 1 О Рис. 10.2. Обращение к pezucmpaM по указателю. Этот метод можно HeMHoro модифицировать, написав макроопределение, преобразующее значение адреса реrистра в указатель. В результате текст про rpaMMbI будет выrлядеть HeMHoro иначе, однако rенерируемый код будет точно таким же, как и в предыдущей реализации (Рис. 10.3). #define HWREG(addr) (*((volatile unsigned long *)(addr))) #define SYSTICKaRL ОхЕОООЕОl0 #define SYSTICKLOAD ОхЕ 000ЕО14 #define SYSTICK V AL ОхЕ 000ЕО18 #define SYSTICKCALIB охЕ ОООЕОl С /* Инициализируем SYSTICK */ HWREG(SYSTICKLOAD) = OxF FFF; // Задаём значение перезаrрузки HWREG(SYSTICKVAL) = ОхО; // Сбрасываем текущее значение HWREG(SYSTICKaRL) = Ох5; // Разрешаем SYSTICK и выбираем // тактовый сиrнал CALI8 ОхЕ ОООЕОl С VALUE ОхЕ ОООЕО18 Реrистры таймера RELOAO ОхЕОООЕО14 SYSTICK CТRL ОхЕ ОООЕОl0 Рис. 10.3. Обращение к pezucmpaM по указателю (альтернативный вариант). 
10.3. Использование языка Си . 181 Второй метод заключается в описании всех реrистров периферийноrо устрой ства в виде структуры с последующим определением указателя на данную CTPYK туру (Рис. 10.4). Этот метод используется в СМSISсовместимых библиотеках драйверов устройств. typedef struct { volatile unsigned long CТRL; /* Реrистр управления и состояния SysTick */ volatile unsigned long LOAD; /* Реrистр значения перезаrрузки SysTick */ volatile unsigned long VAL; /* Реrистр текущеrо значения SysTick */ volatile unsigned long CALIB; /* Реrистр калибровочноrо значения SysТick */ } SysTickType; SysTick Туре #define SysTick «SysTick Туре *) ОхЕОООЕО1 О ) /* Структура SysТick */ САВВ VALUE RELOAD CТRL ОхЕОООЕО1С ОхЕОООЕО18 ОхЕОООЕО14 ОхЕОООЕО10 Реrистры таймера SYSTICK /* Инициализируем SYSTICK */ SysTick>LOAD = OxFFFF; // 3адаём значение перезаrрузки SysTick>VAL = ОхО; // Сбрасываем текущее значение SysTick>CТRL = OxS; / / Разрешаем SYSTICK и выбираем такт. сиrнал Рис. 10.4. Обращение к pezucmpaM как к полям структуры. Третий метод тоже основан на использовании структуры, однако базовый адрес периферийноrо устройства определяется в файле сценария компоновщика и подставляется в код на этапе компоновки проrраммы (Рис. 10.5). в Сифайле определяем структуру данных как attribute «zeroinit)) struct { volatile unsigned long CТRL; /* Реrистр управления и состояния SysTick */ volatile unsigned long RELOAD; /* Реrистр значения перезаrрузки SysTick */ volatile unsigned long VAL; /* Реrистр текущеrо значения SysTick */ volatile unsigned long CALIB; /* Реrистр калибровочноrо значения SysTick */ } SYSTICKstruct; SYSTICKstruct systickreg.o ( + ZI) CALI8 VALUE RELOAD CТRL ОхЕОООЕО1С ОхЕОООЕО18 ОхЕОООЕО14 ОхЕОООЕО10 Реrистры таймера SYSTICK Затем добавляем в файл сценария компоновщика директивы, размещающие эту структуру по требуемому адресу LOAD FLдSH О хОООО { SYSTICK ОхЕОООЕО10 UNINIT { Рис. 10.5. Определение базовоzо адреса периферийноzо устройства в файле сценария компоновщика. В последнем случае блок реrистров периферийноrо устройства должен быть описан в проrрамме как внешний указатель. При этом обращение к конкретным реrистрам производится так же, как и при использовании BToporo метода. Первый метод, применение KOToporo показано на Рис. 10.2 и Рис. 10.3, являет ся самым простым, но в то же время и наименее эффективным по сравнению с прочими методами, поскольку значения адресов реrистров хранятся в виде KOH стант. В итоrе увеличивается размер кода проrраммы и может замедлиться её BЫ полнение, поскольку для считывания значений адресов потребуются дополни 
182 . [лава 10. Проzраммuрованuе CortexM3 тельные обращения к памяти проrрамм. В то же время при использовании толь ко одноrо реrистра для управления периферийным устройством эффективность данноrо метода оказывается такой же, как и друrих методов. Второй метод (использование указателя на структуру) при меняется, пожалуй, чаще Bcero. Этот метод позволяет обращаться ко всем реrистрам периферийноrо устройства, используя единственную константу  базовый адрес устройства. Для обращения к конкретным реrистрам в данном случае можно задействовать режим адресации с непосредственным смещением. Указанный метод применяет ся в стандарте CMSIS, который будет рассмотрен в следующем разделе. Третий метод, в котором задействуется файл сценария компоновщика (Рис. 10.5), по эффективности эквивалентен 2MY методу, однако обладает rораз до меньшей переносимостью изза необходимости использования отдельноrо файла сценария (формат и синтаксис этоrо файла зависят от KOHKpeTHoro cpeд ства разработки). Применение данноrо метода оправдано в том случае, если вы разрабатываете библиотеку драйверов для периферийноrо устройства, которое будет использоваться в разных изделиях и базовый адрес KOToporo в каждом слу чае становится известным только на этапе компоновки. 10.3.4. Встроенные функции Использование языка BbIcoKoro уровня, TaKoro как Си, значительно ускоряет разработку приложений. Однако в ряде случаев возникает потребность в исполь зовании определённых команд, которые не MorYT быть сrенерированы с помо щью стандартных конструкций языка. Поэтому в некоторых компиляторах Си имеются встроенные (intrinsic) функции, позволяющие использовать в проrрам ме такие команды. Обращение к встроенным функциям производится так же, как и к обычным пользовательским функциям. В качестве примера в Табл. 10.1 перечислены встроенные функции, поддерживаемые компиляторами ARM. Таблица 10.1. Встроенные функции, поддерживаемые компиляторами ARM Команда ассемблера Встроенная функция CLZ unsigned char clz(unsigned int val) CLREX void clrex(void) CPSID 1 void disableirq(void) CPSIE 1 void enableirq(void) CPSID F void disablefiq(void) CPSIE F void enablefiq(void) LDREX/LDREXB/LDREXH unsigned int ldrex(volatile void *ptr) LDRT/LDRBT/LDRSBT/LDRHT/LDRSHT unsigned int ldrt(const volatile void *ptr) NOP void nop(void) RBIT unsigned int rbit(unsigned int val) REV unsigned int rev(unsigned int val) ROR unsigned int ror(unsigned int val, unsigned int shift) SSAT int ssat(int val, unsigned int sat) SEV void sev(void) 
10.4. Стандарт CMSIS . 183 Таблица 10.1. Встроенные функции, поддерживаемые компиляторами ARM (продолжение) Команда ассемблера Встроенная функция STREX/STREXB/STREXH int strex(unsigned int val, volatile void *ptr) STRT/STRBT/STRHT void int strt(unsigned int val) const volatile void *ptr) USAT int usat(unsigned int val) unsigned int sat) WFE void  wfe(void) WFI void wfi(void) ВКРТ void breakpoint(int val) 10.3.5. Встроенный и iпliпе..ассемблер Вместо использования встроенных функций мы можем напрямую вставлять команды ассемблера в текст проrрамм на Си. Как правило, потребность в этом возникает при управлении системой на низком уровне или же при необходимо сти реализации критичной ко времени исполнения процедуры. Большинство компиляторов языка Си для процессоров ARM позволяют внедрять ассемблер ный код в текст проrраммы, используя iпliпеассемблер. Компилятор ARM позволяет выполнять вставку ассемблерных команд в текст проrраммы на языке Си. Традиционно для этоrо используется iпliпеассемблер, однако iпliпеассемблер компилятора RealView не поддерживает команды Thumb2. Начиная с версии 3.0, в компиляторе появилась поддержка так называ eMoro BCTpoeHHoro ассемблера, поддерживающеrо команды из набора Thumb2. Например, вы можете вставить в свою проrрамму ассемблерную функцию, опи сав её следующим образом: asm void SetFaultMask(unsigned int newvalue) // Используем ассемблерный код MSR FAULTМASK, newvalue // Заносим новое значение в FAULTМASK ВХ LR // Возвращаемся в вызывающую проrрамму Подробно встроенный ассемблер компилятора RealView описан в PYKOBOД стве [6]. Применительно к процессору CortexM3 встроенный ассемблер полезен для решения таких задач, как непосредственная манипуляция стеком и реализа ция критичных ко времени выполнения процедур (кодеки). 10.4. Стандарт CMSIS 10.4.1. Предпосылки появления стандарта CMSIS На сеrодняшний день микроконтроллеры с процессором CortexM3 активно захватывают рынок встраиваемых приложений  появляется всё больше и боль ше устройств, основанных на этом процессоре, а также проrраммноrо 06еспече ния, поддерживающеrо данные устройства. К концу 2008 rода процессор CortexM3 поддерживали уже более пяти компиляторов разных производителей и более 15 различных встраиваемых ос. Помимо этоrо, на рынке присутствует 
184 . Тлава 10. Проzраммuрованuе CortexM3 множество компаний, предлаrающих собственные проrраммные решения, такие как кодеки, библиотеки обработки данных, а также различные средства проrрам мирования и отладки. Стандарт CMSIS (Cortex Microcontroller Software Interface Standard  стандарт проrраммноrо интерфейса микроконтроллеров с ядром Cortex), разработанный компанией ARM, позволяет пользователям микрокон троллеров с ядром CortexM3 извлечь максимальную выrоду из всех этих про rpaMMHbIx решений и быстро разрабатывать собственные высоконадёжные встраиваемые приложения (Рис. 10.6). Проrраммное обеспечение Библиотека драйверов устройств Микроконтроллер Прикладное ПО СоrtехМЗ/ CortexMO/ CortexM 1 Встраиваемые ОС Промежуточное ПО Рис. 10.6. Роль CMSIS в разработке встраиваемых приложений. Разработка стандарта CMSIS, который позволил бы улучшить потребитель ские свойства и функциональную совместимость проrраммноrо обеспечения для микроконтроллеров ARM, была начата в 2008 rоду. Этот стандарт нашёл при менение в библиотеках драйверов, предлаrаемых производителями микрокон троллеров, обеспечивая стандартизованный проrраммный интерфейс для дo ступа к функциональным возможностям процессора CortexM3, а также различ ные системные функции и функции ввода/вывода. Подобные библиотеки также поддерживаются компаниямиразработчиками ПО, включая разработчиков встроенных ОС, а также производителей компиляторов. При создании CMSIS преследовались следующие цели: . улучшить переносимость и степень повторноrо использования rOToBoro кода; . предоставить поставщикам проrраммных решений возможность разработки продуктов, которые моrли бы без всяких проблем работать с библиотеками различных производителей микроконтроллеров; . уменьшить время разработки ПО за счёт простоrо и стандартизованноrо про rpaMMHoro интерфейса; . обеспечить возможность создания BCTpoeHHoro ПО с использованием различ ных компиляторов; . исключить проблемы с совместимостью проrраммных модулей из различных источников. Первая версия стандарта CMSIS была представлена на суд общественности в 4M квартале 2008 rода и в настоящее время входит в состав библиотек драйве ров устройств, предлаrаемых различными производителями микроконтролле ров. Стандарт CMSIS также поддерживает процессорное ядро CortexMO.