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


Ь4 Э КА





Joseph Yiu ТНЕ DEFINITIVE GUIDE ТО ТНЕ ARM CORTEX..M3 Newnes
СЕРИЯ МИРОВАЯ ЭЛЕКТРОНИКА Джозеф Ю ЯДРО CORTEX..M3 КОМПАНИИ ARM Полное руководство Перевод А. В. Евстифеева $4. Э КА Москва Издательский дом «Додэка ХХI» 2012
УДК 004.31(035.3) ББК 32.973 04я81 Юll Данное издание подrотовлено при участии компании «Компэл» и российско ro представительства компании Texas Instruments. На сайтах www.compel.ru и www.ti.com/ru вы можете получить консультацию, а также заказать бесплатные образцы микросхем. Телефон rорячей линии технической поддержки ТI +7 495 981 07 01. Ю, Джозеф. Юll Ядро Cortex M3 компании ARM. Полное руководство / Джозеф Ю; пер. с анrл. А. В. Евстифеева. М. : Додэка ХХI, 2012. 552 с. : ил. (Мировая электроника). Доп. тит. л. анrл. ISBN 978 5 94120 243 0. Настоящая книrа представляет собой исчерпывающее руководство по HOBO му 32 битному процессору компании ARM Cortex M3. В данном руководстве подробно описана архитектура процессорноrо ядра Cortex M3 и ero подсистемы памяти. Также подробно рассмотрены остальные узлы процессора, в том числе контроллер векторных прерываний NVIC, модуль защиты памяти MMU и разно образные компоненты отладки. Приводится детальное описание новой системы команд Thumb 2, поддерживаемой данным процессором. Книrа содержит большое число примеров проrраммноrо кода как на языке Си, так и на ассемблере. Это руководство должно присутствовать на столе любоrо разработчика, ис пользующеrо в своей работе микроконтроллеры с ядром Cortex M3. Полнота и яс ность изложения материала книrи также позволяет рекомендовать её студентам соответствующих специальностей и подrотовленным радиолюбителям. УДК 004.31(035.3) ББК 32.973 04я81 Все права защищены. Никакая часть этоrо издания не может быть воспроизведе на в любой форме или любыми средствами, электронными или механическими, включая фотоrрафирование, ксерокопирование или иные средства копирования или сохранения информации, без письменноrо разрешения издательства. Книrа «Ядро Cortex M3 компании ARM. Полное руководство» Дж. Ю подrо товлена и издана по доrовору с Elsevier Inc., 30 Corporste Drive, 4th Floor, Burlington, МА 01803, USA. ISBN 978 5 94120 243 0 (рус.) ISBN 978 1 85617 963 8 (анrл.) @ 2010 Elsevier Inc. АН rights reserved. @ Издательский дом «Додэка ХХI», 2012
СОДЕРЖАНИЕ ]J(:1f)fIIII1f JIIJII() (:JI()]J() ................................................................... 1 ]J(:1f)'IIII1f JIIJII() (:1I()]J() ................................................................... ]J(:1f)'IIII1f JIIJII() (:1I()]J() ................................................................... ]J[I' II(:JI()]JII Ci]J1f()I'Ci..................................................................... ()()() IICi'l III1J1 ................................................................................ :; lI()(:(:Cil'lIii ..................................................................................... () JICi]JCi 1. ]J]J III1 ........................................................................ 1.1. Процессор ARM Cortex M3 что же это такое? . ...................................................... 9 1.2. ARM компания и архитектура .......................................................................... 11 1.2.1. Историческая справка........................................ ....................................... ............ .11 1.2.2. Версии архитектуры...... .......... ............................................ .................... .............. 12 1.2.3. Обозначения процессоров ......................................................................... .......... .14 1.3. Развитие набора команд .... ............... ...... ..... ....... ..... .... ...... .............. ...... .......... ....... 16 1.4. Технолоrия Thumb 2 и архитектура набора команд .......................................... 17 1.5. Области применения процессора Cortex M3....................................................... 18 1.6. Структура книrи .. ....... ........... .................... ........ .... ... ... ... .... ..... ...... ...... ..... ............... 19 1.7. Дополнительная литература .................................................................................. 19 lICi]JCi . ()() ()I' C()rt x 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()rt x 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. Некоторые полезные команды процессора Cortex M3 ......................................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(:1f Ma паМJl1f1l ........................................................... 9 5.1. Основные особенности системы памяти ............................................................. 93 5.2. Карта памяти ......... ..................................... ......... .... ... ..... ......... ......... ..... ........... ... .... 93 5.3. Атрибуты доступа к памяти ..................... ........ .... ... ...... ......... ......... ..... ............ ...... 96 5.4. Права доступа к памяти, принятые по умолчанию ........................................... 98 5.5. Операции побитовоrо доступа .............................................................................. 99 5.5.1. Преимущества использования метода bit band............................................ 103 5.5.2. Битовые операции с данными разной разрядности ................................... 106 5.5.3. Битовые операции в Си проrраммах .............................................................. 106 5.6. Обращения к невыровненным данным ............................................................. 107 5.7. Монопольный доступ ............................. .......... ....... .... ... ..... ................ ........ ... ....... 109 5.8. Порядок расположения байтов ............................................................................111 fJIaIJa (). ()(:()() III1()(:1fIlI' CilIlI Ciцllll C()rt x M ........................ 11 6.1. Конвейер.................................................................................................................. .114 6.2. Подробная блок схема . ......... ................. .......... ..... ... ... ....... ................. .......... ........ 116 6.3. Интерфейсы шин в процессоре Cortex M3........................................................ 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ие интерфейсы процессора Cortex M3....................................................... 121 6.5. Внешняя шина РРВ ... .................................... ... .... ... .... .... ..................... ................. 121 6.6. Типичная схема подключения процессора....................................................... 122 6.7. Виды сброса и сиrналы сброса............................................................................. 124 lICiBCi 7. исКlIю'l lIи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. Ещё раз о значении EXC RETURN ..................................................................... 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()rtex M ................................. 174 10.1. Общие сведения ...... .... ..... .... .... ..... ..... .... .... ...... .... ..... ...... .... .... ..... ..... .... ..... ..... .... ..174 10.2. Типичный процесс разработки ПО ...................................................................174 10.3. Использование языка Си.................................................................................... 175 10.3.1. Компиляция простой Си проrраммы в пакете RVDS ...............................176 10.3.2. Компиляция простой Си проrраммы в пакете MDK ARM ................... 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. Метод bit band и семафоры ................................................................................. 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?AllJ T1\I.[A ........................................................................................... 233 lIaBa 13. MOA)'lIlJ аЩИ1fЫ паМJl1fИ MPU ...................................2 4 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'а Cortex M ...........25 14.1. Системный таймер Y TIC .............................................................................. 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. Обзор архитектуры Core ight ......... ..... .......... .... .... ... ... .... ............... ...... ............. 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. Система трассировки в процессоре Cortex M3 ........................................... 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()rtex M .........294 17.1. Выбор устройства с ядром Cortex M3................................................................294 17.2. Средства разработки.... ........ ... ... ...... ..... ... ..... .... ..... ...... .... ......... ....... ... ...... ... ... .... 295 17.2.1. Си компиляторы и отладчики.... .............................. ... ......... .... .................. ..... 296 17.2.2. Поддержка встраиваемых ОС ........... ............ ....... ................................ ........... 297 17.3. Различия между процессорами Cortex M3 ревизий О и 1..............................298 17.3.1. Ревизия 1 замена модуля JTAG DP на SWJ DP....................................... 300 17.4. Различия между процессорами Cortex M3 ревизий 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 процессора Cortex M3? .........................................303 17.6. Различия между процессорами Cortex M3 и Cortex MO ................................ 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()rtex M3 ............................................ 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 . Pa l'a()()1fKa Пl'lIlI()жеllИЙ AlIJI C()rtex M (: 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 MDK ARM К()М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раммирование Cortex M3 в 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()rtex M . СПl'аIJ()'1I1IJIЙ Ma1fel'lIalI ................................... 7:; ]J[l'lIlIожеllllе Б. l() ()И1fllые КОМCiIlДЫ Thumb 11 IJel'<:1I1I aI'XIl1feK1f)'l'bI ARM ...........................4 7 ]J[РlllI()жеllllе ]J. И<:КlIЮ'lеIlIlЯ ПI'()це<:<:()l'а C()rtex M ...............4 8 ]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Й )'Ka a1felIlJ ... ...... ........... ..................... .................... :; 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. 
10.4. Стандарт CMSIS · 185 10.4.2. Области стандартизации Действие стандарта CMSIS распространяется на следующие области: . Уровень аппаратной абстракции для pezucmpOB процессора CortexM. Это касается унифицированных обозначений реrистров контроллера NVIC, блока управления системой SBC, системноrо таймера SYSTICK, модуля MPU, а также ряда функций для использования возможностей контроллера NVIC и ядра процессора. . Унифицированные названия системных исключений. Это позволяет 6пераци онным системам и промежуточному по использовать системные исключения без всяких проблем с совместимостью. . Унифицированная структура заzоловочных файлов. Это облеrчает переход пользо вателей на новые микроконтроллеры с ядром Cortex и улучшает переносимость по. . Единообразная инициализация системы. Каждый производитель микрокон троллеров предоставляет в библиотеке драйверов для своих микроконтролле ров функцию SystemInit(), выполняющую основные операции по конфиrу рированию микроконтроллера, такие как инициализация системы тактиро вания. И опять же, это помоrает новичкам освоить микроконтроллеры с ядром CortexM и облеrчает перенос по. . Стандартные встроенные функции. Встроенные функции, как правило, ис пользуются для вызова команд процессора, которые не MorYT быть сrенериро ваны стандартными конструкциями языка си 1 ). При наличии стандартных встроенных функций значительно увеличиваются возможности повторноrо использования кода и переносимость по. . Общие функции для передачи данных. Это набор интерфейсных функций для типовых коммуникационных интерфейсов, таких как UART, Ethernet и SPI. Блаrодаря наличию в библиотеках драйверов устройств таких функций улуч шается переносимость BCTpoeHHoro по и увеличивается возможность по BTopHoro использования кода. На момент написания книrи данные функции ещё находились в процессе разработки. . Унифицированный метод определения тактовой частоты системы. В драй вере устройства определена rлобальная переменная SystemFrequency, с по мощью которой встраиваемые ОС MorYT настраивать модуль SYSTICK в COOT ветствии с тактовой частотой системы. В стандарте CMSIS определены основные требования к по, обеспечивающие переносимость и возможность повторноrо использования кода. Производители микроконтроллеров MorYT включать в библиотеки дополнительные функции для поддержки своей периферии. Соответственно, использование CMSIS никоим об разом не оrраничивает возможности встраиваемых устройств. 10.4.3. Структура CMSIS Собственно стандарт CMSIS описывает несколько взаимосвязанных уровней. 1) Возможности языка Си/Си++ определены в стандарте ISO/IEC 14882, подrотовленном международной орrанизацией стандартов (ISO) совместно с международной электротехнической комиссией (IEC). 
186 · Fлава 10. Проzраммuрованuе CortexM3 Core Peripheral Access Layer (уровень доступа к периферии ядра) · Определения имён, определения адресов, а также вспомоrательные функции для доступа к реrистрам и периферии ядра процессора. Middleware Access Layer (уровень доступа промежуmОЧНО20 по) · Общие методы для обращения к периферийным устройствам для разработчи ков ПО (в процессе разработки). · Поддержка коммуникационных интерфейсов, таких как Ethernet, UART и SPI. · Позволяет переносимому ПО осуществлять обмен данными на любом микро контроллере с ядром Cortex, поддерживающем требуемый коммуникацион ный интерфейс. Device Peripheral Access Level (уровень доступа к периферии устройства, определяется производителем микроконтроллера) · Определения имён, определения адресов и вспомоrательные функции для об ращения к периферийным устройствам. Access Functions for Peripherals (функции доступа к периферии, определяются производителем микроконтроллера) · Опциональные дополнительные функции для работы с периферийными устройствами. Место каждоrо из уровней в иерархии CMSIS показано на Рис. 10.7. мси Уровень попЬЗ0 ватепя RTOS CMSIS Рис. 10.7. Структура CMSIS. 
10.4. Стандарт CMSIS . 187 10.4.4. Использование стандарта CMSIS Поскольку стандарт CMSIS, условно rоворя, «внедрён» В библиотеки драйве ров устройств, то для ero использования в проекте не требуется предпринимать никаких специальных мер. Для каждоrо микроконтроллера производитель пре доставляет заrоловочный файл <device>.h, который, в свою очередь, содержит директивы вставки дополнительных заrоловочных файлов, требуемых библиоте кой драйвера устройства, в том числе и заrоловочный файл уровня доступа к пе риферии ядра, разработанный компанией ARM (Рис. 10.8). О пр пе r ........ corecm3.h пределения номеров r ........ ерываний и реrиаров corecm3.c риферийных уаройав \..  / <device> .h ""'1 system <device>.h /" ........ r ""'\ r-.. system <device>.c Файлы со аартовым коде  N r-.. \.. ./ \. \. r "" Различные варианты aapToBoro Оаальные заrоловочные ода для разных инарументариев файлы \.. Уровень доступа к периферии ядра Описания вароенных функций Сиаемные функции, включая функцию инициализации (объявления) Сиаемные функции, включая функцию инициализации (описания) к Уровень доступа к периферии уаройава и дополнительные функции доступа Рис. 10.8. Файлы CMSIS. Файл core сmЗ. h содержит определения реrистров периферийных устройств и описания функций доступа к периферии процессора CortexM3, Ta кой как контроллер NVIC, реrистры управления системой и реrистры системно ro таймера SYSTICK. Файл core  сmЗ. h также содержит объявления встраивае мых функций стандарта CMSIS, позволяющих использовать команды процессо ра, которые не MorYT быть сrенерированы при использовании стандартных KOH струкций языка. Кроме Toro, этот файл содержит описание функции для вывода отладочной информации через модуль ITM. Следует заметить, что имена некоторых встроенных функций CMSIS MorYT совпасть с именами встроенных функций компилятора, однако функции CMSIS не зависят от используемоrо компилятора. Файл core  сmЗ. с содержит описания встроенных функций CMSIS, которые не MorYT быть реализованы в файле core  сmЗ. h в виде макроопределений. Файл system <device>.h содержит объявление, а файл system  <device>.c  описание функции Systemlnit(), предназначенной для инициализации системы (реализация этой функции зависит от KOHKpeTHoro ми кроконтроллера). 
188 · Fлава 10. ПрО2раммuрованuе CortexM3 в самом файле <device>.h содержатся определения номеров прерываний и реrистров периферийных устройств KOHKpeTHoro устройства. Кроме Toro, СМSISсовместимые драйверы устройств также содержат CTapTO вый код (с таблицей векторов) для всех поддерживаемых компиляторов, а также СМSISверсии встроенных функций, что позволяет встроенному ПО использо вать все возможности ядра независимо от применяемоrо компилятора. Примеры использования стандарта CMSIS можно найти на сайтах производи телей микроконтроллеров. Подобные примеры также можно найти в самих би блиотеках драйверов. Кроме Toro, вы можете заrрузить с сайта www.oпarт.coт пакет CMSIS, содержащий при меры и документацию. В этом же па кете можно найти документацию на функции общеrо назначения. Простейший пример использования стандарта CMSIS при разработке соб cTBeHHoro приложения показан на Рис. 10.9. Чтобы воспользоваться функциями CMSIS для конфиrурирования прерываний и исключений, необходимо задей ствовать константы, определённые в файле <device>.h. Значения указанных констант отличаются от номеров исключений, используемых реrистрами ядра, например реrистром IPSR. В CMSIS дЛЯ системных исключений используются отрицательные значения, а для прерываний периферии  положительные. # include "veпdor  device. h" / / Например, // lrnЗsсrnsis.h для микроконтроллеров Texas Instrurnents // LPC17xx.h для микроконтроллеров NXP // strnЗ2fl0х.h для микроконтроллеров ST Унифицированное имя функции инициализации системы (начиная с версии 1.30 CMSIS эта функция вызывается из cтapToBoro кода) Настройка контроллера NVIC NVIC  SetPrior i ty (UARTl  IRQn, ОХО); } peДCТBOM функций доступа к ядру NVIC EnableIRQ(UARTl IRQn);    Номера прерываний, ... определённые в <device.h> {  void rnain(void) Systernlni t () ; } void UARTlIRQHandler Имена обработчиков прерываний зависят от KOHKpeTHoro устройства и определяются в файле со стартовым KOДO void SysTickHandler(void) Имена обработчиков системных исключений одинаковы для всех ми кроконтроллеров семейства Cortex Рис. 10.9. Прим.ер использования CMSIS. Чтобы создать переносимое приложение, вы должны использовать для обра щения к процессору и периферийным устройствам функции доступа к ядру и функции промежуточноrо ПО соответственно. Это позволит вам перенести приложения с одноrо микроконтроллера на друrой с минимальными усилиями. Более подробно СМSISфункции, как общеrо назначения, так и встроенные, описаны в Приложении ж. 
10.4. Стандарт CMSIS . 189 10.4.5. BbIroAa ОТ использования CMSIS и всё же, что стандарт CMSIS даёт конечному пользователю! Прежде Bcero, стандарт CMSIS значительно улучшает переносимость и увели чивает возможность повторноrо использования проrраммноrо кода. Следование этому стандарту не только облеrчает переход между разными микроконтролле рами с ядром CortexM3, но и позволяет ускорить процесс переноса проrраммно ro обеспечения с процессора CortexM3 на друrие процессоры линейки CortexM, тем самым сокращая время вывода продукта на рынок. Для разработчиков встраиваемых ОС и промежуточноrо ПО выrода от ис пользования стандарта CMSIS rораздо существеннее. Применение этоrо CTaHдap та позволит обеспечить совместимость их продукции с драйверами устройств для микроконтроллеров самых разных производителей, в том числе и для тех устройств, которые пока существуют только на бумаrе (Рис. 10.10). Если не ис пользовать CMSIS, то поставщики ПО должны либо предоставлять небольшую библиотеку функций для работы с ядром CortexM3, либо разрабатывать множе ство конфиrураций для своей продукции, позволяющих ей работать с библиоте ками от различных производителей микроконтроллеров. Приложение Вараиваемая ОС/ промежуточное ПО Приложение Вараиваемая 0(/ промежуточное ПО Библиотека драйверов от производителя ОС/ промежуточноrо ПО Библиотека драйверов с использованием CMSIS от производителя микроконтроллера Библиотека драйверов от производителя микроконтроллера Периферия Процессорное ядро Периферия Процессорное ядро В отсутствие CMSIS вараиваемые ОС и промежуточное ПО должны содержать функции доступа к процессорному ядру и, возможно, драйверы некоторых периферийных уаройав Рис. 10.10. Стандарт CMSIS как средство против дублирования кода. При наличии CMSIS вараиваемые ОС и промежуточное ПО MOryт использовать унифицированные функции доступа к ядру из библиотеки драйверов Стандарт CMSIS очень нетребователен к памяти (необходимо менее 1 Кбайт для всех функций доступа к ядру и несколько байтов ОЗУ). Он также позволяет избежать дублирования кода драйвера периферии ядра при повторном исполь зовании кода из друrоrо проекта. Поскольку стандарт CMSIS поддерживается мноrими разработчиками KOM пиляторов, для компиляции встраиваемоrо ПО можно использовать самые раз ные компиляторы. Это позволяет разрабатывать встраиваемые ОС и промежу.. точное ПО, которые были бы независимы как от производителей микроконтрол леров, так и от производителей средств разработки. До появления стандарта 
190 . fлава 10. Проzраммuрованuе CortexM3 CMSIS в каждом компиляторе были, как правило, свои собственные встроенные функции, что затрудняло перенос ПО на друrой компилятор. Поскольку все СМSISсовместимые библиотеки драйверов устройств имеют одинаковую структуру, значительно облеrчается изучение новых микроконтрол леров CortexM3 (проrраммный интерфейс практически не меняется, т.е. нет He обходимости изучать новый API). В тестировании стандарта CMSIS принимало участие множество людей; KpO ме Toro, он совместим с требованиями MISRA 1 ). Всё это позволяет уменьшить за траты на тестирование ПО, необходимое при разработке собственных функций работы с ядром или контроллером NVIC. 10.5. Использование ассемблера Небольшие проекты MorYT быть целиком и полностью описаны на ассемблере. Однако следует учесть, что для начинающих разработчиков это часто оказывает ся довольно сложной задачей. Используя ассемблер, вы можете по максимуму оптимизировать код приложения так, как считаете необходимым; правда, такой подход чреват увеличением времени разработки, а также появлением различных ошибок. Кроме Toro, обработка сложных структур данных на языке ассемблера, так же как и управление библиотеками функций, может оказаться весьма нетри виальной задачей. И тем не менее, даже при написании приложения на языке Си может возникнуть необходимость в использовании ассемблера: · для реализации функций, которые не MorYT быть написаны на Си, например функций, напрямую манипулирующих содержимым стека или использую щих специальные команды, которые не MorYT быть получены с помощью CTaH дартных конструкций языка; · для написания процедур, критичных ко времени выполнения; · при оrраниченных объёмах памяти, что требует написания части проrраммы на ассемблере для получения как можно более компактноrо кода. 10.5.1. Интерфейс между ассемблером и Си Рано или поздно ассемблерному коду приходится взаимодействовать с про rраммой, написанной на языке Си: · при использовании BCTpoeHHoro ассемблера (или, в случае средств GNU, iпliпеассемблера) в тексте проrраммы на Си; · при вызове из проrраммы на Си функции или процедуры, написанной на ac семблере и реализованной в отдельном файле; · при вызове из ассемблерной проrраммы процедуры или функции, написан ной на Си. При этом необходимо чётко представлять себе, каким образом осуществляет ся передача параметров в вызываемую функцию и возврат результата её работы в вызывающую проrрамму. Механизм TaKoro взаимодействия детально описан в стандарте AAPCS [5]. 1) Motor Industry Software Reliability Association  Ассоциация по вопросам надёжности проrраммноrо обеспечения в автомобильной промышленности.  Прuмеч. пер. 
10.5. Использование ассемблера. 191 в простейших случаях для передачи параметров используются реrистры RO...R3 процессора, при этом в реrистре RO передаётся lй параметр, в реrистре Rl  2й и т.д. Аналоrично, реrистр RO используется для передачи значения, воз вращаемоrо вызываемой функцией. Реrистры RO.. .R3 и R12 MorYT изменяться в функции или процедуре, тоrда как содержимое реrистров R4...Rll должно co храняться при входе в подпроrрамму и восстанавливаться при выходе из неё. Обычно для этой цели используют стек. Необходимо отметить, что при меры, имеющиеся в книrе, не в полной мере следуют рекомендациям стандарта AAPCS  это было сделано для Toro, чтобы облеrчить их понимание. При вызове Сифункции из ассемблерной проrраммы нужно учитывать возможность изменения реrистров RO.. .R3 и R12. Если coдep жимое этих реrистров потребуется в дальнейшем, то их необходимо сохранить в стеке перед вызовом функции и восстановить из стека после возврата из неё. Поскольку в примерах вызываются, rлавным образом, только ассемблерные про цедуры и функции, которые изменяют лишь некоторые реrистры или же BOCCTa навливают содержимое реrистров перед возвратом, сохранять реrистры RO.. .R3 и R12 нет необходимости. 10.5.2. Проrраммирование на ассемблере...... первые шаrи в этой rлаве приводится несколько учебных проrрамм, написанных на acceM блере. Конечно же, в своей практической деятельности вы в большинстве случа ев будете проrраммировать на Си. Однако изучая ассемблерные проrраммы, можно лучше разобраться в том, как использовать процессор CortexM3. Приве дённые ниже примеры написаны на ассемблере ARM (armasm) из состава пакета разработки RVDS. Ассемблер, имеющийся в пакете проrрамм MDKARM компа нии КеН, задействует HeMHoro друrие параметры командной строки. При исполь зовании друrих ассемблеров потребуется изменить соответствующим образом формат файла и синтаксис команд. Необходимо также отметить, что вам, как правило, не нужно беспокоиться о создании cTapToBoro кода на ассемблере, по скольку мноrие средства разработки предоставляют ero уже в rOToBoM виде. Наша первая проrрамма будет выrлядеть следующим образом: STACK тор EQU Ох20002000 ; Начальное значение SP (константа) AREA IHeader Code 1, СОDЕ DСD STACK тор Вершина стека DСD Start ; Вектор сброса ENTRY ; Обозначает точку входа в проrрамму Start ; Начало основной проrраммы ; Инициализируем реrистры MOV rO, #10 ; Начальное значение счётчика цикла MOV r1, #0 ; Начальное значение результата ; Будем вычислять 10 + 9 + 8 +...+ 1 loop АDD r1, rO SUBS rO, #1 BNE loop ; Результат deadloop R1 = R1 + RO Декрементируем RO, обновляя флаи (суффикс S) Если RO не равен О, переходим к метке loop сложения  в R1 
192 . Тлава 10. Проzраммuрованuе CortexM3 в deadloop; Бесконечный цикл END ; Конец файла В этой простейшей проrрамме задаётся начальное значение указателя стека SP, начальное значение счётчика команд РС, после чеrо в цикле выполняются Tpe буемые вычисления. При использовании инструментальных средств пакета RealView компании ARM ассемблирование данной проrраммы можно выполнить с помощью следу ющей командной строки: $> armasm cpи соrtехmЗ o testl.o testl.s Ключ o применяется для указания имени выходноrо объектноrо файла (testl.o). Для создания образа исполняемой проrраммы (ELF) необходимо ис пользовать компоновщик, который запускается из командной строки со следую щими параметрами: $> armlink rwbase Ох20000000 robase ОхО map o testl.elf testl.o Параметр ro  base определяет начало области, предназначенной только для чтения (ПЗУ памяти проrрамм); в данном случае эта область начинается с адреса ОхО. Аналоrично, параметр rw base определяет начальный адрес об ласти памяти, доступной для чтения и для записи (память данных). Учтите, что в нашей проrрамме нет данных, которые располаrались бы в ОЗ Ключ rnap указывает на необходимость rенерации mарфайла, который может приrодиться для изучения распределения памяти в скомпилированном образе. И в завершение, создадим двоичный образ: $> fromelf bin output testl.bin testl.elf Чтобы убедиться в том, что полученный образ соответствует исходному TeK СТУ, можно сrенерировать файл листинrа, содержащий дизассемблированный код проrраммы: $> fromelf c output testl.1ist testl.elf Если всё прошло нормально, то вы можете заrрузить полученный образ (ELF или двоичный) в микроконтроллер или симулятор для тестирования проrрам мы. 10.5.3. ВЫВОД результатов работы nporpaMMbI Разумеется, rораздо интереснее, если наш микроконтроллер может взаимо действовать с окружающим миром. Самым простым вариантом TaKoro взаимо действия является включение/выключение светодиода. Однако этот способ Haxo дит довольно оrраниченное применение, поскольку ero информативность чрез вычайно мала. Одним из наиболее широко используемых способов вывода ин формации является передача текстовых сообщений. При разработке встраивае мых устройств для этоrо, как правило, при меняется интерфейс UART. ДЛЯ OTO бражения получаемой информации можно задействовать, например, компьютер под управлением ОС Windows!) с проrраммой HyperTerminal, работающей в pe жиме консоли (Рис. 10.11). l)Windows и HyperTerminal являются товарными знаками компании Мiсrоsоft Corporation. 
10.5. Использование ассемблера · 193 Ми кроконтроллер CortexM3 Преобра З0ватель уровней Проrрамма HyperTerminal под управлением ОС Windows Рис. 10.11. Недороzая тестовая система, в которой используется вывод текстовых сообщений. в самом процессоре CortexM3 нет интерфейса UART, однако соответствую щие модули имеются в большинстве микроконтроллеров с процессором CortexM3. Спецификации данных модулей определяются производителями конкретных микроконтроллеров, поэтому мы не будем заострять на этом внима ние. Наш следующий при мер написан в расчёте на то, что в модуле UART исполь зуемоrо микроконтроллера имеется флаr состояния, показывающий rOToBHoCTb буфера передачи к заrрузке новых данных. Для подключения микроконтроллера к компьютеру потребуется также преобразователь уровней, поскольку уровни напряжений интерфейса RS232 отличаются от лоrических уровней, имеющихся на выводах микроконтроллера. Интерфейс UART  далеко не единственное решение для вывода текстовых сообщений. В процессоре CortexM3 реализовано несколько механизмов, облеr чающих вывод отладочных сообщений: . Seтihostiпg. Механизм полухостинrа (вывод сообщений с помощью функции printf через отладчик) может быть задействован при помощи реrистра управления отладкой контроллера NVIC (возможность применения этоrо Me ханизма зависит от KOHKpeTHoro отладчика и используемой библиотеки). Бо лее подробно данный вопрос рассматривается в [лаве 15. При использовании данноrо механизма вы можете задействовать в своей проrрамме стандартную функцию printf для вывода информации в консоль/стандартный поток BЫ вода (STDOUT) проrраммы отладчика. . Iпstruтeпtatioп trace. Если в микроконтроллере с ядром CortexM3 реализован специальный порт трассировки, а в вашем распоряжении имеется анализатор порта трассировки (Trace Port Analyzer  ТРА), то вместо модуля UART вы можете использовать для вывода отладочных сообщений модуль ITM. Порт трассировки работает rораздо быстрее UART и позволяет реализовать боль шее число каналов передачи данных. . Iпstruтeпtatioп trace via Serial Wire Viewer (SVW). В качестве альтернативы процессор CortexM3 (lй и последующих ревизий) также поддерживает рабо ту модуля интерфейса порта трассировки TPIU в режиме SVW. Этот интер фейс позволяет считывать данные с выхода модуля ITM, используя недороrие устройства вместо анализаторов порта. Однако модуль TPIU в режиме SVW имеет оrраниченную полосу пропускания, поэтому данный механизм не 
194 · Тлава 10. Проzраммuрованuе CortexM3 очень rодится в случае больших объёмов данных (скажем, при трассировке исполняемых команд). 10.5.4. Проrрамма «Hello World» Прежде чем приступить к написанию проrраммы «Неllо World», мы должны понять, каким образом производится передача одиночных символов по интер фейсу UART. Код, выполняющий эту операцию, можно оформить в виде подпро rpaMMbI, которая, в свою очередь, будет вызываться друrими функциями вывода сообщений. Тоrда при смене устройства вывода нам потребуется изменить толь ко эту подпроrрамму, после чеrо все текстовые сообщения можно будет выводить на друrое устройство. TaKoro рода модификацию кода обычно называют перена правлением (retargeting). Ниже приведён код простейшей подпроrраммы для вывода одноrо символа: UARTOBASE EQU Ох4000СООО UARTO FLAG EQU UARTO BASE+Ox018   UARTO DАТА EQU UARTO BASE+OxOOO   Putc Подпроrрамма вывода одноrо символа через UART Вход: RO  передаваемый символ PUSH {Rl,R2, LR} ; Сохраняем реrистры LDR Rl,=UARTOFLAG PutcWaitLoop LDR R2, [Rl] Читаем флаrи состояния TST R2, #Ох20 Проверяем флаr буфера передачи BNE PutcWaitLoop ; Если полон, то проверяем снова LDR Rl,=UARTO DАТА Иначе STRB RO, [Rl] Заrружаем данные в буфер передачи РОР {Rl,R2, РС} Возвращаемся Адреса реrистров и определения битов в данном коде приведены лишь для примера; вам, скорее Bcero, придётся изменить эти значения в соответствии с ис пользуемым устройством. Кроме Toro, в некоторых модулях UART может потре боваться более сложная процедура проверки состояния перед заrрузкой символа в буфер передачи. Для инициализации модуля UART вызывается отдельная под проrрамма (UartOInitialize), реализация которой будет зависеть от KOHKpeT Horo модуля, в связи с чем она не приводится в этой rлаве. При мер инициализа ции модуля UART для микроконтроллера LM3S811 производства Texas Instruments, написанный на языке Си, приведён в [лаве 20. Теперь мы можем использовать нашу подпроrрамму для создания различных функций, осуществляющих вывод текстовых сообщений: Puts Подпроrрамма вывода строки через UART ; Вход: RO = адрес начала строки ; Строка должна завершаться нулевым символом PUSH {RO ,Rl, LR} Сохраняем реrистры MOV Rl, RO Копируем адрес в Rl, поскольку RO будет использоваться для передачи символа в Putc PutsLoop LDRВ RO, [Rl],#l CBZ RO, PutsLoopExit ; Читаем один символ и инкрементируем адрес Если символ нулевой, то выходим из цикла 
10.5. Использование ассемблера · 195 Putc PutsLoop Выводим символ в UART Следующий символ BL В PutsLoopExit РОР {RO, Rl, РС} Возвращаемся Используя эту подпроrрамму, мы, наконец, можем написать нашу первую проrрамму «Неllо World»: STACK ТОР EQU Ох20002000; Константа, содержащая начальное значение SP UARTO BASE EQU Ох4000СООО UARTO FLAG EQU UARTO BASE+Ox018   UARTO ОАТА EQU UARTO BASE+OxOOO   AREA I Header Codel, СООЕ ОСО STACK ТОР Начальное значение указателя стека ОСО Start ; Вектор сброса ENTRY Start ; Начало основной про:rраммы MOV rO, #0 ; Инициализируем ре:rистры MOV rl, #0 MOV r2, #0 MOV rЗ, #0 MOV r4, #0 BL UartOInitialize Инициализируем UARTO LDR rO,=HELLOTXT Заносим в RO адрес начала строки BL Puts deadend В deadend ; ; Бесконечный цикл ; Подпро:rраммы ; Puts Подпро:rрамма вывода строки через UART ; Вход: RO = адрес начала строки ; Строка должна завершаться нулевым символом PUSH {RO ,Rl, LR} Сохраняем ре:rистры MOV Rl, RO Копируем адрес в Rl, поскольку RO будет использоваться для передачи символа в Putc PutsLoop LDRB RO, [Rl],#l CBZ RO, PutsLoopExit BL Putc В PutsLoop PutsLoopExit РОР {RO, Rl, РС} Читаем один символ и инкрементируем адрес Если символ нулевой, то выходим из цикла Выводим символ в UART Следующий символ Putc ; Возвращаемся ; Подпро:rрамма вывода одно:rо символа через UART ; Вход: RO  передаваемый символ PUSH {Rl, R2, LR} ; Сохраняем ре:rистры LDR Rl,=UARTOFLAG PutcWaitLoop LDR TST BNE LDR R2 , [ Rl ] R2, #Ох20 PutcWaitLoop Rl,=UARTO DАТА Читаем фла:rи состояния Проверяем фла:r буфера передачи Если полон, то проверяем снова Иначе 
196 · Тлава 10. Проzраммuрованuе CortexM3 STR RO, [R1 ] РОР {R1, R2, РС} ; Заrружаем данные в буфер передачи ; Возвращаемся ; UartOlnitialize ; Зависит от устройства, здесь не приведено ВХ LR ; Возвращаемся ; HELLO ТХТ ОСВ «Hello world\n»,O ; Строка, завершающаяся нулевым символом END ; Конец файла Единственное, что вам осталось сделать,  это вставить в проrрамму код под проrраммы UartOInitialize и откорректировать значения адресов реrистров UART, расположенные в начале проrраммы. Также нелишне было бы иметь ряд подпроrрамм для вывода содержимоrо pe rистров. Эти подпроrраммы MorYT базироваться на уже написанных подпро rpaMMax Putc и Puts. Первая подпроrрамма предназначена для вывода шестнад цатеричных значений. PutHex ; Подпроrрамма вывода содержимоrо реrистра в шестнадцатеричном виде ; Вход: RO = выводимое значение PUSH {RОRЗ, LR} MOV RЗ, RO MOV BL MOV BL MOV MOV PutHexLoop ROR RЗ, R2 AND RO, RЗ,#ОхF ; СМР RO, #ОхА ITE GE ADDGE RO, #55 Если больше или равно 10, преобразуем в «A»«F», ADDLT RO, #48 иначе преобразуем в «0»«9» BL Putc Выводим один шестнадцатеричный разряд SUBS R1, #1 Декрементируем счётчик цикла BNE PutHexLoop Если переданы все 8 шестнадцатеричных разрядов, РОР {RОRЗ, РС} ; то возвращаемся, иначе обрабатываем следующие 4 бит Эта подпроrрамма полезна для вывода значений реrистров. Однако иноrда желательно выводить содержимое реrистров в десятичном виде. Не пуrайтесь, в процессоре CortexM3 данная операция реализуется леrко и быстро блаrодаря наличию команд аппаратноrо умножения и деления. Ещё одна проблема заклю чается в том, что выходные символы, получаемые в процессе преобразования, будут располаrаться в обратном порядке. Поэтому нам потребуется промежуточ ный буфер для хранения указанных символов. После завершения преобразова ния мы выведем полученную строку при помощи функции Puts. В данном при мере текстовый буфер размещается в стеке: RO,#'O' Putc RO,#'x' Putc R1, #8 R2, #28 Сохраняем входной параметр в RЗ, поскольку RO используется для передачи параметров в друrие подпроrраммы Выводим «Ох» Инициализируем счётчик цикла ; Задаём смещение Сдвиrаем значение на 4 бит влево (на 28 бит вправо) Выделяем младшие 4 бит Преобразуем в ASCII 
10.5. Использование ассемблера · 197 R4 = RO / 10 R1 = R4 * 10 ; R2 = RO  (R4 * 10) = остаток Преобразуем в ASCII (R2 должен содержать от О до 9 ) Кладём АSСIIсимвол в буфер (с прединдексацией) Заносим в RO результат деления и устанавливаем флаr Z, если R4 = О Если RO (R4) уже равно О, значит, больше ; десятичных разрядов нет MOV RO, RЗ ; Заносим в RO адрес начала буфера BL Puts Выводим строку, используя подпроrрамму Puts АОО SP, SP, #12 ; Восстанавливаем указатель стека РОР {ROR5, РС} Возвращаемся Блаrодаря различным возможностям, предоставляемым набором команд про цессора CortexM3, мы смоrли написать очень компактную процедуру преобра зования числовых значений в десятичный текстовый формат. PutDec PutDecLoop Подпроrрамма вывода содержимоrо реrистра в десятичном виде ; Вход: RO = выводимое значение ; Поскольку реrистр З2битный, то максимальное число символов ; в десятичном формате, включая завершающий нулевой символ, равно 11 PUSH {ROR5, LR} ; Сохраняем реrистры MOV RЗ, SP Копируем указатель стека в RЗ SUB SP, SP, #12 Резервируем 12 байт под текстовый буфер MOV R1, #0 Нулевой символ STRB R1, [RЗ, #1]! Кладём нулевой символ в конец буфера, используем операцию пересылки с прединдексацией MOV R5, #10 Задаём делитель UDIV R4, MUL R1 , S UB R2 , АОО R2, RO, R5 R4, R5 RO, R1 #48 S TRB R2, [RЗ , #  1] ! MOVS RO, R4 BNE PutDecLoop 10.5.5. Использование памяти данных Вернёмся к нашему первому примеру: на этапе компоновки мы указали об ласть памяти, доступную как для чтения, так и для записи. Как же нам разме стить в ней данные? Для этоrо в ассемблерном файле необходимо определить об ласть данных. Взяв за основу пример, приведённый в начале rлавы, мы можем co хранить данные в памяти данных по адресу Ох20000000 (область СО3У). Располо жение секции данных определяется ключами командной строки при вызове KOM поновщика: STACK ТОР Start EQU Ох20002000 ; Константа, содержащая начальное значение SP AREA I Header Codel, СООЕ ОСО STACK ТОР Начальное значение SP ОСО Start ; Вектор сброса ENTRY ; Начало основной проrраммы ; Инициализируем реrистры MOV rO, #10 ; Начальное значение счётчика цикла MOV r1, #0 ; Начальное значение результата Будем вычислять 10 + 9 + 8 +...+ 1 
198 · Тлава 10. Проzраммuрованuе CortexM3 loop ADD rl, rO ; SUBS rO, # 1 BNE loop LDR rO,==MyDatal STR rl, [rO] deadloop Rl == Rl + RO Декрементируем RO, обновляя флаrи (суффикс S) Если RO не равен О, то переходим к метке loop Результат сложения  в Rl Заrружаем адрес ячейки MyDatal в RO Сохраняем результат в MyDatal в deadloop Бесконечный цикл AREA I Header Datal, DATA ALIGN 4 DCD О ; Ячейка памяти для хранения результата DCD О END ; Конец файла Компоновщик разместит секцию ОАТА в области перезаписываемой памяти, поэтому в данном случае переменная MyDatal будет располаrаться по адресу Ох20000000. MyDatal MyData2 10.6. МОНОПОЛЬНЫЙ доступ и семафоры Команды монопольноrо доступа применяются для реализации семафоров, в частности семафоров взаимных исключений (мьютексов), позволяющих rapaH тировать использование какоrолибо ресурса только одной задачей. В качестве при мера представим себе, что переменная DeviceALocked, расположенная в па мяти, предназначена для индикации использования устройства А. Если задача хочет задействовать устройство А, то она должна сначала проверить ero состоя ние, прочитав переменную DeviceALocked. Если её значение равно нулю, то за дача может записать в неё 1 для блокирования устройства. После Toro как надоб ность в устройстве отпадёт, задача может обнулить переменную DeviceALocked, предоставляя возможность использовать это устройство друrим задачам. Что произойдёт, если две задачи попытаются одновременно обратиться к устройству А? В этом случае существует вероятность, что обе задачи, прочитав переменную, получат нулевое значение. После этоrо обе попытаются записать в неё 1 для блокирования устройства, и в результате каждая задача будет пребы вать в полной уверенности, что она имеет исключительный доступ к устройству. Чтобы описанной ситуации не возникало, используются команды исключитель Horo доступа. Команда STREX возвращает значение, показывающее, была ли опе рация сохранения успешной. Если обе задачи одновременно попытаются забло кировать устройство, то будет возвращена 1 (отказ доступа), и задача будет знать, что ей необходимо повторить блокирование устройства. Некоторые базовые сведения о командах монопольноrо доступа приведены в [лаве 5. Блоксхема, отображающая рассмотренную выше ситуацию, приведена на Рис. 10.12. Ниже приведена подпроrрамма, выполняющая указанные операции с ис пользованием функций стандарта CMSIS. Заметьте, что при отказе доступа опе рация записи данных командой STREX не выполняется, что предотвращает YCTa новку бита блокировки: 
10.6. Монопольный доступ u семафоры · 199 Читаем бит блокировки Монопольное чтение (например, LDREX) Бит уаановлен? Уаанавливаем бит блокировки Монопольная запись (например, S TREX) Неудача. Бит блокировки уже уаановлен (запрашиваемый ресурс уже используется друrим процессом или процессором) Статус операции моноп. записи = О (успех) ? Неудача. Друrой процесс или процессор обратился к облааи памяти, содержащей бит блокировки Успех. Бит блокировки уаановлен и процессор может обращаться к разделяемому ресурсу Рис. 10.12. Использование команд монопОЛЬНО20 доступа для реализации семафоров. volatile unsigned int DeviceALocked; // Флаr блокировки int LockDeviceA(void) { unsigned int status; // Переменная для хранения статуса выполнения STREX // Читаем флаr блокировки и проверяем ero состояние if (LDREXW(&DeviceALocked) = О) { // Если блокировки нет, то пытаемся установить флаr status = STREXW(l, &DeviceALocked); if (status != О) return (1); // Возвращаем «отказ доступа» else return(O); // Возвращаем «успех» else { return(l); // Возвращаем «отказ доступа» Аналоrичную функцию можно написать и на ассемблере: LockDeviceA Простая функция для блокирования устройства А Возвращаемое значение (RO) : О = «успех», 1 = «отказ В случае успеха в переменную DeviceALocked заносится PUSH {R1, R2, LR} TryToLockDeviceA LDR R1,=DeviceALocked LDREX R2, [R1] СМР R2,#0 BNE LockDeviceAFailed DeviceAIsNotLocked MOV RO,#l STREX R2, RO, [Rl] СМР R2, #0 BNE LockDeviceAFailed LockDeviceASucceed MOV RO,#O РОР {R1, R2, РС} доступа» 1 Получаем состояние блокировки Заблокировано? Пытаемся записать 1 в DeviceALocked Монопольная запись STREX не прошла Возвращаем «успех» Возвращаемся 
200 · rлава 10. Проzраммuрованuе CortexM3 LockDeviceAFailed MOV RO,#l ; Возвращаем «отказ доступа» РОР {Rl, R2, РС} ; Возвращаемся Если функция возвращает 1 (отказ в монопольном доступе), то проrрамма должна выждать некоторое время и повторить попытку позже. В однопроцессор ных системах наиболее частой причиной отказа в монопольном доступе служит появление прерывания между командами монопольной заrрузки и монопольно ro сохранения. Если код выполняется на привилеrированном уровне доступа, то возникновение такой ситуации можно предотвратить, установив на некоторое время реrистр маскирования, такой как PRIMASK,  это увеличит вероятность успешноrо блокирования ресурса. В мноrопроцессорных системах возможна и друrая причина отказа в выпол нении команды монопольноrо сохранения  обращение друrоrо процессора к той же области памяти. Факт обращения к памяти друrих процессоров опреде ляется отдельным устройством, которое называется монитором монопольноrо доступа. Этот монитор отслеживает обращения к памяти со стороны друrих Be дущих шины между двумя операциями монопольноrо доступа. Однако, посколь ку в большинстве недороrих микроконтроллеров задействуется только один про цессор CortexM3, в таком мониторе нет никакой необходимости. Используя описанный механизм, мы можем быть твёрдо уверены, что в каж дый момент времени к конкретному разделяемому ресурсу обращается только одна задача. Если приложение не может захватить ресурс в течение KaKoroTo времени, оно должно завершить работу с сообщением об ошибке таймаута. Ta кая ситуация может возникнуть, если задача, заблокировавшая ресурс, аварийно завершится, не сбросив признак блокировки. В подобных случаях использование ресурса конкретныIии задачами должно отслеживаться операционной системой. Если задача завершилась или была прервана, не сбросив признак блокировки, то ОС должна будет разблокировать ресурс. Если процесс начал операцию обращения в монопольном режиме, используя команду LDREX, а затем обнаружил, что монопольный доступ больше не требует ся, он может использовать команду CLREX для очистки локальной записи в мони торе монопольноrо доступа. Эту операцию можно выполнить с помощью функ цИИ CMSIS: void CLREX(void); При проrраммировании на ассемблере просто вставляется команда CLREX: CLREX или CLREX.W В процессоре CortexM3 все операции монопольноrо доступа должны выпол няться последовательно. Если же код, управляющий монопольным доступом, дол жен работать и на друrих процессорах ARM, то между монопольными пересылка ми необходимо вставлять команду барьера памяти данных ОМВ, чтобы rарантиро вать корректный порядок обращений к памяти. При мер использования команд ба рьерной синхронизации с командами монопольноrо доступа можно найти в разде ле 14.3, посвящённом коммуникациям в мноrопроцессорных системах. 
10.7. Метод bitbaпd u семафоры . 201 10.7. Метод bit..band и семафоры Для реализации семафоров можно также воспользоваться побитовым ДOCTY пом по методу bitband при условии, что система памяти поддерживает блокиро ванные пересылки или же к шине памяти подключён только один ведущий. Ис пользуя метод bitband, мы можем реализовать функционал семафоров на языке Си, не прибеrая к помощи операций монопольноrо доступа. В данном случае для управления ресурсами используется переменная (скажем, слово), расположенная в области хранения битов, каждый бит которой показывает, что соответствую щий ресурс используется какойто задачей. Операции записи в область доступа к битам представляют собой блокирован ные пересылки типа «чтениемодификациязапись» (смена ведущеrо шины между пересылками не допускается). Поэтому если каждая задача изменяет толь ко свой бит, то значения битов блокировки друrих задач не будут искажены даже в том случае, если две задачи одновременно попытаются выполнить запись по одному и тому же адресу. В отличие от варианта с использованием команд MOHO польноrо доступа, возможно кратковременное «блокирование» ресурса OДHOBpe менно двумя задачами до тех пор, пока одна из них не обнаружит конфликт и не снимет блокировку (Рис. 10.13). Переменная блокировки ресурсов Значение равно 01 Нет Каждый бит слова указывает на использование Задача 3 ресурса конкретной задачей. Задача 2 Один из битов cooTBeT :J ByeT Задача 1 данной задаче Задача О (например, Задаче 1) Ресурс уже заблокирован одной из задач. Повторим попытку позже Читаем всё слово, coдep жащее биты блокировки Пытаемся заблокировать ресурс установкой бита [1], используя область доступа к битам Снова читаем всё слово, чтобы определить, не был ли ресурс одновременно заблокирован друrой задачей Только бит, установленный данной задачей, равен 1 (значение = Ох2)1 Нет Друrой бит уже уаановлен, ресурс был заблокирован друrой задачей/процессором Сбрасываем бит блокировки данной задачи (бит [1]), используя область доступа к битам Ресурс был успешно захвачен Рис. 10.13. Реализация мьютекса с использованием метода bitbaпd. Использование метода bitband для реализации семафоров будет работать только в том случае, если все задачи в системе будут изменять свои биты блоки ровки исключительно посредтвом области доступа к битам. Если же любая из задач изменит ячейку с битами блокировки, используя обычную операцию запи 
202 . fлава 10. Проzраммuрованuе CortexM3 си, то работа семафора может быть нарушена: в случае, если непосредственно пе ред записью в эту ячейку какойлибо задачей будет установлен бит блокировки, то бит блокировки, установленный ранее друrой задачей, окажется сброшенным. 10.8. Использование команд извлечения битовоrо поля и команд табличных переходов Мы познакомились с командами извлечения беззнаковоrо битовоrо поля (UBFX) и командами табличноrо перехода (ТВВ/ТВН) в [лаве 4. Эти две команды MorYT использоваться вместе для реализации очень развитых деревьев перехо дов. Такие деревья находят широкое применение в приложениях передачи дaH ных, в которых передаваемые данные MorYT иметь различный смысл в зависимо сти от заrоловка сообщения. В качестве примера, давайте рассмотрим ассемблер ную процедуру декодирования дерева решений, изображённоrо на Рис. 10.14. OecodeA LOR RO,=A LOR RO, [RO] UBFX R1, RO, #6, #2 ТВВ [РС, R1] BrTable1 ОСВ ОСВ ОСВ ОСВ OecodeA1 UBFX R1, RO, #3, #2 ТВВ [ РС, R1] BrTable2 ОСВ ОСВ ОСВ ОСВ OecodeA2 TST RO, #4 Считываем значение А из памяти Извлекаем биты [7:6] в R1 ((РО BrTable1)/2) ((DecodeA1BrTable1)/2) ((Р1 BrTable1)/2) ((DecodeA2BrTable1)/2) Переходим к РО, если А[7:6] = 00 Переходим к DecodeA1, если А[7:6] = 01 Переходим к Р1, если А[7:6] = 10 Переходим к OecodeA1, если А[7:6] 11 Извлекаем биты [4:3] в R1 ((Р2 BrTable2)/2) ((Р3 BrTable2)/2) ((Р4 BrTable2)/2) ((Р4 BrTable2)/2) Переходим к Р2, если А[4:3] = 00 Переходим к Р3, если А[4:3] = 01 Переходим к Р4, если А[4:3] = 10 Переходим к Р4, если А[4:3] = 11 Проверяем только 1 бит, поэтому команда UBFX не нужна BEQ Р5 В Р6 РО Process О Р1 Process 1 Р2 Process 2 Р3 Process 3 Р4 Process 4 Р5 Process 5 Р6 Process 6 Как видите, мы смоrли реализовать достаточно большое дерево решений с по мощью весьма компактноrо фраrмента. Если конечные адреса переходов Haxo 
10.8. Использование команд извлечения битовоzо поля и команд табличных переходов · 203 ДЯТСЯ на более далёком расстоянии, то некоторые из команд ТВВ необходимо бу дет заменить на команды ТВН. Д[7:0] Переход кРО Переход кР3 Переход кР4 Переход кР5 Рис. 10.14. Декодер битовО20 поля: пример использования команд UBFX и ТВВ. 
rЛАВА 11 РАБОТА С прЕрыАниями// ИСКЛЮЧЕНИЯМИ 11.1. Использование прерываний Наверное, сложно найти такое встраиваемое приложение, в котором вообще не использовались бы прерывания. В процессоре CortexnIM3 большую часть pa боты по обслуживанию прерываний выполняет контроллер прерываний NVIC. В частности, он осуществляет контроль приоритетов прерываний, а также coxpa нение/восстановление контекста в стеке. Однако, прежде чем вы сможете исполь зовать прерывания в своей проrрамме, вам необходимо будет выполнить ряд операций: · настроить стек; · настроить таблицу векторов прерываний; · задать приоритеты прерываний; · разрешить прерывания. 11.1.1. Конфиrурирование стека в простых приложениях, как правило, используется один (основной) стек. При разработке таких приложений необходимо только зарезервировать под стек область памяти достаточноrо размера и установить указатель MSP на вершину этой области. Не забудьте: при расчёте требуемоrо размера стека необходимо учитывать не только степень ero использования проrраммой, но и максимально возможное число уровней вложенности прерываний. Каждый уровень вложенности требует, как минимум, восемь слов стека. Kpo ме Toro, стек может использоваться и самими обработчиками прерываний. Поскольку в процессоре CortexM3 реализован «полный» убывающий стек, указатель стека обычно устанавливают на конец области статическоrо озу, что бы исключить фраrментацию свободной памяти (Рис. 11.1). 
11.1. Использование прерываний . 205 r, I I , I I I , Периферийные устройства Начальное значение указателя стек. СОЗУ Стек Адрес в памяти Данные } Проrрамма Рис. 11.1. Прuмер пpocmozo распределения памятu. Флэшпамять в более сложных приложениях, задействующих разные стеки для пользова тельскоrо кода и ядра системы, размер OCHoBHoro стека должен быть достаточ ным для поддержки вложенных вызовов обработчиков прерываний, а также для работы ядра. Размер стека процесса должен быть на восемь слов больше, чем Tpe буется для работы пользовательскоrо кода. Этот «довесок» обусловлен тем, что при переходе к обработчику прерывания первоrо уровня контекст пользователь ской проrраммы сохраняется в стеке процесса. 11.1.2. Настройка табяицы векторов прерываний в простых приложениях, использующих неизменяемые обработчики преры ваний, таблица векторов может располаrаться во флэшпамяти или в П3 В этом случае необходимость в какойлибо настройке таблицы во время выполнения проrраммы отсутствует. Однако существуют приложения, в которых обработчи ки прерываний требуется изменять в зависимости от какихлибо условий. В Ta ком случае вам придётся переместить таблицу векторов в область перезаписыва емой памяти. Перед перемещением таблицы векторов необходимо будет скопировать её часть в то место, rде будет располаrаться новая таблица. Копируются адреса BeK торов обработчиков отказов, немаскируемоrо прерывания, системных вызовов и т.п. Если этоrо не сделать, то при возникновении любоrо из указанных исклю чений после перемещения таблицы процессор выберет неверно е значение адреса вектора. После определения требуемых элементов таблицы векторов и перемещения таблицы на новое место мы можем добавлять в неё новые векторы. В CMSIS совместимых библиотеках для конфиrурирования векторов таблицы предусмо трена следующая функция (для обращения к реrистру смещения таблицы BeKTO ров в данной функции используется операция SCB>VTOR): 
206 . fлава 11. Работа с прерыванuямu/uсключенuямu void SetVector(unsigned int ЕхсрТуре, unsigned int VectorAddress) { // Место расположения вектора вычисляется как VTOR + (ExceptionType * 4) *((volatile unsigned int *) (SCB>VTOR + (ЕхсрТуре « 2))) = VectorAddress I Ох1; // 1SB вектора устанавливается в 1 (Thumb) return; Те, кто предпочитает проrраммировать на ассемблере, MorYT использовать подпроrрамму, текст которой приведён в следующем при мере: ; Подпроrрамма для задания вектора исключения по ero номеру ; (Для пользовательских прерываний прибавляем 16: IRQ #0 = исключение W16) SetVector ; Вход: RO = Номер исключения R1 = Значение адреса вектора PUSH {R2, 1R} 1DR R2,=OxEOOOED08 1DR R2, [R2 ] ORR R1, R1, #1 Реrистр смещения таблицы векторов Устанавливаем 1SB вектора, так как используем команды Thumb Заносим вектор по адресу VectTblOffset + ЕхсрТуре*4 РОР {R2, РС} Возвращаемся В большинстве случаев устанавливать младший бит вектора в 1 не требуется, поскольку компилятор или ассемблер должны распознать задаваемое значение как адрес команды 1humb и установить этот бит автоматически. STR R1, [R2, RO, 1S1 #2] 11.1.3. Назначение приоритетов прерываний По умолчанию (после сброса) все исключения с проrраммируемым приорите том имеют нулевой уровень приоритета. Исключения Hard Fault и NMI имеют уровни 1 и 2 соответственно. При использовании СМSISсовместимых библи отек для задания уровня приоритета можно задействовать соответствующую 6и блиотечную функцию. К примеру, установка приоритета прерывания N Q 4, paBHO ro ОхСО, производится следующим образом: NVICSetPriority(IRQ4IRQn, ОхС); // Эта функция // автоматически сдвиrает значение приоритета на число // битов, реализованных в реrистрах уровня приоритета Константа IRQ4  IRQn, упомянутая в примере, является идентификатором прерывания. При вызове функций управления прерываниями стандарта CMSIS рекомендуется применять идентификаторы, определённые в заrоловочном фай ле device. h (см. Рис. 10.8),  это улучшает читабельность проrраммы и её пере носимость. С функцией NVIC  Setpriority можно использовать друrую функцию CTaH дарта CMSIS, которая вычисляет значение уровня приоритета, исходя из значе ний приоритета rруппы, субприоритета и настроек rруппирования приоритетов: NVICSetPriority(IRQ4IRQn, NVICEncodePriority(PriorityGroup, PreemptPriority, SubPriority)); Дополнительная информация об этих функциях приведена в Приложении ж. 
11.1. Использование nрерываний . 207 При проrраммировании на ассемблере мы можем облеrчить себе работу, ис пользуя побайтную адресацию реrистров, например: ; Установка приоритета IRQ #4, paBHoro ОхСО LDR RO, =ОхЕОООЕ400 Базовый адрес реrистров приоритета внешних прерываний LDR Rl, =ОхСО ; Уровень приоритета STRB Rl, [RO, #4] ; Устанавливаем приоритет IRQ #4 (пишем один байт) В процессоре CortexM3 разрядность реrистров приоритета прерываний зада ётся изrотовителем микросхемы. Минимальная разрядность равна трём, а MaK симальная  восьми битам. В СМSISсовместимых драйверах устройств разряд ность реrистров уровня приоритета определяется константой   NVIC  PRIO  BITS. Число реализованных битов также можно определить, записав OxFF в один из реrистров приоритета и прочитав затем ero содержимое. Описанную процедуру можно реализовать следующим образом: ; Определение разрядности поля приоритета LDR RO,=OxEOOOE400 Реrистр приоритета внешнеrо прерывания WO LDR Rl,=OxFF STRB Rl, [RO] LDRB Rl, [RO] RBIT R2, Rl CLZ Rl, R2 Пишем OxFF (однобайтная запись) Считываем обратно (например, ОхЕО при трёх битах) Переставляем биты и сохраняем в R2 (например, ОхО7000000 при трёх битах) Считаем число ведущих нулей (например, Ох5 при трёх битах) MOV R2, #8 SUB R2, R2, Rl Вычисляем реальную разрядность реrистров приоритета (например, 8  5 = 3 при трёх битах) MOV Rl, #ОхО STRB Rl, [RO] Восстанавливаем значение по умолчанию (ОхО) Если вы хотите, чтобы ваше приложение было переносимым, рекомендуется использовать только следующие значения уровней приоритета: ОхОО, Ох20, Ох40, Ох60, Ох80, ОхАО, ОхСО и ОхЕО. Это пожелание связано с тем, что данные уровни приоритета имеются в любом устройстве на базе процессора CortexM3. Не забывайте также задавать приоритеты системных исключений и обработ чиков отказов. Если по какимлибо причинам некоторые важные прерывания в приложении должны иметь приоритет, который выше приоритета остальных системных исключений или обработчиков отказов, то необходимо снизить ypo вень приоритета последних с тем, чтобы эти обработчики моrли прерываться об работчиками важных прерываний. 11.1.4. Разрешение прерываний После настройки таблицы векторов и задания приоритета мы HaKOHeЦTO MO жем разрешить требуемое прерывание. Однако перед этим необходимо выпол нить следующее: 1. Если таблица векторов располаrается в области памяти с буферированием записи, то возможно потребуется применить команду барьера синхронизации данных (DSB), чтобы быть уверенными, что содержимое таблицы векторов полностью обновлено. В большинстве случаев операции 
208 . rлава 11. Работа с прерыванuямu/uсключенuямu записи в память должны завершаться за несколько тактов. Однако если вы хотите обеспечить переносимость своей проrраммы на друrие процессоры ARM, то указанная операция сможет rарантировать выборку KoppeKTHoro значения вектора при возникновении прерывания сразу же после ero разрешения. 2. Поскольку прерывание уже моrло быть отложено или активировано, перед разрешением прерывания настоятельно рекомендуется сбрасывать бит признака отложенноrо прерывания. В частности, запросы прерываний MorYT случайно rенерироваться изза паразитных импульсов, возникающих при подаче питания. Кроме Toro, в некоторых периферийных устройствах, таких как UART, шум на неподключённом входе приёмника может быть ошибочно принят устройством за данные и вызвать отложенное прерывание. Поэтому из соображений безопасности рекомендуется проверять признак отложенноrо прерывания и, при необходимости, сбрасывать ero перед разрешением прерывания. К тому же существуют такие устройства, которые MorYT потребовать повторной инициализации в случае, если при их разрешении признак отложенноrо прерывания уже был установлен. Для разрешения и запрещения прерываний в контроллере NVIC предусмо трены отдельные реrистры. Это позволяет разрешать/запрещать отдельные пре рывания, не затраrивая биты разрешения остальных прерываний. В противном случае, при использовании проrраммных операций типа «чтениемодифика циязапись» существовала бы вероятность потери изменений, сделанных в pe rистрах разрешения обработчиками прерываний. Для разрешения прерывания проrрамма должна определить положение бита, соответствующеrо данному пре рыванию, в rруппе реrистров NVICISERx и записать в этот бит 1. Аналоrичным образом, для запрещения прерывания необходимо записать 1 в соответствую щий бит одноrо из реrистров запрещения NVICICERx. Те, кто пользуются СМSISсовместимыми библиотеками, MorYT задействовать для разрешения/запрещения прерываний функции NVIC  EnableIRQ и NVIC  DisableIRQ, например: NVICEnableIRQ(UARTlIRQn); // Разрешаем прерывание модуля UARTl 
11.2. Обработчики исключений/прерываний . 209 // Значение UART1IRQn зависит от МК и // определяется в файле device.h NVICDisableIRQ(UART1IRQn); // Запрещаем прерывание модуля UART1 Более подробно эти функции описаны в Приложении ж. Те, кто использует ассемблер, MorYT сами написать функции, выполняющие аналоrичные операции. Так на ассемблере может выrлядеть аналоr функции NVIC EnableIRQ: ; Подпроrрамма разрешения EnableIRQ ; Вход: PU8H AND.W MOV 181 AND . W 18R RO = Номер IRQ {ROR2, 1R} R1, RO, #Ox1F R2 , # 1 R2, R2, R1 R1, RO, #ОхЕО R1, R1, #3 прерывания по ero номеру Формируем битовую маску для разрешения прерывания Маска = (Ох1 « (N & Ox1F)) Вычисляем смещение, если номер прерывания больше 31 Смещение = (N/32)*4 (каждое слово содержит ; биты разрешения для 32 прерываний) RO,=OxEOOOE100 Адрес реrистра NVICI8ERO дЛЯ внешних прерываний ; с номерами 31...0 8TR R2, [RO, R1] Пишем маску в соответствующий реrистр NVICI8ERx РОР {ROR2, РС} Восстанавливаем реrистры и возвращаемся А так может выrлядеть аналоr функции NVIC DisableIRQ: ; Подпроrрамма запрещения прерывания по ero номеру DisableIRQ ; Вход: PU8H AND.W MOV 181 AND . W 18R 1DR RO = Номер IRQ {ROR2, 1R} R1, RO, #Ox1F R2, #1 R2, R2, R1 R1, RO, #ОхЕО R1, R1, #3 Формируем битовую маску для разрешения прерывания Маска = (Ох1 « (N & Ox1F)) Вычисляем смещение, если номер прерывания больше 31 Смещение = (N/32)*4 (каждое слово содержит биты разрешения для 32 прерываний) RO,=OxEOOOE180 Адрес реrистра NVICICERO дЛЯ внешних прерываний с номерами 31...0 8TR R2, [RO, R1] Пишем маску в соответствующий реrистр NVICICERx РОР {ROR2, РС} Восстанавливаем реrистры и возвращаемся Также можно написать аналоrичные подпроrраммы для установки и сброса битов реrистров признака отложенноrо прерывания. 1DR 11.2. Обработчики искяючений/прерываний в процессоре CortexM3 обработчики прерываний MorYT быть полностью Ha писаны на Си, тоrда как в процессоре ARM7 в большинстве случаев применяют ся обработчики, написанные на ассемблере, которые rарантируют сохранение всех необходимых реrистров. А при использовании вложенных прерываний He 06ходимо к ТОМУ же переключать режимы работы процессора во избежание поте ри информации. В процессоре CortexM3 ничеrо подобноrо Н,е требуется, что зна чительно упрощает разработку проrраммноrо обеспечения. 
210 . fлава 11. Работа с прерыванuямu/uсключенuямu На языке Си обработчик прерывания может быть описан следующим обра зом: void UARTl Handler(void) { ... // Обработка запроса периферийноrо устройства return; Для корректной инициализации содержимоrо таблицы векторов при исполь зовании СМSISсовместимых библиотек обработчики прерываний должны иметь имена, определённые изrотовителем микроконтроллера. Эти имена можно узнать, посмотрев на описание таблицы векторов в файле со стартовым кодом. В пакете MDKARM компании КеН, например, этот файл называется startup <device>. s. Пользователи компилятора RealView компании ARM или пакета MDKARM компании КеН MorYT для удобочитаемости добавлять к объявлению обработчика ключевое слово irq. Например: irq void UARTlHandler(void) { ... // Обрабатываем запрос IRQ от периферийноrо устройства ... // Снимаем запрос IRQ return; На языке ассемблера простейший обработчик исключения может иметь сле дующий вид: irqlhandler ; Обрабатываем запрос IRQ ; Снимаем запрос IRQ ; Возвращаемся из прерывания ВХ LR Необходимость деактивации IRQ в процедуре обработки прерывания опреде ляется реализацией KOHKpeTHoro периферийноrо устройства. Если устройство формирует запросы прерываний в виде импульсов, то эта операция не требуется. Что же касается процессора CortexM3, то при формировании периферийным устройством запросов прерываний в виде импульсов контроллер NVIC может сохранить запрос, установив бит признака отложенноrо прерывания. При входе в обработчик исключения этот бит автоматически сбрасывается. Данная лоrика отличается от поведения традиционных процессоров ARM, которые требовали, чтобы периферийные устройства удерживали запрос до тех пор, пока он не будет обработан. Это связано с тем, что контроллеры прерываний, разработанные для предыдущих процессоров ARM, таких как ARM7TDMI, не имели памяти для хранения признака отложенноrо прерывания. В тех случаях, коrда периферийное устройство может rенерировать несколько запросов в течение KopoTKoro промежутка времени, это необходимо учитывать при деактивации запроса прерывания, чтобы исключить пропуск какоrолибо запроса. 
11.3. Проzраммные прерЫ8анuя · 211 Часто обработчику прерывания помимо реrистров RO.. .R3 и R12 требуются дополнительные реrистры процессора; их тоже необходимо сохранять. При Ha писании проrраммы на Си проrраммисту не нужно задумываться об этом, по скольку В Сифункциях все используемые реrистры сохраняются автоматически, коrда это необходимо. При использовании же ассемблера в обработчиках преры ваний необходимо предусматривать команды заrрузки в стек и извлечения из стека для сохранения используемых реrистров из диапазона R4.. .Rll. В следующем примере сохраняются все реrистры, которые не были помещены в стек при сохранении контекста. Если какието из реrистров не используются в обработчике исключения, то их можно исключить из списка сохраняемых реrи стров: irqlhandler PUSH {R4Rll, LR} ; Сохраняем все реrистры, которые не были сохранены ; при помещении контекста в стек ; Обрабатываем запрос прерывания ; Снимаем запрос прерывания в периферийном устройстве (опционально) РОР {R4Rll, РС} ; Восстанавливаем реrистры и выходим из обработчика Поскольку команда РОР является одной из команд, позволяющих осуществить возврат из прерывания, мы можем объединить в одной команде операцию BOC становления реrистров с операцией возврата. В зависимости от конструкции периферийноrо устройства, обработчику пре рывания от этоrо устройства может потребоваться обратиться к нему для дeaK тивации запроса прерывания. Если периферийное устройство формирует запрос прерывания в виде импульса, то сбрасывать указанный запрос в обработчике прерывания не требуется. В противном случае, обработчик должен сбрасывать запрос прерывания, чтобы после выхода из обработчика данное прерывание не было отложено повторно. Ещё раз напомню, что в традиционных процессорах ARM периферийные устройства должны удерживать запрос до тех пор, пока он не будет обработан. Если периферийное устройство rенерирует запросы прерываний в виде им пульсов, то контроллер NVIC может сохранить запрос, используя признак отло женноrо прерывания. После перехода процессора к выполнению обработчика ис ключения бит признака отложенноrо прерывания сбрасывается автоматически. Естественно, что в этом случае обработчик не должен обращаться к периферий ному устройству для сброса запроса прерывания. 11.3. Проrраммные прерывания Прерывания MorYT инициироваться: . подачей сиrнала на вход внешнеrо прерывания; . записью в реrистр признака отложенноrо прерывания контроллера NVIC (см. [лаву 8); . записью в реrистр проrраммной rенерации прерывания STIR контроллера NVIC (см. [лаву 8). 
212 · rлава 11. Работа с прерыванuямu/uсключенuямu В большинстве случаев ряд прерываний оказываются незадействованными и MorYT использоваться в качестве проrраммных прерываний. Проrраммные прерывания MorYT служить для тех же целей, что и команда вызова супервизора (SVC), т.е. для доступа к системным службам. Однако по умолчанию пользова тельские проrраммы не MorYT обращаться к контроллеру NVIC. Обращение к pe rистру STIR контроллера NVIC допускается только в том случае, если установлен бит USERSETMPEND реrистра управления конфиrурацией NVIC (см. Табл. [.18 в Приложении [). в отличие от исключения SVCall, проrраммные прерывания являются «неточ ными». Друrими словами, обработка проrраммноrо прерывания не обязательно произойдёт сразу же после ero rенерации, даже при отсутствии блокировки со стороны реrистров маскирования прерываний или друrих процедур обработки прерывания. Поэтому если команда, следующая за командой записи в реrистр STIR, зависит от результата проrраммноrо прерывания, то результат её выполне ния может оказаться некорректным, поскольку обработка проrраммноrо преры вания может произойти уже после исполнения команды. Для решения указанной проблемы можно использовать команду барьерной синхронизации DSB. Так, пользователи СМSISсовместимых библиотек MorYT вставить в проrрамму следующие строки: NVICSetPendingIRQ(SOFTWAREINTERRUPTNUМEER); DSB () ; При использовании ассемблера: MOV RO, #SOFTWAREINTERRUPTNUMBER LDR Rl,=OxEOOOEFOO ; Адрес реrистра rенерации проrраммноrо прерывания (STIR) контроллера NVIC rенерируем проrраммное прерывание Барьер синхронизации данных STR RO, [Rl] DSB Однако существует ещё одна возможная проблема. Если установлен реrистр маскирования прерываний или если проrраммное прерывание rенерируется He посредственно из обработчика исключения, то существует вероятность Toro, что проrраммное прерывание вообще не будет выполнено. Соответственно, про rраммный код, rенерирующий проrраммное прерывание, должен контролиро вать выполнение данноrо прерывания. Для этой цели можно использовать про rраммный флаr, устанавливаемый в обработчике проrраммноrо прерывания. Кстати rоворя, даже сама установка бита USERSETMPEND может привести к появлению проблем. После установки указанноrо бита пользовательская про rpaMMa сможет проrраммно rенерировать любое прерывание, кроме системных исключений. Вследствие этоrо, если в системе используется непроверенный поль зовательский код, то обработчики исключений должны контролировать допу стимость возникновения исключений, поскольку они MorYT быть сrенерированы пользовательской проrраммой. В идеале, если в системе имеются недостаточно надёжные пользовательские проrраммы, то доступ к системным сервисам дол жен предоставляться только через исключение SVCall. 
11.4. Пример nеремещения таблицы векторов. 213 11.4. Пример перемещения таблицы векторов в [лаве 7 мы уже rоворили о том, что начальная таблица векторов должна co держать, как минимум, вектор сброса, вектор немаскируемоrо прерывания и BeK тор исключения Hard Fault, поскольку оба последних исключения не требуют какоrолибо разрешения. После запуска проrраммы мы можем при необходимо сти переместить таблицу векторов в область ОЗУ. Сразу необходимо отметить, что в большинстве простых приложений этоrо не требуется. Для перемещения таблицы векторов необходимо выполнить следующие опе рации: . Зарезервировать память для новой таблицы векторов. Возможно, вам при дётся использовать сценарии компоновщика для резервирования участка па мяти. Адрес таблицы векторов должен быть выровнен на величину, равную размеру таблицы, который приведён к ближайшему большему значению, яв ляющемуся степенью двойки. . Скопировать существующую таблицу на новое место. Перед перемещением таблицы векторов необходимо убедиться, что новая таблица содержит KOp ректные значения векторов для всех требуемых исключений, включая NMI, Hard Fault и все разрешённые исключения. . Записать новый вектор исключения в новую таблицу векторов, после чеzо вы полнить запись в pezucmp смещения таблицы векторов VTOR для перемеще ния таблицы. Пример проrраммноrо кода, выполняющеrо собственно перемещение табли цы векторов, был приведён в [лаве 8. В следующем при мере, написанном на ac семблере, мы продемонстрируем процесс резервирования памяти в начале обла сти ОЗУ дЛЯ таблицы векторов и нескольких переменных: STACKTOP EQU Ох20002000 Константа, содержащая начальное значение SP NVICSETEN EQU ОхЕОООЕI00 Адрес блока реrистров разрешения прерываний NVICVECTTBL EQU ОхЕОООЕD08 Реrистр смещения таблицы векторов NVICAIRCR EQU ОхЕОООЕDОС Реrистр управления прерываниями и сбросом NVICIRQPRI EQU ОхЕОООЕ400 Реrистр уровня приоритета прерываний AREA I Header Code 1, СОDЕ DСD STACK ТОР Начальное значение SP DСD Start Вектор сброса DСD Nmi Handler Обработчик NMI DСD Hf Handler Обработчик Hard Fault ENTRY Start ; Начало основной проrраммы ; Инициализируем реrистры MOV rO, #0 ; Инициализируем реrистры MOV rl, #0 ; Копируем старую таблицу векторов на новое место LDR rO, =0 LDR rl, =VectorTableBase LDMIA rO!, {r2r5} ; Копируем 4 слова STMIA rl!, {r2r5} 
214 . fлава 11. Работа с прерыванuямu/uсключенuямu DSB ; Барьер синхронизации данных ; Пишем смещение в реrистр смещения таблицы векторов 1DR rO, =NVIC VECTTB1 1DR r1, =VectorTableBase STR r1, [rO] ; Конфиrурируем реrистр приоритета 1DR rO, =NVICAIRCR 1DR r1, =Ox05FA0500 ; PRIGROUP = 5 STR R1, [rO] ; Настраиваем вектор IRQO MOV rO, #0 IRQ#O 1DR r1, =IrqOHandler В1 SetupIrqHandler ; Задаём приоритет 1DR rO, =NVICIRQPRI 1DR rl, =ОхСО Приоритет IRQO STRВ r1, [rO,#O] Пишем приоритет IRQO со смещением = О Примечание : lбайтная операция (смещение дЛЯ IRQ1 будет равно 1) DSB Барьер синхронизации данных. rарантирует завершение операций записи до разрешения прерываний MOV rO, #0 ; Выбираем IRQO В1 EnableIRQ . , ; Функции SetupIrqHandler ; Вход: RO = Номер IRQ R1 = Обработчик {RO, R2, 1R} R2, =NVIC VECTTB1 R2 , [ R2 ] RO, #16 RO, RO, #2 R2, RO R1, [R2] {RO, R2, РС} PUSH 1DR 1DR АDD 1S1 АDD STR РОР EnableIRQ ; Вход: RO = Номер IRQ PUSH {RO  R3, 1R} AND Rl, RO, #OxlF MOV R2, #1 1S1 R2, R2, Rl BIC RO, #Ox1F 1SR RO, #3 1DR Rl, =NVIC SETEN STR R2, [Rl, RO] РОР {RO  R3, РС} IRQ Получаем смещение таблицы векторов Номер исключения = номер IRQ + 16 Умножаем на 4 (размер каждоrо вектора  4 байт) Находим адрес вектора Записываем адрес обработчика Возвращаемся Извлекаем младшие 5 бит для формирования битовой маски Маска  в R2 Смещение слова (номер IRQ может быть больше 32) Устанавливаем бит разрешения Возвращаемся 
11.4. Пример nеремещения таблицы векторов · 215 ; ; Обработчики исключений Hf Handler ВХ LR Nmi Handler Здесь должен быть ваш код Возвращаемся ВХ LR IrqOHandler ; Здесь должен быть ваш код Возвращаемся ВХ LR Здесь должен быть ваш код Возвращаемся ; AREA I Header Datal, DАТА ALIGN 4 ; Перемещённая таблица векторов VectorTableBase SPACE 256 Размер (в байтах) VectorTableEnd (256 / 4 = до 64 исключений) MyDatal DСD О Переменные MyData2 DСD О END ; Конец файла Это довольно длинный пример) поэтому будем рассматривать ero с конца  с определения области данных. В секции данных (практически в самом конце проrраммы) мы выделяем под таблицу векторов участок памяти размером 256 байт (SPACE 256). В таблице Ta Koro размера мы сможем хранить до 64 векторов. При необходимости размер этой области можно скорректировать. Остальные переменные располаrаются сразу после таблицы векторов) поэтому адрес переменной MyDatal равен Ох20000100. В самом начале приведённоrо кода мы определяем несколько констант. Ис пользование таких именованных констант вместо непосредственных значений значительно увеличивает читабельность проrраммы. Итак) исходная таблица векторов содержит вектора сброса) немаскируемоrо прерывания и исключения Hard Fault. Приведённый пример предназначен для иллюстрации процесс а настройки векторов исключений и поэтому не содержит рабочеrо кода соответствующих обработчиков  операции) выполняемые этими обработчиками) будут зависеть от KOHKpeTHoro приложения. Для возврата из об работчиков исключений в при мере используется команда перехода с изменением состояния ВХ LR) однако она может быть заменена любой друrой командой) по зволяющей выполнить возврат из обработчика (см. Табл. 9.1). После инициализации реrистров мы копируем вектора обработчиков в новую таблицу) расположенную в C03 Данная операция выполняется одной командой rрупповой заrрузки и одной командой rрупповоrо сохранения. Если необходимо скопировать большее число векторов) то мы можем вставить дополнительные KO манды rрупповой заrрузки/сохранения и/или увеличить количество слов) пере сылаемых при выполнении каждой пары этих команд. После Toro как новая таблица будет rOToBa) мы можем переместить её на новое место в 03 Чтобы быть уверенными в том) что все операции пересылки BeKTO ров завершены) мы используем команду синхронизации DSB. 
216 . fлава 11. Работа с прерыванuямu/uск:люченuямu После перемещения таблицы векторов мы должны окончательно сконфиrури ровать прерывание. Прежде Bcero  задать требуемые установки rруппирования приоритетов (эту операцию необходимо выполнить Bcero один раз в начале про rpaMMbI). Для настройки прерываний в примере используются две подпроrрам мы, SetuplrqHandler и EnableIRQ, которые позволяют значительно упростить этот процесс. Заменив в коде последней подпроrраммы NVIC  SETEN на NVIC  CLREN, мы получим ещё одну функцию) DisableIRQ. После настройки об работчика и задания уровня приоритета прерывания мы HaKOHeЦTO можем раз решить ero. 11.5. Использование команды SVC Команда SVC является общепринятым методом предоставления пользова тельским приложениям доступа к проrраммному интерфейсу приложения (API) операционной системы. При этом пользовательские приложения должны «знать» только то) какие параметры следует передавать ОС (информация о расположе нии АРIфункций в памяти приложениям не требуется). Команда SVC имеет параметр) представляющий собой 8битную константу) значение которой хранится в коде команды. Например: SVC #3 ; Вызов системноrо сервиса 3 Можно использовать и альтернативный синтаксис (без символа «#»): SVC 3 ; Вызов системноrо сервиса 3 Обработчик исключения SVCall может извлечь значение этоrо параметра из KO да команды SVC) определив её адрес по значению счётчика команд) сохранённому в стеке при входе в обработчик. Для выполнения указанной операции можно ис пользовать процедуру, блоксхема алrоритма которой приведена на Рис. 11.2. Бит 2 = О Определяем стек, который использовал вызывающий процесс, по значению LR (Бит 2) Определяем положение ре в основном стеке Бит 2 = 1 Определяем положение ре в стеке процесса Определяем aд команды SVC по значению РС, извлекаем константу из кода команды Рис. 11.2. Алzоритм извлечения параметра команды svc. Ниже приведена одна из простейших реализаций данной процедуры: svc handler TST LR, #Ох4 ITE EQ MRSEQ RO, MSP MRSNE RO, PSP Проверяем бит 2 значения EXCRETURN в LR ; Если ноль (<<равно»), то был использован ; основной стек, помещаем MSP в RO ; Иначе был использован стек процесса, 
11.6. Пример использования команды SVC: функции вывода текстовых сообщений · 217 помещаем PSP в RO LDR R1, [RO,#24] Читаем из стека сохранённое значение РС LDRB RO, [R1,# 2] Извлекаем константу из кода команды ; Переданное значение  в RO ВХ LR ; Возвращаемся в вызывающую функцию Определив значение параметра) обработчик исключения может выполнить соответствующую системную функцию. Для реализации переходов к требуемым фраrментам кода удобнее Bcero использовать команды табличноrо перехода твв и ТВН. Не забывайте только выполнять проверку на соответствие параметра дo пустимым значениям) чтобы избежать краха системы изза вызова некорректной системной функции. Впрочем) если вы абсолютно уверены в корректности пере даваемых значений) то эту проверку можно опустить. Обратите внимание: передача параметров обработчику исключения SVCall и возврат результата выполнения обработчика должны осуществляться через стек. Причины данноrо требования объясняются в следующем подразделе. Поскольку одна системная служба не может вызвать друrую) используя Mexa низм исключений) обработчик системных вызовов должен напрямую вызывать друrие svсфункции (скажем) используя команду BL). 11.6. Пример использования команды SVC: функции вывода текстовых сообщений Мы уже разрабатывали с вами различные подпроrраммы для вывода инфор мации. Однако не всеrда имеется возможность вызова подпроrрамм с помощью команды BL  например) если код выполняется на непривилеrированном уровне доступа) а функции ввода/вывода текстовых сообщений требуют привилеrиро BaHHoro доступа. В подобных случаях мы можем воспользоваться командой SVC в качестве точки входа в функции вывода. Например) пользовательская проrрам ма может задействовать команду SVC с разными параметрами для вызова различ ных сервисов: LDR RO,=HELLOTXT SVC #0 ; Отобразить строку, адрес которой содержится в RO MOV RO,#'A' SVC #1 ; Отобразить символ, содержащийся в RO LDR RО,=ОхС12345б SVC #2 ; Отобразить шестнадцатеричное значение, содержащееся в RO MOV RO,#1234 SVC #3 ; Отобразить десятичное значение, содержащееся в RO Если таблица векторов была перемещена в ОЗУ) то для использования команды SVC нам необходимо настроить обработчик исключения SVCall. Для этоrо можно воспользоваться модифицированным вариантом функции SetupIrqHandler из предыдущеrо раздела. Единственным отличием новой функции будет то) что в Ka честве входноrо параметра она будет принимать номер исключения) а не номер прерывания (исключение SVCall имеет номер 11). Заодно оптимизируем код функ ции) переписав её с использованием 32битных команд Thumb2: 
218 · Тлава 11. Работа с прерыванuямu/uсключенuямu SetиpExcpHandler ; Настройка вектора в таблице векторов, перемещённой в ОЗУ ;Вход: RO = Номер исключения R1 = Обработчик исключения PUSH {RO, R2, LR} LDR R2, =NVIC VECTTBL 1DR R2, [R2] STR.W R1, [R2, RO, 1S1 #2] Сохраняем вектор по адресу [R2+RO«2] РОР {RO, R2, РС} Возвращаемся Сам обработчик исключения SVCall мы напишем) взяв за основу код) приве дённый в конце предыдущеrо раздела. Добавим в Hero команду чтения из стека параметра системноrо вызова) а также команды переходов к различным систем ным функциям в зависимости от значения этоrо параметра: svc handler TST 1R, #Ох4 ITE EQ MRSEQ R1, MSP MRSNE R1, PSP Получаем смещение таблицы векторов svc Проверяем бит 2 значения EXCRETURN в 1R Если ноль (<<равно»), то был использован основной стек, помещаем MSP в R1 Иначе был использован стек процесса, помещаем PSP в R1 1DR RO, [R1,#O] Читаем из стека сохранённое значение RO 1DR R1, [R1,#24] Читаем из стека сохранённое значение РС 1DRB R1, [R1,#2] Извлекаем константу из кода команды ; Теперь значение константы находится в R1, значение параметра PUSH {1R} ; Сохраняем 1R в стеке CBNZ R1, svchandlerl В1 pиts ; Вызываем процедуру pиts В svc handler end   handler 1 СМР R1, #1 BNE svc handler 2 В1 pиtc В svc handler end   handler 2 СМР R1, #2 BNE svc handler 3 В1 pиtHex В svc handler end   handler 3 СМР R1, #3 BNE svc handler 4 BL pиtDec В svc handler end   handler 4 В error  в RO Вызываем процедуру pиtc svc Вызываем процедуру pиtHex svc Вызываем процедуру pиtDec svc Некорректный номер системноrо вызова svc handler end РОР {РС} ; Возвращаемся Код обработчика svc  handler должен располаrаться рядом с кодом функций вывода) с тем чтобы эти функции оказались в пределах досяrаемости команд BL. Заметьте) что для передачи параметров используется не текущее содержимое реrистров процессора) а их содержимое) сохранённое в стеке. Это сделано специ 
11.6. Пример использования команды SVC: функции вывода текстовых сообщений · 219 ально, так как если во время исполнения команды SVC возникнет прерывание с более высоким приоритетом, то обработчик SVCall будет запущен сразу же по сле завершения остальных обработчиков (<<цепочечная» обработка). Содержимое реrистров RO.. .R3 и R12 к этому моменту может отличаться от исходноrо, по скольку при «цепочечной» обработке прерываний отсутствуют промежуточные операции восстановления/сохранения контекста. Например: 1. Параметр помещается в реrистр RO. 2. Исполняется команда svc и одновременно с этим возникает более высокоприоритетное прерывание. 3. Производится сохранение контекста, в результате чеrо содержимое реrистров RO. . .R3, R12, LR, РС и xPSR оказывается в стеке. 4. Выполняется обработчик прерывания. В процессе выполнения он может изменять содержимое реrистров RO.. .R3 и R12. Это допускается, поскольку данные реrистры будут восстановлены при восстановлении контекста. 5. Запускается обработчик исключения SVCall. При входе в обработчик содержимое реrистров RO. . .R3 и R12 может отличаться от Toro, которое было на момент выполнения команды svc. Однако корректное значение параметра содержится в стеке, откуда обработчик ero и берёт. 
220 · fлава 11. Работа с прерыванuямu/uсключенuямu 11.7. Использование команды SVC в проrраммах на языке Си в большинстве случаев для передачи параметров в SVСфункции необходимо использовать обработчик) написанный на ассемблере. Это связано с тем) что па раметры передаются через стек) а не через реrистры (см. предыдущий раздел). Ec ли обработчик исключения SVCall должен быть написан на Си) то для определе ния адреса) по которому реrистр был сохранён в стеке) и для передачи этоrо зна чения в обработчик можно использовать простую «обёртку») написанную на ac семблере. Используя указанную информацию) обработчик сможет впоследствии извлечь номер системноrо вызова и значения параметров. Если вы работаете в среде разработки RVDS или MDKARM) то данную «обёртку» можно написать с использованием BCTpoeHHoro ассемблера: // Ассемблерный код«обёртка» для получения начальноrо адреса cTeKoBoro фрейма // Начальный адрес фрейма помещается в реrистр RO, после чеrо осуществляется // переход к собственно обработчику SVCall asm void svchandlerwrapper(void) TST LR, #4 ITE EQ МRSEQ RO, MSP МRSNE RO, PSP В cpp(svchandler) } // Команда возврата (ВХ LR) в конце этой «обёртки» не нужна, поскольку // при возврате из svchandler управление будет передано // на то место, откуда была вызвана команда svc Основная часть обработчика исключения SVCall может быть реализована в виде процедуры на языке Си с одним aprYMeHToM (реrистр RO)) в котором пере даётся стартовый адрес cTeKoBoro фрейма исключения. Это значение использует ся для выделения номера системноrо сервиса и передачи реальных параметров исключения (реrистры RO.. .R3): // Обработчик SVCall, написанный на Си, принимающий в виде параметра начальный // адрес cTeKoBoro фрейма, который используется в качестве указателя на массив 
11.7. Использование команды SVC в npozpaMMax на языке Си · 221 // aprYMeHToB // svcargs[O] RO, svcargs[l] = Rl // svcargs[2] = R2 , svсаrgs[З] = RЗ // svcargs[4] = R12, svcargs[5] = LR // svсаrgs[б] = Адрес возврата (сохранённое значение РС) // svcargs[7] = xPSR void svchandler(unsigned int * svcargs) { unsigned int svcnumber; unsigned int svc rO; unsigned int svc rl; unsigned int svc r2; unsigned int svc rЗ; svc number = ((char *) svсаrgs[б]) [2]; // Memory[(Stacked PC)2] svcrO = ((unsigned long) svcargs[O]); svcrl = ((unsigned long) svcargs[l]); svcr2 = ((unsigned long) svcargs[2]); svсrЗ = ((unsigned long) svсаrgs[З]); printf (<<Номер SVC = %xn», svcnumber); printf (<<Ой параметр SVC = %x\n», svcrO); printf (<<lй параметр SVC = %x\n», svcrl); printf (<<2й параметр SVC = %x\n», svcr2); printf (<<Зй параметр SVC %x\n», svсrЗ); return; Обратите внимание, что супервизор не может возвращать результаты своей работы в вызывающую функцию так) как это делают обычные Сифункции. Обычные функции имеют тип) отличный от void) например unsigned int func (), и используют для передачи возвращаемоrо значения оператор return) который в действительности помещает это значение в реrистр RO. Если при BЫXO де из обработчика исключения SVСаllзаrрузить возвращаемые значения в любой из реrистров RO.. .R3) то они будут утеряны при восстановлении контекста. COOT ветственно) если обработчик должен возвращать какието результаты в вызыва ющую проrрамму) то он должен модифицировать непосредственно стековый фрейм) чтобы эти значения оказались в реrистрах при восстановлении контекста. При работе в пакетах RVDS компании ARM или MDKARM компании КеН мы можем использовать для вызова супервизора ключевое слово компилятора   svc. Например) если нам необходимо передать четыре параметра в SVC функцию с номером 3) то мы можем объявить такую функцию с именем call svc 3 как: void svс(ОхОЗ) саllsvсЗ(unsignеd long svcrO, unsigned long svcrl, unsigned long svcr2, unsigned long svсrЗ); Вызывается эта функция так же как и любая друrая: int main(void) { unsigned long рО, рl, р2, рЗ; // Параметры, передаваемые обработчику SVCall call svc З(рО, рl, р2, рЗ); // Вызываем SVC З с арrументами рО, рl, р2, рЗ 
222 · fлава 11. Работа с прерыванuямu/uсключенuямu return; Дополнительную информацию об использовании ключевоrо слова  svc можно найти в руководстве [4]. Поскольку в компиляторе GCC инструментария GNU ключевое слово  svc отсутствует) то при использовании данноrо инструментария для вызова суперви зора из Сипроrрамм нам придётся прибеrнуть к помощи iпliпеассемблера. Так) если нам необходимо вызвать функцию супервизора с номером 3) которая имеет один параметр и возвращает результат в реrистре RO (соrласно спецификации AAPCS [5] первое значение всеrда передаётся через реrистр RO)) то мы можем ис пользовать следующий код: int MyDataIn = Ох12З; asm volatile (<<mov RO, %O\n» «svc 3 \n» : «» : «»r» (MyDataIn) ); Приведённый выше код можно разбить на три части) rде входные данные определяются параметром r (MyDataIn)) а выходные данные отсутствуют (обо значено как «»): asm ( ассемблерныйкод : списоквыходныхпараметров : списоквходныхпараметров Друrие при меры использования iпliпеассемблера при работе с инструмента рием GNU вы сможете найти в [лаве 19. Для получения детальной информации о передаче параметров в/от iпliпеассемблера обратитесь к документации GNU. 
rлдвд 12 ПРОДВИНУТЫЕ проrрАммныE ВО3МОЖНОСТИ И ПОВЕДЕНИЕ СИСТЕМЫ 12.1. Реализация системы с двумя раздельными стеками Одной из наиболее важных особенностей архитектуры ARMv7M является возможность отделения стека пользовательскоrо приложения от стека) использу eMoro привилеrированным кодом) таким как ядро системы. Если в устройстве pe ализован опциональный модуль защиты памяти (MPU)) то ero можно задейство вать для Toro) чтобы запретить пользовательским приложениям доступ к стеку ядра. Это не позволит им нарушить работу ядра) испортив содержимое памяти. Любая надёжная система на базе процессора CortexM3) как правило) имеет следующие характеристики: . обработчики исключительных ситуаций) использующие основной стек (MSP); . код ядра) запускаемый с определённой периодичностью в исключении си cTeMHoro таймера (SYSTICK). Этот код работает на привилеrированном ypOB не доступа) осуществляя диспетчеризацию задач и управление системой; . пользовательские приложения) выполняющиеся в виде отдельных потоков с пользовательским (непривилеrированным) уровнем доступа; эти приложе ния используют стек процесс а (PSP); . ядро системы и обработчики исключительных ситуаций) задействующие OCHOB ной стек) адресуемый указателем MSP; при наличии модуля MPU доступ к этой области памяти предоставляется только на привилеrированном уровне; . стек пользовательских приложений) адресуемый указателем PSP. Возьмём систему с модулем MPU) использующую в качестве системной памя ти встроенное статическое 03 Мы можем так сконфиrурировать модуль MPU) что всё СО3У окажется разделено на две области) одна из которых будет доступна для обращений на пользовательском уровне) а друrая  на привилеrированном уровне (Рис. 12.1). Каждая из областей используется как для хранения данных) так и для размещения стека. Поскольку в процессоре CortexM3 при меняется MO дель полноrо «у6ывающеrо» стека) то перед началом работы каждый указатель стека должен быть установлен на вершину соответствующей области памяти. 
224 · Тлава 12. Продвинутые npozpaMMHble возможности и поведение системы Начальноезначение указателя OCHoBHoro стека Свободный доступ Привилеrированный аек Только привилеrированный доступ Адрес в памяти СОЗУ Привилеrированные данные Начальное значение указателя стека процесс. Пользовательский стек Пользовательские данные Рис. 12.1. Разбиение памяти на две области. После подачи питания инициализируется только MSP (в процессе сброса в He ro заносится значение, расположенное по OMY адресу). Для конфиrурирования отказоустойчивой системы с двумя стеками необходимо выполнить дополни тельные операции. При написании приложения на ассемблере код инициализа ции может выrлядеть следующим образом: ; Код начинает выполняться на привилеrированном уровне (он располаrается ; в области памяти, доступной на пользовательском уровне) BL MpuSetup Задаём области MPU и разрешаем защиту памяти LDR RO, =PSPTOP ; Устанавливаем PSP на вершину стека процесса MSR PSP, RO BL SystickSetup ; Конфиrурируем таймер SYSTICK и ero исключение для периодическоrо вызова ядра ОС Конфиrурируем реrистр CONTROL таким образом, чтобы пользовательская проrрамма использовала PSP и переключаем текущий уровень доступа на пользовательский Барьер синхронизации команд UserApplicati0nStart Теперь мы работаем на пользовательском уровне доступа Переходим к выполнению пользовательскоrо кода Всё это прекрасно работает в случае ассемблера) однако при проrраммирова нии на Си переключение указателей стека в середине функции или процедуры может привести к порче локальных переменных) поскольку эти переменные MO rYT располаrаться в стеке. В руководстве [1] предполаrается использовать проце дуру обработки какоrолибо исключения (например) SVCall) для вызова ядра с последующим изменением указателя стека модификацией значения EXCRETURN (Рис. 12.2). MOV RO, #ОхЗ MSR CONTROL, RO ISB В 
12.1. Реализация системы с двумя раздельными стеками · 225 Привилеrир. уровень Режим обработчика EXCREТURN = OxFFFFFFF9 Настраиваем PSP Инициализация и создаём фрейм ос пользовательскоrо стека (РС, xPSR) Изменяем EXCRETURN на OxFFFFFFFD и возвращаемся Фрейм пользова тельскоrо стека заrружается в реrистры    Привилеrир. уровень Режим потока l J Инициализаци .........", Операционная система  ПОЛЬЗ0ват. уровень Режим потока Пользова тельское приложение Рис. 12.2. Инициализация нескольких стеков в простой ос. в большинстве случаев модификация значения EXCRETURN и переключе ние стеков осуществляется ядром операционной системы (ОС). После запуска пользовательскоrо приложения исключение SYSTICK может использоваться для периодическоrо обращения к ядру ОС, осуществляющему управление системой и, при необходимости, инициирующему переключение контекста (Рис. 12.3). Привилеrир. уровень Режим обработчика EXCREТURN = = OxFFFFFFFD Функции ос управления системой rенерация PendSV Сохраняем PSP Возврат е для приложения NOl из исключения для поел Аующеrо и формируем в PSP переключения v Ф v стековыи реим контекста для приложения N02 l v' SYSTICK 1 v PendSV J    'рЙ2  пользователь CKoro стека заrружается в реrистры Привилеrир. уровень Режим потока        l!.eE  реrистров сохраняется в стековом фрейме NOl    Пользова тельское приложе ние N02 ПОЛЬЗ0ват. Пользова уровень тельское Исключение Режим потока приложение NOl SYSTICK Рис. 12.3. Переключение контекста в простой ос. Обратите внимание, что собственно переключение контекста осуществляется в низкоприоритетном исключении PendSV, чтобы исключить выполнение дaH ной операции в середине обработчика прерывания. Мноrие приложения прекрасно обходятся без ОС, однако и в этом случае ис пользование отдельных стеков для разных секций проrраммноrо кода позволяет увеличить надёжность устройства. Для реализации такой системы можно при за пуске процессора CortexM3 установить указатель MSP на область стека процес са. В этом случае будет инициализирован стек процесса, но с использованием указателя MSP. А перед запуском пользовательскоrо приложения надо будет BЫ полнить следующий код: ; Код начинает выполняться на привилеrированном уровне, ; MSP указывает на пользовательский стек MpиSetиp(); // 3адаём области MPU и разрешаем защиту памяти SystickSetиp(); // Конфиrурируем таймер SYSTICK и ero исключение, // реализующее функции управления системой 
226 · [лава 12. Продвинутые npozpaMMHble возможности и поведение системы SwitchStackPointer(); // Вызываем ассемблерную подпроrрамму для // указателей стека /*; Тело подпроrраммы SwitchStackPointer  PUSH {RO, Rl, LR} MRS RO, MSP LDR Rl, MSPTOP MSR MSP, Rl MSR PSP, RO MOV RO, #ОхЗ MSR CONTROL, RO переключения Сохраняем текущий указатель стека Устанавливаем MSP на друrую область памяти Сохраняем текущее значение указателя стека в PSP Переключаемся в пользовательский режим и используем стек процесса в качестве текущеrо стека РОР {RO, Rl, РС} Возвращаемся ;  Обратно в Сипроrрамму */ Теперь мы находимся в пользовательском режиме и используем PSP Все локальные переменные остались на месте UserApplicationStart(); // Запускаем приложение в пользовательском режиме 12.2. Выравнивание стека на rраницу двойноrо слова в приложениях, написанных с учётом требований стандарта AAPCsl), указа тель стека при входе в функцию должен быть выровнен на rраницу двойноrо сло ва. Для этоrо при обработке исключений соответствующим образом корректиру ются адреса стека, по которым сохраняются реrистры. Чтобы включить эту воз можность, необходимо установить бит STKALIGN реrистра управления конфи rурацией CCR контроллера NVIC (см. Табл. f.18 в Приложении r). При использо вании СМSISсовместимоrо драйвера это можно сделать с помощью выражения: SCB>CCR  SCB>CCR I Ох200; При проrраммировании на Си без использования CMSIS: #define NVICCCR * ((volatile unsigned long *) (OxEOOOED14)) NVICCCR  NVICCCR I Ох200; /* Устанавливаем бит STKALIGN в NVIC */ Эту операцию можно выполнить и на языке ассемблера: LDR RO, OxEOOOED14 Заrружаем в RO адрес реrистра CCR LDR Rl, [RO] ORR.W Rl, Rl, #Ох200 Устанавливаем бит STКALIGN STR Rl, [RO] Пишем новое значение в реrистр CCR Если на момент сохранения контекста при обработке исключительной ситуа ции бит STKALIGN был установлен, то бит 9 сохранённоrо в стеке реrистра xPSR (объединённый реrистр состояния проrраммы) показывает, корректировался ли указатель стека при сохранении контекста. При восстановлении контекста из CTe ка процессор проверяет состояние 9ro бита xPSR и соответствующим образом корректирует значение указателя стека. 1) Соrлашения по вызову процедур для архитектуры ARM (Procedure СаН Standard for ARM Architecture  AAPCS) [5]. Соответствующие рекомендации, касающиеся выравнивания указателя стека и стандарта AAPCS, были опубликована на сайте компании ARM; см. http://iпfoceпter.arт.coт/help/topic/coт. arт.doc. ihi0046a/IHI0046AABIAdvisory l.pdf. 
12.3. Переход в режим потока с любоzо уровня вложенности · 227 Во избежание повреждения данных, хранящихся в стеке, бит STKALIGN не следует изменять в обработчике исключений. Это может привести к HeCOOTBeT ствию значений указателя до и после исключения. Возможность выравнивания стека появилась в lй ревизии процессора CortexM3. Старые устройства, построенные на процессоре ревизии О, такой воз можности не имеют. Во 2й ревизии процессора эта возможность разрешена по умолчанию, тоrда как в lй ревизии её необходимо разрешать проrраммно. Ещё раз повторю, что выравнивание стека на rраницу двойноrо слова необходи мо, если ваше приложение должно удовлетворять требованиям стандарта AAPCS. 12.3. Переход в режим потока с любоrо уровня впоженности В процессоре CortexM3 предусмотрена возможность переключения выпол няющеrося обработчика прерывания с привилеrированноrо уровня на пользова тельский. Это необходимо в тех случаях, коrда код обработчика прерывания яв ляется частью пользовательскоrо приложения и не должен иметь привилеrиро ванных прав доступа к данным. Указанная функция называется «Nonbase 1hread Enable» и включается установкой бита NONBASETHRDENA реrистра управле ния конфиrурацией CCR контроллера NVIC. Для использования данной функции при меняется перенаправление обработ чика исключительной ситуации. Вектор в таблице векторов указывает на обра ботчик, выполняющийся на привилеrированном уровне, но размещённый в об ласти памяти, доступной в пользовательском режиме. redirect handler PUSH {LR} SVC О SVСфункция для переключения из привилеrированноrо режима в пользовательский BL User IRQ Handler SVC 1 SVСфункция для возврата из пользовательскоrо режима в привилеrированный РОР {РС} ; Возвращаемся Обработчик исключения SVCall состоит из трёх частей: . в первой части определяется значение параметра, переданноrо в команде SVC; . во второй части (обработчик системноrо сервиса NQQ) устанавливается бит NONBASETHRDENA, выравнивается пользовательский стек, корректируется значение EXCRETURN и выполняется возврат в обработчик (уже на пользо вательском уровне доступа) с использованием стека процесс а; 
228 · fлава 12. Продвинутые npozpaMMHble возможности и поведение системы · в третьей части (обработчик системноrо сервиса N Q 1) сбрасывается бит NONBASETHRDENA, восстанавливается значение указателя пользователь cKoro стека и выполняется возврат в обработчик (на привилеrированном уровне доступа) с использованием OCHoBHoro стека. svc handler TST LR, tOx4 ITE EQ MRSEQ RO, MSP MRSNE RO, PSP LDR R1, [RO, #24] LDRB RO, [R1, #2] CBZ RO, svc service О СМР RO, t1 BEQ svc service 1   B.W UnknownSVCRequest svc service О Сервис переключения обработчика из привилеrированноrо режима ; в пользовательский ; Корректируем PSP PSP = PSP  Ох20 МRS SUB MSR MOV RO, PSP RO, RO, #Ох20 PSP, RO R1, tOx20 Проверяем бит 2 значения EXCRETURN Если = О, то заrружаем корректный указатель стека в RO Читаем из стека РС Извлекаем параметр с адреса РС  2 Копируем стековый фрейм из OCHoBHoro стека в стек процесса svc serviceOcopyloop SUBS R1, R1, #4 LDR R2, [ S Р, R1 ] STR R2, [RO, R1] СМР R1, #0 BNE svc serviceOcopyloop STRВ R1, [RO, #Ох1С] ; Сбрасываем в О реrИСТр IPSR, находящийся в стеке ; процесса LDR RO, =ОхЕОООЕО14 ; Разрешаем функцию «Nonbase thread епаЫе» в CCR LDR R1, [rO] ORR R1, #1 STR R1, [rO] ORR LR, #ОхС ; Меняем LR для возврата в режим потока, используя PSP ВХ LR svc service 1 Сервис переключения обработчика из пользовательскоrо режима в привилеrированный Изменяем РС в стеке привилеrированноrо режима так, чтобы при возврате попасть на команду, #Ох18] расположенную после 2й команды SVC обработчика #Ох18] пере направления Заносим в PSP значение, которое в нём было до выполнения 1й команды SVC MRS RO, PSP LDR R1, [RO, STR R1, [SP, MRS RO, PSP АОО RO, RO, #Ох20 MSR PSP, RO LDR RO, =OxEOOOED14 ; Сбрасываем бит NONBASETHRDENA в CCR LDR R1, [rO] BIC R1, #1 STR R1, [rO] 
12.4. Пара слов о проuзводuтельностu · 229 BIC LR, #ОхС Возвращаемся в режим обработчика, ; используя основной стек ВХ LR Исключение SVCall используется потому, что реrистр состояния прерывания (IPSR) может быть изменён только при возврате из обработчика исключительной ситуации. Разумеется, можно использовать и друrие исключения, например про rpaMMHo rенерируемые прерывания. Однако этоrо делать не рекомендуется, по скольку такие прерывания являются «неточными» И MorYT оказаться маскиро ванными, т.е. существует вероятность задержки выполнения требуемых опера ций копирования и переключения стека. Последовательность выполнения кода показана на Рис. 12.4. На этом же рисунке показано изменение указателей стека и текущеrо приоритета исключений. Моменты ручной корректировки указателя PSP в обработчике SVCall помечены пунктирными овалами. Адрес в памяти Основной указатель аека (MSP) Указатель аека n роцесса (PSP) Соаояние процессора IPSR Уровень приоритета SVC Прерывание Привилеrир. поток Пользоват. поток Активноаь IRQ Прерывание SVC о Возврат из SVC о I I I I I I I I I Стековй фрейм копиуется в стек процесса I I I Возврат Возврат из SVC 1 из прерывания I I I I I I SVC 1 I I I I I I I I ,.., I , I \ , I \ Ручая I \ : 1 корркция " Р9Р .., I I 1 ,.., , \ I I \ , I I \ I , '.., Ручная коррекция PSP I Поток Обработчик Обработчик Поток Обработчик Обра60тч. Поток О Номер IRQ 11 (SVC) О 11 (SVC) Номер IRQ О I I I I I I I I I I I I J  I I I I I I        .J    .J      I I I I I I I I I 11\ I I I I I I I I I I I I I I  i J I I I I I I i  I I I I I I I I I I I / Рис. 12.4. Использование бита NONBASETHRDENA. 12.4. Пара слов о производительности Чтобы выжать из процессора CortexM3 максимум возможноrо, нужно учиты вать некоторые моменты. Вопервых, необходимо исключить циклы ожидания при обращении к памяти. При проектировании микроконтроллера или SoC разработ чик должен так оптимизировать систему памяти, чтобы обращения к командам 
230 · [лава 12. Продвинутые npozpaMMHble возможности и поведение системы и данным выполнялись за одинаковое время, а также использовать 32битную па мять. Карта памяти должна быть такой, чтобы проrраммный код исполнялся бы из области кода, а большинство обращений к данным шло бы по системной шине. Это позволит обращаться к данным одновременно с выборкой команд. BOBTOpЫX, таблица векторов прерываний также должна быть, по возможно сти, размешена в области кода. Это позволит одновременно выполнять выборку вектора и сохранение контекста в стеке. При нахождении таблицы векторов в ОЗУ задержка прерываний может увеличиться на несколько тактов, поскольку и для выборки вектора, и для сохранения контекста в этом случае будет задей ствоваться системная шина (если только стек не размещён в области кода, rде ис пользуется шина DCode). По возможности избеrайте обращений к невыровненным данным. HeBыpOB ненные пересылки преобразуются в две и более пересылок по шине ЛИВ), что за медляет выполнение проrраммы. Так что уделите должное внимание структуре данных своей проrраммы. Те, кто пишет проrраммы на ассемблере, MorYT также использовать ряд трю ков, позволяющих ускорить выполнение определённых операций. 1. Используйте команды доступа к памяти со смещением. Если необходимо обращаться к различным ячейкам памяти в пределах HeKoToporo диапазона адресов, то вместо кода LDR RO, OxEOOOE400 LDR Rl, OxEOC02000 STR Rl, [RO] LDR RO, OxEOOOE404 LDR Rl, OxEOEOEOEO STR Rl, [RO] Устанавливаем приоритет прерываний wз.. .WO Уровни приоритетов Устанавливаем приоритет прерываний W7...W4 Уровни приоритетов можно написать следующее: LDR RO, =ОхЕОООЕ400 Устанавливаем приоритет LDR Rl, OxEOC02000 Уровни приоритетов STR Rl, [RO] LDR Rl, OxEOEOEOEO STR Rl, [RO,#4] прерываний WЗ...WО Уровни приоритетов Устанавливаем приоритет прерываний W7. ..W4 Вторая команда сохранения использует смещение относительно первоrо адреса, уменьшая таким образом число команд. 2. Применяйте для обращения к памяти команды rрупповой заrрузки/ сохранения. Так, используя команду STM, предыдущий при мер можно переписать следующим образом: LDR RO, OxEOOOE400 Базовый адрес rруппы реrистров приоритета LDR Rl, OxEOC02000 Уровни приоритетов прерываний N!З.. . NЮ LDR R2, =ОхЕОЕОЕОЕО Уровни приоритетов прерываний W7. ..W4 STMIA RO, {Rl, R2} 3. Используйте Iтблоки для замены коротких условных переходов. Поскольку процессор Cortex М3 имеет конвейер, при выполнении операции перехода возникает штраф ветвления. Если условный переход применяется для пропуска нескольких команд, то ero с успехом можно заменить Iтблоком, что позволит сэкономить несколько тактов. 
12.5. Состояние блокировки · 231 4. Если операцию можно выполнить с помощью двух команд Thumb либо с помощью одной команды Thumb2, то необходимо использовать последний вариант, поскольку он обеспечивает меньшее время исполнения при том же размере кода. 12.5. Состояние блокировки При возникновении какоrолибо отказа rенерируется соответствующее ис ключение. Если ещё один отказ произойдёт во время выполнения обработчика Usage Fault/Bus Fault/MemManage Fault, то будет запущен обработчик исключе ния Hard Fault. А что будет, если отказ произойдёт внутри обработчика Hard Fault? В этом случае процессор перейдёт в состояние блокировки (Рис. 12.5). Приоритет Ошибки, возникающие здесь, не вызывают блокировки Ошибки, возникающие здесь, вызывают блокировку  1/2 Ошибки, возникающие здесь, не вызывают блокировки 0...255 Обработчик Hard Fault  или NMI  Сохранение контекаа в аеке Восаановление контекаа из стека . Время Рис. 12.5. Возникновение состояния блокировки. 12.5.1. Что происходит во время блокировки? При переходе процессора в состояние блокировки в счётчик команд заrружа ется значение OxFFFFFFFX, после чеrо процессор продолжает выборку команд с этоrо адреса. Кроме Toro, активируется выходной сиrнал LOCKUP процессора, сиrнализируя о данной ситуации. Разработчики устройств MorYT использовать этот сиrнал для активации схемы сброса системы. Состояние блокировки может наступить, если: . отказ возникнет внутри обработчика исключения Hard Fault (двойной отказ); . отказ возникнет внутри обработчика немаскируемоrо прерывания; . отказ шины возникнет во время цикла сброса (при выборке начальноrо значе ния SP или РС). в случае двойноrо отказа процессорное ядро сохраняет возможность реаrи рования на немаскируемое прерывание и запуска соответствующеrо обработчи ка. Однако после завершения обработчика процессор вернётся в состояние бло 
232 · fлава 12. Продвинутые npozpaMMHbte возможности и поведение системы кировки, при этом значение счётчика команд снова станет равным OxFFFFFFFX. В данном случае происходит блокировка системы с уровнем приоритета, равным  1. При возникновении немаскируемоrо прерывания процессор перейдёт к ero обработке, поскольку приоритет этоrо прерывания (2) больше текущеrо уровня приоритета (1). После завершения обработки NMI и возврата в состояние блоки ровки текущий уровень приоритета вновь станет равным 1. Как правило, наилучшим способом выхода из состояния блокировки являет ся сброс устройства. При подключённом отладчике также можно остановить процессор, записать в РС друrое значение и продолжить выполнение проrраммы с HOBoro адреса. Однако в большинстве случаев это может оказаться не лучшим вариантом, поскольку ряд реrистров, в том числе реrистры системы прерываний, MorYT потребовать повторной инициализации, прежде чем система сможет Bep нуться в рабочее состояние. Вы спросите, почему же мы просто не сбрасываем ядро при возникновении блокировки? В rотовой системе, возможно, так и придётся делать, однако при разработке проrраммноrо обеспечения мы прежде Bcero должны выявить источ ник проблемы. Если мы сразу же сбросим ядро, то мы не сможем понять причи ну отказа, поскольку реrистры будут сброшены и состояние системы изменится. В большинстве микроконтроллеров на базе процессора CortexM3 для сброса ядра при ero попадании в состояние блокировки можно использовать стороже вой таймер. Обратите внимание, что отказ шины во время сохранения контекста при BXO де в обработчик Hard Fault или обработчик NMI не вызовет перехода в состояние блокировки, однако исключение Bus Fault всё же будет отложено. 12.5.2. Предотвращение бпокировки При написании обработчика NMI или Hard Fault необходимо сделать всё воз можное, чтобы избежать блокировки процессора. К примеру, можно исключить все необязательные обращения к стеку в обработчике Hard Fault до тех пор, пока мы не убедимся, что память работает нормально и указатель стека имеет KOp ректное значение. При разработке сложных систем одной из возможных причин возникновения отказов шины или отказов системы управления памятью являет ся порча указателя стека. Если мы поместим в начале обработчика Hard Fault код, наподобие следующеrо: hard fault handler   PUSH {R4R7, LR} Не лучшая идея до тех пор, пока вы не убедитесь в безопасности работы со стеком! то при возникновении отказа изза ошибки во время обращения к стеку, мы cpa зу же перейдём в состояние блокировки. Вообще rоворя, в обработчиках исклю чений Hard Fault, Bus Fault и MemManage Fault желательно всеrда проверять YKa затель стека на корректность, прежде чем продолжать работу со стеком. При Ha писании обработчика NMI мы можем попытаться уменьшить вероятность появ ления ошибок, вызванных операциями со стеком, используя только реrистры RO...R3 и R12, которые сохраняются в стеке автоматически. 
12.6. Pezucmp FAULTMASK · 233 Одно из основных правил, которому необходимо следовать при написании обработчиков исключения Hard Fault и немаскируемоrо прерывания, звучит сле дующим образом: в обработчике следует выполнять только самые необходимые операции, а для выполнения остальных задач, скажем для вывода сообщений об ошибках, использовать отдельное исключение (например, PendSV) или про rpaMMHoe прерывание. Это позволит сделать указанные обработчики небольши ми по размеру и надёжными. Не вздумайте вызывать в обработчиках NMI и Hard Fault команду svc. По скольку приоритет исключения SVCall всеrда меньше приоритетов Hard Fault и немаскируемоrо прерывания, выполнение команды SVC в этих обработчиках вызовет блокировку системы. Данное требование может показаться простым, oд нако при разработке сложных систем, коrда используются функции, описанные в разных файлах, вы можете случайно, сами Toro не желая, вызвать в обработчи ке NMI или Hard Fault функцию, содержащую команду svc. Поэтому, прежде чем приступить к написанию проrраммы, необходимо тщательно продумать реали зацию обработчика системных вызовов. 12.6. Реrистр FAULTMASK Реrистр FAULTMASK используется для перевода конфиrурируемых обработ чиков исключений отказов (Bus Fault, Usage Fault или MemManage Fault) на ypo вень исключения Hard Fault, не дожидаясь возникновения последнеrо изза pe альноrо отказа. Это позволяет конфиrурируемым обработчикам исключений OT казов выступать в роли обработчика Hard Fault. При этом обработчик исключе ния отказа получает следующие возможности: 1. Маскирование отказов шины установкой бита BFHFNMIGN реrистра управления конфиrурацией. Данная возможность может использоваться для тестирования шинной системы без риска возникновения блокировки. Например, для проверки корректной работы моста. 2. Обход модуля MPU. Данная возможность позволяет обработчику отказа обращаться к областям памяти, защищённым модулем MPU, не требуя, таким образом, перепроrраммирования последнеrо для выполнения нескольких пересылок, предназначенных для исправления ошибки. Использование реrистра FAULTMASK отличается от использования реrистра PRIMASK. Последний обычно задействуется в коде, критичном ко времени ис полнения, однако он не позволяет маскировать отказы шины или обходить YCTa новки модуля MPU. При установленном реrистре PRIMASK все конфиrурируе мые обработчики исключительных ситуаций поднимаются на уровень обработ чика Hard Fault. В то же время реrистр FAULTMASK позволяет конфиrурируе мым обработчикам исключений отказов разрешать проблемы, связанные с си стемой памяти, за счёт возможностей, в обычном режиме доступных лишь обра ботчику исключения Hard Fault. Однако даже при установленном реrистре FAULTMASK отказы, вызванные такими операциями, как выборка некорректной команды или использование команды SVC на неверном уровне приоритета, всё равно MorYT вызвать блокировку процессора. 
rЛАВА 1 3 МОДУЛЬ 3АЩИТЫ ПАМЯТИ MPU 13.1. Общие сведения Архитектура процессора СоrtехМ3ТМ предусматривает наличие опционально ro модуля защиты памяти (Memory Protection Unit  MPU). Будучи реализован ным в микроконтроллере или системе на кристалле, этот модуль осуществляет защиту памяти, что позволяет повысить надёжность разрабатываемых изделий. Перед использованием модуля MPU ero необходимо сконфиrурировать и вклю чить. При отключённом модуле MPU система памяти будет функционировать так же, как и при ero отсутствии. Модуль MPU может повысить надёжность встраиваемой системы следующим образом: · не позволяя пользовательским приложениям повреждать данные, используе мые операционной системой; · разделяя данные между задачами посредством блокирования доступа к дaH ным любой задачи со стороны остальных задач; · позволяя назначать областям памяти атрибут «только для чтения» для защи ты наиболее важных данных; · обнаруживая неожиданные обращения к памяти (скажем, при порче стека). Кроме Toro, модуль MPU может использоваться для назначения различным областям памяти атрибутов доступа, определяющих возможности кэширования и буферизации. Для реализации функций защиты памяти модуль MPU разбивает всё aдpec ное пространство процессора на несколько областей. В общей сложности можно задать до восьми областей. Помимо этоrо, можно определить «фоновую» карту памяти, которая будет использоваться по умолчанию на привилеrированном уровне доступа. Обращения к ячейкам памяти, которые не входят ни в одну из областей модуля MPU или доступ к которым запрещён параметрами области, BЫ зовут rенерацию исключения MemManage Fault. Области MPU MorYT перекрываться. Если ячейка памяти относится к двум об ластям, то атрибуты доступа к памяти и права доступа, используемые при обра щении к этой ячейке, будут определяться установками области с наибольшим HO мером. Так, если адрес пересылки находится в диапазоне адресов, соответствую щем lй и 4й областям, то будут использоваться установки 4й области. 
13.2. Pezucтpbl модуля МРИ · 235 13.2. Реrистры модуля MPU Модуль MPU имеет ряд специальных реrистров. Один из них  это реrистр типа модуля MPUTYPE, который позволяет определить наличие данноrо MOДY ля в устройстве. Если при чтении поля DREGION возвращается нулевое значе ние, значит, модуль MPU не реализован (Табл. 13.1). Таблица 13.1. РеI'ИСТР типа MPU MPUTYPE (OxEOOOED90) Значение Биты Обозначение Тип после Описание сброса Число областей команд) поддерживаемых данным 23:16 IREGION R О MPU; поскольку в архитектуре ARMv7M используется унифицированный модуль MPU) это поле всеrда содержит О Число областей) поддерживаемых данным MPU; 15:8 DREGION R О или 8 в процессоре Cortex М3 это значение равно либо О (MPU отсутствует)) либо 8 (MPU присутствует) О SEPARATE R О Этот бит всеrда равен О) поскольку используется унифицированный модуль MPU Для управления модулем предназначено несколько реrистров. Прежде Bcero, это реrистр управления модулем MPUCTRL (Табл. 13.2). В данном реrистре pac положены три управляющих бита. При сбросе в реrистр заносится нулевое значе ние, что соответствует отключённому модулю MPU. ДЛЯ разрешения работы MO дуля MPU необходимо задать параметры всех областей MPU, после чеrо YCTaHO вить бит ENABLE реrистра управления. Таблица 13.2. РеI'ИСТр управления MPU MPUCTRL (OxEOOOED94) Биты Обозначение Тип Значение Описание после сброса Разрешение доступа к карте памяти в привилеrированном режиме. При YCTaHOB ленном бите PRIVDEFENA и включённом модуле MPU вся карта памяти рассматривается как 2 PRIVDEFENA R/W О «фоновая» область) доступная для привилеrиро ванных обращений. Если данный бит сброшен) то «фоновая» область отсутствует) а обращение к ячейке памяти) не входящей в какуюлибо область MPU) вызывает отказ системы управления памятью Этот бит разрешает использование модуля MPU в обработчиках NMI и исключения Hard Fault. 1 HFNMIENA R/W О Если бит сброшен) то при выполнении данных обработчиков модуль MPU не используется (блокируется) о ENABLE R/W О Установка этоrо бита в 1 разрешает работу модуля MPU Если не задано ни одной области MPU, то установленный бит PRIVDEFENA по зволяет привилеrированному коду обращаться к любым ячейкам памяти в преде 
236 · rлава 13. Модуль защиты памяти МРИ лах Bcero адресноrо пространства, в то время как обращения из пользовательскоrо кода будут блокироваться. Если же имеются сконфиrурированные и разрешённые области MPU, то их настройки будут иметь более высокий приоритет. В качестве примера можно рассмотреть две системы с одинаковыми настройками MPU, в одной из которых бит PRIVDEFENA будет установлен в 1 (правая часть Рис. 13.1). Установленный бит PRIVDEFENA разрешает в последней системе привилеrиро ванный доступ к ячейкам памяти, не входящим ни в одну из областей MPU. о Рис. 13.1. Влияние бита PRIVDEFENA. Установка бита разрешения в реrистре управления обычно является послед ней операцией при настройке модуля MPU. Если не следовать этому правилу, то в процессе конфиrурирования областей MPU MorYT случайным образом rенери роваться различные исключения отказов. Следующим реrистром, используемым для управления модулем MPU, являет ся реrистр номера области MPURNR (Табл. 13.3). Перед заданием параметров каждой из областей в этот реrистр заносится номер конфиrурируемой области. Таблица 13.3. РеI'ИСТР номера области MPU MPURNR (OxEOOOED98) PRIVDEFENA = о о ...... Доступ ..... запрещён Права доступа к области З переопределяют настройки Область 3 ......iI области 2 \.. - ' Область 2 .... П ра ва доступа ..... к области 2 Область 1 ...... I Права доступа ....... I к области 1 ...... I Доступ ..... I запрещён Область О ...... П ра ва доступа ..... к области О 4 rбайт PRIVDEFENA = 1 Только ...... ...... привилеrи Область 1 рованный доступ Права доступа к области З переопределяют настройки Область 3 iI области 2 r Область 2 ...... Права доступа I ...... к области 2 Область 1 ...... Права доступа ..... к области 1 ...... Только Область 1 ....... привилеrи рованный доступ Область О .... Права доступа ..... к области О 4 rбайт Биты Обозна Тип Значение после Описание чение сброса 3адаёт номер проrраммируемой области. Поскольку 7:0 REGION R/W  модуль MPU процессора CortexM3 поддерживает Bcero 8 областей) в этом реrистре реализованы только биты [2:0] 
13.2. Pezucтpbl модуля МРИ · 237 Начальный адрес области MPU определяется реrистром базовоrо адреса MPURBAR (Табл. 13.4). Используя поля VALID и REGION данноrо реrистра, мы сможем исключить этап проrраммирования реrистра номера области. Это позво лит упростить код проrраммы, особенно в том случае, если все параметры MPU хранятся в проrрамме в виде таблицы. Таблица 13.4. Реrистр базовоrо адреса области MPU MPURBAR (OxEOOOED9C) Значение Биты Обозначение Тип после Описание сброса 31:5 ADDR R/W  Базовый адрес области Если бит установлен в 1, то номер области MPU, проrраммируемой на данном этапе, будет 4 VALID R/W  определяться полем REGION этоrо реrистра. Если бит сброшен в О, то используется область, заданная реrистром MPURNR Это поле используется вместо реrистра номера об ласти MPURNR, если бит VALID установлен в 1; 3:0 REGION R/W  в противном случае, содержимое данноrо поля иr норируется. Поскольку модуль MPU процессора Cortex М3 поддерживает Bcero 8 областей, то это по ле также иrнорируется, если ero значение больше 7 Для задания параметров области предназначен реrистр атрибутов и размера области MPURASR (Табл. 13.5). В частности, размер области MPU определяется содержимым 5битноrо поля REGIONSIZE этоrо реrистра (Табл. 13.6). Таблица 13.5. Реrистр атрибутов и размера области MPU MPURASR (OxEOOOEDAO) Биты Обозначение Тип Значение Описание после сброса 31:29 Зарезервировано    Запрет выборки команд (1 = запрещает 28 XN R/W  выборку команд из данной области памяти; при попытке это сделать rенерируется отказ системы управления памятью) 27 Зарезервировано    26:24 АР R/W  Поле прав доступа к данным 23:22 Зарезервировано    21:19 ТЕХ R/W  Поле расширения типа 18 S R/W  Разделяемая 17 С R/W  Кэшируемая 16 В R/W  Буферируемая 15:8 SRD R/W  Запрет подобластей 7:6 Зарезервировано    5:1 SIZE R/W  Размер области MPU О ENABLE R/W  Разрешение области 
238 . Тлава 13. Модуль защиты памяти МРИ Таблица 13.6. Значение поля SIZE реrистра MPURASR и размер области MPU Поле SIZE Размер области ЬООООО Зарезервировано ЬООООl Зарезервировано ЬООО10 Зарезервировано ЬООО11 Зарезервировано ЬООl00 32 байта ЬОО101 64 байта ЬОО110 128 байт ЬОО 111 256 байт ЬО1000 512 байт ЬОl001 1 Кбайт ЬО1010 2 Кбайт ЬО1011 4 Кбайт ЬО1100 8 Кбайт ЬО1101 16 Кбайт ЬО1110 32 Кбайт ЬО1111 64 Кбайт ыоооо 128 Кбайт ЫООО1 256 Кбайт ЫОО10 512 Кбайт ЫОО11 1 Мбайт ЫО100 2 Мбайт ЫО101 4 Мбайт ЫО110 8 Мбайт ы1ll11 16 Мбайт ЫI000 32 Мбайт Ы1001 64 Мбайт Ы1010 128 Мбайт Ы1011 256 Мбайт Ы1100 512 Мбайт Ы1101 1 [байт Ы1110 2 fбайт Ы1111 4 fбайт Поле запрета подобластей (биты [15:8] реrистра MPURASR) используется для разбиения области MPU на восемь подобластей paBHoro размера с последующим разрешением или запрещением каждой из них. Если подобласть запрещена и при этом частично перекрывается друrой подобластью, то используются права ДOCTY па указанной друrой подобласти. Если подобласть запрещена и не перекрывается с друrой областью, то обращение к данному участку памяти вызовет исключение MemManage Fault. Использование подобластей возможно только в том случае, ec ли размер области превышает 128 байт. Права доступа к области MPU определя 
13.2. Pezucтpbl модуля МРИ · 239 ются содержимым битовоrо поля АР (биты [26:24] реrистра MPURASR) в COOT ветствии с Табл. 13.7. Таблица 13.7. Содержимое поля АР и соответствующие права доступа Значение Привилеrиро Пользователь Описание АР ванный доступ ский доступ 000 Доступ запрещён Доступ запрещён Доступ запрещён 001 Чтение/запись Доступ запрещён Доступ только на привилеrированном уровне 010 Чтение/запись Только чтение Запись в пользовательской проrрамме вызовет отказ 011 Чтение/запись Чтение/запись Полный доступ 100 Непредсказуемо Непредсказуемо Непредсказуемо 101 Только чтение Доступ запрещён Только чтение на привилеrированном уровне 110 Только чтение Только чтение Только чтение 111 Только чтение Только чтение Только чтение Поле XN (бит 28) определяет допустимость выборки команд из данной области памяти. Если этот бит установлен в 1, то при исполнении любой команды, выбран ной из указанной области, будет сrенерировано исключение MemManage Fault. Назначение полей ТЕХ, S, В, с (биты [21:16]) более сложное. Несмотря на то что процессор CortexM3 не имеет кэшпамяти, он всё же построен по архитектуре ARMv7M, которая поддерживает внешнюю кэшпамять, а также более развитые системы памяти. Поэтому атрибуты доступа к памяти для конкретной области MorYT задаваться в соответствии с используемой моделью управления памятью. В архитектурах у6 и у7 система памяти может иметь два уровня кэшпамяти: внутренний и внешний. Эти уровни MorYT иметь различные политики кэширо ван ия. Поскольку сам процессор CortexM3 не имеет контроллера кэшпамяти, различные политики кэширования влияют только на буферирование операций записи во внутреннем коммутаторе BusMatrix и, возможно, в контроллере памя ти (Табл. 13.8). Причём, в большинстве микроконтроллеров можно оrраничить ся Bcero несколькими типами памяти с соответствующими атрибутами (Рис. 13.2). Таблица 13.8. Атрибуты памяти в архитектуре ARMv7M Совместное ТЕХ С В Описание использование области ЬООО О О CTporo упорядоченная (выполнение и завершение Разделяемая пересылок производится в проrраммируемом порядке) ЬООО О 1 Разделяемое устройство (операции записи MorYT Разделяемая буферироваться) ЬООО 1 О Внешний и внутренний кэш со сквозной записью; [5] без размещения записываемых данных ЬООО 1 1 Внешний и внутренний кэш со сквозной записью; [5] без размещения записываемых данных ЬООl О О Внешний и внутренний кэш отключены [5] ЬООl О 1 Зарезервировано Зарезервировано 
240 · Тлава 13. Модуль защиты памяти МРИ Таблица 13.8. Атрибуты памяти в архитектуре ARMv7M (продолжение) Совместное ТЕХ С В Описание использование области ЬО01 1 О Зависит от реализации  ЬО01 1 1 Внешний и внутренний кэш со сквозной записью; [S] с размещением записываемых данных Ь010 О О Неразделяемое устройство Неразделяемая Ь010 О 1 Зарезервировано Зарезервировано Ь010 1 Х Зарезервировано Зарезервировано ЫВВ А А Кэшируемая память; ВВ = политика внешнеrо кэша, [S] АА = политика BHYTpeHHero кэша Назначение Тип памяти Обычно ИСПОllьзуемые атрибуты памяти I Флэш/П3У ' С) Обычная память с) Нераеляемая,сквознаязапись ( = 1, В = О, ТЕХ = О, S = о Внутреннее (ОЗУ с) Обычная память с) Разделяемая, сквозная запись ( = 1, В = О, ТЕХ = О, S = 1 Внешнее (ОЗУ с) Обычная память с) Разделяемая, обратная запись ( = 1, В = 1, ТЕХ = О, S = 1 I Периферия ' С) Память устройства с) Разделяемое устройство (= О, В = 1, ТЕХ = О, S = 1 Рис. 13.2. Наиболее часто используемые в микроконтроллерах атрибуты памяти. Если вы используете микроконтроллер с кэшпамятью, то вы должны сконфи rурировать модуль MPU в соответствии с желаемой политикой кэширования (например, запрет кэширования/кэширование со сквозной записью/кэширова ние с обратной записью). Если бит ТЕХ[2] установлен в 1, то политика кэширова ния для внутренней и внешней кэшпамяти соответствует Табл. 13.9. Таблица 13.9. Политика внутреииеrо и виешнеrо кэша при ТЕХ[2] = 1 Биты атрибутов памяти Политика кэширования (АА и ВВ) 00 Кэширование отключено 01 Обратная запись; размещение записываемых данных 10 Сквозная запись; нет размещения записываемых данных 11 Обратная запись; нет размещения записываемых данных 
13.3. Настройка модуля МРИ · 241 Дополнительную информацию о кэшпамяти и политиках кэширования мож но почерпнуть из руководства [2]. 13.3. Настройка модуля MPU На первый взrляд, реrистры модуля MPU MorYT показаться сложными для по нимания, однако если вы чётко осознаёте, какие именно области памяти нужны для вашеrо приложения, то использование этих реrистров не вызовет никаких затруднений. Как правило, необходимы следующие области: . область проrраммноrо кода для привилеrированных проrрамм, таких как ядро ОС и обработчики исключений; . область проrраммноrо кода для пользовательских проrрамм; . область данных для привилеrированных и пользовательских проrрамм в раз личных областях памяти (например, данные и стек приложения, расположен ные в области статическоrо ОЗУ с адресами от Ох20000000 до Ох30000000); . прочая периферия. Выделять отдельную область памяти в диапазоне адресов шины собственных периферийных устройств не обязательно. Модуль MPU автоматически распозна ёт соответствующие адреса и разрешает привилеrированному коду обращаться к этой области памяти. В устройствах с ядром CortexM3 для большинства областей памяти MorYT быть заданы следующие атрибуты: ТЕХ = 000, С = 1, В = 1. Системные устройства, такие как контроллер прерываний NVIC, должны располаrаться в области со cTporo упорядоченным доступом, а области для периферии должны иметь атри буты «разделяемые устройства» (ТЕХ = 000, С = О, В = 1). Если же вы хотите, что бы любые отказы шины в области были «точными», то для неё необходимо будет использовать атрибуты cTporo упорядоченной памяти (ТЕХ = 000, с = О, В = О), чтобы запретить буферизацию записи. Однако при этом может снизиться произ водительность системы. При использовании СМSISсовместимых драйверов устройств к реrистрам MPU можно обращаться как к элементам структуры (см. Табл. 13.10). Алrоритм простейшей процедуры инициализации модуля MPU приведён на Рис. 13.3. Таблица 13.10. Названия реrистров модуля MPU в стандарте CMSIS Поле Реrистр модуля MPU Адрес MPU>TYPE Реrистр типа MPU OxEOOOED90 MPU>CTRL Реrистр управления MPU OxEOOOED94 MPU>RNR Реrистр номера области MPU OxEOOOED98 MPU>RBAR Реrистр баЗОБоrо адреса области MPU OxEOOOED9C MPU>RASR Реrистр атрибутов и размера области MPU OxEOOOEDAO MPU>RBARAl Псевдоним 1 реrистра базовоrо адреса области MPU OxEOOOEDA4 MPU>RBARA2 Псевдоним 2 реrистра базовоrо адреса области MPU OxEOOOEDAC MPU>RBARA3 Псевдоним 3 реrистра базовоrо адреса области MPU OxEOOOEDB4 MPU>RASRAl Псевдоним 1 реrистра атрибутов и размера области OxEOOOEDA8 MPU 
242 · Тлава 13. Модуль защиты памяти МРИ Таблица 13.10. Названия реrистров модуля MPU в стандарте CMSIS (продолжение) Поле РеI'ИСТр модуля MPU Адрес MPU>RASRA2 Псевдоним 2 реrистра атрибутов и размера области OxEOOOEDBO MPU MPU>RASRA3 Псевдоним 3 реrистра атрибутов и размера области OxEOOOEDB8 MPU Проверяем реrистр типа MPU, чтобы убедиться в наличии модуля и в том, что он поддержи вает требуемое число областей Ошибка Да Выключаем MPU Выбираем область NOO Операции выбора области и проrраммирования реrистров 3адаём базовый адрес кон ф и ryр а ц ии области и конфиrурацию области можно объединить Выбираем область N Q l 3адаём базовый адрес и конфиrурацию области , I I I r I Конфиrурируем I : остальные : I области I   Выбираем область NQN 3адаём базовый адрес и конфиrурацию области Включаем модуль MPU Настройка модуля MPU завершена Рис. 13.3. Пример алzорuтма настройки модуля мри. Если таблица векторов перемещена в ОЗУ, то перед включением модуля MPU не забудьте поместить в таблицу адрес обработчика исключения MemManage Fault и разрешить данное исключение, используя реrистр SHCSR. Указанные Me ры необходимы для запуска этоrо обработчика при нарушении правил, заданных модулем MPU. 
13.3. Настройка модуля МРИ . 243 Предположим, что нам требуется Bcero четыре области памяти. В этом случае код инициализации модуля MPU (без функций контроля областей и их разреше ния) может выrлядеть следующим образом: MPU>RNR = О; // Реrистр номера области MPU // Выбираем область O MPU>RBAR = ОхОООООООО; // Реrистр базовоrо адреса области MPU // Базовый адрес = ОхОООООООО MPU>RA8R Ox0307002F; // Реrистр атрибутов и размера области // R/W, ТЕХ=О, 8=1, С=l, В=l, 16 Мбайт, разрешена // Выбираем область 1 // Базовый адрес = Ох20000000 // R/W, ТЕХ=О, 8=1, С=l, В=l, 64 Мбайт, разрешена // Выбираем область 2 // Базовый адрес = Ох40000000 // R/W, ТЕХ=О, 8=1, с=о, В=l, 64 Мбайт, разрешена 3; / / Выбираем область N!3 ОхАООООООО; // Базовый адрес = ОхАООООООО Ох01040027; // Привилеrированное R/W, ТЕХ=О, 8=1, с=о, В=О, // 1 Мбайт, разрешена MPU>CTRL = 1; // Реrистр управления MPU  включаем модуль MPU ТО же на языке ассемблера: LDR RO,=OxEOOOED98 Реrистр номера области MOV R1,#0 Выбираем область O 8TR R1, [RO] LDR R1,=OxOOOOOOOO 8TR R1, [RO, #4] LDR R1,=Ox0307002F 8TR R1, [RO, #8] MOV R1,#1 8TR R1, [RO] LDR R1,=Ox20000000 8TR R1, [RO, #4] LDR R1,=Ox03070033 8TR R1, [RO, #8] MOV R1,#2 8TR R1, [RO] LDR R1,=Ox40000000 8TR R1, [RO, #4] LDR R1,=Ox03050033 8TR R1, [RO, #8] MOV R1,#3 8TR R1, [RO] LDR R1,=OxAOOOOOOO 8TR R1, [RO, #4] LDR R1,=Ox01040027 MPU>RNR = MPU>RBAR = MPU>RA8R MPU>RNR = MPU>RBAR = MPU>RA8R = MPU>RNR = MPU>RBAR = MPU>RA8R = 1; Ох20000000; Ох03070033; 2; Ох40000000; Ох03050033; STR Rl, [RO, #8] MOV R1,#1 8TR R1, [RO,#4] Базовый адрес = ОхОООООООО Реrистр базовоrо адреса области R/W, ТЕХ=О, 8=1, С=l, В=l, 16 Мбайт, Реrистр атрибутов и размера области Выбираем область 1 разрешена Базовый адрес = Ох20000000 Реrистр базовоrо адреса области R/W, ТЕХ=О, 8=1, С=l, В=l, 64 Мбайт, Реrистр атрибутов и размера области Выбираем область 2 разрешена Базовый адрес = Ох40000000 Реrистр базовоrо адреса области R/W, ТЕХ=О, 8=1, с=о, В=l, 64 Мбайт, Реrистр атрибутов и размера области Выбираем область 3 разрешена Базовый адрес = ОхАООООООО Реrистр базовоrо адреса области Привилеrированное R/W, ТЕХ=О, 8=1, с=о, В=О, 1 Мбайт, разрешена Реrистр атрибутов и размера области Включаем модуль MPU Реrистр управления MPU (OxEOOOE0984=OxEOOOE094) 
244 · Тлава 13. Модуль защиты памяти МРИ в результате будут определены четыре области MPU: · Код  ОхОООООООО.. .0хООРРРРРР (16 Мбайт), полный доступ, кэшируемая память. · Данные  Ох20000000.. .Ох23РРРРРР (64 Мбайт), полный доступ, кэшируемая память. · Периферия  Ох40000000.. .Ох43РРРРРР (64 Мбайт), полный доступ, разделяе мый ресурс. · Внешние устройства  ОхАООООООО.. .0хАООРРРРР (1 Мбайт), привилеrиро ванный доступ, cTporo упорядоченная память, неисполняемая. Приведённый выше код можно сократить, объединив операции выбора обла сти и записи в реrистр базовоrо адреса: MPU>RBAR = ОхООООО010; // Реrистр базовоrо адреса области MPU // Базовый адрес = ОхОООООООО, корректен, область WO MPU>RA8R = ОхОЗ07002F; // Реrистр атрибутов и размера области // R/W, ТЕХ=О, 8=1, С=l, В=l, 16 Мбайт, разрешена // Базовый адрес = Ох20000000, корректен, область W1 // R/W, ТЕХ=О, 8=1, С=l, В=l, 64 Мбайт, разрешена // Базовый адрес = Ох40000000, корректен, область W2 // R/W, ТЕХ=О, 8=1, с=о, В=l, 64 Мбайт, разрешена // Базовый адрес = ОхАООООООО, корректен, область WЗ // Привилеrированное R/W, ТЕХ=О, 8=1, с=о, в=о, // 1 Мбайт, разрешена MPU>CTRL = 1; // Реrистр управления MPU  включаем модуль MPU Или, на языке ассемблера: LDR RO,=OxEOOOED9C Реrистр базовоrо адреса области LDR R1,=Ox00000010 Базовый адрес = ОхОООООООО, корректен, область WO 8TR R1, [RO, #0] Реrистр базовоrо адреса области MPU LDR R1,=ОхОЗ07002F R/W, ТЕХ=О, 8=1, С=l, В=l, 16 Мбайт, разрешена 8TR R1, [RO, #4] Реrистр атрибутов и размера области MPU LDR R1,=Ox20000011 Базовый адрес = Ох20000000, корректен, область W1 8TR R1, [RO, #0] Реrистр базовоrо адреса области MPU LDR R1,=ОхОЗ0700ЗЗ R/W, ТЕХ=О, 8=1, С=l, В=l, 64 Мбайт, разрешена 8TR R1, [RO, #4] Реrистр атрибутов и размера области MPU LDR R1,=Ox40000012 Базовый адрес = Ох40000000, корректен, область W2 8TR R1, [RO, #0] Реrистр базовоrо адреса области MPU LDR R1,=ОхОЗ0500ЗЗ R/W, ТЕХ=О, 8=1, с=о, В=l, 64 Мбайт, разрешена 8TR R1, [RO, #4] Реrистр атрибутов и размера области MPU LDR R1,=ОхАОООО01З Базовый адрес = ОхАООООООО, корректен, область wз 8TR R1, [RO, #0] Реrистр базовоrо адреса области MPU LDR Rl,=Ox01040027 R/W, ТЕХ=О, 8=1, с=о, в=о, 1 Мбайт, разрешена 8TR Rl, [RO, #4] Реrистр атрибутов и размера области MPU MOV Rl,#l Включаем модуль MPU STR Rl, [RO,#8] Реrистр управления MPU (OxEOOOE09C8=OxEOOOE094) Размер кода несколько уменьшился. Однако нет предела совершенству! Для получения более быстроrо и компактноrо кода можно воспользоваться альтерна тивными адресами (псевдонимами) реrистров MPU (см. Табл. [.34 в Приложе нии [), которые позволяют обращаться к реrистрам MPU RBAR и MPU RASR. Эти псевдонимы образуют непрерывную область размером 8 слов, что даёт воз можность использовать команды rрупповой заrрузки/сохранения (LDM и STM): MPU>RBAR = MPU>RA8R = MPU>RBAR = MPU>RA8R = MPU>RBAR = MPU>RA8R = Ох20000011; ОхОЗ0700ЗЗ; Ох40000012; ОхОЗ0500ЗЗ; ОхАОООО01З; ОхОl040027; 
13.3. Настройка модуля МРИ . 245 LDR RO,=OxEOOOED9C LDR R1,=MPUconfig LDMIA R1!, {R2, R3, 8TMIA RO!, {R2, R3, LDMIA R1!, {R2, R3, 8TMIA RO!, {R2, R3, В MPUconfigEnd ALIGN 4 ; Эта директива необходима для KoppeKTHoro размещения ; последующей таблицы (с выравниванием на rраницу слова), MPUconfig ; чтобы мы моrли использовать команду умножения DСD ОхООООО010 Базовый адрес = ОхОООООООО, корректен, область WO DСD Ox0307002F R/W, ТЕХ=О, 8=1, С=l, В=l, 16 Мбайт, разрешена DСD Ох20000011 Базовый адрес = Ох08000000, корректен, область W1 DСD Ох03070033 R/W, ТЕХ=О, 8=1, С=l, В=l, 64 Мбайт, разрешена DСD Ох40000012 Базовый адрес = Ох40000000, корректен, область W2 DСD Ох03050033 R/W, ТЕХ=О, 8=1, с=о, В=l, 64 Мбайт, разрешена DСD ОхАООООО13 Базовый адрес = ОхАООООООО, корректен, область W3 DСD Ох01040027 R/W, ТЕХ=О, 8=1, с=о, В=О, 1 Мбайт, разрешена MPUconfigEnd LDR RO,=OxEOOOED94 MOV R1,#1 8TR R1, [RO] Разумеется, приведённое выше решение приrодно только в том случае, если вся требуемая информация известна заранее. В противном случае, придётся при менять более универсальные методы. Один из таких методов заключается в ис пользовании отдельной подпроrраммы (MpuRegionSetup), настраивающей об ласть MPU в соответствии с входными параметрами: void MpuRegion8etup(unsigned int addr, unsigned int region, unsigned int size, unsigned int ар, unsigned int MemAttrib, unsigned int srd, unsigned int XN, unsigned int enable) { // Процедура настройки области MPU MPU>RBAR = (addr & OxFFFFFFEO) I (region & OxF) I Ох10; MPU>RA8R = ((XN & Ох1)«28) I ((ар & Ох7)«24) I ((MemAttrib & Ox3F) «16) I ((srd&OxFF) «8) ((size & Ox1F) «1) I (enable & Ох1); R4, R5}; R4, R5}; R4, R5}; R4, R5}; Реrистр базовоrо адреса области Таблица предустановленных параметров Читаем 4 слова из таблицы Пишем 4 слова в MPU Читаем следующие 4 слова из таблицы Пишем следующие 4 слова в MPU модуля MPU Реrистр управления MPU Включаем модуль MPU return; } void MpuRegionDisable(unsigned int region) { // Процедура запрещения неиспользуемой области MPU MPU>RBAR = (region & OxF) I Ох10; MPU>RASR = о; // Запрещаем return; } void Mpu8etup(void) { // Конфиrурирование модуля MPU MPU>CTRL = о; // Сначала отключаем MPU MpuRegion8etup(OxOOOOOOOO, О, Ох17, 3, 7, MpuRegionSetup(Ox20000000, 1, Ох19, 3, 7, MpuRegion8etup(Ox40000000, 2, Ох19, 3, 5, MpuRegion8etup(OxAOOOOOOO, 3, Ох13, 1, 4, О, О, 1) ; // Область О, 16 Мбайт О, О, 1) ; // Область 1, 64 Мбайт О, О, 1) ; // Область 2, 64 Мбайт О, О, 1) ; // Область 3, 1 Мбайт 
246 . Тлава 13. Модуль защиты памяти МРИ MpuRegionDisable(4); // Запрещаем неиспользуемую область 4 MpuRegionDisable(5); // Запрещаем неиспользуемую область 5 MpuRegionDisable(6); // Запрещаем неиспользуемую область 6 MpuRegionDisable(7); // Запрещаем неиспользуемую область 7 MPU>CTRL  1; // Включаем модуль MPU return; в при мере была использована подпроrрамма, запрещающая обращение к He используемым областям. Это необходимо делать в том случае, если вы не знаете, как указанные области были сконфиrурированы раньше. Если неиспользуемые области ранее были разрешены, то их необходимо запретить, чтобы они не влия ли на новую конфиrурацию модуля MPU. Разумеется, процедуры настройки модуля MPU можно реализовать и на ac семблере: MpuSetup ; Процедура конфиrурирования MPU, в которой несколько раз вызывается ; процедура настройки области {ROR6, LR} RO,OxEOOOED94 R1,#0 R1, [RO] ;  Область o  RO,OxOOOOOOOO R1,#OxO R2,#Ox17 R3,#Ox3 R4,#Ox7 R5,#OxO R6,#Ox1 MpuRegionSetup ;  Область 1  RO,Ox20000000 R1,#Ox1 R2,#Ox19 R3,#Ox3 R4,#Ox7 R5,#OxO R6,#Ox1 MpuRegionSetup PUSH LDR MOV STR LDR MOV MOV MOV MOV MOV MOV BL LDR MOV MOV MOV MOV MOV MOV BL Реrистр управления MPU Отключаем модуль MPU Область Область Область Область Область Область Область Область Область Область Область Область Область Область о: базовый адрес  ОхОООООООО о: номер области = О о: размер  Ох17 (16 Мбайт) о: АР  Ох3 (полный доступ) о: атрибуты = Ох7 о: запрет подобластей  О о: {XN, Enable}  0,1 1: базовый адрес  Ох20000000 1: номер области = 1 1: размер = Ох19 (64 Мбайт) 1: АР = Ох3 (полный доступ) 1: атрибуты  Ох7 1: запрет подобластей  О 1: {XN, Enable} = 0,1 Настраиваем области 2 и 3 ;  Области 47 запрещены MOV RO,#4 BL MpuRegionDisable MOV RO,#5 BL MpuRegionDisable MOV RO,#6 BL MpuRegionDisable MOV RO,#7 BL MpuRegionDisable LDR RO,OxEOOOED94 ; Реrистр управления MPU MOV R1,#1 
13.4. Типичный процесс настройки модуля МРИ · 247 5TR R1, [RO] РОР {ROR6, РС} MpuRegion5etup ; Подпроrрамма настройка области MPU Вход RO базовый адрес R1 номер области R2 размер R3 АР (права доступа) R4 атрибуты памяти ({ТЕХ[2:0], R5 запрет подобластей R6 {XN, Enable} PUSH {ROR1, LR} BIC RO, RO, #Ox1F BFI RO, R1, #0, #4 ORR RO, RO, #Ох10 LDR R1,=OxEOOOED9C 5TR RO, [R1] AND R О , R б , UBFX R1, R6, BFI RO, R1, BFI RO, R2, #Ох01 #1, #1 #28, #1 #1 , #5 BFI BFI RO, R3, #24, #3 RO, R4, #16, #6 BFI RO, R5, #8, #8 Включаем модуль MPU Возвращаемся 5, С, В}) Очищаем неиспользуемые биты адреса Помещаем номер области в RO[3:0] Устанавливаем бит корректности Реrистр базовоrо адреса области MPU ; Задаём базовый адрес Получаем бит Enable Получаем бит XN Кладём XN в RO[28] Заrружаем размер области (R2[4:0]) в RO[5:1] Заrружаем права доступа (R3[2:0]) в RO[26:24] Заrружаем атрибуты памяти (R4[5:0]) в RO[21:16] Заrружаем биты запрета подобластей (5RD) в RO[15:8] Реrистр размера и атрибутов области MPU Инициализируем реrистр ; Возвращаемся LDR R1,=OxEOOOEDAO STR RO, [R1] РОР {ROR1, РС} MpuRegionDisable ; Подпроrрамма для запрещения неиспользуемой области ; Вход RO : номер области PU5H {R1, LR} AND RO, RO, #OxF ORR RO, RO, #Ох10 LDR R1,=OxEOOOED9C STR RO, [R1] MOV RO, #0 LDR R1,=OxEOOOEDAO Реrистр размера и атрибутов области MPU 5TR RO, [R1] Очищаем реrистр (область запрещена) РОР {R1, РС} Возвращаемся В данном примере демонстрируется использование команды вставки битово ro поля (BFI). Эта команда позволяет значительно упростить операции объедине ния битовых полей. Очищаем неиспользуемые биты адреса Устанавливаем бит корректности Реrистр базовоrо адреса области MPU 13.4. Типичный процесс настройки модуля MPU в большинстве приложений модуль MPU используется для Toro, чтобы пре дотвратить доступ из пользовательских проrрамм к областям кода и данных при 
248 · Тлава 13. Модуль защиты памяти МРИ вилеrированных процессов. Обычно эти функции реализуются встраиваемой ос. Между переключениями контекста ос изменяет конфиrурацию MPU так, чтобы пользовательские приложения моrли обращаться к своему коду и данным, а также к друrим требуемым ресурсам. При написании процедуры конфиrуриро вания модуля MPU необходимо предусмотреть следующие области: 1. Область кода: а) привилеrированный код, включая начальную таблицу векторов; б) пользовательский код. 2. Область созу: а) привилеrированные данные, включая основной стек; б) пользовательские данные, включая стек процесса; в) привилеrированная область доступа к битам; r) пользовательская область доступа к битам. 3. Периферия: а) привилеrированная периферия; б) пользовательская периферия; в) привилеrированная область доступа к битам в диапазоне адресов периферийных устройств; r) пользовательская область доступа к битам в диапазоне адресов периферийных устройств. В приведённом выше списке мы обозначили 10 областей  это больше, чем под держивается модулем MPU процессора CortexM3. Однако привилеrированные области можно задать, воспользовавшись «фоновой» областью (PRIVDEFENA = 1). Тоrда нам необходимо будет определить только пять пользовательских областей MPU и ещё три останутся в запасе. При необходимости незадействованные обла сти MPU можно использовать для орrанизации дополнительных областей во внешней памяти для защиты данных, предназначенных только для чтения, или же для полной блокировки определённоrо участка памяти. Для уменьшения Tpe буемоrо числа областей MPU некоторые из них можно объединить друr с друrом. 13.4.1. Пример использования запрета подобластей в ряде случаев нам может потребоваться, чтобы какието периферийные устройства были доступны для пользовательских проrрамм, а какието  только для привилеrированноrо доступа. В результате адресное пространство памяти периферийных устройств, доступных для пользователя, оказывается фраrменти ровано. Это можно реализовать одним из следующих способов: · определить несколько пользовательских областей; · определить привилеrированные области внутри области пользовательской периферии; · запретить подобласти в пользовательской области. В первых двух случаях очень леrко израсходовать все доступные области MPU. Используя же возможности запрета подобластей, мы сможем задать права ДOCTY па к отдельным блокам реrистров периферийных устройств, не расходуя на это дополнительные области. Применение данноrо метода показано на Рис. 13.4. 
13.4. Типичный процесс настройки модуля МРИ · 249 Адресное пространство Устройство N27 (доступное пользователю) Устройство N2б (только привилеrир. доступ) "'""""-" ;", ....,.. . Устройство N25 (только привилеrир. доступ) Устройство N24 (доступное пользователю) "":"",,:,,:,,,:,':"',""" ..... ......'............:\..:0..'..'...;:..........'..'...'.......... Устройство N23 (доступное пользователю) .\..;,..\........... ..,.-, .:. о";:,; ....::....\...\.\...;. . .:.....r...::..\.\\...:.:::..::..:.. ,..". ......"'- Устройство N22 (только привилеrир. доступ) ..,.."',..:.:.,.........."".,:....\..,....: Устройство N21 (доступное пользователю) '\'\ ...:,....:.:.."":..:....:.:;...;....: Устройство N20 (доступное пользователю) За прет подобласти о Пользовательский доступ «Фоновая» привилеrи рованная область . I : Привилеrированный: : доступ I L_________________ ,----------------------- : Привилеrированный 1 : доступ : L_______________________ о Пользовательский  доступ . .- о Пользовательский доступ 1 Привилеrированный: : доступ I . I L___________ о Пользовательский доступ о Пользовательский доступ ОБласть, доступная пользователю, с заблокированными подобластями (SRD = Охб4) Рис. 13.4. Использование запрета подобластей для управления правами доступа к разделяемым перифериЙНblМ устройствам. Этот способ работает и с областями памяти. Однако появление блоков, требу ющих прав доступа, отличных от прав соседних блоков, всё же более вероятно в области периферийных устройств. Предположим, что в нашей проrрамме используются области памяти, опи санные в Табл. 13.11. Таблица 13.11. Параметры областей памяти из приведённоrо ниже примера Атрибуты Адрес Описание Размер Тип памяти Область (С, В, А, S, MPU XN) ОхОООООООО. . . Привилеrированный 16 Кбайт Только чтение С, , А, ,  «Фоновая» OxOOO03FFF код ОхООО04000.. . Пользовательский 16 Кбайт Только чтение С, , А, ,  Область N20 OxOOO07FFF код Ох20000000. . . Пользовательские 4 Кбайт Полный доступ С, В, А, , Область N21 Ox20000FFF данные  Ох2000 1 000. . . Привилеrированные 4 Кбайт Привилеrированный С, В, А, , «Фоновая» Ox20001FFF данные доступ  Ох22000000. . . Пользовательская 128 С, В, А, , область доступа Полный доступ Область N22 Ox2201FFFF Кбайт  к битам 
250 · Тлава 13. Модуль защиты памяти МРИ Таблица 13.11. Параметры областей памяти И3 приведённоrо ниже примера (продолжение) Атрибуты Адрес Описание Размер Тип памяти Область (С, В, А, S, MPU XN) Ох22020000.. . Привилеrированная 128 С, В, А, , Ox2203FFFF область доступа Кбайт Полный доступ «Фоновая» к битам  Ох40000000.. . Пользовательская 1 Мбайт Полный доступ , В, , , Область N23 Ox400FFFFF периферия XN Привилеrированная Ох40040000. . . периферия в области 128 Привилеrированный , В, , , Закрытая Ox4005FFFF пользовательских Кбайт XN подобласть периферийных доступ области N23 устройств Область доступа Ох42000000.. . к битам 32 Мбайт Полный доступ , В, , , Область N24 Ox43FFFFFF пользовательской XN периферии Область доступа к битам Закрытая Ох42800000.. . привилеrированной Привилеrированный , В, , , 4 Мбайт подобласть Ox42BFFFFF периферии доступ XN области N24 в пользовательской области памяти Ох60000000.. . Внешнее ОЗУ 16 Мбайт Полный доступ С, В, А, , Область N25 Ox60FFFFFF  Контроллер NVIC, ОхЕООООООО. . . компоненты отладки Привилеrированный и шина собственных 1 Мбайт ,,, , «Фоновая» OxFOOFFFFF периферийных доступ XN устройств Примечание. Символ «А» в столбце атрибутов памяти определяет размещение кэша. После определения требуемых областей мы можем написать процедуру Ha стройки модуля MPU. ДЛЯ облеrчения пони мания и последующих изменений KO да воспользуемся ранее написанной функцией: void MpuSetup(void) { // Настройка модуля МРИ МРИ>СТRL = о; // Сначала отключаем МРИ // Параметры: Адрес, Область, Размер, АР, Атрибуты, 8RD, XN, Разрешение MpuRegionSetup(Ox00004000, О, ОхОD, 3, Ох2, О, О, 1); // Область O // Ox00004000Ox00007FFF: пользовательская проrрамма, 16 Кбайт, полный доступ, // атрибуты = Ох2 (ТЕХ=О, 8=0, С=l, В=О), запрет подобластей = О, XN=O MpuRegionSetup(Ox20000000, 1, ОхОВ, 3, ОхВ, О, О, 1); // Область 1 // Ox20000000Ox20000FFF: пользовательские данные, 4 Кбайт, полный доступ, // атрибуты = ОхВ (ТЕХ=l, 8=0, С=l, В=l), запрет подобластей = О, XN=O MpuRegion8etup(Ox22000000, 2, Ох10, 3, ОхВ, О, О, 1); // Область 2 // Ox22000000Ox2201FFFF: пользовательская область доступа к битам, 128 Кбайт, 
13.4. Типичный процесс настройки модуля МРИ · 251 // полный доступ, атрибуты = ОхВ (ТЕХ=l, 5=0, С=l, В=l), // запрет подобластей = О, XN=O MpuRegion5etup(Ox40000000, 3, Ох13, 3, Ох1,Ох64,0,1); // Область W3 // Ox40000000Ox400FFFFF: пользовательская периферия, 1 Мбайт, полный доступ, // атрибуты = Ох1 (ТЕХ=О, 5=0, с=о, В=l), запрет подобластей = Ох64, XN=O // Примечание: запрет подобластей = Ох64 соrласно Рис. 13.4 MpuRegion5etup(Ox42000000, 4, Ох18, 3, Ох1,Ох64,0,1); // Область W4 // Ox42000000Ox43FFFFFF: пользовательская область доступа к битам для // периферии, 32 Мбайт, полный доступ, атрибуты = Ох1 (ТЕХ=О, 8=0, с=о, В=l), // запрет подобластей = Ох64, XN=O // Примечание: запрет подобластей = Ох64 соrласно Рис. 13.4 MpuRegion5etup(Ox60000000, 5, Ох17, 3, Ох3, О, О, 1); // Область W5 // Ox60000000Ox60FFFFFF: внешнее озу, 16 Мбайт, полный доступ, // атрибуты = Ох3 (ТЕХ=О, 8=0, С=l, В=l), запрет подобластей = О, XN=O MpuRegionDisable(6); // Запрещаем неиспользуемую область W6 MpuRegionDisable(7); // Запрещаем неиспользуемую область W7 MPU>CTRL = 5; // Включаем MPU, одновременно разрешая привилеrированные // обращения к «фоновой» области return; 
rЛАВА 14 ПРОЧИЕ ВО3МОЖНОСТИ ПРОЦЕССОРА CORTEXM3 14.1. Системный таймер SYSTICK Таймер SYSTICK, входящий в состав контроллера прерываний NVIC, вкратце был рассмотрен в [лаве 8. Как мы с вами уже знаем, этот таймер представляет co бой 24битный вычитающий счётчик. При достижении счётчиком нулевоrо зна чения в Hero заrружается значение перезаrрузки из реrистра SYSTRVR. При этом счёт прекращается только при сбросе бита разрешения ENABLE реrистра управления и состояния SYSTCSR (Рис. 14.1). NOREF  KE W 31 23 Реrистр калибровочноrо значения 16 ОхЕОООЕО1С TENMS О I SYST  CALIB I SYSTCVR Реrистр текущеrо значения - ОхЕОООЕО18 CURRENT ОхЕОООЕО 14 Реrистр значения перезаrрузки RELOAD SYSTRVR ОхЕОООЕО1 О Реrистр управления и состояния . : - SYSTCSR COUNTFLAG ЕпаЫе TICКlNT CLKSOURCE Рис. 14.1. Pezucmpbl таймера SYSTICK в контроллере NVIC. В процессоре CortexM3 предусмотрено два источника TaKToBoro сиrнала тай мера SYSTICK. Одним из них является внутренний reHepaTop процессора (неза висимый от системноrо TaKToBoro сиrнала HCLK, так что формируемый им сиr нал не пропадает при отключении системноrо TaKToBoro сиrнала). В качестве друrоrо источника может выступать внешний источник TaKToBoro сиrнала. Ча стота этоrо сиrнала должна быть, по меньшей мере, в два раза меньше частоты сиrнала BHYTpeHHero reHepaTopa, поскольку последний применяется для синхро низации внешнеrо сиrнала. Возможность использования внешнеrо TaKToBoro сиrнала определяется разработчиком микросхемы и в некоторых моделях может отсутствовать. Чтобы определить наличие такой возможности, необходимо про верить состояние бита 31 реrистра калибровочноrо значения таймера 
14.1. Системный таймер SYSTICK · 253 SYSTCALIB. Разработчик микросхемы должен подать на этот вывод реrистра соответствующий уровень. При изменении значения таймера SYSTICK с О на 1 устанавливается флаr COUNTFLAG реrистра SYSTCSR. Этот флаr сбрасывается при выполнении одной из следующих операций: . чтение процессором реrистра SYSTCSR; . очистка счётчика SYSTICK посредством записи любоrо значения в реrистр Te кущеrо значения таймера SYSTCVR. Счётчик таймера SYSTICK может использоваться для периодической reHepa ции соответствующеrо исключения. Обычно это требуется операционным систе мам для реализации функций управления задачами и ресурсами. Чтобы разре шить rенерацию исключения SYSTICK, необходимо установить бит TICKINT pe rистра SYSTCSR. Кроме Toro, если таблица векторов была перемещена в ОЗУ, то в неё необходимо будет поместить адрес обработчика исключения SYSTICK. Ha пример: * ((volatile unsigned int *) (SCB>VTORt(15«2))) = (unsigned int) SysTickHandler; На языке ассемблера эту операцию можно реализовать следующим образом: ; Настройка обработчика исключения SYSTICK (необходима только в том случае, ; если таблица векторов размещена в ОЗУ) MOV RO, #OxF Исключение W15 LDR R1, =SysTickhandler Адрес обработчика исключения LDR R2, =ОхЕОООЕD08 Реrистр смещения таблицы векторов LDR R2, [R2] STR R1, [R2, RO, LSL #2] Пишем вектор по адресу VectTblOffsettExcpType*4 При наличии СМSISсовместимоrо драйвера устройства для конфиrурирова ния таймера SYSTICK можно использовать функцию SysTickConfig. Подробная информация об этой функции приведена в Приложении Ж. Также к реrистрам таймера можно обращаться напрямую как к полям структуры: . SysTick>CTRL (реrистр управления и состояния); . SysTick>LOAD (реrистр значения перезаrрузки); . SysTick>VAL (реrистр текущеrо значения); . SysTick>CALIB (реrистр калибровочноrо значения). Например, чтобы настроить таймер для rенерации исключения SYSTICK каж дые 1024 такта процессора, можно использовать следующий код: SysTick>LOAD = 1023; // Считать от 1023 до О SysTick>VAL = О; // Сбрасываем текущее значение в О SysTick>CTRL = Ох7; // Разрешаем работу таймера и rенерацию исключения SYSTICK // Для тактирования используется тактовый сиrнал процессора Аналоrичный код, написанный на ассемблере, будет выrлядеть следующим образом: ; Разрешаем работу таймера SYSTICK и rенерацию соответствующеrо исключения LDR RO, =ОхЕОООЕ010 Реrистр управления и состояния SYSTICK MOV R1, #0 STR R1, [RO] Останавливаем счётчик во избежание случайной rенерации исключения rенерируем исключение каждые 1024 такта (для получения LDR R1, =1023 
254 · rлава 14. Прочие возможности процессора CortexM3 такой периодичности счётчик декрементируется с 1023 дО О, поэтому значение перезаrрузки равно 1023) Заrружаем значение перезаrрузки в соответствующий реrистр Заrружаем любое значение в реrистр текущеrо значения для очистки последнеrо и сброса бита COUNTFLAG Тактирование  системный тактовый сиrнал, прерывание  разрешено, работа таймера  разрешена STR R1, [RO] Запускаем счётчик В таймере SYSTICK предусмотрен удобный доступ к калибровочной инфор мации. Процессор CortexM3 имеет 24битный вход, на который разработчик ми кросхемы может выставить значение, соответствующее 10MC интервалу. Чтобы получить это значение, необходимо прочитать реrистр калибровочноrо значения SYSTCALIB. Однако функция калибровки может быть не реализована  чтобы убедиться в возможности её использования, обратитесь к документации на ис пользуемое устройство. Счётчик SYSTICK также можно задействовать в качестве сиrнальноrо тайме ра, запускающеrо некоторую задачу по истечении заданноrо времени. Например, если нам необходимо запустить задачу через 300 тактов, то мы можем описать её в виде обработчика исключения SYSTICK и запроrраммировать таймер следую щим образом: volatile int SysTickFired; // rлобальный проrраммный флаr, индицирующий // запуск процедуры SysTickAlarm , S TR R1, [RO,#4] STR R1, [RO,#8] MOV R1, #Ох7 // Опционально: инициализируем обработчик SYSTICK, это необходимо только // при размещении таблицы векторов в ОЗУ * ((volatile unsigned int *) (SCB>VTOR+(15«2))) = (unsigned int) SysTickAlarm; SysTick>CTRL = ОхО; // Запрещаем SysTick SysTick>LOAD = (30012); // Задаём значение перезаrрузки минус 12 // (учитываем задержку обработки исключения) // Сбрасываем текущее значение счётчика // Сбрасываем проrраммный флаr // Разрешаем работу таймера, исключение SYSTICK // и тактирование от системноrо TaKToBoro сиrнала while (SysTickFired == О); // Ждём установки флаrа обработчиком SYSTICK Обработчик исключения может быть таким: void SysTickAlarm(void) // Обработчик исключения SYSTICK { SysTick>CTRL = ОхО; // Запрещаем SysTick // Выполняем требуемые операции SCB>ICSR = SCB>ICSR & (OxFDFFFFFF); // Очищаем бит отложенноrо прерывания // для исключения SYSTICK, если оно было // отложено повторно SysTickFired++; // Изменяем проrраммный флаr, сообщая // основной проrрамме о выполнении // обработчика SYSTICK SysTick>VAL = о; SysTickFired = о; SysTick>CTRL = Ох7; return; 
14.2. Управление электропитанием · 255 Таймер запускается с нулевым значением счётчика, поскольку тот сбрасыва ется вручную в основной проrрамме. Сразу же после этоrо в счётчик переrружа ется число 288 (300  12). Мы уменьшаем требуемое число тактов на 12 для Toro, чтобы учесть время задержки обработки прерывания. Однако если на момент дo стижения счётчиком нулевоrо значения будет обрабатываться друrое исключе ние с таким же или более высоким приоритетом, то rенерация исключения SYSTICK может HeMHoro задержаться. Заметьте, что корректировать значение перезаrрузки необходимо только при использовании таймера SYSTICK в качестве таймера с однократным запуском. В периодическом режиме значение перезаrрузки должно быть равно числу TaK тов, уменьшенному на единицу. Поскольку счётчик SYSTICK не останавливается автоматически, мы должны останавливать ero в обработчике исключения (процедура SysTickAlarrn). Более Toro, существует вероятность повторноrо откладывания исключения SYSTICK при задержке ero обработки изза более приоритетных исключений. Поэтому ec ли исключение SYSTICK используется для однократноrо выполнения некоей за дачи, то в обработчике также необходимо сбрасывать признак отложенности ис ключения. В самом конце обработчика исключения SYSTICK мы изменяем значение переменнойфлаrа SysTickFired, чтобы проинформировать основную проrрам му о выполнении требуемой задачи. 14.2. Управление злектропитанием 14.2.1. Спящие режимы Одним из инструментов управления электропитанием в процессоре Cortex М3 является наличие спящих режимов. При переводе системы в спящий режим си стемный тактовый сиrнал может останавливаться, однако независимый TaKTO вый reHepaTop должен продолжать работать, чтобы обеспечить вывод процессо ра из спящеrо режима при возникновении прерывания. Поддерживаются следу ющие спящие режимы: . Sleep  в этом режиме активируется сиrнал SLEEPING процессора; . Deep Sleep  в этом режиме активируется сиrнал SLEEPDEEP процессора. Для выбора KOHKpeTHoro режима пониженноrо энерrопотребления в реrистре управления SCR контроллера NVIC предусмотрено битовое поле SLEEPDEEP (Табл. 14.1). Использование сиrналов SLEEPING и SLEEPDEEP зависит от KOH кретной реализации микроконтроллера. Возможны даже такие реализации, в KO торых активация обоих сиrналов будет приводить к одним И тем же результатам. Перевод в спящий режим осуществляется командами WFI (ожидание преры вания в спящем режиме) или WFE (ожидание события в спящем режиме). Таким событием может стать прерывание, ранее возникшее прерывание или же сиrнал внешнеrо события, поданный в виде импульса на ВХОД RXEV процессора. В са.. мом процессоре предусмотрено «защёлкивание» событий, что позволяет уже прошедшему событию выводить процессор из спящеrо режима (Рис. 14.2). 
256 · Тлава 14. Прочие возможности процессора CortexM3 Таблица 14.1. Реrистр управления системой SCR (OxEOOOEDIO) Значение Биты Обозначение Тип после Описание сброса rенерация события при откладывании прерывания; вывод из спящеrо режима, 4 SEVONPEND R/W О вызванноrо командой WFE, производится при откладывании HOBoro прерывания, даже если уровень приоритета этоrо прерывания выше текущеrо уровня 3 Зарезервировано    2 SLEEPDEEP R/W О Разрешает формирование сиrнала SLEEPDEEP при переходе в спящий режим 1 SLEEPONEXIT R/W О Включение функции SleepOn Exit О Зарезервировано    WFI WFE SLEEPDEEP = 1? Защёлка события = 1 Нет Сбросить защёлку и продолжить выполнение Перейти в спящий режим Перейти в спящий режим со следующей команды (SLEEPING  ВЫСОКИЙ уров., (SLEEPING  ВЫСОКИЙ уров., SLEEPDEEP  НИЗКИЙ уров.) SLEEPDEEP  ВЫСОКИЙ уров.) Рис. 14.2. Переключение в режим пониженноzо энерzопотре6ления. При наличии СМSISсовместимоrо драйвера для вызова команд WFI и WFE можно задействовать встроенные функции   WFI () и   WFE () COOTBeTCTBeH но. Для обращения к реrистру управления системой можно использовать Bыpa жение SCB>SCR. Что в действительности происходит при переходе процессора в спящий pe жим, зависит исключительно от реализации микросхемы. Как правило, при этом прекращается rенерация некоторых тактовых сиrналов, что приводит к YMeHЬ шению потребления. По желанию разработчика микросхемы для ещё большеrо сокращения потребления может также отключаться часть узлов микросхемы. Возможен даже вариант, при котором отключается весь процессор и прекращает ся rенерация всех тактовых сиrналов. Единственным способом вывода системы из спящеrо режима в последнем случае является сброс устройства. Чтобы прерывание моrло вывести процессор из спящеrо режима, вызванноrо командой WFI, оно должно иметь приоритет, который выше текущеrо уровня приоритета (при наличии активноrо прерывания) и выше заданноrо реrистром BASEPRI или реrистрами маскирования (PRIMASK и FAULTMASK). Если преры вание не может быть обработано изза низкоrо приоритета, то оно не сможет BЫ вести процессор из спящеrо режима. 
14.2. Управление электропитанием · 257 Со спящим режимом, вызванным командой WFE, ситуация несколько друrая. Если прерывание, возникшее во время спящеrо режима, имеет приоритет ниже или равный заданному в реrистрах маскирования или BASEPRI и при этом YCTa новлен бит SEVONPEND, то такое прерывание всё же выведет процессор из спя щеrо режима. Условия вывода процессора CortexM3 из режимов пониженноrо энерrопотребления приведены в Табл. 14.2. Таблица 14.2. ВЫВОД из режимов пониженноrо потребления Поведение команды Вывод из спящеrо Запуск обработчика режима IRQ WFI IRQ с BASEPRI Приоритет IRQ > BASEPRIv Да Да Приоритет IRQ =< BASEPRI Нет Нет IRQ с BASEPRI и PRIMASK Приоритет IRQ > BASEPRI Да Нет Приоритет IRQ =< BASEPRI Нет Нет WFE IRQ с BASEPRI, SEVONPEND = О Приоритет IRQ > BASEPRI Да Да Приоритет IRQ =< BASEPRI Нет Нет IRQ с BASEPRI, SEVONPEND = 1 Приоритет IRQ > BASEPRI Да Да Приоритет IRQ =< BASEPRI Да Нет IRQ с BASEPRI и PRIMASK, SEVONPEND = О Приоритет IRQ > BASEPRI Нет Нет Приоритет IRQ =< BASEPRI Нет Нет IRQ с BASEPRI и PRIMASK, SEVONPEND = 1 Приоритет IRQ > BASEPRI Да Нет Приоритет IRQ =< BASEPRI Да Нет 14.2.2. Функция Sleep..On..Exit Ещё одной особенностью процессора CortexM3 является возможность aBTOMa тическоrо возврата в спящий режим при выходе из процедуры обработки преры вания. Это позволяет нам постоянно удерживать ядро в спящем режиме, за исклю чением моментов обработки требуемоrо прерывания. Для использования указан ной функции необходимо установить бит SLEEPONEXIT реrистра SCR (Рис. 14.3). Обратите внимание, что если функция SleepOnExit включена, то процессор может перейти в спящий режим при возвращении в режим потока из любоrо ис ключения, даже если команды WFE/WFI не выполнялись. Чтобы процессор пере ходил В спящий режим CTporo в требуемые моменты времени, устанавливайте бит SLEEPONEXIT непосредственно перед переводом системы в спящий режим. 
258 · Тлава 14. Прочие возможности процессора CortexM3 WFI/ WFE Процессор автоматически возвращяется в спящий режим Просыпаемся и запускаем обработчик прерывания Выходим из исключения и возвращаемся в режим потока Да Процессор обнаружил, что SLEEPONEXIT = 1? Процессор выходит из спящеrо режима и продолжает выполнение проrраммы со следующей команды Рис. 14.3. Пример использования функции SleepOпExit. 14.2.3. Контроппер WIC Начиная со 2й ревизии в процессоре CortexM3 появился новый опциональ ный компонент, позволяющий уменьшить энерrопотребления системы. Этот компонент называется контроллером вывода процессора из спяще20 режима по прерыванию или, сокращённо, контроллером WIC (Wakeup Interrupt Controller). Данный контроллер подключается к существующему контроллеру NVIC и ис пользуется для формирования запроса на пробуждение процессора при возник новении прерывания. С точки зрения проrраммы, поведение команд WFE и WFI не изменяется. В KOH троллере WIC нет реrистров, требующих проrраммирования, поскольку всю He обходимую информацию он получает от контроллера NVIC. Наличие контролле ра WIC позволяет отключить все тактовые сиrналы, поступающие на процессор. При появлении запроса прерывания контроллер WIC может послать запрос на пробуждение системному контроллеру или модулю управления электропитани ем PMU (Power Management Unit), расположенным на кристалле, чтобы возобно вить rенерацию тактовых сиrналов процессора (Рис. 14.4). 
14.2. Управление электропитанием · 259 CortexM3 IRQ IRQ NMI NMI Модуль управления электропитанием Пробуж дение WIC Статус спящеrо режима Рис. 14.4. Обнаружение прерываний контроллером WIC при выключенных тактовых сиzналах процессора. Наличие контроллера WIC также предоставляет новые возможности в части уменьшения энерrопотребления устройства при нахождении в спящем режиме. Использование новейших технолоrий проектирования цифровых устройств по зволяет нам отключать большинство узлов процессора CortexM3, оставляя включёнными только некоторую rруппу лоrических вентилей, хранящих TeKY щее состояние лоrики. Данная технолоrия называется State Retention Power Gating (SRPG). При совместном использовании технолоrии SRPG и контроллера WIC большинство узлов процессора в режиме Deep Sleep может быть отключено (Рис. 14.5). При нахождении процессора в этом режиме контроллер WIC продол жает работать и при возникновении прерывания rенерирует запрос на включе ние системы и восстановление её состояния. Максимальная задержка обработки прерывания в данном случае зависит от времени, необходимоrо для перевода си стемы в рабочее состояние. В большинстве случаев эта задержка составляет от 20 до 30 тактов. В режиме обычноrо сна (бит SLEEPDEEP реrистра SCR сброшен в О) питание процессора не отключается. Новая функция отключения питания является опцией и может отсутствовать в некоторых микроконтроллерах. Она требует наличия в кристалле модуля PMU, который разрабатывается изrотовителем микросхемы. Этот модуль управляет циклами включения/выключения питания и может потребовать дополнительно ro проrраммирования перед использованием. Для получения дополнительной информации следует обратиться к документации на микроконтроллер. Обратите внимание, что при использовании функции отключения питания системный таймер SYSTICK останавливается на время нахождения процессора в режиме Deep Sleep. Кроме Toro, данную функцию нельзя использовать при под ключённом отладчике, поскольку тот должен периодически обращаться к реrи страм отладки для контроля состояния процессора. 
260 · Тлава 14. Прочие возможности процессора CortexM3 Статус спящеrо режима IRQ NMI Модуль управления Пробуж WIC электропитанием дение Модуль PMU включает питание при поступлении запроса на пробуждение от контроллера WIC Контроллер WIC обнаруживает и удерживает запрос прерывания, пока процессор отключён Состояние процессора хранится в предназначенных для этоrо триrrерах Рис. 14.5. Обнаружение прерываний контроллером WIC при использовании процессором режима SRPG. 14.3. Межпроцессорный обмен в процессоре CortexM3 реализован очень простой интерфейс межпроцессор Horo обмена для передачи событий между процессорами. В процессоре имеется выходной сиrнал для передачи событий (ТХЕУ) и один входной сиrнал для при ёма событий (RXEV). В двухпроцессорных системах соответствующие выводы процессоров MorYT быть соединены так, как показано на Рис. 14.6. ТXEV ТXEV CortexM3 CortexM3 RXEV RXEV Рис. 14.6. Обмен событиями в двухпроцессорной системе. Как уже было отмечено в предыдущем разделе 14.2 «Управление электропита нием», процессор может перейти в спящий режим при выполнении команды WFE и вернуться в активное состояние при получении внешнеrо события. С помощью команды SEV один из процессоров может вывести из спящеrо режима друrой, при этом оба процессора начнут выполнять задачу одновременно (Рис. 14.7). Пользователи СМSISсовместимоrо драйвера устройства для вызова команды SEV MorYT задействовать встроенную функцию   SEV(). Используя эту функ цию, мы можем запустить задачу на выполнение одновременно на обоих процес сорах (возможно, с небольшим временным смещением, зависящим от реализа ции микросхемы и кода, осуществляющеrо контроль состояния задачи). Число 
14.3. Межпроцессорный обмен · 261 Процессор N91 Процессор N92 Выполняет команду WFE Процессор N Q l активирует сиrнал SLEEPING Переходит в спящий режим Узнаёт, что процессор 1 находится в спящем режиме Процессор N Q 2 формирует импульс TXEV, поступающий на вход RXEV процессора 1 I I I I Обнаруживает потребность в синхронизации задач а: I "   Выполняет команду SEV Выходит из спящеrо режима Проверяет состояния задачи Выполняет задачу Выполняет задачу Рис. 14.7. Использование сиzналов событий для синхронизации задач. процессоров может быть любым, необходимо только, чтобы один из процессоров выступал в роли ведущеrо, формируя импульс события для остальных. Необходимо отметить, что причиной выхода процессора из спящеrо режима MorYT стать и друrие события, например прерывания или события отладки. Поэ тому, прежде чем приступать к выполнению требуемой задачи, необходимо убе диться, что пробуждение процессора произошло в результате синхронизации за дач. В большинстве мноrозадачных систем для корректной синхронизации задач требуется более сложная система межпроцессорных сообщений, наподобие оче реди сообщений (mаНЬох), используемой во встраиваемых ос. Также необходимо отметить, что выполнение команды WFE не всеrда приво дит к переводу процессора в спящий режим. Поэтому данная команда обычно помещается внутрь цикла (для уменьшения потребления системы) и сопрово ждается кодом, который проверяет необходимость выполнения требуемой зада чи, как показано на Рис. 14.8. При выполнении команды WFE сначала проверяется состояние локальной за щёлки события. Если защёлка не установлена, то процессор переходит в спящий режим. Если же защёлка установлена, то она сбрасывается, и процессор продол жает выполнение команд, не переходя в спящий режим. Локальная защёлка co бытия может быть установлена предыдущимИ исключениями, а также командой SEV. Поэтому если вы выполните команду WFE сразу после команды SEV, то про цессор не перейдёт в спящий режим, а просто продолжит выполнение проrрам мы со следующей команды (при этом эащёлка будет сброшена командой WFE). 
262 · Тлава 14. Прочие возможности процессора CortexM3 WFE Событие Цикл ожидания Проверяем состояние задач и Нет Проснулись изза синхронизации задач? Запускаем задачу Надо выйти из цикла? Выходим из цикла Рис. 14.8. Пример использования команды WFE. Команду WFE можно при менять для реализации семафора в мноrопроцессорной системе. В стандартных ситуациях, скажем при реализации семафора взаимноrо исключения (мьютекса), для управления доступом к разделяемой памяти или пери ферии обычно используют системный монитор монопольноrо доступа совместно с командами монопольноrо доступа. При этом процесс, нуждающийся в определён ном ресурсе, должен вызвать специальную функцию для захвата «блокировки»: void getlock(volatile int * LockVariable) // LDREXW и STREXW  встроенные функции CMSIS // СМSISсовместимой библиотеки драйвера устройства int status == о; do { while ( LDREXW(&LockVariable)!== О); // status == STREXW(l, &Lock Variable); // // // // // } while (status ,== DMB () ; О) ; Ждём снятия блокировки Пытаемся установить флаr блокировки, используя команду STREX Повторяем до победноrо конца Барьер памяти данных return; Та же процедура на ассемблере: getlock Ассемблерная функция для установки флаrа блокировки LDR rO, ==LockVariable MOVS r2, #1 getlockloop 
14.3. Межпроцессорный обмен · 263 Ресурс заблокирован, проверяем снова Пытаемся установить флаr LockVariable, используя STREX СМР rl, #0 Проверяем статус выполнения STREX BNE getlock loop Неудача, повторяем попытку DMB Барьер памяти данных ВХ LR Возвращаемся С друrой стороны, процесс, использующий ресурс, должен разблокировать ero, если тот больше не требуется: void freelock(volatile int * LockVariable) { LDREX СМР BNE STREX rl, rl, get rl, [rO] #0 lock loop r2, [rO ] DMB () ; Lock Variable = О; return; // Барьер памяти данных // Разблокируем Эту же процедуру можно написать и на ассемблере: freelock ; Ассемблерная процедура для разблокирования ресурса LDR rO, =LockVariable MOVS rl, #0 DMB Барьер памяти данных STR rl, [rO] Сбрасываем флаr блокировки ВХ LR Возвращаемся Подобная взаимоблокировка ресурса может привести к излишнему потребле нию во время простоя процессора. Использование команды WFE позволит нам уменьшить потребление процессора за счёт вывода ero из спящеrо режима толь ко при освобождении требуемоrо ресурса. void getlockwithWFE(volatile int * LockVariable) { int status = О; do { while ( LDREXW(&LockVariable) 1= О) { status = STREXW(l, &LockVariable); // Проверяем состояние флаrа // блокировки // Если ресурс заблокирован, то // «засыпаем» до появления события // Пытаемся установить флаr // блокировки, // используя команду STREX // Повторяем до победноrо конца // Барьер памяти данных  WFE () ; } } while (status != О); DMB () ; return; в функции снятия блокировки используется команда SEV, выводящая из спя щеrо режима друrие процессоры, ожидающие освобождения ресурса. void freelock(volatile int * LockVariable) { DMB () ; Lock Variable // Барьер памяти данных о; // Снимаем блокировку 
264 · rлава 14. Прочие возможности процессора CortexM3 DSB () ;  SEV () ; return; // Обеспечиваем завершение операции записи // rенерируем событие для пробуждения остальных процессоров Эти же процедуры MorYT быть написаны на ассемблере: getlockwithWFE ; Ассемблерная функция для установки флаrа блокировки LDR rO, =LockVariable MOVS r2, #1 getlockloop LDREX r1, [rO] CBNZ r1, lockisset STREX r1, r2, [rO] СМР r1, #0 BNE getlockloop ; DMB ВХ LR lock is set WFE Ждём события В getlockloop Просыпаемся, повторяем попытку freelockwithSEV ; Ассемблерная функция для сброса флаrа блокировки LDR rO, =LockVariable MOVS r1, #0 DMB STR r1, [rO] DSB SEV Если ресурс заблокирован  засыпаем Пытаемся установить флаr LockVariable, Проверяем статус выполнения STREX Неудача, повторяем попытку Барьер памяти данных Возвращаемся используя STREX Барьер памяти данных Сбрасываем флаr блокировки Обеспечиваем завершение операции записи rенерируем событие для пробуждения остальных процессоров ВХ LR Возвращаемся Использование механизма передачи событий совместно с кодом реализации семафора позволяет уменьшить потребление процессора при взаимоблокировке ресурса. Аналоrичные решения MorYT применяться для передачи сообщений и синхронизации задач. В большинстве устройств с ядром CortexM3 используется Bcero один процес сор, вход RXEV KOToporo либо подтяrивается к НИЗКОМУ уровню, либо подклю чается к периферийным устройствам, способным rенерировать события. 14.4. Управление сбросом в процессоре CortexM3 реализовано два механизма сброса системы. Первый из них основан на использовании бита SYSRESETREQ реrистра AIRCR контрол лера NVIC. При установке упомянутоrо бита процессор CortexM3 формирует за прос сброса для reHepaTopa сброса системы. Поскольку данный блок не входит в состав процессора CortexM3, конкретная реализация этоrо механизма зависит от разработчика микроконтроллера. Поэтому необходимо внимательно изучить документацию на применяемое устройство, чтобы определить, какие именно узлы микроконтроллера сбрасываются при установке указанноrо бита. При наличии СМSISсовместимоrо драйвера для активации paccMoTpeHHoro механизма сброса системы можно использовать команду NVIC  Sys ternRe set (). 
14.4. Управление сбросом · 265 Описание данной функции приведено в Приложении ж. Те же, кто не хочет ис пользовать стандарт CMSIS, MorYT поступить следующим образом: * ((volatile unsigned int *) (ОхЕОООЕDОС)) == Ox05FA0004; // Устанавливаем бит SYSRESETREQ (05FA  ключ доступа) while(l); // Бесконечный цикл, rарантирующий отсутствие выполняемых команд // после запуска цикла сброса Проrраммисты, пишущие на ассемблере, для формирования запроса на сброс системы MorYT использовать следующий код: LDR RO,==OxEOOOEDOC Адрес реrистра AIRCR контроллера NVIC LDR Rl,==Ox05FA0004 ; Устанавливаем бит SYSRESETREQ (05FA  ключ доступа) STR Rl, [RO] deadloop в deadloop Бесконечный цикл, rарантирующий отсутствие выполняемых команд после запуска цикла сброса Второй механизм управления сбросом основан на использовании бита VECTRESET Toro же реrистра AIRCR (бит [О]). Установка этоrо бита в 1 вызывает сброс процессора, за исключением компонентов отладки. Сброс узлов, внешних по отношению к процессору, не производится. Так, если в SoC имеется модуль UART, то при установке бита VECTRESET этот модуль, равно как и остальные внешние периферийные устройства, не будет сброшен. Данный механизм пред назначен, rлавным образом, для целей отладки, однако может использоваться и в том случае, если проrрамме необходимо сбросить только процессор, не затра rивая остальные элементы системы. На языке Си сброс процессора можно реализовать следующим образом: * ((volatile unsigned int *) (ОхЕОООЕDОС)) == Ox05FAOOOl; // Устанавливаем бит VECTRESET (05FA  ключ доступа) while(l); // Бесконечный цикл, rарантирующий отсутствие выполняемых команд // после запуска цикла сброса Эту же операцию можно реализовать и на ассемблере: LDR RO,==OxEOOOEDOC Адрес реrистра AIRCR контроллера NVIC LDR Rl,==Ox05FAOOOl ; Устанавливаем бит VECTRESET (05FA  ключ доступа) STR Rl, [RO] deadloop в deadloop ; Бесконечный цикл, rарантирующий отсутствие выполняемых ; команд после запуска цикла сброса В общем случае, для выполнения проrраммноrо сброса следует использовать бит SYSRESETREQ, а не VECTRESET, что позволит одновременно сбросить боль шинство компонентов системы. В зависимости от реализации микросхемы при этом MorYT сбрасываться все или только некоторые периферийные устройства, ядро и схема тактирования, включая блок ФАПЧ (PhaseLocked Loop  PLL). Бо лее подробную информацию можно получить из документации на микросхему. Следует обратить внимание на то, что между установкой бита SYSRESETREQ и реальным сбросом системы проходит некоторое время, в течение KOToporo про цессор сохраняет возможность реакции на прерывания. Если для вас это нежела тельно, то перед rенерацией запроса на сброс необходимо установить реrистр Ma скирования прерываний (PRIMASK или FAULTMASK). 
rЛАВА 15 АРХИТЕКТУРА СИСТЕМЫ ОТЛАДКИ 15.1. Общие сведения о возможностях отладки Процессор CortexM3 предоставляет пользователю непревзойденные возмож ности для отладки кода. По своему характеру все функции отладки можно разде лить на две rруппы: 1. Инвазивные (с вмешательством в процесс выполнения проrраммы): CJ останов и пошаrовое выполнение проrраммы; CJ аппаратные точки останова; CJ команда точки останова; CJ точки наблюдения при обращении к конкретному адресу, диапазону aдpe сов или значению; CJ доступ к содержимому реrистров (как на чтение, так и на запись); CJ исключение Debug monitor; CJ ПЗУотладка с использованием функции Flash Patch. 2. Неинвазивные: CJ обращения к памяти (содержимое памяти доступно даже во время работы ядра); CJ трассировка команд (посредством опциональноrо модуля ЕТМ); CJ трассировка данных; CJ проrраммная трассировка (посредством модуля ITM); CJ профилирование (посредством модуля DWT). Ряд компонентов отладки встроены непосредственно в процессор CortexM3. Система отладки базируется на архитектуре отладки CoreSight, которая предо ставляет унифицированные решения для управления процессом отладки, сбора трассировочной информации и определения конфиrурации системы отладки. 15.2. Обзор архитектуры CoreSight Архитектура отладки CoreSight охватывает самые разные аспекты отладки, включая протокол интерфейса отладки, протокол шины отладки, управление компонентами отладки, средства обеспечения безопасности, интерфейс трасси ровки данных и т.п. Для ознакомления с данной архитектурой рекомендую обра 
15.2. Обзор архитектуры CoreSight · 267 титься К руководству [3]. Компоненты отладки, входящие в состав процессора CortexM3, также описаны в соответствующих разделах руководства [1]. В пода вляющем большинстве случаев эти компоненты используются исключительно отладочными средствами, но никак не прикладной проrраммой. Однако для луч шеrо понимания работы системы отладки будет нелишне вкратце ознакомиться с возможностями этих компонентов. 15.2.1. Отладочный интерфейс процессора В отличие от традиционных процессоров ARM7/ARM9 система отладки про цессора CortexM3 базируется на архитектуре отладки CoreSight. Традиционно в процессорах ARM дЛЯ обращения к реrистрам процессора и управления интер фейсом памяти использовался интерфейс JTAG (Joint Test Action Group  объе динённая рабочая rруппа по автоматизации тестирования). В процессоре CortexM3 управление лоrикой отладки осуществляется по специальному интер фейсу, называемому портом доступа к средствам отладки (DAP), к6торый прак тически идентичен интерфейсу шины АРВ архитектуры АМВА. ДЛЯ управления интерфейсом DAP служит друrой компонент, преобразующий протоколы обмена JTAG или SerialWire (SW) в протокол интерфейса шины DAP. Поскольку внутренняя шина средств отладки во MHoroM идентична шине АРВ, к ней можно леrко подключать различные компоненты, получая в результа те хорошо масштабируемую систему отладки. Кроме Toro, разделение интерфей са отладки и аппаратных средств управления отладкой обеспечивает полную прозрачность типа интерфейса, реализованноrо на кристалле. Это позволяет BЫ полнять одни И те же задачи отладки вне зависимости от типа используемоrо ин терфейса. Управление имеющимися функциями отладки процессора CortexM3 ocy ществляется контроллером прерываний NVIC и рядом друrих компонентов, Ta ких как модули РРВ, DWT и ITM. В контроллере NVIC имеется несколько реrи стров для управления основными отладочными операциями, например OCTaHO вом и пошаrовым выполнением проrраммы, тоrда как друrие блоки поддержива ют более продвинутые возможности, такие как точки наблюдения, точки OCTaHO ва и вывод отладочных сообщений. 15.2.2. Интерфейс хоста отладки Технолоrия CoreSight поддерживает разные типы интерфейсов для соедине ния хоста отладки и системы на кристалле. Традиционно для этой цели исполь зовался интерфейс JTAG. Теперь же, блаrодаря тому, что отладочный интерфейс процессора был заменён на шинный интерфейс общеrо назначения, мы можем, подключая различные модули между хостом отладки и интерфейсом отладки процессора, работать с самыми разными кристаллами, имеющими различные интерфейсы хоста отладки, не внося изменений в интерфейс отладки процессора. На сеrодняшний день устройства на базе CortexM3 поддерживают два раз личных интерфейса хоста отладки. Первый из них  это уже известный нам ин терфейс JTAG, а второй  новый протокол обмена данными, получивший назва ние SerialWire (или, сокращённо, SW). В интерфейсе SW число сиrнальных ли 
268 · rлава 15. Архитектура системы отладки ний уменьшено до двух. Компания ARM предлаrает несколько модулей портов отладки (Debug Port  DP), поддерживающих различные протоколы обмена дaH ными. С одной стороны модуль DP подключается к аппаратному отладчику, а с друrой  к шинному интерфейсу DAP. 15.2.3. Модупи DP, АР и DAP Соединение внешнеrо аппаратноrо отладчика с интерфейсом отладки процес сора CortexM3 показано на Рис. 15.1. JT AG или SerialWire МикроконтроллеРr                           I СоrtехМЗ I I I I I I I I Шина: SWJOP ОДР I или SWOP ДHBДP Ядро СоrtехМЗ NVIC Хоет отладки (ПК) USB или Ethernet I I I I I I I L I I I r'" I I I  Прочие др I II Отладчик Память Рис. 15.1. Подключение хоста отладки к процессору CortexM3. Интерфейсный модуль DP, в качестве KOToporo обычно используется порт OT ладки SerialWire/JTAG (SWJDP) либо порт отладки SerialWire (SWDP), преоб разует сиrналы отладчика в транзакции 32битной шины отладки общеrо назна чения (шина DAP на рисунке). Модуль SWJDP поддерживает протоколы JTAG и SerialWire, а модуль SWDP  только SerialWire. В числе компонентов линей ки CoreSight, предлаrаемых компанией ARM, также имеется модуль JTAGDP, поддерживающий только протокол JTAG. Разработчики микросхем MorYT BЫ брать любой из этих трёх модулей в соответствии со своими предпочтениями. Адреса на шине DAP являются 32битными, при этом старшие 8 бит шины aдpe са используются для выбора KOHKpeTHoro устройства. Соответственно, к шине DAP может быть подключено до 256 устройств. В самом процессоре задействован Bcero один адрес, поэтому при необходимости вы можете подключить к шине DAP ещё 255 модулей порта доступа (АР). То есть теоретически вы можете реали 
15.2. Обзор архитектуры CoreSight · 269 зовать на одном кристалле сотни процессоров, использующих единственное под ключение по интерфейсу JTAG или SerialWire. Для подключения к шине DAP в процессоре CortexM3 используется порт дo ступа шины АНВ (AHBAP). Это устройство выполняет функции моста, преобра зуя команды отладчика в транзакции на шине АНВ, которые затем передаются во внутреннюю систему шин процессора. Такое решение обеспечивает доступ ко всему адресному пространству процессора, в том числе и к реrистрам управле ния отладкой контроллера NVIC. Среди продукции линейки CoreSight имеются модули портов доступа различ ных типов, в том числе порта доступа шины АНВ (APBAP) и порта доступа ин терфейса JTAG (JTAGAP). Модуль APBAP может использоваться для формиро вания транзакций на шине АНВ, а модуль JTAGAP  для управления традици онными интерфейсами на базе протокола JTAG, такими как интерфейс отладки процессора ARM7. 15.2.4. Интерфейс трассировки Друrие компоненты архитектуры CoreSight относятся к трассировке. В про цессоре CortexM3 MorYT присутствовать следующие источники трассировочной информации: . трассировка команд  осуществляется модулем ЕТМ; . трассировка данных  осуществляется модулем DWT; . отладочные сообщения  rенерируются модулем ITM, обеспечивающим BЫ вод сообщений стандартными средствами языка Си, такими как функция printf(), в rрафическом интерфейсе отладчика. В процессе трассировки её результаты в виде пакетов данных выставляются источниками трассировки, такими как модуль ЕТМ, на шину данных трассиров ки АТВ (Advanced Trace Bus). Если в системе на кристалле имеется несколько ис точников трассировки (скажем, в случае мноrопроцессорной системы), то потоки данных с шин А ТВ MorYT быть объединены посредством специальноrо модуля (в архитектуре CoreSight такой модуль называется АТВ funnel). Сформирован ный поток данных поступает в модуль интерфейса порта трассировки (TPIU), KO торый пересылает ero внешнему трассировщику. После Toro как эти данные по падут в хост отладки (например, ПК), их можно будет разделить обратно на He сколько потоков. Несмотря на то что в самом процессоре CortexM3 имеется несколько источ ников трассировки, встроенные в Hero компоненты отладки спроектированы Ta ким образом, что позволяют объединять трассировочные данные без использо вания дополнительных модулей АТВ funnel. Выходной интерфейс системы Tpac сировки может напрямую подключаться к модулю TPIU специальноrо исполне ния, разработанноrо для CortexM3. Далее трассировочные данные считываются внешним трассировщиком и пересылаются хосту (как правило, ПК) для анализа. 15.2.5. Характеристики архитектуры CoreSight Решения на основе архитектуры CoreSight имеют следующие преимущества: 
270 · Тлава 15. Архитектура системы отладки · Содержимое памяти и реrистров периферийных устройств может контроли роваться даже во время работы процессора. · Для управления отладочными интерфейсами нескольких процессоров ДOCTa точно одноrо экземпляра отладчика. Например, при использовании интер фейса JTAG требуется только один ТАРконтроллер, даже при наличии на кристалле нескольких процессоров. · Внутренние интерфейсы отладки имеют простую шинную структуру, что обе спечивает их масштабируемость и простоту реализации дополнительных ло rических узлов для тестирования друrих блоков кристалла или SoC. · Для захвата нескольких потоков данных трассировки достаточно одноrо внешнеrо трассировщика; в хосте отладки эти данные разделяются обратно на несколько потоков. Система отладки, используемая в процессоре CortexM3, несколько отличает ся от стандартной реализации архитектуры CoreSight: · Компоненты трассировки разработаны специально для процессора CortexM3. Некоторые из АТВинтерфейсов являются 8битными, тоrда как в архитекту ре CoreSight везде используются 32битные шины. · Система отладки процессора CortexM3 не поддерживает технолоrию TrustZone 1 ) . · Компоненты отладки располаrаются в системной области памяти, тоrда как в системах со стандартной архитектурой CoreSight для управления компонен тами отладки используется отдельная шина со своим адресным простран ством. Пример системы, в которой при меняется традиционная реализация архитектуры CoreSight, приведён на Рис. 15.2. Традиционная реализация системы управления отладкой на базе архитектуры CoreSight Интерфейс хоста отладки SWJOP Шина ОДР JT AG или или SWOP SerialWire ДPB муль типлексор у CТpBO отладки NOl YcтpBO отладки N02 YCTpBO отладки NQЗ APBAP Шина АРВ ........... ДН BAP Память JT AGAP JTAG JT AG устройства Рис. 15.2. Традиционная система отладки на базе технолоzиu CoreSight. 1) Технолоrия TrustZone, разработанная компанией ARM, реализует различные механизмы защиты для встраиваемых устройств. 
15.3. Режимы отладки · 271 в процессоре CortexM3 все компоненты отладки располаrаются в общем адресном пространстве (Рис. 15.3). Система управления отладкой в процессоре СоrtехМЗ Ядро СоrtехМЗ NVIC Интерфейс хоста отладки SWJOP Шина ОДР JT AG или или SWOP SerialWire ДHBДP OWТ FPB ITM Память Мост ДHBДPB Внешняя РРВ АРВпериферия (через интерфейс РРВ) TPIU ЕТМ Таблица ПЗУ Рис. 15.3. Система отладки процессора CortexM3. Дополнительную информацию об архитектуре CoreSight можно найти в PYKO водстве [3]. Несмотря на то что компоненты отладки в процессоре CortexM3 орrаНИЗ0ва ны несколько иначе, нежели в обычных системах, задействующих архитектуру CoreSight, коммуникационные интерфейсы и протоколы, используемые в про цессоре, полностью совместимы с данной архитектурой. Это позволяет напря мую подключаться к друrим системам, использующим архитектуру CoreSight. В частности, в процессоре CortexM3 MorYT применяться такие компоненты, как модуль TPIU, модули портов отладки (DP) и блоки системы трассировки, позво ляя включать ero в мноrоядерную систему отладки. 15.3. Режимы отладки в процессоре CortexM3 предусмотрено два режима выполнения отладочных операций. Первый из них  режим останова, при котором процессор полностью прекращает выполнение проrраммы. Второй  режим исключения Debug monitor, при котором отладочные операции выполняются в обработчике данноrо исключения. В этом режиме MorYT возникать исключения с более высоким прио ритетом. Исключение Debug monitor (исключение N Q I2) имеет проrраммируемый приоритет. Указанное исключение может быть вызвано как различными событи ями отладки, так и ручной установкой бита признака отложенноrо прерывания. Характерные особенности обоих режимов: 
272 · Тлава 15. Архитектура системы отладки 1. Режим останова: а исполнение команд останавливается; а системный таймер SYSTICK останавливается; а поддерживаются пошаrовые операции; а при пошаrовом выполнении проrраммы возможно возникновение и обра ботка прерываний. Внешние прерывания MorYT маскироваться. 2. Режим монитора отладки: а процессор выполняет обработчик исключения Debug monitor (исключение NQ 12); а счётчик таймера SYSTICK продолжает работать; а новые прерывания MorYT как прерывать, так и не прерывать выполнение обработчика монитора отладки в зависимости от приоритета исключения Debug monitor и приоритета HOBoro прерывания; а если событие отладки возникнет во время обработки прерывания с более высоким приоритетом, то оно будет пропущено; а поддерживаются пошаrовые операции; а содержимое памяти (в частности, стека) может изменяться обработчиком исключения Debug monitor при сохранении контекста и во время выполне ния обработчика. Потребность в мониторе отладки обусловлена существованием таких систем, в которых останов процессора для выполнения отладочных операций невозмо жен в принципе. Например, в системе управления автомобильным двиrателем или контроллере жёсткоrо диска процессор во время отладки должен продол жать обслуживать запросы прерываний, чтобы обеспечить безопасное выполне ние требуемых операций и предотвратить повреждение отлаживаемоrо устрой ства. Используя монитор, отладчик может останавливать и отлаживать процессы уровня потока и обработчики низкоприоритетных прерываний, не влияя при этом на работу обработчиков системных исключений и прерываний с более BЫ сокими приоритетами. Для перехода в режим останова необходимо установить бит CDEBUGEN pe rистра DHCSR контроллера NVIC в 1. Проrраммирование этоrо бита может быть выполнено только по интерфейсу DAP; соответственно, вы не сможете OCTaHO вить процессор при отсутствии отладчика. После установки бита CDEBUGEN ядро процессора может быть остановлено установкой бита CHALT Toro же pe rистра. Данный бит может быть установлен как отладчиком, так и самой отлажи ваемой проrраммой. В реrистре DHCSR есть биты, назначение которых зависит от выполняемой операции. Так, при операциях записи в биты [31:16] реrистра заносится ключ дo ступа. При чтении же реrистра указанный ключ совсем не нужен, поэтому в CTap шем полуслове считанноrо значения содержатся биты состояния режима отлад ки (Табл. 15.1). 
15.3. Режимы отладки · 273 Таблица 15.1. Реrистр управления и состояния отладки в режиме останова DHCSR (OxEOOOEDFO) Биты Обозначение Тип Значение Описание после сброса Ключ доступа к функциям отладки; при записи 31:16 КЕУ W  в реrистр эти биты должны содержать значение OxA05F, в противном случае операция записи не будет выполнена 25 SRESETST R  Ядро было сброшено или находится в состоянии сброса. Бит сбрасывается при чтении 24 SRETIREST R  Команда завершена с момента последнеrо чтения реrистра. Бит сбрасывается при чтении 19 SLOCKUP R  Если бит установлен в 1, то ядро находится в состоянии блокировки 18 SSLEEP R  Если бит установлен в 1, то ядро находится в спящем режиме 17 SHALT R  Если бит установлен в 1, то ядро остановлено 16 SREGRDY R  Операция чтения/записи реrистра завершена 15:6 Зарезервировано   Зарезервировано 5 CSNAPSTALL R/W 0* Прерывание «зависших» операций обращения к памяти 4 Зарезервировано   Зарезервировано Маскирование прерываний в спящем режиме; 3 CMASKINTS R/W 0* бит может быть изменён только при остановленном процессоре Выполнение одной команды (пошаrовая работа 2 CSTEP R/W 0* процессора); действителен только при установленном бите CDEBUGEN 1 CHALT R/W 0* Останов процессорноrо ядра; действителен только при установленном бите CDEBUGEN О CDEBUGEN R/W 0* Разрешение отладки в режиме останова *Управляющие биты в реrистре DHCSR сбрасываются только при сбросе по включению питания. При сбросе системы (например, посредством реrистра AIRCR контроллера NVIC) эти биты не сбрасываются. Необходимо отметить, что реrистр DHCSR используется исключительно OT ладчиком. Прикладные проrраммы не должны изменять содержимое этоrо реrи стра во избежание конфликтов с отладочными средствами. . Управляющие биты реrистра DHCSR сбрасываются только при сбросе по включению питания. При сбросе системы (например, посредством реrистра AIRCR контроллера NVIC) эти биты не сбрасываются. Для отладки в режиме монитора используется друrой реrистр контроллера NVIC, а именно реrистр DEMCR (Табл. 15.2). Помимо битов управления монитором отладки, реrистр DEMCR содержит бит разрешения системы трассировки TRCENA и ряд битов управления перехватом векторов прерываний YCxxx (последние MorYT ис пользоваться только при отладке в режиме останова). Если на момент возник новения какоrолибо отказа (или сброса ядра) был установлен соответствую 
274 · Тлава 15. Архитектура системы отладки щий бит YCxxx, то формируется запрос на останов, в результате KOToporo процессор будет остановлен сразу же после завершения текущей команды. · Управляющие биты TRCENA и YCxxx реrистра DEMCR сбрасываются при сбросе по включению питания. При сбросе системы эти биты не сбрасывают ся. В то же время биты управления отладкой в режиме монитора сбрасывают ся в обоих случаях. Таблица 15.2. Реrистр управления исключением и монитором отладки DEMCR (OxEOOOEDFC) Биты Обозначение Тип Значение Описание после сброса Разрешение работы системы трассировки; для 24 TRCENA R/W 0* использования модулей DWT, ЕТМ, ITM и TPIU должен быть установлен в 1 23:20 Зарезервировано   Зарезервировано Указывает на то, что вызов монитора отладки 19 MONREQ R/W О произошёл в результате ручной установки бита отложенности прерывания, а не в результате события аппаратноrо отладчика Выполнение одной команды (пошаrовая 18 MONSTEP R/W О работа процессора); действителен только при установленном бите MONEN rенерация запроса исключения Debug monitor; 17 MONPEND R/W О процессор приступит к обработке исключения соrласно ero приоритету 16 MONEN R/W О Разрешение исключения Debug monitor 15:11 Зарезервировано   Зарезервировано 10 VCHARDERR R/W 0* Перехват тяжёлых отказов Перехват ошибок, возникающих при входе 9 VCINTERR R/W 0* в обработчик исключения и при выходе из Hero 8 VCBUSERR R/W 0* Перехват отказов шины 7 VCSTATERR R/W 0* Перехват отказов проrраммы, вызванных некорректной информацией о состоянии Перехват отказов проrраммы, вызванных 6 VCCHKERR R/W 0* невыровненным доступом либо делением на ноль 5 VCNOCPERR R/W 0* Перехват отказов проrраммы, вызванных попыткой обращения к сопроцессору 4 VCMMERR R/W 0* Перехват отказов системы управления памятью 3:1 Зарезервировано   Зарезервировано О VCCORERESET R/W 0* Перехват сброса ядра *Управляющие биты в реrистре DEMCR сбрасываются только при сбросе по включению питания. При сбросе системы (например, посредством реrистра AIRCR контроллера NVIC) эти биты не сбрасываются. 
15.4. События отладки · 275 15.4. События отладки Процессор CortexM3 может перейти в режим отладки (всё равно, в какой именно) по разным причинам. На Рис. 15.4 показаны события, которые MorYT вызвать переход процессора в режим останова. События отладки ОСТАНОВ CDEBUGEN = 1 CDEBUGEN = о и rнори ровать CDEBUGEN = 1 Исключение Debug monitor Монитор отладки разрешён CDEBUGEN Монитор отладки запрещён Исключение Hard Fault Рис. 15.4. События отладки в режиме останова. Внешний запрос отладки формируется путём активации входа EDBGREQ процессора CortexM3. Куда именно будет подключён этот вход, зависит от разра ботчика KOHKpeTHoro микроконтроллера или SoC. Вполне возможны решения, в которых этот вход будет жёстко подтянут к НИЗКОМУ уровню, т.е. в принципе не может быть активирован. Однако чаще Bcero он подключается так, чтобы aK тивироваться при формировании отладочных событий дополнительными KOM понентами отладки (разработчики микросхем MorYT размещать дополнительные компоненты в своих SoC). В мноrопроцессорной системе этот сиrнал может акти вироваться при rенерации отладочных событий друrим процессором. После завершения отладки нормальное выполнение проrраммы может быть возобновлено посредством сброса бита CHALT. Аналоrичным образом, при OT ладке в режиме исключения Debug Monitor для вызова монитора отладки MorYT использоваться различные события (Рис. 15.5). 
276 · rлава 15. Архитектура системы отладки События отладки MONEN = 1 и приоритет исключения монитора отладки ниже или равен текущему приоритету Обработчик исключения Debug monitor откладывается MONEN = 1 и приоритет исключения монитора отладки выше текущеrо приоритета Запускается обработчик исключения Debug monitor ч MONEN = 1 и приоритет исключения монитора отладки выше текущеrо приоритета Иrнорировать MONEN = о или приоритет исключения монитора отладки ниже или равен текущему приоритету Рис. 15.5. Отладочные события для отладки 8 режиме монитора. Исключение ошибки Процесс отладки с использованием монитора несколько отличается от отлад ки в режиме останова. Это связано с тем, что исключение Debug monitor являет ся Bcero лишь одним из массы друrих исключений, и на ero обработку влияет Te кущий приоритет процессора, если последний выполняет обработчик друrоrо исключения. После завершения отладки нормальное выполнение проrраммы возобновля ется при выходе из обработчика исключения. 15.5. Точки останова в процессоре CortexM3 Одним из наиболее широко используемых средств отладки в большинстве микроконтроллеров являются точки останова. В процессоре CortexM3 поддер живаются два механизма точек останова: · команда точки останова ВКРТ; · останов с использованием компараторов адреса модуля РРВ. Команда вставки точки останова (ВКРТ #immed8) является 16битной KOMaH дой Thumb, машинный код которой имеет вид ОхВЕхх. Младшие 8 бит кода опре деляются значением константы, расположенной после мнемоники команды. При выполнении этой команды rенерируется событие отладки, которое может быть использовано для останова ядра процессора (если установлен бит CDBGEN) 
15.6. Получение доступа к содержимому pezucmpoB при отладке · 277 или для активации исключения монитора отладки, если последнее разрешено. Поскольку данное исключение является обычным исключением с изменяемым приоритетом, то монитор отладки может вызываться либо из основной проrрам мы, работающей в режиме потока, либо из обработчика исключения с меньшим приоритетом. Как следствие, если отладка ведётся с использованием монитора, то команда BRPT не должна вызываться из обработчиков исключений, таких как немаскируемое прерывание или Hard Fault, а сам монитор отладки в этом случае может быть запущен только после завершения обработчика исключения. При возврате из обработчика исключения Debug monitor процессор возвра щается по адресу команды ВКРТ, а не по следующему адресу, как при возврате из прочих обработчиков. Это связано с тем, что при нормальном использовании KO манды ВКРТ она подменяет собой обычную команду. Соответственно, после дo стижения процессором точки останова и выполнения требуемых отладочных операций команда ВКРТ заменяется на исходную команду (остальная память проrрамм не затраrивается). Если попытаться выполнить команду ВКРТ при сброшенных битах CDEBUGEN и MONEN, то будет сrенерировано исключение Hard Fault. При этом будут установлены бит DEBUGEVT реrистра HFSR и бит ВКРТ реrистра DFSR. Модуль РРВ может rенерировать события точек останова даже в том случае, если модификация памяти проrрамм невозможна. Правда, в этом случае ero воз можности оказываются оrраничены шестью точками останова в области кода и двумя  в области констант. Более подробно модуль РРВ будет рассмотрен в следующей rлаве. 15.6. Получение доступа к содержимому реrистров при отладке в контроллере NVIC предусмотрено два реrистра для поддержки функций OT ладки. Это реrистр выбора реrистра ядра DCRSR (Табл. 15.3) и реrистр содержи Moro реrистра ядра DCRDR (Табл. 15.4). Указанные реrистры позволяют отлад чику обращаться к реrистрам процессора. Учтите, что пересылка содержимоrо реrистров может осуществляться только при остановленном процессоре. Чтобы прочитать содержимое какоrолибо реrистра процессора с помощью этих реrистров, необходимо выполнить следующие операции: 1. Убедиться, что процессор находится в состоянии останова. 2. Записать в реrистр DCRSR значение со сброшенным битом [16] (операция чтения). 3. Дождаться установки бита SREGRDY реrистра DHCSR (OxEOOOEDFO). 4. Прочитать реrистр DCRDR для получения содержимоrо реrистра. Для записи в реrистр необходимо выполнить аналоrичные действия: 1. Убедиться, что процессор находится в состоянии останова. 2. Заrрузить значение в реrистр DCRDR. 3. Записать в DCRSR значение с установленным битом 16 (операция записи). 4. Дождаться установки бита SREGRDY реrистра DHCSR (OxEOOOEDFO). 
278 · rлава 15. Архитектура системы отладки Таблица 15.3. Реrистр DCRSR (OxEOOOEDF4) Биты Обозначение Тип Значение Описание после сброса 16 REGWnR W  Направление передачи данных: Запись = 1, Чтение = О 15:5 Зарезервировано    Реrистр, к которому производится обращение: 00000 = RO 00001 = Rl . . . 01111 = R15 10000 = хРSR/флаrи 4:0 REGSEL W  10001 = Основной указатель стека (MSP) 10010 = Указатель стека процесс а (PSP) 10100 = Реrистры специальноrо назначения: [31:24] CONTROL [23:16] FAULTMASK [15:8] BASEPRI [7:0] PRIMASK Остальные значения зарезервированы Таблица 15.4. Реrистр DCRDR (OxEOOOEDF8) Биты Обозначение Тип Значение Описание после сброса 31:0 Data R/W  Реrистр данных для хранения результата чтения реrистра или значения, записываемоrо в реrистр Реrистры DCRDR и DCRSR позволяют пересылать содержимое реrистров только при отладке в режиме останова. При отладке с использованием монитора содержимое одних реrистров можно прочитать из стека, а друrих  непосред ственно в обработчике исключения Debug monitor. Реrистр DCRDR также может применяться для реализации полухостинrа при наличии соответствующих библиотек функций и поддержки со стороны отлад чика. Например, при использовании в приложении функции printf собственно вывод текста, как правило, осуществляется мноrократными вызовами функции putc (вывод символа). Реализация данной функции может предусматривать co хранение выводимоrо символа и текущеrо состояния в реrистре DCRDR с после дующей активацией режима отладки. Отладчик сможет обнаружить останов ядра и считать этот символ для ero вывода на экран. Однако это решение требует останова процессора, тоrда как полухостинr средствами модуля ITM не наклады вает TaKoro оrраничения. 15.7. Прочие отладочные возможности ядра в контроллере NVIC имеются и друrие возможности, используемые при OT ладке: · Внешний си2нал запроса отладки. Контроллер NVIC имеет вход внешнеrо сиr нала запроса отладки, который позволяет переводить процессор CortexM3 
15.7. Прочие отладочные возможности ядра · 279 в режим отладки при наступлении внешнеrо события. Данная возможность актуальна в основном для мноrопроцессорных систем. В простых микрокон троллерах этот вход обычно подтяrивается к НИЗКОМУ уровню. . Pezucтp DFSR. Поскольку процессор CortexM3 поддерживает различные co бытия отладки, в нём предусмотрен специальный реrистр DFSR, с помощью KOToporo отладчик может определить произошедшее событие. . Управление сбросом. Во время отладки процессорное ядро можно перезапу стить с помощью бита VECTRESET или SYSRESETREQ реrистра AIRCR KOH троллера NVIC (OxEOOOEDOC). Данный реrистр управления сбросом позволя ет сбрасывать процессор, не затраrивая при этом компоненты отладки, имею щиеся в системе. . Маскирование nрерываний. Указанная возможность очень полезна при поша rовой отладке. В частности, если вам необходимо отладить проrрамму и при этом вы не хотите попадать в процедуры обработки прерываний, то вы може те замаскировать запросы прерываний. Для этоrо достаточно установить бит CMASKINTS реrистра DHCSR (OxEOOOEDFO). . Прерывание «зависших» nересылок. Если пересылка по шине «зависла» на дли тельное время, то её можно прервать установкой бита CSNAPSTALL реrи стра DHCSR (OxEOOOEDFO). Данная возможность может использоваться толь ко при отладке в режиме останова. 
rЛАВА 1 б КОМПОНЕНТЫ ОТЛАДКИ 16.1. Общие сведения в составе процессора CortexM3 имеются различные компоненты, обеспечива ющие реализацию таких функций, как точки останова, точки наблюдения, KOp рекция флэшпамяти (Flash Patch) и трассировка. Если вы занимаетесь разработ кой прикладных проrрамм, то вам скорее Bcero никоrда не потребуется детальная информация об этих компонентах, поскольку они обычно используются исклю чительно отладочными средствами. В данной rлаве приводятся основные CBeдe ния обо всех компонентах отладки процессора. Если же вам необходима более подробная информация об указанных компонентах, обратитесь к руководству [1]. Проrраммирование всех компонентов поддержки трассировки, так же как и MO дуля FPB, осуществляется по шине собственных периферийных устройств (РРВ) процессора. В подавляющем большинстве случаев проrраммирование этих компо нентов производится только средствами отладки. Прикладным проrраммам не pe комендуется обращаться к компонентам отладки (за исключением реrистров пор тов стимулов модуля ITM), поскольку это может помешать работе отладчика. 16.1.1. Система трассировки в процессоре Cortex..M3 Система трассировки процессора CortexM3 базируется на архитектуре Core Sight. Результаты трассировки rенерируются в виде пакетов данных различноrо раз мера (имеющих разное число байтов). Компоненты трассировки пересылают эти па кеты по шине АТВ в модуль TPIU, который форматирует их в соответствии с требу емым протоколом интерфейса трассировки. После этоrо данные считываются внешним устройством, таким как анализатор порта трассировки ТРА (Рис. 16.1). Трассировка команд CortexM3 Процессорное ядро CortexM3 rраница кристалла I I I I I I I I I I Анализатор порта трассировки Хост отладки   TPIU Аппаратная и проrраммная трассировка АТВ I I I Порт! трассировки Рис. 16.1. Система трассировки процессора CortexM3. 
16.2. Компоненты трассировки: модуль DWT · 281 В обычных процессорах CortexM3 может присутствовать до трёх источников трассировочных данных  это модули ЕТМ, ITM и DWT. Заметьте, модуль ITM является опциональным, поэтому некоторые устройства с процессором Cortex М3 не поддерживают трассировку команд. Во время работы каждому источнику трассировки присваивается уникальный 7битный идентификатор (ATID), KOTO рый пересылается вместе с пакетом данных по шине АТВ. Этот идентификатор позволяет хосту отладки разделить полученные пакеты на отдельные потоки данных трассировки. В отличие от мноrих друrих стандартных компонентов CoreSight, компоненты отладки процессора CortexM3 MorYT сами объединять потоки АТВ, тоrда как в обычных системах CoreSight для объединения пакетов используется отдельный блок, называемый АТВ fuппel. Перед использованием системы трассировки необходимо установить бит раз решения трассировки TRCENA реrистра DEMCR (см. Табл. 15.2 или Табл. f.38 в Приложении [). В противном случае, система трассировки будет отключена. Во время нормальной работы, не требующей трассировки, сброс бита TRCENA по зволяет отключить часть лоrических узлов процессора и уменьшить ero потре бление. 16.2. Компоненты трассировки: модуль DWT Модуль DWT имеет следующие возможности: 1. Содержит в своём составе четыре компаратора, каждый из которых может быть сконфиrурирован для реализации: а) аппаратной точки наблюдения (rенерирует событие точки наблюдения, переводящее процессор в один из режимов отладки); б) триrrера ЕТМ (в результате модуль ЕТМ вставляет в поток трассировки команд триrrерпакет); в) триrrера события выборки счётчика команд; r) триrrера события выборки адреса. Первый компаратор также может использоваться для сравнения с содержимым счётчика тактов (CYCCNT) вместо сравнения со значением адреса. 2. Имеет счётчики для подсчёта: а) числа тактов (CYCCNT); б) числа «свёрнутых» команд; в) числа элементов операций заrрузки/сохранения; r) числа тактов при нахождении в спящем режиме; д) числа тактов, затраченных на выполнение команды; е) числа тактов, связанных с накладными расходами на исключение. 3. Позволяет считывать значения РС с заданной периодичностью. 4. Обеспечивает трассировку событий, связанных с исключениями. При использовании компаратора в качестве аппаратной точки наблюдения или триrrера ЕТМ он позволяет сравнивать либо адреса данных, либо значения счётчика команд. При работе в друrом качестве компаратор сравнивает адреса. 
282 · Тлава 16. Компоненты отладки Каждый компаратор имеет три реrистра: · сомр (реrистр сравнения); · MASK (реrистр маски); · FUNCTION (реrистр управления). Реrистр сомр представляет собой 32битный реrистр, содержимое KOToporo сравнивается с адресом данных (или значением счётчика команд или значением CYCCNT). Реrистр MASK позволяет задавать, какие биты адреса будут иrнори роваться во время сравнения (Табл. 16.1). Таблица 16.1. Декодирование содержимоrо реrистров маски модуля DWT MASK Иrнорируемые биты О Сравниваются все биты 1 Иrнорируется бит [о] 2 Иrнорируются биты [1:0] 3 Иrнорируются биты [2:0] . . . . . . 15 Иrнорируются биты [14:0] Используя реrистр маски, можно отслеживать обращения к данным в диапа зоне адресов до 32 Кбайт. Однако изза оrраниченноrо объёма FIFОбуфера в MO дулях DWT и ITM отследить большое число пересылок просто нереально, по скольку это приведёт к переполнению буфера трассировки и утере полученных данных. Реrистр FUNCTION определяет режим работы компаратора. Чтобы исклю чить некорректное поведение компаратора, перед проrраммированием реrистра FUNCTION в реrистры MASK и СОМР необходимо заrрузить требуемые значе ния. Если нужно изменить функцию компаратора, то ero сначала следует отклю чить, очистив реrистр FUNCTION, затем соответствующим образом перепро rраммировать реrистры MASK и СОМР, после чеrо снова включить. Остальные счётчики модуля DWT обычно используются для профилирова ния кода приложения. Их можно запроrраммировать на rенерацию событий (в виде пакетов данных трассировки) при переполнении. В качестве типичноrо применения можно указать использование реrистра CYCNT дЛЯ подсчёта числа тактов, затраченных на выполнение конкретной задачи. Рис. 16.2. Статистика выполнения npozpaMMbl, собранная с использованием счётчиков модуля DWT (ИСР f"l Vision компании Keil). 
16.3. Компоненты трассировки: модуль ITM · 283 Например, в ИСР tlVision компании КеН эти счётчики MorYT использоваться для rенерации статистической информации (Рис. 16.2). Данные счётчики запу скают rенерацию пакетов событий, которые собираются отладчиком с выхода модуля SerialWire Viewer (SWV). 16.3. Компоненты трассировки: модуль ITM Модуль ITM имеет следующие возможности (Рис. 16.3): . проrрамма может напрямую записывать сообщения в порты стимулов MOДY ля ITM и выводить их в виде данных трассировки; . модуль DWT может rенерировать пакеты трассировки и выводить их через модуль ITM; . модуль ITM может rенерировать пакеты временных меток, вставляемые в по ток данных трассировки, что помоrает отладчику вести хронометраж собы тий. Проrраммная трассировка owт Внешнее устройство сбора данных трассировки (например, RealView Trace) r енератор временных меток Пакеты трассировки от ЕТМ Рис. 16.3. Объединение пакетов трассировки в модулях ITM и TPIU. Для вывода данных модуль ITM использует порт трассировки, поэтому если в микроконтроллере или SoC отсутствует модуль TPIU, то результаты трассиров ки никак не получится передать за пределы процессора. Из этоrо следует, что прежде чем задействовать модуль ITM, необходимо убедиться в том, что микро контроллер или SoC имеют требуемую функциональность. В крайнем случае, ec ли указанные возможности недоступны, вы можете выводить отладочные сооб щения, используя полухостинr на основе реrистра отладки контроллера NVIC (этот метод поддерживается отладчиком RealView Debugger компании ARM) или же модуль UART. Чтобы задействовать модуль ITM, необходимо бит TRCENA реrистра DEMCR установить в 1. В противном случае, модуль ITM будет отключён, а ero реrистры недоступны. Кроме Toro, в модуле ITM имеется специальный реrистр блокировки. Перед проrраммированием модуля в этот реrистр необходимо заrрузить значение ОхС5АССЕ55 (ключ доступа CoreSight), иначе все операции записи в реrистры MO дуля ITM будут иrнорироваться. И наконец, в самом модуле ITM имеется ещё один реrистр управления, OTBe чающий за разрешение/запрещение отдельных функций модуля. В этом реrистре 
284 · fлава 16. Компоненты отладки также содержится поле А TID, в котором хранится значение идентификатора MO дуля ITM дЛЯ шины АТВ. Данный идентификатор должен отличаться от иденти фикаторов остальных источников трассировочных данных, чтобы хост отладки, получающий пакеты данных трассировки, Mor выделить пакеты от модуля ITM среди друrих пакетов. 16.3.1. Проrраммная трассировка с испопЬЗ0ванием модупя ITM Одной из основных функций модуля ITM является поддержка вывода отла дочных сообщений (скажем, посредством функции printf). В составе модуля ITM имеется 32 порта стимулов, в которые различные процессы MorYT выводить свою информацию. Последующее отделение сообщений различных процессов друr от друrа осуществляется хостом отладки. Каждый порт может быть разре шён/запрещён посредством реrистра разрешения трассировки ITMTER, а также может быть запроrраммирован (rруппами по восемь реrистров) на предоставле ние пользовательским процессам доступа на запись. В отличие от вывода текста посредством модуля UART, использование ITM не вносит большой задержки в работу проrраммы. Внутри модуля ITM имеется FIFОбуфер, так что операции записи выводимых сообщений буферизуются. Co ответственно, прежде чем писать в буфер, необходимо убедиться в том, что в нём есть место. Выводимые сообщения MorYT быть считаны через интерфейс порта трасси ровки или интерфейс SWV модуля TPIU. При этом вам не потребуется удалять из финальной версии проrраммы код, осуществляющий вывод отладочных сообще ний, поскольку при сброшенном бите TRCENA модуль TPIU будет неактивным, и сообщения в любом случае выводиться не будут. Соответственно, вы можете включить вывод отладочных сообщений в «живой» системе и, используя реrистр ITMTER, выбрать интересующие вас порты. К примеру, в ИСР flVision компании КеН имеется специальный модуль для сбора и отображения выводимой информации, который называется ITM Viewer (Рис. 16.4). value - Ох083, value - Ох083, value - Ох083, value - ОхОВ40 value - ОхОВ40 value - ОхОВ40 value - Ох0840 value - Ох0840 value - Ох0840 value - ОхОВ40 value - ОхОВ3, value - ОхОВ40 D value - Ох083, value - Ох0840 value - ОхОВЗF value - ОхОВ40 value - ОхОВ40 value - ОхОВ40 value - Ох0840 value - Ох0840 value - Ох083, Рис. 16.4. Окно «ITM Viewer»  ВЫ80д сообщений с выхода модуля ITM. 
16.4. Компоненты трассировки: модуль ЕТМ · 285 16.3.2. Аппаратная трассировка с использованием модулей ITM и DWT Модуль ITM задействуется при выводе пакетов данных аппаратной трассиров ки. Собственно пакеты rенерируются модулем DWT, а модуль ITM выступает в Ka честве устройства объединения этих пакетов. Для использования трассировки средствами модуля DWT необходимо установить бит DWTEN реrистра управления модуля ITM; остальные настройки модуля DWT выполняются через ero реrистры. 16.3.3. Временные отметки модуля ITM При поступлении в FIFОбуфер модуля ITM очередноrо пакета трассировки MO дуль может вставлять в поток данных трассировки пакет временной отметки. YKa занный пакет rенерируется также при переполнении счётчика временных отметок. Каждый пакет временной отметки содержит время, прошедшее с момента предыдущеrо события. Используя эти пакеты, трассировщик может определить время rенерации каждоrо пакета и, таким образом, реконструировать процесс возникновения отладочных событий. Объединив возможности трассировки модулей DWT и ITM, мы можем полу чить MHoro полезной информации. Так, из содержимоrо окна трассировки ис ключений ИСР Vision мы можем узнать, какие исключения были обработаны и сколько ушло времени на каждое из них (Рис. 16.5). 2 НМ1 О 08 З HarcFd О 0$ .. MemМ О 0$ 5 BusFd О О, Б Ud О 0$ 11 SVYI 475 158.236 u8 77500\.1$ 1Ю.7З6 \.1$ 13!861 \.1$ 145-49$ 0(0)21660 12 Oon О 0$ 14 PendSV О а. 15 SysTick 2576 4 309 ms 1.417 us 93б94us 785 222 us 1a. /'А$ О OOJJ727S 16 EкtlRQ О Q 0$ 17 EмtlRQ 1 О 0$ 18 EICtfRQ2 О О. 19 ЕICtIRQЗ О о. 20 Е иdRQ 4 О 0$ 21 EICtfRQ5 О 08 22 EIItIRQ6 О 0$ 2з EкtlRQ 7 О 0$ Рис. 16.5. Окно «Exceptioп Trace» ИСР flVisioп. 16.4. Компоненты трассировки: модуль ЕТМ Модуль ЕТМ используется для трассировки команд. Данный модуль является опциональным и может отсутствовать в отдельных устройствах на базе процес сора CortexM3. Если модуль ЕТМ включён, то в процессе трассировки он rенери рует пакеты трассировки команд. В модуле предусмотрен FIFОбуфер, облеrчаю щий захват потока трассировочных данных внешним устройством. Для уменьшения объёма данных, rенерируемых модулем ЕТМ, он сообщает не обо всех командах, выполненных процессором. Как правило, модуль выводит информацию о ходе выполнения проrраммы и значения адресов только в опреде лённые моменты времени (например, при выполнении переходов). Поскольку хост отладки имеет копию двоичноrо образа проrраммы, то этих данных ему бу 
286 · rлава 16. Компоненты отладки дет достаточно для Toro, чтобы восстановить последовательность команд, выпол ненных процессором. Модуль ЕТМ также взаимодействует с друrими компонентами отладки, таки ми как модуль DWT. В частности, компаратор модуля DWT может использовать ся для rенерации запускающих событий в модуле ЕТМ или для управления пу ском/остановом трассировки. В отличие от модуля ЕТМ традиционных процессоров ARM, модуль ЕТМ, pe ализованный в процессоре CortexM3, не имеет собственных компараторов aдpe са, так как операции сравнения для модуля ЕТМ может выполнять модуль DWT. Более Toro, поскольку трассировка данных также осуществляется модулем DWT, то реализация модуля ЕТМ процессора CortexM3 довольно сильно отличается от традиционных решений для друrих процессорных ядер ARM. Чтобы задействовать модуль ЕТМ в процессоре CortexM3, необходимо BЫ полнить следующие операции (этим занимается отладчик): 1. Установить бит TRCENA реrистра DEMCR (см. Табл. 15.2 или Табл. f.38). 2. Разблокировать модуль ЕТМ, чтобы получить возможность записи в ero реrистры. Для этоrо необходимо в реrистр ETMLOCKACCESS записать значение ОхС5АССЕ55. 3. Занести в реrистр идентификатора ATID уникальное значение, которое позволит хосту отладки отделить пакеты модуля ЕТМ от пакетов из друrих источников трассировки. 4. Подать на вход разрешения неинвазивной отладки (NIDEN) модуля ЕТМ сиrнал BbICOKOrO уровня. Реализация этоrо сиrнала зависит от KOHKpeTHoro устройства. Чтобы получить более подробную информацию, обратитесь к документации на используемый микроконтроллер. 5. Запроrраммировать реrистры управления модуля ЕТМ на rенерацию трассировочной информации. 16.5. Компоненты трассировки: модуль TPIU Модуль TPIU используется для вывода пакетов трассировки, формируемых модулями ITM, DWT и ЕТМ, во внешнее устройство (например, анализатор пор та трассировки). Модуль TPIU процессора CortexM3 поддерживает два режима вывода информации: · синхронный режим, использующий параллельную шину данных разряд ностью до 4 бит; · SWVрежим, использующий однопроводной интерфейс SWVl). Реальная разрядность порта вывода данных в синхронном режиме может быть разной. Она зависит от типа корпуса микросхемы, а также от числа сиrналь ных контактов, которые можно будет задействовать для вывода данных трасси ровки. Максимальную разрядность порта трассировки, поддерживаемую KOH кретной микросхемой, можно определить из реrистра TPIUSSPSR модуля TPIU. Скорость вывода данных также проrраммируется. 1) Доступен только в устройствах с процессором CortexM3 ревизии 1 и выше. 
16.6. Модуль РРВ · 287 в режиме SWV при меняется однобитный последовательный протокол, требу ющий Bcero один сиrнальный провод. При этом также уменьшается пропускная способность канала передачи данных трассировки. При объединении SWV и протокола отладки SerialWire в качестве выхода SWV может задействоваться вывод TDO интерфейса JTAG (Рис. 16.6). Это позволяет использовать для сбора отладочной информации в режиме SWV стандартный JТАGкабель (см., напри мер, отладчик ULINK 2 компании КеН). Параллельный выход ДЛЯ синхронноrо режима ULink2, ULinkPro или RealView ICE TOI ТСК (SWCLK) TMS (SWIO) SerialWire JТAG (SWJOP) СоrtехМЗ Модуль интерфейса порта трассировки (ТРIU) Данные, бит 3 Данные, бит 2 Данные, бит 1 Данные, бит 0/ SWV ULink Pro или RealView Trace ТОО SWV Рис. 16.6. Использование выхода SW Также SWV может передавать данные на вывод, используемый в синхронном режиме в качестве одной из линий параллельноrо порта. Для сбора трассировоч ной информации, независимо от режима работы модуля TPIU, можно задейство вать внешний анализатор порта трассировки, например RealView Trace компа нии ARM. Если необходимо выполнить трассировку команд (с помощью модуля ЕТМ), то желательно использовать синхронный режим, поскольку он обеспечивает бо лее высокую пропускную способность. Для простой трассировки данных и Tpac сировки событий (например, исключений), как правило, достаточно режима SWV, достоинством KOToporo является меньшее число задействованных выводов. Для использования модуля TPIU бит TRCENA реrистра DEMCR следует YCTa новить в 1. Также необходимо запроrраммировать соответствующим образом реrистр выбора протокола (режима) и реrистры управления разрядностью порта трассировки (эти операции выполняет ПО трассировки). 16.6. Модуль FPB Модуль РРВ выполняет следующие функции: . установка аппаратных точек останова (rенерирует событие точки останова для перевода процессора в один из режимов отладки); . подмена команды или константы в области кода значением из области стати ческоrо 03 16.6.1. Точка останова Назначение точек останова, в общемто, понять не сложно. Во время отладки вы можете разместить одну или несколько точек останова по адресам проrраммы 
288 · rлава 16. Компоненты отладки или констант. При выполнении команды или при чтении значения, расположен Horo по такому адресу, rенерируется событие отладки, которое приводит к OCTa нову проrраммы (для отладки в режиме останова) или rенерации исключения Debug monitor (для отладки в режиме монитора). После этоrо вы можете прокон тролировать содержимое реrистров, памяти, начать пошаrовую отладку про rpaMMbI и т.д. 16.6.2. Функция Flash Patch Функция Flash Patch позволяет использовать проrраммируемое ЗУ небольшо ro объёма для наложения «заплаток» на память проrрамм, доступную только для чтения. Использование в качестве памяти проrрамм масочноrо или однократно проrраммируемоrо ПЗУ может значительно снизить стоимость продукции при массовом производстве. Однако в этом случае замена устройств при обнаруже нии ошибки в проrрамме может дороrо обойтись производителю. Если же доба вить в устройство перепроrраммируемую память (флэш или EEPROM) неболь шоrо объёма, то можно будет ставить «заплатки» на проrрамму, зашитую в устройстве. Для микроконтроллеров, использующих для хранения проrраммы флэшпамять, функция Flash Patch не актуальна, поскольку флэшпамять допу скает стирание и повторное проrраммирование. 16.6.3. Компараторы Модуль РРВ содержит в общей сложности восемь компараторов: · шесть компараторов команд; · два компаратора констант. Любой компаратор в каждый момент времени может использоваться для pea лизации либо точки останова, либо функции Flash Patch, но не обеих функций одновременно. В модуле РРВ имеется реrистр управления функцией Flash Patch, который co держит бит, разрешающий работу модуля. Кроме Toro, для каждоrо компаратора предусмотрены отдельные биты разрешения, которые располаrаются в реrистрах управления компараторами. Для включения компаратора оба бита разрешения (модуля и компаратора) необходимо установить в 1. Компараторы MorYT быть запроrраммированы на то, чтобы переназначать адреса из области кода в область статическоrо ОЗ ДЛЯ использования данной функции в реrистр REMAP необходимо занести начальный адрес переназначае мой области памяти. В трёх старших битах этоrо реrистра (биты [31:29]) жёстко зашито значение ЬООI, что оrраничивает базовый адрес диапазоном Ох20000000.. .Ох3РРРРР80, который всеrда находится в области ОЗ При совпадении адреса команды или константы с адресом, заданным в компа раторе, производится чтение из таблицы, на которую указывает реrистр REMAP (Рис. 16.7). 
16.6. Модуль РРВ · 289 Ох20000000 Адресное пространство Переадресация Новая константа N21 Область СОЗУ Новая команда N23 Новая команда N22 Новая команда N21 Базовый адрес (REMAP) Ох 20000000 Константа N21 СОМРб Команда N22 СОМР1 Область кода Команда N21 СОМРО Команда N23 СОМР2 ОхОООООООО Рис. 16.7. Функция Plash Patch: переназначение операций чтения команд и констант. Используя функцию переадресации, можно реализовать набор проверок типа «если  то», В которых ориrинальные команда или константа будут подменяться друrими (даже в том случае, если код проrраммы расположен в ПЗУ или флэш памяти). В частности, такое решение можно использовать для запуска проrрам мы или процедуры из ОЗУ, размещая такую «заплатку» В области кода, которая осуществляла бы переход к проrрамме или процедуре тестирования. Это позво ляет отлаживать устройства, в которых проrрамма хранится в ПЗУ. Второй функцией компараторов адреса команд является rенерация точек останова с запуском одноrо из двух режимов отладки. 
290 · Тлава 16. Компоненты отладки 16.7. Порт доступа шины АНВ Порт доступа усовершенствованной высокопроизводительной шины (AHBAP) представляет собой мост между модулем интерфейса отладки (SWJDP или SWDP) и системой памяти процессора CortexM3 (Рис. 16.8). В большинстве операций пересылки данных между хостом отладки и системой с процессором CortexM3 используются следующие реrистры модуля AHBAP: · реrистр слова состояния и управления (CSW); · реrистр адреса пересылки (Т AR); · реrистр чтения/записи данных (DRW). Реrистр CSW позволяет управлять направлением передачи данных (чтение/ запись), размером пересылки, типом пересылки и т.п. Реrистр TAR используется для указания адреса пересылки, а реrистр DRW предназначен для выполнения собственно операции пересылки данных (пересылка начинается при обращении к этому реrистру). Содержимое реrистра данных DRW в точности соответствует содержимому ши ны. При выполнении двухбайтных и однобайтных пересылок требуемые данные бу дут сдвинуты в корректный байтовый тракт проrраммным обеспечением отладчика. 
16.8. Таблица ПЗУ. 291 СоrtехМЗ AHBAP Периферия CortexM3 Хост отладки SW JDP или SWDP TAR CSW ОАТА Порт ОАР в СоrtехМЗ Система памяти Рис. 16.8. Подключение порта AHBAP 8 процессоре CortexM3. Например, если вы хотите переслать полуслово по адресу Охl002, то вы должны поместить данные в биты [31:16] реrистра DRW. Модуль AHBAP может форми ровать невыровненные пересылки, однако результат операции при этом не BЫ равнивается. Так что проrрамма отладчика должна будет либо сдвинуть данные самостоятельно, либо разбить одно обращение к невыровненным данным на He сколько операций. Остальные реrистры AHBAP обеспечивают дополнительные функциональ ные возможности. В частности, модуль имеет 4 реrистра, объединённых в банк, которые в сочетании с функцией автоматическоrо инкрементирования адреса ускоряют обращения к памяти в некотором диапазоне адресов и выполнение по следовательных пересылок. В модуле AHBAP также имеется специальный pe rистр, содержащий адрес таблицы ПЗУ. В реrистре CSW находится бит Master Туре. Этот бит обычно устанавливается в 1, rоворя о том, что пересылка, полученная устройством от моста AHBAP, бы ла запущена отладчиком. Однако отладчик может «симулировать» ядро процес сора, сбросив указанный бит. В этом случае устройство на шине АНВ будет функ ционировать так, как если бы к нему обращался процессор. Данная возможность облеrчает тестирование периферийных устройств с FIFОбуфером, которые в присутствии отладчика MorYT работать иначе, нежели без Hero. 16.8. Таблица ПЭУ Таблица ПЗУ используется для Toro, чтобы отладчик Mor автоматически обна ружить компоненты отладки, имеющиеся в устройстве с процессором CortexM3. Как уже неоднократно rоворилось, данный процессор является первым процес сором компании ARM, имеющим архитектуру ARM v7M. Он содержит предо пределённую карту памяти и ряд компонентов отладки. Однако в будущих устройствах семейства CortexM расположение компонентов отладки в адресном пространстве может измениться. Это же может произойти в том случае, если раз работчики микросхемы модифицируют компоненты отладки, используемые по умолчанию. Для Toro чтобы отладочные средства моrли обнаружить компонен ты, имеющиеся в системе отладки, и предназначена таблица ПЗУ, которая coдep жит информацию об адресах контроллера NVIC и модулей отладки. 
292 · rлава 16. Компоненты отладки Таблица ПЗУ располаrается по адресу ОхЕООРРООО. Содержимое данной Ta блицы позволяет вычислить расположение в памяти системных компонентов и компонентов отладки. После этоrо отладчик может проверить реrистры иден тификатора обнаруженных компонентов и определить, какие именно компонен ты имеются в системе. Для процессора CortexM3 первый элемент таблицы ПЗУ (OxEOOFFOOO) дол жен содержать смещение для реrистров контроллера NVIC. По умолчанию значе ние первоrо элемента таблицы равно ОхРРРОРО03; установленные биты [1:0] сви детельствуют о том, что устройство существует и что в таблице имеются и друrие элементы. Адрес блока реrистров контроллера NVIC может быть вычислен как OxEOOFFOOO + OxFFFOFOOO = ОхЕОООЕООО. Содержимое таблицы ПЗУ процессора CortexM3, принятое по умолчанию, приведено в Табл. 16.2. Однако в связи с тем, что разработчики микроконтролле ров MorYT добавлять, исключать или замещать определённые опциональные KOM поненты отладки друrими СоrеSightсовместимыми компонентами, содержимое таблицы применяемоrо вами микроконтроллера может оказаться друrим. Таблица 16.2. Содержимое таблицы ПЗУ CortexM3, ПРИНJlтое по умолчанию Адрес Значение Обозна Описание чение ОхЕООРРООО ОхРРРОРОО3 NVIC Базовый адрес контроллера NVIC (ОхЕОООЕООО) ОхЕООРРОО4 ОхРРРО2003 DWT Базовый адрес модуля DWT (OxEOOOIOOO) OxEOOFFOO8 OxFFF03003 FPB Базовый адрес модуля РРВ (ОхЕООО2000) OxEOOFFOOC OxFFFOIOO3 ITM Базовый адрес модуля ITM (ОхЕООООООО) OxEOOFFOIO OxFFF41003/ TPIU Базовый адрес модуля TPIU (ОхЕОО40000) OxFFF41002 OxEOOFFOl4 OxFFF42003/ ЕТМ Базовый адрес модуля ЕТМ (OxEOO41000) OxFFF42002 OxEOOFF018 О End Маркёр конца таблицы OxEOOFFFCC Ох! МЕМТУРЕ Признак Toro, что остальные устройства расположены в этом же адресном пространстве OxEOOFFFDO О / ОхО4 PID4 Область идентификаторов периферии; зарезервировано OxEOOFFFD4 О / ОхОО PID5 Область идентификаторов периферии; зарезервировано OxEOOFFFD8 О / ОхОО PID6 Область идентификаторов периферии; зарезервировано OxEOOFFFDC О / ОхОО PID7 Область идентификаторов периферии; зарезервировано OxEOOFFFEO О / ОхС3 PIDO Область идентификаторов периферии; зарезервировано OxEOOFFFE4 О / ОхВ4 PIDl Область идентификаторов периферии; зарезервировано OxEOOFFFE8 О / ОхОВ PID2 Область идентификаторов периферии; зарезервировано OxEOOFFFEC О / ОхОО PID3 Область идентификаторов периферии; зарезервировано OxEOOFFFFO О / OxOD CIDO Область идентификаторов компонентов; зарезервировано OxEOOFFFF4 О / Ох! О CIDl Область идентификаторов компонентов; зарезервировано ОхЕООРРРР8 О / ОхО5 CID2 Область идентификаторов компонентов; зарезервировано OxEOOFFFFC О / ОхВ! CID3 Область идентификаторов компонентов; зарезервировано 
16.8. Таблица ПЗУ · 293 Младшие два бита значения каждоrо элемента используются для указания Ha личия компонента в системе. В любом устройстве обязательно должны присут ствовать модули NVIC, DWT и FPB, поэтому два младших бита значений табли цы, соответствующих этим компонентам, всеrда будут установлены в 1. В то же время модули TPIU и ЕТМ MorYT быть заменены производителем на друrие KOM поненты отладки семейства CoreSight. В старших битах значений таблицы содержатся величины смещений компо нентов относительно адреса начала таблицы ПЗ Например: Адрес NVIC = OxEOOFFOOO + OxFFFOFOOO = ОхЕОООЕООО (усечено до 32 бит) Средства отладки, поддерживающие технолоrию CoreSight, должны уметь определять адреса компонентов отладки из таблицы ПЗУ. В некоторых устрой ствах с ядром CortexM3 MorYT присутствовать друrие компоненты, что приво дит К появлению новых элементов в таблице ПЗ Используя содержимое табли цы, отладчик может вычислить базовые адреса всех компонентов отладки. После этоrо, читая содержимое реrистров идентификаторов указанных компонентов, отладчик может определить, какие именно компоненты присутствуют в системе (Рис. 16.9). Отладчик обнаруживает подключение AHBAP, читая реrистры иденти фикатора модуля В ДHBДP Отлад ч ик q SWJDP 17:r,-.}'..""" f \,i........: Отладчик обнаруживает SWJDP, используя протокол JTAG или SerialWire Используя реrистр базовоrо адреса модуля AHBAP, отладчик определяет таблицу ПЗУ Отладчик перебирает все элементы таблицы ПЗУ и считывает значения идентификаторов компонентов отладки После этоrо отладчик может определить возможности компо не нто в отладки, читая содержимое друrих реrистров компонентов NVIC r-----\ Число точек у наблюдения r-----\ Число точек у останова ЕТМ Рис. 16.9. Автоматическое обнаружение компонентов в архитектуре CoreSight. 
rЛАВА 17 ПРИСТУПАЯ к РАБОТЕ С ПРОЦЕССОРОМ CORTEXM3 17.1. Выбор устройства с ядром CortexM3 Устройства, построенные на базе процессора CortexM3, отличаются друr от друrа не только объёмами памяти, имеющимися периферийными устройствами и быстродействием, но и множеством друrих параметров. Процессор CortexM3, предлаrаемый компанией ARM, имеет ряд конфиrурируемых параметров: · число внешних прерываний; · число уровней приоритета прерываний (разрядность реrистров уровня прио ритета); · наличие или отсутствие модуля защиты памяти MPU; · наличие или отсутствие модуля трассировки ЕТМ; · используемый интерфейс отладки (SerialWire, JTAG или оба). Очевидно, что выбор KOHKpeTHoro устройства в большинстве проектов опре деляется функциональными возможностями и параметрами Toro или иноrо мик роконтроллера. Например: · Перuферuя. Для мноrих приложений наличие Toro или иноrо периферийноrо устройства является основным критерием. Большее число периферийных устройств можно считать достоинством, однако это также влияет на потре бление микроконтроллера и ero стоимость. · Память. Микроконтроллеры с ядром CortexM3 MorYT иметь флэшпамять объёмом от нескольких килобайт до нескольких меrабайт. Также немалова жен объём BHYTpeHHero ОЗУ устройства. Как правило, эти факторы напрямую влияют на стоимость микроконтроллера. · Тактовая частота. Процессор CortexM3 компании ARM может леrко рабо тать на частоте 100 мrц, даже при ero изrотовлении по 0.18MKM технолоrии. Однако производители устройств на базе данноrо процессора MorYT указы вать меньшие значения максимальной тактовой частоты изза оrраниченноrо быстродействия используемой памяти. · Посадочное место. Микроконтроллеры с ядром CortexM3 MorYT выпускаться в самых разных корпусах  это зависит исключительно от политики произво дителя. Мноrие устройства имеют корпуса с малым числом выводов, что дела ет их идеальным выбором при создании недороrих изделий. 
17.2. Средства разработки · 295 На сеrодняшний день мноrие производители микроконтроллеров уже актив но продвиrают свои решения на базе процессора CortexM3) и ещё ряд произво дителей намереваются выпустить такие микроконтроллеры в ближайшее время. Перечислим наиболее заметных иrроков на этом рынке. Texas Instruments (бывшая Luminary Micro). В семейство Stellaris микрокон троллеров с ядром CortexM3 входит более 100 различных устройств) включая устройства с контроллерами Ethernet 10/100 MAC и РНУуровней) интерфейсами USB) CAN) SPI) I 2 C) I 2 S И т.п. STMicroelectronics. Компания выпускает три линейки микроконтроллеров с ядром CortexM3: . STM32 (Connectivity Line)  в рамках этой линейки выпускаются устройства, имеющие максимальную функциональность и поддержку интерфейсов USB OnTheGo (USB OTG)) Ethernet, а также интерфейсов карт памяти. . STM32L (Low Power)  микроконтроллеры данной линейки предназначены для приложений со сверхнизким потреблением и имеют встроенную под держку интерфейса ЖКИ. . STM32 (Value Line)  микроконтроллеры для бюджетных приложений. Toshiba. Микроконтроллеры семейства ТХ03 предназначены для использова ния в самых разных областях, в том числе в промышленном оборудовании) aBTO мобильных устройствах и бытовой аппаратуре. Эти микроконтроллеры поддер живают различные интерфейсы, включая USB) CAN, Ethernet; ряд моделей имеют в своём составе аналоrовую периферию. Atmel. Микроконтроллеры семейства SAM3U используют двухбанковую флэшпамять) оснащены высокоскоростными интерфейсами High Speed USB) SPI) SDIO) SSC) имеют интерфейс карт памяти) а также АЦП. Energy Micro. Микроконтроллеры семейства EFM32 являются чрезвычайно энерrоэффективными устройствами с инновационной периферией) которая MO жет реаrировать на внешние воздействия без участия ЦП Помимо Bcero проче ro, эти микроконтроллеры имеют интерфейс ЖКИ) модули АЦП/ЦАП) а также ряд специальных возможностей наподобие поддержки стандарта шифрования AES. NXP. Компания выпускает две линейки микроконтроллеров с ядром CortexM3  LPC1700 и LPC1300. Первая из них рассчитана на создание BЫCOKO производительных приложений и обеспечивает поддержку высокоскоростных коммуникационных интерфейсов) различных методов управления двиrателями, а также стандартных промышленных интерфейсов, таких как USB, CAN, eS. Ли нейка LPC1300) наоборот, нацелена на устройства с малым потреблением) а также на устройства обработки смешанных сиrналов. 17.2. Средства разработки Для работы с микроконтроллерами на базе процессора CortexM3 вам потре буется определённый инструментарий. Обычно в Hero входят следующие компо- ненты: 
296 · rлава 17. Приступая к работе с процессором CortexM3 · Компилятор и/или ассемблер  проrраммное обеспечение для компиляции ваших проrрамм, написанных на языке Си или на ассемблере. Практически все компиляторы поставляются вместе с ассемблером. · Симулятор  проrраммное обеспечение, симулирующее исполнение команд; применяется для отладки проrраммы на первых этапах разработки приложе ния. Этот компонент необязателен. · Внутрисхемный эмулятор (/СЕ) или отладчик  устройство, позволяющее подключать хост отладки, в качестве KOToporo обычно выступает персональ ный компьютер, к разрабатываемому устройству. Может использоваться ин терфейс JTAG или SerialWire. · Отладочная плата  печатная плата с установленным на ней микроконтрол лером. · Трассировщик  опциональный проrраммноаппаратный комплекс для Tpac сировки команд или считывания выходных данных модулей DWT и ITM и преобразования их в удобочитаемую форму. Иноrда функции трассировщи ка встраиваются во внутрисхемный эмулятор. · Встраиваемая операционная система  операционная система (ОС), работа ющая на микроконтроллере. Этот компонент необязателен  существует MHO жество приложений, не требующих наличия ОС. 17.2.1. Си"компипяторы и отпадчики в настоящее время на рынке представлено довольно MHoro Сикомпиляторов и средств разработки, имеющих поддержку микроконтроллеров с процессором CortexM3 (Табл. 17.1). Таблица 17.1. Некоторые средства разработки с поддержкой процессора CortexM3 Компания Продукция*' Пакет разработки RealView Development Suite (RVDS) ARM и внутрисхемный эмулятор RealViewICE (RVI). Обратите внимание, (www.arm.com) что старые продукты, такие как ARM Development Suite (ADS) и Software Development Toolkit (SDT), не поддерживают процессор Cortex М3 КеН, ап ARM соmрапу Пакет разработки Microcontroller Development Kit (MDKARM). (www.keil.com) Внутрисхемные отладчики и трассировщик семейства ULINК1'М CodeSourcery Пакет разработки SourceryG++, основанный на инструментарии GNU (www.codesourcery.com) Too1chain (www.codesourcery.com/gnu toolchains/arm/) Rowley Associates Среда разработки CrossWorks for ARM, основанная на (www.rowley.co. uk) инструментарии GNU Too1chain (www.rowley.co.uk/arm/index.htm) Среда разработки IAR Embedded Workbench for ARM версии 4.40. IAR Systems Также предлаrается стартовый комплект, в который входит (www.iar.com) отладочная плата с микроконтроллером LM3S102 (Texas Instruments) и внутрисхемный отладчик J  Link Lauterbach Проrраммноаппаратные средства для отладки и трассировки (www.lauterbach.com) 
17.2. Средства разработки. 297 Таблица 17.1. Некоторые средства разработки с поддержкой процессора CortexM3 (продолжение) Компания Продукция*" Segger Внутрисхемный отладчик J  Link и трассировщик J  Trace (www.segger.com) Signum Внутрисхемные отладчики JTAGJet и JTAGJetTrace для процессора (www.signum.com) CortexM3 Code Red Интеrрированная среда разработки Red Suitе ТМ 2 на базе Eclipse, (www.codered tech.com) использующая компилятор GCC и отладчик Red Probe с поддержкой протоколов JT AG и SW N ational Instrument Модуль LabVIEW Embedded Module for ARM Microcontrol1er (www.ni.com) Raisonance Пакет проrрамм RKitARM на базе компилятора GCC. (www.raisonance.com) Также имеется отладчик (RLink) и стартовый комплект (STM32 Primer) GNU GCC Последние версии компилятора GCC поддерживают процессор (www.gcc.gnu.org) Cortex М3 *Названия продуктов являются зареrистрированными товарными знаками соответствующих компаний, указанных в левом столбце таблицы. Бесплатный компилятор Си/Си++ из набора GCC можно заrрузить с сайта проекта GNU, а также с сайтов ряда компаний, например CodeSourcery и Raisonance. Некоторые коммерческие пакеты, такие как пакет MDKARM KOM пании КеН, имеют полнофункциональные пробные версии. 17.2.2. Поддержка встраиваемых ОС Мноrие приложения требуют операционной системы для поддержки MHoro поточности и управления ресурсами. В настоящее время на рынке предлаrается множество встраиваемых ОС, некоторые из которых уже портированы на про цессор CortexM3 (Табл. 17.2). Таблица 17.2. Встраиваемые ОС, портированные на процессор CortexM3 Компания Продукция*" FreeRTOS (www.freertos.org) FreeRTOS Express Logic (www.rtos.com) ThreadX(TM) RTOS Micrium (www.micrium.com) flC/OSII Mentor Graphics (www.mentor.com) Nucleus/Nucleus Plus Pumpkin Inc. (www.pumpkininc.com) Salvo RTOS СМХ Systems (www.cmx.com) CMXRTX КеН (www.keil.com) ARM RTX Segger (www.segger.com) emboss IAR Systems (www.iar.com) IAR PowerPac for ARM eCosCentric (www.ecoscentric.com, www.ecos.sourceware.org) eCos Interniche Technologies Inc. (www.nichetask.com) NicheTask Green Hil1s Software (www.ghs.com) flVelOSity 
298 · rлава 17. Приступая к работе с nроцессором CortexM3 Таблица 17.2. Встраиваемые ОС, портированные на процессор CortexM3 (продолжение) Компания Продукция* Ореп source (www.1inuxarm.org/LinuxKerne1/LinuxM3) flCLinux Quadros System (www.quadros.com) RTXC ENEA (www.enea.com) OSE Epsilon RTOS Raisonance (www.stm32circle.com/projects/circleos.php) CircleOS SCIOPT А (www.sciopta.com) SCIOPTA RTOS Micro Digital (www.smxrtos.com) SMX RTOS *Названия продукции являются зареrистрированными товарными знаками соответствующих компаний, указанных в левом столбце таблицы. 17.3. Различия между процессорами Cortex..M3 ревизий О и 1 в самых первых устройствах использовались процессоры ревизии о. Изделия на базе процессора CortexM3 ревизии 1 появились на рынке в первом квартале 2006 rода и на момент опубликования первоrо издания книrи эта ревизия ядра использовалась во всех новых микроконтроллерах с процессором CortexM3. Pe визия 2 процессора появилась в 2008 rоду, а устройства с данным ядром начали выпускаться в 2009 rоду. Желательно точно знать номер ревизии процессора, pe ализованной в используемом вами микроконтроллере, поскольку эти ревизии существенно отличаются друr от друrа. В ревизии 1 процессора была HeMHoro изменена модель проrраммирования и добавлены некоторые возможности: · Начиная с ревизии 1, появилась возможность выравнивания cTeKoBoro фрей ма обработчика исключения на rраницу двойноrо слова. Для этоrо в реrистр CCR контроллера NVIC был добавлен бит STKALIGN. · В редакции rlpl ревизии появился новый реrистр состояния AUXFAULT (оп циональный). · В модуль DWT были добавлены новые возможности, включая контроль co впадения значений данных. · Поскольку сменился номер ревизии, то было изменено и значение реrистра идентификатора процессора. Изменений, незаметных конечным пользователям, было HaMHoro больше: · Области памяти кода были жёстко назначены следующие атрибуты: кэшируе мая, выделяемая, небуферируемая и неразделяемая. Это нововведение затро нуло интерфейсы шин АНВ ICode и DCode, но не интерфейс системной ши НЫ. Изменения коснулись лишь возможности кэширования и буферизации памяти, расположенной вне процессора (например, кэшпамяти 2ro уровня или контроллеров памяти с кэшем). Функционирование BHYTpeHHero буфера записи процессора не изменилось, поэтому в большинстве микроконтролле ров данное новшество ни на что не повлияло. 
17.3. Различия между процессорами CortexM3 ревизий О и 1 · 299 . Появилась возможность мультиплексирования шин ICode и DCode. В этом режиме указанные шины можно было объединять с помощью простоrо муль типлексора шин (в предыдущем решении использовался компонент BusMatrix из набора ADK). Это позволило уменьшить общее число лоrических элементов. . Был добавлен новый выходной порт для подключения к модулю АНВ Trace Macrocell (НТМ, компонент отладки архитектуры CoreSight от ARM). . Появилась возможность обращения к компонентам отладки и реrистрам управления отладкой даже во время системноrо сброса; эти реrистры стали недоступными только во время сброса по включению питания. . В модуль TPIU была добавлена поддержка режима работы SerialWire Viewer (SWV). Это позволило использовать для сбора трассировочной информации недороrое оборудование. . Бит CMASKINTS реrистра DHCSR контроллера NVIC получил возможность влиять на содержимое поля VECTPENDING реrистра ICSR. Теперь, если при установке бита CMASKINTS маскировалось отложенное прерывание, то по ле VECTPENDING обнуляется. . Модуль интерфейса отладки JTAGDP был заменён на модуль SWJDP (см. подраздел 17.3.1). Однако разработчики микроконтроллеров моrли продол жать использовать модуль JTAGDP, поскольку он остался в линейке продук ции архитектуры CoreSight. Поскольку ревизия О процессора не поддерживала выравнивание стека на rpa ницу двойноrо слова при обработке исключений, то в некоторых средах разра ботки, в частности в пакете RVDS компании ARM и пакете MDKARM компании КеН, были предусмотрены специальные опции для проrраммноrо выравнивания стека, что обеспечивало совместимость разрабатываемоrо приложения с интер фейсом EABI. Это моrло оказаться важным при необходимости работы с друrи ми ЕАВIсовместимыми средствами разработки. Для определения номера ревизии процессора, реализованноrо в микрокон троллере или SoC, можно воспользоваться реrистром идентификатора ЦПУ CPUID контроллера NVIC. Зависимость содержимоrо полей указанноrо реrистра от номера ревизии и номера редакции ядра приведена в Табл. 17.3. Таблица 17.3. Реrистр идентификатора ЦПУ CPUID (ОхЕОООЕООО) Implementer Variant Constant Part No Revision [31:24] [23:20] [19:16] [15:4] [3:0] Ревизия О Ох41 ОхО OxF ОхС23 ОхО (rOpO) Ревизия 1 Ох41 ОхО OxF ОхС23 Охl (rlpO) Ревизия 1 Ох41 Охl OxF ОхС23 Охl (rlpl) Ревизия 2 Ох41 Ох2 OxF ОхС23 ОхО (r2pO) Все компоненты отладки процессора CortexM3 тоже имеют реrистры идентифи катора, содержимое которых может быть различным для ревизий О и 1 процессора. 
300 · rлава 17. Приступая к работе с процессором Cortex..M3 17.3.1. Ревизия 1 ...... замена модупя JTAG..DP на SWJ..DP На смену модулю JTAGDP, использовавшемуся в ранних устройствах на базе процессора CortexM3, пришёл модуль SWJDP. Этот модуль обладает функцио нальностью модулей SWDP и JTAGDP и может автоматически определять ис пользуемый протокол (Рис. 17.1). При наличии данноrо компонента устройства с процессором CortexM3 MorYT поддерживать отладку как по интерфейсу Serial Wire, так и по интерфейсу JTAG. Хост отладки (ПК) Микроконтроллер  СоrtехМЗ SW JOP Ядро СоrtехМЗ NVIC USB или Ethernet Интерфейс JTAG SerialWire Шина, ОАР, AHBAP , , I , , , , I ,  , , , ,....., , I , L Прочие АР I L..J JTAG или SerialWire J Отладчик Память Рис. 17.1. Модуль SW/DP  /TAG..DP и SWDP «8 одном флаконе». 17.4. Различия между процессорами Cortex..M3 ревизий 1 и 2 в середине 2008 rода компания ARM представила новую ревизию процессора CortexM3  ревизию 2 (r2pO). Устройства, использующие данную ревизию про цессора, начали появляться на рынке в 2009 rоду. В ревизии 2 процессора появи лись новые возможности, б6льшая часть которых нацелена на уменьшение по требления и увеличение rибкости процесса отладки. Изменения модели про rраммирования, заметные конечному пользователю, описаны в следующих под разделах. 17.4.1. Выравнивание стека на rраницу двойноrо спова по умолчанию По умолчанию в новой ревизии включено выравнивание стека на rраницу двойноrо слова при сохранении контекста (хотя изrотовители микросхем MorYT и не использовать эту возможность). Такое поведение процессора позволяет уменьшить объём cTapToBoro кода для большинства приложений, написанных на Си (устраняется необходимость установки бита STKALIGN в реrистре CCR). 
17.4. Различия между процессорами CortexM3 ревизий 1 и 2 · 301 17.4.2. Допопнитепьный реrистр управпения в контроллере NVIC появился дополнительный реrистр управления ACR, по зволяющий более точно управлять функционированием процессора. Например, для целей отладки можно отключить буферы записи процессора, в результате че ro отказы шины станут синхронными с командами обращения к памяти (точны ми). Это позволит леrко определять команду, вызвавшую отказ, по значению адреса возврата, сохранённому в стеке. Формат реrистра ACR приведён в Табл. 17.4. Таблица 17.4. Дополнительный реrистр управлении ACR (ОхЕОООЕОО8) Биты Обозначение Тип Значение Описание после сброса Запрещает «схлопывание» команды 1Т 2 DISFOLD R/W О (предотвращает перекрытие исполнения команды 1Т со следующей командой) Запрещает использование буфера записи для 1 DISDEFWBUF R/W О карты памяти, используемой по умолчанию (не влияет на обращения к областям памяти, определённым в модуле MPU) Запрещает прерывание команд, выполняющихся О DISMCYCINT R/W О за несколько тактов, таких как команды rрупповой заrрузки/сохранения (LDM/STM) и команды 64битноrо умножения и деления 17.4.3. Новое значение реrистров идентификации Были изменены различные реrистры идентификации контроллера NVIC и компонентов отладки. Так, значение реrистра CPUID контроллера NVIC стало равным Ох412РС230 (см. Табл. 17.3). 17.4.4. Возможности отпадки Для облеrчения процесса отладки в ревизии 2 процессора появились следую щие улучшения: . При трассировке данных, запускаемой точкой наблюдения в модуле DWT, Te перь можно выбирать для трассировки отдельно пересылки записи и отдель но пересылки чтения, что позволяет уменьшить поток трассировочной ин формации. . Большая rибкость в реализации функций отладки. Например, можно YMeHЬ шить число поддерживаемых точек останова и точек наблюдения для YMeHЬ шения размеров кристалла, снизив тем самым энерrопотребление устройства. . Улучшенная поддержка отладки мноrопроцессорных устройств. Был добав лен новый интерфейс, позволяющий одновременно перезапускать и исполь зовать в пошаrовом режиме несколько процессоров (совершенно прозрачно для проrраммиста). 
302 . rлава 17. Приступая к работе с процессором CortexM3 17.4.5. Особенности режима пониженноrо знерrопотребпения Также были улучшены имеющиеся возможности режима пониженноrо энер rопотребления (Рис. 17.2). В ревизии 2 появилась возможность задержки MOMeH та выхода микроконтроллера из спящеrо режима. Это позволяет отключать боль шее число узлов кристалла; выполнение проrраммы может возобновляться си стемой управления электропитанием при rQТОВНОСТИ устройства. Такой алrо ритм работы необходим для микроконтроллеров, в которых имеются узлы, OT ключающиеся при переходе в спящий режим, поскольку для стабилизации Ha пряжения питания после ero восстановления может потребоваться некоторое время. Выполнение nporpaMMbI «Сон» «Пробуждение). Выполнение nporpaMMbI IRQ Запрос прерывания ..........1 \  Напряжение флэшпамяти I Задержка «пробу.ждения» Рис. 17.2. Задержанный выход из спящеzо режима (ревизия 2 процессора). Также в процессор были внедрены новые технолоrии, позволяющие ещё боль ше снизить потребление микроконтроллера. Предыдущие ревизии процессора CortexM3 требовали наличия независимоrо TaKToBoro сиrнала для выхода из спящеrо режима по прерыванию. Для устранения данноrо недостатка к процессору был подключён простой контроллер прерываний. Этот контроллер (WIC) дублирует функции маскиро вания прерываний контроллера NVIC при нахождении процессора в режиме Deep Sleep и извещает систему управления электропитанием о необходимости выхода из спящеrо режима. Наличие указанноrо контроллера позволяет пол ностью отключить все тактовые сиrналы, поступающие в процессор (Рис. 17.3). Помимо останова всех тактовых сиrналов, данное решение позволяет отклю чать б6льшую часть узлов процессора с сохранением ero состояния в специаль ных лоrических ячейках. При возникновении прерывания контроллер WIC фор мирует для модуля PMU запрос на включение системы. После подачи питания на процессор ero предыдущее состояние восстанавливается, и он приступает к об работке прерывания. Эти возможности позволяют уменьшить энерrопотребление устройства в спя  щем режиме. Однако их реализация зависит от техпроцесса, по которому было изrотовлено устройство. То есть описанные возможности MorYT быть доступны не во всех изделиях, несмотря на использование процессора ревизии 2. 
17.5. Чем же хороша ревизия 2 процессора CortexM3? · 303 IRQ Пробуж дение WIC NMI Модуль управления электропитанием Модуль PMU включает питание при поауплении запроса на пробуждение от контроллера WIC Контроллер WIC обнаруживает и удерживает запрос прерывания, пока процессор отключён Состояние процессора хранится в предназначенных для этоrо т иrrе ах Рис. 17.3. Контроллер WIC (ревизия 2 процессора). 17.5. Чем же хороша ревизия 2 процессора Cortex..M3? и всё же, как влияют все эти новые возможности на процесс разработки BCTpa иваемых устройств? Вопервых, они позволяют уменьшить потребление встраиваемых устройств и, соответственно, увеличить время работы от батарей. Коrда контроллер WIC находится в режиме Deep Sleep, активной должна оставаться лишь малая часть узлов схемы. Кроме Toro, при реализации микроконтроллеров с чрезвычайно низким энерrопотреблением разработчики MorYT уменьшить площадь кристалла за счёт сокращения числа доступных точек останова и точек наблюдения. BOBTOpЫX, новые возможности обеспечивают большую rибкость при отладке и устранении неполадок. Помимо более развитых функций трассировки данных, которые MorYT использоваться отладчиком, в нашем распоряжении оказывается дополнительный реrистр управления. С помощью указанноrо реrистра мы MO жем отключать буферизацию операций записи, получая в итоrе возможность OT слеживать ошибочные команды или же запрещать прерывания на время испол нения команд, выполняющихся за несколько тактов, с тем чтобы все команды rрупповой заrрузки/сохранения завершались перед обработкой исключения. По следнее весьма облеrчает анализ содержимоrо памяти. Для мноrопроцессорных систем ревизия 2 процессора даёт возможность одновременно перезапускать и отлаживать в пошаrовом режиме несколько ядер. Кроме Toro, при разработке ревизии 2 процессора были проведены определён ные работы по оптимизации ядра, которые обеспечили более высокую произво дительность и лучшие интерфейсные возможности. Это позволяет производите 
304 . rлава 17. Прuступая к работе с процессором CortexM3 лям микроконтроллеров создавать более быстрые устройства на базе процессора СоrtехМЗ, имеющие более боrатые функциональные возможности. Тем не менее, проrраммисты встраиваемых систем должны обязательно учитывать следующее: 1. Выравнивание cmeKoBozo фрейма исключения на zраницу двоuноzо слова. В новой ревизии процессора стековые фреймы исключений по умолчанию выравниваются на rраницу двойноrо слова. Это может привести к некорректной работе проrрамм, написанных на ассемблере для процессоров ревизий О или 1 и использующих стек для передачи параметров в обработчики исключений. Поэтому обработчики исключений должны сначала определять, было ли осуществлено выравнивание стека, проверяя бит 9 сохранённоrо в стеке реrистра PSR. Затем они MorYT определить адреса данных, помещённых в стек до возникновения исключения. Или же можно просто сбросить в проrрамме бит STKALIGN в О и получить в результате такое же поведение стека, как и в предыдущих ревизиях процессора. На работу приложений, удовлетворяющих требованиям стандарта EABI, т.е. написанным на языке Си и скомпилированным ЕАВIсовместимым компилятором, это нововведение не влияет. 2. Возможность останова таймера SYSTICK в режиме Deep Sleep. Если микроконтроллер с процессором СоrtехМЗ допускает отключение различных узлов в спящем режиме или же обеспечивает останов всех тактовых сиrналов ядра при переводе ero в режим Deep Sleep, то существует вероятность Toro, что таймер SYSTICK тоже не будет работать в этом спящем режиме. В таком случае встраиваемые приложения, использующие ОС, потребуют наличия внешнеrо (относительно ядра процессора) таймера. 3. Функции отладки и отключения питания. Новые возможности отключения узлов процессора блокируются при подключении процессора к отладчику. Это связано с тем, что во время отладочной сессии отладчик должен иметь возможность обращаться к отладочным реrистрам процессора. При этом ядро должно сохранять возможность останова или перехода в спящий режим, однако не должно активировать цикл отключения питания даже в том случае, если данная функция разрешена. Для проверки работы функции отключения питания отлаживаемое устройство необходимо отключить от отладчика. 17.6. Разпичия между процессорами Cortex..M3 и Cortex..MO Наверняка KTOTO из вас уже слышал о процессоре CortexMO. Модель про rраммирования этоrо процессора очень похожа на модель CortexM3. Однако он занимает меньшую площадь на кристалле, поддерживает меньшее число команд и имеет фоннеймановскую архитектуру. Процессор CortexMO был разработан специально для использования в устройствах со сверхмалым потреблением, rде число лоrических вентилей является критическим фактором. В минимальной конфиrурации процессор СоrtехМЗ содержит Bcero 12 000 лоrических вентилей, 
lZ6. Различия между процессорами CortexM3 и CortexMO · 305 что меньше, чем в большинстве 16битных процессоров и некоторых топовых 8битных процессоров. Несмотря на это, процессор CortexMO обеспечивает про изводительность 0.9 DМIРS/Мfц, что в два раза превышает производительность большинства 16битных микроконтроллеров и почти в 10 раз современных 8бит ных микроконтроллеров. Это позволяет rоворить о процессоре CortexM3 как о самом энерrоэффективном процессоре для микроконтроллеров общеrо приме нения. 17.6.1. Модеnь проrраммирования Между моделями проrраммирования процессоров CortexM3 и CortexMO cy ществует ряд существенных отличий (Рис. 17.4). Так, непривилеrированный ypo вень доступа имеется только в процессоре CortexM3. Также в процессоре CortexMO отсутствуют реrистры специальноrо назначения FAULTMASK и BASEPRI. Проrраммирование реrистров управления Отсутствуют в CortexMO Реrистр RO Rl R2 RЗ R4 R5 R6 R7 R8 R9 Rl0 Rll R12 RlЗ (MSP) R14 R15 Функции Ре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о назначения RlЗ (PSP) I Укаэатель OCHoaнoro аека, Укаэатель аека процесса Реrистр связи (LR) Счётчик команд (РС) Функции Реrистры состояния nporpaMMbl } Реrистры мскирования прерывании Реrистр управления Per..cтp  I xPSR I   - I CONTROL I Реrистры специальноrо назначения Рис. 17.4. Различия 8 моделях проzраммирО8ания CortexM3 и CortexMO. Имеются некоторые различия и в формате реrистров xPSR  в процессоре CortexMO отсутствуют бит Q в реrистре APSR и битовое поле ICI/IT в реrистре EPSR. Это связано с тем, что процессор CortexMO не поддерживает Iтблоки, а при прерывании команды rрупповой заrрузки/сохранения её выполнение пре кращается и начинается заново после завершения обработчика прерывания. 17.6.2. Искnючения и контроnnер NVIC Обработка исключений в процессоре CortexMO осуществляется так же, как и в процессоре CortexM3. Каждому прерыванию и исключению соответствует свой вектор, а поддержка вложенных исключений осуществляется контроллером NVIC автоматически. Некоторые из системных исключений процессора 
306 · rлава 17. Прuступая к работе с процессором CortexM3 CortexM3, а именно исключения Bus Fault, Usage Fault, MemManage Fault и Debug monitor в процессоре CortexMO не реализованы. При возникновении системной ошибки в процессоре CortexMO всеrда запускается обработчик исключения Hard Fault. Соответственно, в процессоре CortexMO отсутствует и ряд реrистров co стояния ошибок, имеющихся в CortexM3. Реrистры приоритета процессора CortexMO имеют Bcero два бита. COOTBeT ственно, для прерываний и системных исключений с проrраммируемым приори тетом доступно Bcero четыре уровня приоритета. Данный процессор не поддержи вает динамическое изменение приоритетов, поэтому назначение приоритетов пре рываний и исключений обычно производится в самом начале проrраммы и после этоrо уже не изменяется. Модель проrраммирования контроллера NVIC процессо ра CortexMO во MHoroM схожа с моделью в процессоре CortexM3. Основное отли чие состоит в том, что реrистры контроллера допускают только пословное обраще ние. Поэтому при необходимости изменить приоритет какоrолибо прерывания придётся считать всё содержимое реrистра, скорректировать уровень приоритета данноrо прерывания и записать полученное значение обратно. Также в контролле ре NVIC процессора CortexMO отсутствуют следующие реrистры: · Pezucmp смещения таблицы векторов. В процессоре CortexMO положение Ta блицы векторов фиксировано. Однако микроконтроллеры MorYT воспользо ваться функцией отображения памяти для изменения векторов исключений в процессе работы проrраммы. · Pezucmp npozpaMMHOzo запуска прерывания. Для проrраммной rенерации исклю чений используются реrистры установки признака отложенноrо прерывания. · Pezucmp состояния aKmUBHOZO прерывания. · Pezucmp типа контроллера прерываний. 17.6.3. Набор команд Процессор CortexMO базируется на архитектуре ARMv6M. Он поддерживает 16битные команды Thumb@ и ряд 32битных команд Thumb2 (переход со ссыл кой (BL), барьер синхронизации команд (ISB), барьер синхронизации данных (DSB), барьер памяти данных (DMB), MRS и MSR). Некоторые команды, имеющиеся в процессоре CortexM3, процессором CortexMO не поддерживаются. Например: · команда IT; · команды сравнения и перехода (CBZ и CBNZ); · команды умножения с накоплением (MLA, MLS, SMLAL и UMLAL), а также KOMaH ды длинноrо умножения с 64битным результатом (UMULL и SMULL); · команды аппаратноrо деления (UDIV, SDIV) и насыщения (SSAT, USAT); · команды табличных переходов (твн и твв); · команды монопольноrо доступа; · команды работы с битовыми полями (UBFX, SBFX, BFI и BFC); · ряд команд обработки данных (CLZ, RRX и RBIT); · команды заrрузки и сохранения, использующие такие режимы адресации или комбинации реrистров, которые допускаются только в 32битных командах; · команды заrрузки/сохранения на непривилеrированном уровне (LDRT и STRT). 
lZ6. Различия между процессорами CortexM3 и CortexMO · 307 17.6.4. Особенности системы памяти Как и в процессоре CortexM3, карта памяти процессора CortexMO разделена на несколько областей (CODE, SRAM, периферия и т.д.). Однако некоторые воз можности системы памяти процессора CortexM3 в процессоре CortexMO OTCYT ствуют, а именно: . области с побитовой адресацией; . обращения к невыровненным данным; . модуль защиты памяти; . исключительный доступ. 17.6.5. Возможности отладки Процессор CortexMO не содержит никаких модулей поддержки трассировки (ЕТМ или ITM). В сравнении с CortexM3 он поддерживает меньшее число точек останова и точек наблюдения (Табл. 17.5). Таблица 17.5. Сравнение возможностей отладки CortexMO CortexM3 Точки останова до4 до 8 Точки наблюдения до 2 до4 в большинстве случаев микроконтроллеры с процессором CortexMO поддер живают только один протокол отладки (SerialWire или JTAG), в то время как устройства с процессором CortexM3 обычно поддерживают оба указанных про токола и способны динамически переключаться между ними. 17.6.6. Совместимость Процессор CortexMO обратно совместим с процессором CortexM3. Проrрам мы, скомпилированные для процессора CortexMO, MorYT выполняться процес сором CortexM3. Однако проrраммы, скомпилированные для CortexM3, не MO rYT использоваться с процессором CortexMO (Рис. 17.5). Архитектура АRМvбМ Обратно совместимы Архитектура ARMv7M 0.9 DМIРs/мrц Простое портирование/ перекомпиляция 1.25 DМIРs/мrц Фоннеймановская архитектура rарвардская архитектура Рис. 17.5. Совместимость процессоров CortexM3 и CortexMO. 
308 · rлава 17. Прuступая к работе с процессором CortexM3 Изза схожести обоих процессоров большинство проrрамм можно написать так, что они CMorYT выполняться на любом из процессоров (это обеспечивается совместимостью карт памяти и периферийных устройств). Если приложение должно выполняться как на микроконтроллерах с ядром CortexM3, так и на микроконтроллерах с ядром CortexMO, необходимо обратить внимание на ряд моментов: 1. Обращения к реrистрам контроллера NVIC должны быть исключительно 32битными или осуществляться с использованием соответствующих функций СМSISсовместимой библиотеки. 2. Данные должны быть выровнены. Для отслеживания невыровненых пересылок в процессоре CortexM3 можно установить бит UNALIGNTRP реrистра CCR. В процессоре CortexMO любая попытка обращения к невыровненным данным вызовет rенерацию исключения Hard Fault. 3. Нельзя использовать метод bitband в связи с тем, что в процессоре CortexMO отсутствуют области с побитовой адресацией. В качестве альтернативноrо решения можно применить условную компиляцию кода, чтобы при компиляции проrраммы для процессора CortexMO все операции побитовоrо доступа заменялись бы эквивалентными проrраммными реализациями. Совместимость процессоров CortexM3 и CortexMO предоставляет MHoro преимуществ разработчикам встраиваемых устройств. Помимо простоты пере носа проrраммноrо кода, она также позволяет отлаживать приложения для про цессора CortexMO на платформе CortexM3, которая располаrает более широки ми отладочными возможностями, в частности поддерживает трассировку KO манд и событий. Чтобы поведение CortexM3 стало ещё больше похожим на пове дение CortexMO, мы можем, используя дополнительный реrистр управления, за претить буферизацию записи. Необходимо только учитывать, что время испол нения некоторых команд в процессорах CortexM3 и CortexMO может различаться. 
rЛАВА 18 ПЕРЕНОС ПРИЛОЖЕНИЙ С ПРОЦЕССОРА ARM7 НА ПРОЦЕССОР CORTEXM3 18.1. Общие сведения Для большинства разработчиков перенос существующеrо проrраммноrо кода с одной платформы на друrую является типовой задачей. А в связи с появлением на рынке устройств с ядром CortexM3 мноrие разработчики столкнулись с необ ходимостью переноса кода, написанноrо для процессора ARM7TDMI (далее в этой rлаве  ARM7), на процессор CortexM3. В данной rлаве обсуждаются He которые вопросы, касающиеся переноса приложений с процессора ARM7 на про цессор CortexM3. При переносе кода с процессора ARM7 на процессор CortexM3 необходимо принимать во внимание следующее: . особенности системы; . исходные файлы на языке ассемблера; . исходные файлы на языке Си; . оптимизацию. В общем случае, наибольших изменений требует код низкоrо уровня (драйве ры аппаратуры, процедуры управления задачами и обработчики исключений). В то же время для переноса кода собственно приложения, как правило, достаточ но внесения незначительных изменений и простой перекомпиляции. 18.2. Особенности системы Системы, построенные на процессоре ARM7, имеют ряд отличий от систем на базе процессора CortexM3. В частности, у них различаются карты памяти, систе мы прерываний, модули MPU, управление системой и режимы работы. 18.2.1. Карта памяти Прежде Bcero, внесение изменений в исходный код проrраммы при её перено се с одноrо микроконтроллера на друrой обусловлено различием их карт памяти. В процессоре ARM7 память и периферийные устройства MorYT располаrаться практически по любым адресам, тоrда как в процессоре CortexM3 используется предопределённая карта памяти. Различия в адресах обычно разрешаются на 
310 · rлава 18. Перенос прuложенuй с процессора ARM7 на процессор CortexM3 этапе компиляции и компоновки. Перенос кода, связанноrо с какимлибо пери ферийным устройством, потребует rораздо б6льших усилий, поскольку модели проrраммирования данноrо устройства MorYT оказаться совершенно разными. В этом случае драйвер устройства, скорее Bcero, придётся писать заново. Мноrие микроконтроллеры с процессором ARM7 поддерживают ремаппиН2 памяти, что позволяет после запуска проrраммы отобразить таблицу векторов в область статическоrо 03 В процессоре CortexM3 таблица векторов может быть перемещена в ОЗУ с помощью одноrо из реrистров контроллера NVIC, т.е. подобная переадресация уже не требуется. Соответственно, в большинстве устройств с процессором CortexM3 возможность переназначения памяти может отсутствовать. Формат с обратным порядком байтов, используемый в процессоре ARM7, OT личается от аналоrичноrо формата в CortexM3. Чтобы привести проrрамму в co ответствие с новой системой хранения мноrобайтных значений, достаточно пе рекомпилировать её исходные файлы (при наличии в проrрамме жёстко задан ных таблиц соответствия может потребоваться их предварительное преобразо вание). В процессоре ARM720T и некоторых более поздних процессорах, таких как ARM9, предусмотрена возможность размещения таблицы векторов по адресу ОхРРРРОООО. Эта возможность предназначена для поддержки ОС Windows СЕ и в процессоре CortexM3 отсутствует. 18.2.2. Прерывания Второй причиной необходимости внесения изменений являются различия между используемыми контроллерами прерываний. Придётся переписать код, отвечающий за управление контроллером, в частности разрешающий/запрещаю щий прерывания. Кроме Toro, необходимо будет добавить в этот код строки, OT вечающие за конфиrурирование уровней приоритета и адресов векторов для раз личных прерываний. Также изменяется способ возврата из прерываний. В ассемблерных проrрам мах это потребует модификации кода возврата из прерывания, а при проrрамми ровании на языке Си может потребоваться указание дополнительных директив компилятора. Операции изменения реrистра текущеrо состояния проrраммы (CPSR), ис пользуемые в процессоре ARM7 для разрешения и запрещения прерываний, He обходимо будет заменить на операции изменения реrистров маскирования пре рываний. Кроме Toro, процессор ARM7TDMI поддерживает повторное разреше ние прерывания в момент возврата из Hero за счёт восстановления содержимоrо реrистра CPSR из реrистра SPSR. В процессоре же CortexM3 используется друrой механизм: если прерывание было запрещено установкой реrистра PRIMASK во время выполнения обработчика, то этот реrистр должен быть очищен вручную перед выходом из обработчика. В противном случае, прерывания останутся за прещёнными. В процессоре CortexM3 определённые реrистры автоматически сохраняются в стеке при входе в прерывание и восстанавливаются из стека при выходе из пре 
18.2. Особенности системы · 311 рывания. Наличие этоrо механизма позволяет уменьшить объём проrраммных манипуляций со стеком или вообще их исключить. Несколько особняком стоит быстрое прерывание (PIQ), дЛЯ KOToporo в традиционных процессорах ARM предусмотрены отдельные реrистры R8. . . Rll, что позволяет обработчику РI Q ис пользовать данные реrистры, не заботясь о сохранении их содержимоrо в стеке. Поскольку в процессоре CortexM3 реrистры R8...Rll не сохраняются автомати чески, то при переносе обработчика PIQ необходимо либо изменить реrистры, используемые обработчиком, либо сохранять эти реrистры в стеке самостоя тельно. Проrраммный код, предназначенный для поддержки вложенных прерыва ний, можно спокойно убрать. Контроллер NVIC процессора CortexM3 имеет встроенную поддержку вложенных прерываний. Системные ошибки в рассматриваемых процессорах тоже обрабатываются HeMHoro поразному. Так, в процессоре CortexM3 предусмотрены различные pe rистры состояния отказов, позволяющие локализовать источник TaKoro отказа. Также в процессоре CortexM3 определены новые типы отказов, в частности ошибки сохранения/восстановления из стека, отказы системы управления памя тью и тяжёлые отказы. Поэтому обработчики отказов придётся переписывать. 18.2.3. Модуль MPU с точки зрения проrраммиста, модуль MPU является Bcero лишь дополни тельным блоком системы, который должен быть сконфиrурирован перед исполь зованием. Микроконтроллеры с процессорами ARM7TDMI/ARM7TDMIS не имеют TaKoro модуля, поэтому перенос проrраммы на процессор CortexM3 не вызовет никаких затруднений с этой стороны. А вот в устройствах с процессором ARM720T имеется модуль управления памятью (Memory Management Unit  MMU), функциональное назначение KOToporo отличается от назначения модуля MPU процессора CortexM3. Если в приложении используется модуль MMU (для реализации системы виртуальной памяти), то такое приложение не может быть перенесено на процессор CortexM3. 18.2.4. Управление системой Также при переносе проrрамм необходимо обратить внимание на различные подходы к управлению системой в этих двух процессорах. Так, процессор CortexM3 имеет специальные команды для переход а в спящий режим. Кроме TO ro, системный контроллер процессора CortexM3 не имеет ничеrо общеrо с KOH троллером, используемым в устройствах с процессором ARM7. Поэтому код, OT вечающий за управление системой, придётся писать заново. 18.2.5. Режимы работы в процессоре ARM7 имеется семь режимов работы, большинство которых бы ло заменено в процессоре CortexM3 на различные исключения (Табл. 18.1). 
312 · fлава 18. Перенос прuложенuй с процессора ARM7 на процессор CortexM3 Таблица 18.1. Режимы работы и исключения процессоров ARM7 и CortexM3 Режимы и исключения ARM7 Режимы и исключения CortexM3 Supervisor (режим по умолчанию) Привилеrированный уровень, режим потока Supervisor (проrраммное Привилеrированный уровень, вызов супервизора (SVCall) прерывание) Быстрое прерывание (FIQ) Привилеrированный уровень, прерывание Запрос прерывания (IRQ) Привилеrированный уровень, прерывание Abort (prefetch) Привилеrированный уровень, исключение Bus Fault Abort (data) Привилеrированный уровень, исключение Bus Fault Undefined Привилеrированный уровень, исключение Usage Fault System Привилеrированный уровень, режим потока User Пользовательский уровень (непривилеrированный), режим потока Быстрое прерывание PIQ, имеющееся в процессоре ARM7, может быть заме нено на обычное прерывание (IRQ), поскольку процессор CortexM3 позволяет любому прыванию назначить наивысший приоритет. Соответственно, такое прерывание будет способно вытеснять друrие исключения, аналоrично прерыва нию PIQ в процессоре ARM7. Однако изза Toro, что специальные реrистры PIQ в процессоре ARM7 отличаются от реrистров, сохраняемых в стеке процессором CortexM3, вам придётся либо сменить реrистры, используемые в обработчике PIQ, либо сохранять эти реrистры в стеке самостоятельно. 18.3. ФаЙЛbl с ИСХОДНblМ текстом на ассемблере Процесс переноса ассемблерных файлов зависит от используемоrо набора KO манд  ARM или Тhиmb. 
18.3. Файлы с исходным текстом на ассемблере · 313 18.3.1. Режим Thumb Если в файле содержится код, предназначенный для работы в режиме Thumb, то всё замечательно. В большинстве случаев такой файл можно без какихлибо проблем использовать в проrрамме для HOBoro процессора. Необходимо только проверить ero на наличие команд Thumb, не поддерживаемых процессором CortexM3, а именно: . любых команд, пытающихся переключить процессор в режим ARM; . команды SWI, которая была заменена на команду SVC (не забудьте скорректи ровать код, используемый для передачи параметров и возвращаемоrо значе ния). И напоследок, убедитесь в том, что при обращении к стеку в проrрамме ис пользуется только модель полноrо спадающеrо стека. Эта рекомендация объяс няется тем, что в процессоре ARM7TDMI может быть реализована друrая CTeKO вая модель (скажем, полный вырастающий стек), хотя это и довольно экзотиче ская ситуация. 18.3.2. Состояние ARM Если же в файле содержится код ARM, то задача усложняется. Выделим OCHOB ные моменты: . Таблица векторов. В процессоре ARM7 таблица векторов начинается с адреса ОхОО и содержит команды перехода. В процессоре CortexM3 таблица coдep жит начальное значение указателя стека, адрес вектора сброса, вслед за KOTO рыми располаrаются адреса обработчиков исключений. Изза этих различий таблицу векторов придётся полностью переписать. . Инициализация pezucmpoB. В процессоре ARM7 зачастую требуется инициа лизировать разные реrистры для каждоrо из режимов. Так, в процессоре ARM7 используются банковые указатели стека (RI3), реrистр связи (RI4) и pe rистры SPSR. Поскольку процессор CortexM3 имеет друrую проrраммную модель, код инициализации реrистров необходимо будет изменить. На самом деле, он станет rораздо проще, поскольку в нём уже не будет последовательно ro переключения процессора между различными режимами. . Переключение режимов работы и состояний. Поскольку режим работы про цессора CortexM3 определяется иначе, нежели в процессоре ARM7, то код, ис пользуемый для переключения режимов, необходимо будет удалить. Это же касается и кода, применяемоrо для переключения между состояниями ARM и Thumb. . Разрешение и запрещение прерываний. В процессоре ARM7 разрешение/запре щение прерываний осуществляется сбросом/установкой бита 1 реrистра CPSR. В процессоре CortexM3 для этих целей используются реrистры маскирова ния прерываний PRIMASK и FAULTMASK. К тому же, в реrистре xPSR про цессора CortexM3 отсутствует бит F, поскольку данный процессор не имеет входа FIQ. 
314 · fлава 18. Перенос прuложенuй с процессора ARM7 на процессор CortexM3 · Обращения к сопроцессору. В процессоре CortexM3 отсутствует поддержка co процессора, поэтому подобные операции не MorYT быть перенесены на новую платформу. · Обработчики прерываний и возврат из прерываний. В процессоре ARM7 пер вая команда обработчика прерываний располаrается в таблице векторов (как правило, это команда перехода на реальный обработчик). В процессоре CortexM3 данный этап уже не требуется. Возврат из прерываний в процессо ре ARM7 осуществляется ручной корректировкой значения счётчика команд. В процессоре CortexM3 скорректированное значение счётчика команд coxpa няется в стеке, а процесс возврата из прерывания запускается заrрузкой в счётчик команд значения EXCRETURN. ДЛЯ возврата из прерываний в процессоре CortexM3 нельзя использовать такие команды, как MOVS и SUBS. Всё это требует корректировки обработчиков прерываний, а также кода, ocy ществляющеrо возврат из прерываний. · Код поддержки вложенных прерываний. Если в процессоре ARM7 требовалось использование вложенных прерываний, то обработчик IRQ должен был пере ключить процессор в режим System, после чеrо повторно разрешить прерыва ния. В процессоре CortexM3 ничеrо этоrо не требуется. · Обработчик FIQ. При переносе обработчика быстроrо прерывания может по требоваться добавить в Hero команды, сохраняющие содержимое реrистров R8...Rll в стеке. В процессоре ARM7 эти реrистры являются банковыми, что позволяет обработчику FIQ не заботиться об их сохранении. В то же время в процессоре CortexM3 автоматически сохраняются только реrистры RO.. .R3 и R12, а вот реrистры R8...Rl1  нет. · Обработчик SWI. Команда SWI заменяется на svc. Однако при портировании обработчика SWI необходимо будет переписать код, выполняющий извлече ние параметра команды SWI. Адрес команды svc, вызвавшей прерывание, можно определить по значению РС, сохранённому в стеке (в процессоре ARM7 значение счётчика команд считывается из реrистра связи). · Команда SWP. В процессоре CortexM3 такая команда отсутствует. Если в ис ходной проrрамме данная команда использовалась для реализации семафо ров, то её необходимо заменить на команды монопольноrо доступа. ECTe ственно, при этом придётся переписать код поддержки семафоров. Если же команда использовалась исключительно для пересылки данных, то её можно будет заменить несколькими командами обращения к памяти. · Обращения к pezucтpaM CPSR и SPSR. Реrистр CPSR процессора ARM7 в про цессоре CortexM3 был заменён несколькими реrистрами состояния проrрам мы xPSR, а реrистр SPSR  ликвидирован. Если в проrрамме лроизводится чтение состояния флаrов процессора, то такую команду следует заменить на команду чтения реrистра APSR. Если обработчику исключения необходимо узнать содержимое реrистра PSR, которое было до возникновения исключе ния, то он может прочитать ero из стека, поскольку содержимое реrистров xPSR автоматически сохраняется в стеке при входе в обработчик. То есть pe rистр SPSR в процессоре CortexM3 попросту не нужен. 
18.4. Файлы с исходным текстом на Си · 315 . Условное выполнение. В процессоре ARM7 условное выполнение поддержива ется мноrими командами ARM, в то время как в машинном коде большинства команд Thumb2 места для поля условия не предусмотрено. При переносе по добноrо кода на процессор CortexM3 ассемблер может автоматически заме нить эти условно выполняемые команды на конструкции с использованием Iтблоков. Или же мы можем вручную вставить в проrрамму команды IT и команды условных переходов для получения условно выполняемоrо кода. Единственное неудобство, связанное с заменой условно выполняемых команд на Iтблоки, состоит в возможном увеличении размера кода. А это, в свою оче редь, может вызвать друrие проблемы (например, адреса, используемые в He которых операциях заrрузки/сохранения, MorYT оказаться за rраницами диа пазона, поддерживаемоrо командой). . Использование значения РС при вычислениях в npozpaMMe. При выполнении кода ARM процессором ARM7 значение, возвращаемое при чтении РС, равно адресу команды плюс 8. Это связано с наличием трёхступенчатоrо конвейе ра  при чтении счётчика команд на этапе исполнения он уже дважды успе вает инкрементироваться (каждый раз на 4 байта). Поскольку процессор CortexM3 поддерживает только код Thumb, то разница между считанным и реальным значением РС будет равна четырём. . Использование значения pezucтpa R13. В процессоре ARM7 указатель стека R13 содержит 32битные значения; в процессоре CortexM3 младшие 2 бита указателя стека всеrда сброшены в о. Соответственно, в тех редких случаях, коrда реrистр R13 используется в качестве реrистра данных, код проrраммы необходимо будет модифицировать, чтобы исключить потерю младших битов значений. Прочий код ARM можно попытаться скомпилировать как код ThumbIThumb2, после чеrо просмотреть сообщения ассемблера и определить дальнейшие KoppeK тировки. Например, некоторые команды обращения к памяти с пред и постин дексацией, используемые в процессоре ARM7, не поддерживаются процессором CortexM3 и должны быть заменены на последовательности команд. В друrих Me стах проrраммы возможно наличие длинных переходов или больших констант, которые не MorYT быть скомпилированы в коде Thumb, и поэтому данные KOMaH ды должны быть вручную заменены на команды Thumb2. 18.4. Файлы с ИСХОДНЫМ текстом на СИ Перенос проrрамм, написанных на языке Си, выполняется rораздо проще, чем перенос ассемблерных проrрамм. В большинстве случаев такую проrрамму дo статочно просто перекомпилировать для процессора CortexM3. Тем не менее, и здесь может возникнуть необходимость ручной корректировки кода: . Iпliпеассемблер. В некоторых проrраммах MorYT присутствовать вставки с ис пользованием iпliпеассем6лера, которые необходимо будет изменить. Такой код леrко можно обнаружить по наличию ключевоrо слова   aSffi. При ис пользовании пакета RVDS с компилятором RVCT версии 3.0 и выше inline ассемблер необходимо заменить на встроенный ассемблер. 
316 · fлава 18. Перенос прuложенuй с процессора ARM7 на процессор CortexM3 · Обработчики прерываний. В Сипроrраммах для процессора ARM7 при объ явлении обработчиков прерываний используется ключевое слово   irq. В процессоре CortexM3 сохранение реrистров и возврат из прерывания ocy ществляются иначе, нежели в процессоре ARM7, поэтому ключевое слово   irq может быть придётся убрать из проrраммы (это зависит от использу eMoro средства разработки). В частности, в средствах разработки компании ARM (в том числе, в пакете RVDS и компиляторе RVCT) ключевое слово  irq поддерживает процессор Cortex М3. Более Toro, это ключевое слово даже pe комендуется использовать, чтобы улучшить читаемость кода! Праrмы Сикомпилятора ARM наподобие #pragma arm и #pragma thumb He обходимо будет удалить. 18.5. Скомпилированные объектные файлы в составе большинства компиляторов Си имеются библиотеки различных функций и различные варианты cTapToBoro кода, распространяемые в виде пред варительно скомпилированных объектных файлов. Некоторые из этих файлов (скажем, стартовый код для традиционных процессоров ARM) не MorYT исполь зоваться с процессором CortexM3 изза различий в рабочих режимах и состоя ниях, поддерживаемых процессорами. При наличии исходноrо кода объектноrо файла последний можно будет перекомпилировать с помощью набора команд Тbиmb2. Для получения дополнительной информации обратитесь к ДOKYMeHTa ции на используемое средство разработки. 18.6. Оптимизация После Toro как вам удастся заставить свою проrрамму работать на процессоре CortexM3, можно попытаться её улучшить, чтобы увеличить скорость работы и уменьшить потребность в памяти. Следует обратить внимание на следующие моменты: · Использование команд 1humb2. Если 16битная команда 1humb пересылает содержимое одноrо реrистра в друrой с последующим выполнением какой либо операции над переданным значением, то данную последовательность операций в большинстве случаев можно заменить одной командой 1humb2. При этом может также уменьшиться число тактов, необходимых для выпол нения операции. · Использование метода bitband. Если реrистр периферийноrо устройства pac положен в области памяти с побитовой адресацией, то обращения к битам управления можно значительно упростить, используя область доступа к би там. · Умножение и деление. Процедуры, требующие операций деления, такие как процедуры преобразования значений в десятичные для отображения их на дисплее, MorYT быть модифицированы с помощью команд деления CortexM3. Для выполнения умножения можно использовать различные варианты KO манд аппаратноrо умножения. 
18.6. Оптимизация . 317 . Непосредственные значения. Некоторые непосредственные значения, которые невозможно было разместить в коде команды ТЬитЬ, можно леrко закодиро вать в командах Thumb2. . Ветвления. Невозможность выполнения длинных переходов с помощью KO манд ТЬиmЬ приводила к необходимости использования нескольких команд перехода. Такие команды можно заменить одной командой Тbиmb2. . Двоичные данные. Для экономии памяти несколько булевых переменных (при нимающих только значения О или 1) можно упаковать в один байт/полуслово/ слово, расположенное в битадресуемой области. Обращаться к этим перемен ным можно посредством области доступа к битам. . Работа с битовыми полями. В процессоре CortexM3 имеется несколько KO манд для работы с битовыми полями: извлечение беззнаковоrо битовоrо поля (UBFX), извлечение битовоrо поля со знаком (SBFX), вставка битовоrо поля (BFI), очистка битовоrо поля (BFC) и перестановка битов (RBIT). Использова ние этих команд может упростить реализацию таких операций, как обраще ния к периферийным устройствам, формирование пакетов данных или обмен данными по последовательному каналу. . IТблоки. Некоторые короткие переходы можно заменить блоком команды IT. ЭТО позволит нам избежать напрасной траты тактов на очистку конвейера при выполнении перехода. . Переключение состояния ARM/7humb. В определённых ситуациях разработ чикам приходилось разбивать исходный код приложения на несколько фай лов, после чеrо компилировать одни из этих файлов с использованием набора ARM, а друrие  с использованием набора Thumb. Обычно это делалось для увеличения плотности кода в тех случаях, коrда производительность была He критична. Поскольку процессор CortexM3 поддерживает только набор KO манд Тbиmb2, такое разбиение кода больше не требуется. Это позволяет ис ключить накладные расходы на переключение состояний, что ведёт к YMeHЬ шению размеров кода и, возможно, уменьшению числа файлов проекта. 
rЛАВА 19 РАЗРАБОТКА ПРИЛОЖЕНИЙ ДЛЯ CORTEX..M3 С ИСПОЛЬЗОВАНИЕМ GNU 19.1. Общие сведения Мноrие разработчики при создании приложений для микроконтроллеров с процессорами ARM используют открытый инструментарий GNU, на котором основан ряд средств разработки для ARM. Набор инструментов GNU, поддержи вающий процессор CortexM3, доступен как в виде исходных кодов для последу ющей компиляции GNUкомпилятором gcc, так и в виде скомпилированных и rOToBbIx к использованию исполняемых файлов, которые распространяются различными компаниямиразработчиками проrраммных средств. Одной из таких компаний, предлаrающей средства разработки для процессо ров CortexM3, основанные на инструментарии GNU, является компания CodeSourcery. Пакет проrрамм Sourcery G++, разработанный компанией, распро страняется в трёх вариантах: 1. Sourcery G++ Lite:  бесплатная версия, которую можно свободно заrрузить с вебсайта компании (www.codesourcery.coт). Эта версия поддерживает работу только из командной строки и имеет оrраниченные возможности отладки. 2. Sourcery G++ Persoпal Editioп  наиболее популярная версия пакета, поскольку имеет небольшую стоимость при достаточно больших возможностях: · Интеrрированная среда разработки с интерфейсом на базе пакета Eclipse. · Поддержка широкоrо спектра микроконтроллеров с процессорами ARM, включая поддержку CS3 для этих микроконтроллеров (сценарии компонов щика и конфиrурации средств отладки). · Поддержка отладочных плат различных производителей, в том числе плат компаний Texas Instrument с микроконтроллерами Stellaris и STMicroelectronics с микроконтроллерами STM32. · Большая подборка примеров проrрамм. · Встроенная поддержка различных отладочных интерфейсов, в том числе: (J ARMUSB (встроен в микроконтроллеры Stellaris); (J Segger J  Link; (J КеН ULINK2. 
19.2. Прио6ретение инструментария GNU . 319 . Мастер «Board Builder Wizard», облеrчающий использование неизвестных плат: (J клонирование определений платы; (J изменение распределения памяти; (J изменение cTapToBoro кода; (J конфиrурирование отладочных средств. . Поддержка импорта примеров из библиотеки StellarisWare. 3. Sourcery G++ Professioпal Editioп  все возможности варианта Personal Edition плюс дополнительные библиотеки и неоrраниченная техническая поддержка. Все при меры, представленные в этой rлаве, рассчитаны на инструменты из па кета Sourcery G++ Lite, работающие с командной строкой, поскольку вопросы, Ka сающиеся использования данноrо режима, актуальны для большинства средств разработки, основанных на инструментарии GNU. Сразу хочу предупредить, что в данной rлаве содержатся только самые основные сведения по применению YKa занных инструментов. Подробную информацию по работе с инструментами GNU вы можете получить из документации, имеющейся в составе используемоrо пакета проrрамм, а также из сети Интернет. Синтаксис ассемблера GNU (as.exe) HeMHoro отличается от синтаксиса ориrи нальноrо ассемблера ARM. Эти различия касаются объявлений, директив KOM пилятора, комментариев и прочих элементов языка. Соответственно, чтобы ис пользовать в среде GNU ассемблерные проrраммы, написанные для пакета RVDS компании ARM, их необходимо будет откорректировать. 19.2. Приобретение инструментария GNU Скомпилированный вариант инструментов GNU можно заrрузить по адресу: www.codesourcery/coт/sgpp/lite/arт. По этому адресу доступно несколько сборок. Для начала возьмём любую сборку с поддержкой интерфейса ЕАВI и без какой либо встраиваемой операционной системы. Данный инструментарий доступен для различных платформ, включая Windows и Linux. При меры, представленные в этой rлаве, работают в любой из указанных версий. 19.3. Процесс разработки проrраммы В состав инструментария GNU входят компилятор, ассемблер, редактор свя зей и ряд дополнительных утилит. Эти инструменты позволяют создавать проек ты, содержащие одновременно исходные тексты на языках Си и ассемблера (Рис. 19.1). При использовании компилятора GCC компоновщик обычно запускается компилятором по завершении этапа компиляции, что rарантирует передачу KOM поновщику корректных библиотек и параметров. Если же компоновщик будет использоваться напрямую) то связывание объектных файлов может оказаться невозможным. Кроме Toro, без информации со стороны компилятора компонов щик может сформировать на выходе двоичный образ, не совместимый с интер фейсом EABI. 
320 · Тлава 19. Разработка приложений для CortexM3 с использованием GNU ИСХОДНЫЙ КОД на Си (.с) Id KOкa I Структура  gcc памяти  (компиляция + связывание) Исходный код . . л на ассемблере (.5) Объектные файлы v U [] i/ ДВОИЧНЫЙ образ Исполняемый nporpaMMbl Q б objcopy (.binJ [] (ассемблер) Дизассембли рованный КОД (.txt) Рис. 19.1. Разработка ПО с использованием пакета Sourcery G++. Существуют версии инструментария GNU дЛЯ самых разных платформ (Symbian, Linux, ЕАВI и т.д.). Имена проrрамм обычно имеют префикс, определя емый целевой платформой, для которой предназначена данная версия. Напри мер, при использовании ЕАВI совместимоrоI) инструментария компилятор Си (gcc) будет иметь имя armxxxxeabi gcc. В следующих при мерах мы будем применять инструменты, поставляемые в составе пакета Sourcery G++. Названия этих проrрамм указаны в Табл. 19.1. Таблица 19.1. Имена исполняемых файлов пакета Sourcery G++ Назначение Файл (ЕАВIвариант) Ассемблер armnoneeabias Компилятор с языка Си armnoneeabigcc Компоновщик armnoneeabild reHepaTOp двоичных образов armnoneeabiobjcopy Дизассемблер armnoneeabiobjdump Примечание. Заметьте, имена файлов отличаются от имён, используемых друrими разработчиками проrраммных средств. Если исходный код вашеrо проекта написан целиком на ассемблере, то для связывания объектных файлов компоновщик можно вызвать напрямую (Рис. 19.2). 1) Стандарт ЕАВI для архитектуры ARM  исполняемые файлы должны удовлетворять данной спецификации, чтобы их можно было использовать с различными наборами средств разработки. 
19.4. Прuмеры . 321 Сценарий компоновщика Исходный код  на ассемблере (.5) Объектные файлы (.0)  Q (aZep)Q q Испonняемый  образ objcopy (комновщик) q [] [] Двоичный образ nporpaMMbl (.bin) [] Дизассембли рованный код (.txt) Рис. 19.2. Разработка ПО на ассемблере. 19.4. Примеры Рассмотрим несколько примеров по использованию инструментария GNU. 19.4.1. Пример 1: первая nporpaMMa Для начала возьмём простую ассемблерную проrрамму, уже рассмотренную нами в [лаве 10, которая вычисляет сумму чисел от 1 до 10: ========== exarnple1.s ========== /* Определяем константы */ .equ STACKTOP, Ох20000800 .text . syntax unified .thurnb .global start .type start, %function start: .word STACKTOP, start /* Начало основной проrраммы */ start: rnovs rO, #10 rnovs r1, #0 /* Вычисляем 10+9+8... +1 */ loop: adds r1, rO subs rO, #1 bne loop /* Результат в R1 */ deadloop: Ь deadloop .end .......................................... ............................................................... Конец файла .................................................................... ................................................................. 
322 . fлава 19. Разработка приложений для CortexM3 с использованием GNU · Директива. word в данном при мере помоrает нам задать начальное значение указателя стека (Ох20000800) и вектор сброса (start). · Директива. text указывает на то, что данная секция проrраммы должна быть ассемблирована. · Директива. syntax unified указывает на использование унифицированноrо синтаксиса языка ассемблера. · Директива. thumb сообщает ассемблеру о том, что в проrрамме используется набор команд Thumb @. Также для этоrо можно использовать традиционную директиву .code16. · Директива .global позволяет сделать метку  start видимой в друrих объ ектных файлах. · start  метка, отмечающая начало проrраммы. · start  отдельная метка, адрес которой содержится в векторе сброса. · .type start, %function  объявляет идентификатор start как функцию. Это необходимо сделать для всех векторов исключений. В противном случае, ассемблер сбросит младший значащий бит вектора в О. · Директива .end отмечает конец проrраммы. В отличие от ассемблера ARM, в ассемблере GNU метки должны завершаться символом двоеточия (:). Комментарии помещаются между символами «/*» И «* /», а директивы начинаются с символа точки (.). Обратите внимание на то, что вектор сброса (start) объявлен как функция (. type start, %function), использующая код Thumb (. thumb). Так было сдела но для Toro, чтобы установить младший бит вектора сброса в 1 (установленный младший бит rоворит процессору о том, что выполнение кода начинается в co стоянии Thumb). Если этоrо не сделать, то процессор попытается переключиться в режим ARM, что вызовет исключение Hard Fault. Для ассемблирования дaHHO ro файла наберём в командной строке: $> arrnnoneeabias rnсрu=соrtехrnЗ rnthurnb exarnplel.s o exarnplel.o В результате будет создан объектный файл examplel.o. Ключи mcpи и mthumb определяют используемый набор команд. Для компоновки проекта BЫ зовем линкер ld: $> arrnnoneeabild Ttext Охо o exarnplel.out exarnplel.o Далее, сформируем двоичный образ, используя команду obj сору: $> arrnnoneeabiobjcopy Obinary exarnplel.out exarnplel.bin Можно проконтролировать получившийся код, дизассемблировав ero с ис пользованием проrраммы objdump: $> arrnnoneeabiobjdurnp s exarnplel.out > exarnplel.1ist В результате выполнения последней проrраммы мы получим файл листинrа, содержащий чтото вроде: exarnplel.out: file forrnat еlfЗ2littlеаrrn Disassernbly of section .text: 00000000 < start>: о: 20000800 .word Ох20000800 4: 00000009 .word ОхОООООО09 00000008 <start>: 
19.4. Примеры · 323 8: 200а rnovs rO, #10 а: 2100 rnovs r1, #0 ОООООООс <loop>: с: 1809 adds r1, r1, rO е: 3801 subs rO, #1 10: d1fc Ьпе.п с <loop> 00000012 <deadloop>: 12: e7fe Ь.п 12 <deadloop> 19.4.2. Пример 2: связывание нескольких файлов Как уже неоднократно rоворилось, мы можем создать несколько объектных файлов, а затем связать их друr с друrом. Давайте рассмотрим при мер, состоя щий из двух ассемблерных файлов example2a. s и example2b. s; первый из них содержит только таблицу векторов, а второй  проrраммный код. Для передачи адресов между файлами используется директива .global:  exarnple2a.s  /* Определяем константы */ .equ STACKTOP, Ох20000800 .syntax unified .global vectors table .global start .global nrnihandler .thurnb vectors table: .word STACKTOP, start, nrnihandler, ОхОООООООО .end  Конец файла   exarnple2b.s  /* Основная проrрамма */ .text . syntax unified .thurnb .type start, %function .type nrnihandler, %function .global start .global start .global nrnihandler start: /* Начало основной проrраммы */ start: rnovs rO, #10 rnovs r1, #0 /* Вычисляем 10+9+8... +1 */ loop: adds r1, rO subs rO, #1 bne loop /* Результат в R1 */ deadloop: Ь deadloop 
324 · fлава 19. Разработка приложений для CortexM3 с использованием GNU /* Пустой обработчик NMI для иллюстрации */ nrni handler: Ьх lr .end ========== Конец файла ========== Для создания двоичноrо образа необходимо выполнить следующие операции: 1. Ассемблируем example2a. s: $> arrnnoneeabias rncpu=cortexrn3 rnthurnb exarnple2a.s o exarnple2a.o 2. Ассемблируем example2b.s: $> arrnnoneeabias rncpu=cortexrn3 rnthurnb exarnple2b.s o exarnple2b.o 3. Связываем объектные файлы в единый образ. Обратите внимание, что порядок указания объектных файлов в командной строке влияет на их расположение в исполняемом двоичном образе: $> arrnnoneeabild Ttext Ох О o exarnple2.out exarnple2a.o exarnple2b.o 4. Формируем двоичный файл: $> arrnnoneeabiobjcopy Obinary exarnple2.out exarnple2.bin 5. Как и в предыдущем примере, сrенерируем файл листинrа, чтобы убедиться в корректности финальноrо образа: $> arrnnoneeabiobjdurnp S exarnple2.out > exarnple2.1ist При большом числе файлов с исходным кодом процесс компиляции можно упростить, воспользовавшись UNIХкомандой makefile. Отдельные пакеты раз работки также MorYT иметь встроенные средства для облеrчения процесса KOM пиляции. 19.4.3. Пример 3: простая nporpaMMa «Hello World» Чтобы было не так скучно, давайте попробуем написать проrрамму «Неllо World». (Примечание. В следующем примере отсутствует код инициализации модуля UART; дЛЯ запуска данноrо примера вы должны добавить собственный код инициализации UART. Пример инициализации модуля UART на Си приве дён в [лаве 20.) ========== exarnple3a.s ========== /* Определяем константы */ .equ STACKTOP, Ох20000800 . syntax unified .thurnb .global vectors table .global start vectors table: .word STACKTOP, start .end ========== Конец файла ========== exarnple3b.s .text .syntax unified .thurnb .global start ....................  ............................................................... .......................................................................... 
19.4. Прuмеры · 325 .type start, %function start: /* Начало основной проrраммы */ movs rO, #0 movs rl, #0 movs r2, #0 movs rЗ, #0 movs r4, #0 movs r5, #0 ldr rO,=hello bl puts movs rO, #Ох4 bl putc deadloop: Ь deadloop hello: .asciz «Hello\n» .align puts: /* Подпроrрамма передачи строки по UART */ /* Вход: rO = Адрес начала строки */ /* Строка должна завершаться нулевым символом */ push {rO, rl, lr} /* Сохраняем реrистры */ mov rl, rO /* Копируем адрес в Rl, поскольку */ /* RO будет использоваться в качестве */ /* входноrо параметра putc */ putsloop: ldrb.w rO, [rl],#l /* Читаем один символ и инкрементируем адрес */ cbz rO, putsloopexit /* Если символ  NULL, выходим */ bl putc Ь putsloop putsloopexit: рор {rO, rl, рс} .equ UARTODATA, Ох4000СООО .equ UARTOFLAG, Ох4000СО18 putc: /* Подпроrрамма для передачи символа через UART */ /* Вход: RO = передаваемый символ */ push {rl, r2, rЗ, lr} /* Сохраняем реrистры */ LDR rl,=UARTOFLAG putcwaitloop: ldr r2, [rl] tst.W r2, #Ох20 bne putcwaitloop ldr rl,=UARTODATA str rO, [rl] рор {rl, r2, rЗ, рс} /* Возврат */ .end /* Возврат */ /* Считываем флаrи */ /* Проверяем состояние буфера передачи */ /* Если полон, то ждём */ /* Иначе заrружаем символ в буфер передачи */ ========== Конец файла ========== В данном примере для определения строки с завершающим нулем мы BOC пользовались директивой .asciiz. Эта директива эквивалентна директиве .ascii, определяющей строку, с последующей директивой .byte, определяющей 
326 · Тлава 19. Разработка приложений для CortexM3 с использованием GNU байт с нулевым значением. Для KoppeKTHoro выравнивания проrраммноrо кода после определения строки мы разместили директиву .align. Для компиляции проrраммы, создания двоичноrо образа и дизассемблиро BaHHoro листинrа можно использовать следующие команды: $> arrnnoneeabias rnсрu=соrtехrnЗ rnthumb ехаrnрlеЗа.s o ехаrnрlеЗа.о $> arrnnoneeabias rnсрu=соrtехrnЗ rnthumb ехаrnрlеЗЬ.s o ехаrnрlеЗЬ.о $> arrnnoneeabild Ttext ОхО o ехаrnрlеЗ.оut ехаrnрlеЗа.о ехаrnрlеЗЬ.о $> arrnnoneeabiobjcopy Obinary ехаrnрlеЗ.оut ехаrnрlеЗ.Ьin $> arrnnoneeabiobjdurnp S ехаrnрlеЗ.оut > ехаrnрlеЗ.list 19.4.4. Пример 4: данные в 03У Очень часто данные хранятся во встроенном ОЗУ микроконтроллера. Рассмотрим следующий при мер: ========== exarnple4.s ========== .equ STACKTOP, Ох20000800 .text . syntax unified .thumb .global start .type start, %function start: .word STACKTOP, start /* Начало основной проrраммы */ start: rnovs rO, #10 rnovs r1, #0 /* Вычисляем 10+9+8... +1 */ loop: adds r1, rO subs rO, #1 bne loop /* Результат в R1 */ ldr rO,=Result str r1, [rO] deadloop: Ь deadloop /* Данные расположены в секции LC (Local Cornmon) */ .lcornm Result 4 /* 4байтное значение названо Result */ .end ========== Конец файла ========== Псевдокоманда .lcomrn, использованная в примере, резервирует 4 байта в ceK ции неинициализированных данных «bss» и помечает эту область меткой Result. Используя указанный идентификатор, проrрамма может обращаться к данной области памяти. Чтобы скомпоновать проrрамму, мы должны сообщить компоновщику о Mec тоположении ОЗ ДЛЯ этоrо используется ключ Tbss, размещающий секцию неинициализированных данных по заданному адресу: $> arrnnoneeabias rnсрu=соrtехrnЗ rnthumb exarnple4.s o exarnple4.o 
19.4. Примеры · 327 $> armnoneeabild Ttext ОхО Tbss Ох20000000 o example4.out example4.o $> armnoneeabiobjcopy Obinary example4.out example4.bin $> armnoneeabiobjdump s example4.out > example4.1ist 19.4.5. Пример 5: nporpaMMa на Си Одним из основных компонентов инструментария GNU является компиля тор языка Си. В этом примере мы напишем проrрамму целиком на Си. Помимо собственно проrраммы, нам ещё потребуется файл сценария компоновщика для размещения cerMeHToB по соответствующим адресам: ========== example5.c ========== // Объявляем ФУНКЦИИ void myputs(char *stringl); void myputc(char mychar); int main(void); void Reset Handler(void); void NMI Handler(void); void HardFault Handler(void); void UartInit(void); // Объявляем start()  в стартовом коде extern void start(void); // void Reset Handler(void) { // Вызываем обработчик сброса сsз  start () ; } // // Пустой обработчик void NMIHandler(void) { return; } // // Пустой обработчик void HardFaultHandler(void) { return; } // void UartInit(void) { /* Здесь должен располаrаться код инициализации UART */ return; } // // Начало основной проrраммы int main{void} { #define NVICCCR (*((volatile unsigned long *) (ОхЕОООЕО14))) const char *helloworld = «Hello world\n»; 
328 · rлава 19. Разработка приЛDжений для CortexM3 с использованием GNU NVICCCR = NVICCCR I Ох200; /* Устанавливаем STКALIGN в NVIC */ UartInit(); myputs(helloworld); while(l); return(O); } // // Функция вывода строки void myputs(char *stringl) { char mychar; int j; j=O; do { mychar = stringl[j]; if (mychar!=O) { myputc(mychar); j++; } while (mychar != О); return; } // void myputc(char mychar) { #define UARTO DАТА (*((volatile unsigned long *) (Ох4000СООО))) #define UARTOFLAG (*((volatile unsigned long *) (Ox4000C018))) // Ждём сброса флаrа занятости while ((UARTO FLAG & Ох20) != О); // Выводим символ в UART UARTODATA = mychar; return; ========== Конец файла ========== Эта проrрамма выводит строку «Неllо world» через интерфейс UART. В зави симости от используемоrо модуля вы должны либо сами написать код ero иници ализации, либо воспользоваться функциями библиотеки, предоставляемой про изводителем микроконтроллера. После выхода процессора из состояния сброса обработчик вызывает функ цию  start, содержащую стартовый код. По завершении начальной инициали зации стартовый код вызывает функцию та i n ( ). Для поддержки стартовой по следовательности и таблицы векторов пакет Sourcery G++ использует инфра структуру CS3 (CodeSourcery Соmmоп Startup Code Sequence). В составе CS3 име ется предопределённая таблица векторов для процессора CortexM3, называемая  сsЗ  interrupt  vector  rnicro. Содержимое этой таблицы векторов при ведено в Табл. 19.2. 
19.4. Примеры . 329 Таблица 19.2. Таблица векторов CortexM3 в CS3 Номер Имя вектора Описание О cs3 stack Начальное значение указателя  OCHoBHoro стека 1  cs3 reset Вектор сброса 2  cs3 isrnmi Немаскируемое прерывание 3  cs3 isrhardfault Тяжёлый отказ 4  cs3 isrmpufault Отказ системы управления памятью 5 cs3isrbusfault Отказ шины 6 cs3 isrusagefault Отказ проrраммы 7.. .10 cs3isrreserved7.. .10 Зарезервировано 11  cs3 isrsvcall Вызов супервизора 12 cs3isrdebug Исключение монитора отладки 13  cs3 isrreserved  13 Зарезервировано 14 cs3isrpendsv PendSV 15 cs3 isrsystick Системный таймер 16.. .47 cs3isrexternal0.. .  cs3 isr external31 Внешнее прерывание Соответствие между обработчиками исключений, используемыми в нашей проrрамме, и данными именами векторов устанавливается сценарием компонов щика. В этом же файле описывается распределение памяти, включая расположе ние таблицы векторов. В версиях Personal и Professional пакета поставляются файлы сценариев для большинства выпускаемых микроконтроллеров с процес сором CortexM3. При использовании версии Lite несколько общих файлов cцe нария можно найти в папке armnoneeabi\lib. В данном примере мы воспользу емся сценарием, полученным модификацией общеrо файла сценария для процес соров CortexM (genericm.ld). Содержимое этоrо модифицированноrо файла сценария приведено в Приложении д. Для запуска компилятора и компоновщика используется следующая KOMaHД ная строка: $> armnoneeabigcc mcpu=cortexm3 mthumb example5.c T cortexm3.1d o example5.o Информация о карте памяти передаётся компоновщику на этапе компиля ции. Компилятор gcc запустит компоновщик автоматически, так что отдельно ero вызывать не нужно. В заключение мы можем сrенерировать двоичный образ и дизассемблированный листинr: $> armnoneeabiobjcopy Obinary example5.out example5.bin $> armnoneeabiobjdump s example5.out > example5.1ist Использование обработчика Reset  Handler в данном при мере необяза тельно. Вместо этоrо в сценарии компоновщика можно присвоить вектору   сsЗ  reset значение  start (адрес входа в стартовую процедуру). 
330 · fлава 19. Разработка приложений для CortexM3 с использованием GNU 19.4.6. Пример 6: перенаправпение вывода в nporpaMMe на Си в предыдущем примере мы написали собственную функцию вывода TeKCTO вых строк, однако в большинстве случаев удобнее пользоваться функциями BЫ вода из стандартной библиотеки Си. Так, для вывода текста вполне можно ис пользовать стандартную функцию printf. Для этоrо нам необходимо написать функцию, которая перенаправляла бы результат работы printf в процедуру BЫ вода по интерфейсу UART. Реализация такой функции перенаправления демонстрируется в следующем примере: ========== example6.c ========== #include<stdio.h> // Объявляем ФУНКЦИИ void myputc(char mychar); int main(void); void ResetHandler(void); void NMIHandler(void); void HardFault Handler(void); void Uartlnit(void); // Объявляем start()  в стартовом коде extern void start(void); // void Reset Handler(void) { // Вызываем обработчик сброса сsз start(); } // // Пустой обработчик void NMIHandler(void) { return; } // // Пустой обработчик void HardFaultHandler(void) { return; } // void Uartlnit(void) { /* Здесь должен располаrаться код инициализации UART */ return; } // // Функция перенаправления вывода int writer(void *reent, int fd, char *ptr, size t len) 
19.4. Примеры · 331 size t i; for (i=O; i<len; i++) { myputc(ptr[i]); // Вызываем нашу функцию вывода символа return len; } // // Начало основной проrраммы int main(void) { #define NVICCCR (*((volatile unsigned long *) (OxEOOOED14))) NVIC CCR = NVIC CCR I Ох200; /* Устанавливаем STKALIGN в NVIC */   UartIni t () ; printf(<<Hello world\n»); while(l); return(O); } // // Функция для вывода символа void myputc(char mychar) { #define UARTO DATA (*((volatile unsigned long *) (Ох4000СООО))) #define UARTOFLAG (*((volatile unsigned long *) (Ox4000C018))) // Ждём сброса флаrа занятости while ((UARTO FLAG & Ох20) != О); // Выводим символ в UART UARTODATA = mychar; return; ========== Конец файла ========== Перенаправление осуществляется функцией  write  r, которая вызывает нашу процедуру вывода символа. 19.4.7. Пример 7: реализация собственной таблицы векторов Если вы не используете пакет Sourcery G++, то вам может потребоваться caMO стоятельно описать таблицу векторов. Это можно сделать следующим образом: // Определяем таблицу векторов attribute ((section(<<vectors»))) void (* const VectorArray[]) (void) = { (void (*) (void)) ((unsigned long) MainStack + sizeof (МаiпStасk)), ResetHandler, NMI Handler, HardFault Handler } ; Стек можно описать в виде массива: // Резервируем 64 слова памяти для OCHOBHoro стека static unsigned long МаiпStасk[б4]; 
332 · rлава 19. Разработка приложений для CortexM3 с использованием GNU Поместить таблицу векторов в начало адресноrо пространства процессора можно с помощью сценария компоновщика. Например: .text : CREATE OBJECT SYMBOLS   сsЗrеgiопstаrtrоm = ., *(.сsЗ.rеgiопhеаd.rоm) сSЗiпtеrruрtvесtоr = сsЗiпtеrruрtvесtоrmiсrо; * (vectors) /* Таблица векторов */ Имя секции (vectors) должно соответствовать имени, использованному при описании таблицы векторов. В противном случае, таблица окажется располо женной в друrом месте. Этот метод может приrодиться даже при наличии инструментария Sourcery G++; если вам требуется более 32 векторов прерываний, то вы можете описать дополнительные векторы и поместить их сразу после таблицы векторов CS3. 19.5. Обращения к реrистрам специапьноrо назначения Инструментарий GNU поддерживает обращения к реrистрам специальноrо назначения. Названия этих реrистров должны записываться строчными буква ми. Например: msr control, rl mrs rl, control msr apsr, Rl mrs rO, psr 19.6. Использование неподдерживаемых команд Если вы при меняете друrой набор инструментов GNU ARM, то может полу читься так, что используемый ассемблер не поддерживает необходимую вам KO манду. В этом случае команду можно будет вставить в проrрамму в виде двоич Horo кода с помощью директивы . word. Например: .equ DWMSRCONTROLRO, Ох8814FЗ80 MOV RO, #Охl .word DWMSRCONTROLRO /* Эта команда переводит процессор в пользовательский режим */ 19.7. Iпliпеассембпер в компипяторе GCC Как и Сикомпилятор компании ARM, компилятор GCC тоже поддерживает iпliпеассемблер. Правда, синтаксис несколько отличается: 
19.Z Iпliпеассемблер в компиляторе GCC . 333 asm (<< inst1 ор1, ор2... \n» « inst2 ор1, ор2... \n» « inst ор1, ор2... \n» outputoperands /* Опция */ inputoperands /* Опция */ clobberedregisterlist /* Опция */ ) ; Например, простая процедура перевода процессора в спящий режим может выrлядеть следующим образом: void Sleep(void) { // Переход в спящий режим с помощью команды WFE asm ( «WFI\n» ) ; Если в ассемблерном коде должны использоваться входные и выходные пере менные, то ero можно записать следующим образом: unsigned int Dataln, DataOut; /* Переменные для параметра и результата */ asm (<<mov rO, %O\n» «mov r3, #5\n» «udiv rO, rO, r3\n» «mov %1, rO\n» :»=r» (DataOut) : «r» (Dataln) : «се», «r3» ); В этом фраrменте входным параметром является переменная DataIn (пара метр %0), а возвращаемым значением  переменная DataOut (параметр %1). Ac семблерный код модифицирует реrистр R3 и изменяет флаrи условия СС, в связи с чем они перечислены в списке затираемых реrистров. Для дальнейшеrо изучения iпliпеассемблера рекомендую обратиться к ДOKY менту «GCCIпliпeAsseтblyHOWTO» (на анrл. языке), свободно распространяе мому в сети Интернет. 
rЛАВА 2 О ИСПОЛЬ30ВАНИЕПАКЕТА REALVIEW MDK..ARM КОМПАНИИ KEIL 20.1. Общие сведения В настоящее время на рынке представлено множество проrраммных средств разработки для устройств с процессором CortexM3. Одним из наиболее попу лярных па кетов является пакет RealView Microcontroller Development Kit (RealView MDKARM), предлаrаемый компанией КеН. В составе этоrо пакета име ются следующие компоненты: · Интеrрированная среда разработки (ИСР) J.1Vision. . Отладчик. . Симулятор. · Инструментарий RealView Compilation Tools компании ARM: CJ компилятор С/С++; CJ ассемблер; CJ компоновщик и различные утилиты. · Операционная система реальноrо времени RTX RealTime Kernel. · Стартовые коды для различных микроконтроллеров. · ПО дЛЯ проrраммирования флэшпамяти микроконтроллеров. · Примеры проrрамм. Для изучения процессора CortexM3 с помощью пакета RealView MDKARM наличие реальной платы с микроконтроллером на базе CortexM3 необязательно. В составе ИСР J.1Vision имеется симулятор, позволяющий тестировать простые проrраммы без отладочной платы. Бесплатный компактдиск с пробной версией пакета можно заказать на сайте компании (www.keil.coт). Эта же версия пакета поставляется в составе некоторых отладочных комплектов от разных производителей микроконтроллеров. 20.2. Приступая к работе в ИСР fJVision Вместе с пакетом MDKARM поставляется множество примеров, в том числе и для микроконтроллеров с ядром CortexM3 и различных отладочных плат, предлаrаемых на рынке. Помимо этоrо, с сайта производителя микроконтролле ра можно заrрузить библиотеки драйверов устройств, в которых тоже имеются 
20.2. Прuступая к работе в ИСР flVisioп · 335 примеры проrрамм. При разработке cBoero приложения вы можете взять за OCHO ву подходящий учебный проект или же создать свой проект с нуля. Данному BO просу и посвящена настоящая rлава. Все примеры, приведённые в этой rлаве, бы ли написаны в среде MDKARM версии 3.80 для микроконтроллера LM3S811 компании Texas Instruments. После инсталляции пакета MDKARM вы сможете запустить ИСР JlVision из меню «Проrраммы». При первом запуске JlVision будет автоматически создан пу стой проект для традиционноrо процессора ARM. Мы можем закрыть этот про ект и создать свой, выбрав пункт New Project в меню Project (Рис. 20.1). New Protect' 'W,orkspece. '" t p\li!kJnl Project.... gpen Projett i i " , " Рис. 20.1. Создание HOBOZO проекта. Создадим для нашеrо проекта новую папку HelloWorld (Рис. 20.2). После это ro нам нужно будет выбрать целевое устройство. Выберем микроконтроллер LM3S811 (Рис. 20.3).  HeRoW'orld Му Recent Documents D esktop  ,, ' .,, ;" Му Documents .1 Му Computer .. Local Disk (С:)  СоrtехМЗ iia BookE xamples .- .. DVO Drive (D:) .. Local Disk (Е:)  (G:) '1 Му Network P1aces Рис. 20.2. Выбор папки для размещения проекта. 
336 · Тлава 20. Использование пакета RealView MDKARM компании Кеи Рис. 20.3. Выбор целевоzо микроконтроллера. После выбора микроконтроллера появится диалоrовое окно с вопросом об ис пользовании cTapToBoro кода, принятоrо по умолчанию. Нажмите на кнопку Yes (Рис. 20.4). Рис. 20.4. Выбор стандартноzо cmapmoBozo кода. В результате проделанных манипуляций будет создан проект HelloWorld, co держащий Bcero один файл Startup.s (Рис. 20.5). Теперь нам нужно создать новый файл, который будет содержать тело основной проrраммы (Рис. 20.6). Сохраним этот текстовый файл под именем Неllо.с (Рис. 20.7). Теперь мы можем добавить созданный файл в проект через контекстное меню, появляющееся при щелчке правой кнопкой мыши на rруппе Source Group 1 в окне проекта (Рис. 20.8). 
20.2. Приступая к работе в ИСР f1-Visioп . 337 fnt l ,{::}, 50uусе Group 1 , hi3 Stattф.s . Fлgt t (g,8GtOk1 ! t() fta'lclOO 1" T8n9 >.. .' '-';"';,\ii\i\i\l.'i.it'P.' """" "-"":'-";"';"p."':"" " .;i ' 'ir.' ': ' ' '.i ';''''''''  '''';'- \; '''''' 'r- ''''''''-'; .c.', 'i ,;O"-"" "а" "'О-';'._ ';'. .,"'о" ,......-- -yo ..-...;::.,',:.-,',' --.'.:-,:.:..'.:{.<':,i;:{i;': w\-;' '-__-.0'; Рис. 20.5. Созданный проект. fj;Qpen CТRL+O .,.-. '.' S«V$ AI Рис. 20.6. Создание НОБОZО файла с исходным кодом. 
338 · Тлава 20. Использование пакета RealView MDKARM компании Keil I B  Target 1 ! з. Source Group 1 ! a$ 11  ! Q;iBookt !} Func5or .TempI. Рис. 20.7. ПрО2рамма «HelloWold». (YOid) 'tJO r 1 d ! \ n ") ; Rmove Group .Source Group l' and its FiIes IEJ IQClude Dependencies Рис. 20.8. Добавление файла в проект. Выберем созданный нами файл Неllо.с, после чеrо закроем окно Add File. Te перь наш проект содержит два файла (Рис. 20.9). 
20.2. Прuступая к работе в ИСР ""Visioп · 339 т arget 1 E}" Source Group 1 ;... [!;J startup. s III!IIIII!!I  IIIIIIII8 include "stdio.h" main (void) wor ld! \ n") ; == P-.egs ! r;QJ BI)ok I t{} Func1ion') 1" Тем Рис. 20.9. Окно проекта после добавления файла Hello.c. Для задания настроек проекта следует щёлкнуть правой кнопкой мыши на имени проекта Target 1 в окне Project Workspace и выбрать пункт Options for Target 'Target 1'. На вкладке Target появившеrося диалоrовоrо окна мы увидим, что распределение памяти уже задано средой автоматически (Рис. 20.10). В этом же окне мы можем задать множество друrих параметров проекта, расположен ных на соответствующих вкладках. Рис. 20.10. Диалоzовое окно задания опций проекта. 
340 · Тлава 20. Использование пакета RealView MDKARM компании Keil Теперь мы можем приступить к компиляции проrраммы. Для этоrо нужно нажать на соответствующую кнопку панели инструментов (Рис. 20.11) или же выбрать пункт Build target из KOHTeKcTHoro меню, появляющеrося при щелчке правой кнопкой мыши на имени проекта в окне Project Workspace. ..i Не 110 VI О'" I (1  JJVj; 10 п] . fJe Edt.., e.rojкt ' Qabцg :\ AAsh,. .. . lools svcs.. WI. ' t(eIP .   ..., .. -- . , . .... > ........ J.!2 (J. -J tlllf l '* '...f.: I Targct 1 вuitd TltoItl ;:...i с oiЬ с........... Gr 1   .JV'fJI e oup ;" _  Ct.avh.... 1iIt . r.  U41'  :tи НeIo.c 'inClu( ,'int ma: { printf Рис. 20.11. Запуск компиляции. Сообщение компилятора об успешном завершении процесса компиляции бу дет выведено в окне Output Window (Рис. 20.12). L   l JJl Х Build tarqet I Tarqet 1. J compiling Hello.c... 11nking. . . Progr.. S1ze: Соde-ЗЗО6 RQ-daca-46 RVdata.12 ZIdata.S96 Bel1oVorld.axt"  О Error(s), О Varn1ng(s). Рис. 20.12. Вывод результата компиляции. 
20.3. Вывод сообщения «Неllо World» по интерфейсу UART · 341 20.3. ВЫВОД сообщения «Hello World» по интерфейсу UART В нашей проrрамме используется функция printf из стандартной библиоте ки языка Си. Эта библиотека не располаrает никакой информацией об использу емом аппаратном обеспечении. Поэтому для вывода текстовых сообщений по средством реальных устройств, таких как модуль UART микроконтроллера, нам придётся написать соответствующие процедуры. Как уже упоминалось ранее в книrе, реализация вывода информации на pe альные аппаратные средства часто обозначается термином «перенаправление». Помимо собственно вывода текста, проrраммный код поддержки перенаправле ния также может содержать функции для обработки ошибок и аварийноrо завер шения проrраммы. В данном примере мы коснёмся только функций вывода TeK стовой информации. Следующая проrрамма выводит сообщение «Неllо World» в модуль UARTO микроконтроллера LM3S811. Эта проrрамма рассчитана на соответствующую OT ладочную плату производства Texas Instruments. Источником TaKToBoro сиrнала служит имеющийся на плате кварцевый резонатор частотой 6 Мfц. Встроенный модуль PLL микроконтроллера после некоторой настройки формирует из этоrо сиrнала системный тактовый сиrнал частотой 50 Мfц. Скорость передачи UART задаётся равной 115 200 бит/с; для приёма информации от UART используется проrрамма HyperTerminal, работающая на ПК под управлением ОС Windows. Чтобы перенаправить поток данных, формируемый функцией printf, нам необходимо реализовать свою функцию fputc. Ниже приведена возможная pea лизация этой функции, использующая для вывода символов в модуль UART функцию sendchar. Файл hello.c #include «stdio.h» #pragma import( usenosemihostingswi) struct FILE { int handle; }; FILE stdout; #define CR ОхОО // Возврат каретки #define LF ОхОА // Перевод строки void UartOlnit(void); void SetClockFreq(void); int sendchar(int ch); // При использовании TaKToBoro сиrнала 6 мrц закомментируйте следующую строку #define CLOCK50MHZ // Адреса реrистров #define SYSCTRL RCC #define SYSCTRL RIS #define SYSCTRL RCGCl #define SYSCTRL RCGC2 #define GPIOPA AFSEL #define UARTO ОАТА #define UARTO FLAG #define UARTO IBRD * ((volatile unsigned long * ((volatile unsigned long * ((volatile unsigned long *((volatile unsigned long * ((volatile unsigned long * ((volatile unsigned long * ((volatile unsigned long *((volatile unsigned long *) (Ox400FE060)) *) (О х 4 О О FE О 5 О) ) *) (О х 4 О О FE 1 О 4) ) *) (О х 4 О О FE 1 О 8) ) *) (Ох40004420)) *) (Ох4000СООО) ) *) (Ох4000СО18)) *) (Ох4000СО24)) 
342 · Тлава 20. Использование пакета RealView MDKARM компании Keil #define UARTO FBRD #define UARTO LCRH #define UARTO CTRL #define UARTO RIS #define NVIC CCR int main (void) { // Простой код для вывода сообщения «Hello World» NVIC CCR = NVIC CCR I Ох200; // Устанавливаем STКALIGN   SetClockFreq(); // Задаём частоту TaKToBoro сиrнала (50 мrц/6 мrц) UartOInit(); // Инициализируем UARTO printf (<<Hello world!\n»); while (1); * ( (volatile * ( (volatile * ( (volatile * ( (volatile * ( (volatile unsigned unsigned unsigned unsigned unsigned long long long long long *) (Ох4000С028)) *) (Ох4000С02С)) *) (Ох4000СОЗО)) *) (Ох4000СОЗС)) *) (ОхЕОООЕD14)) } void SetClockFreq(void) { #ifdef CLOCK50MHZ // Устанавливаем бит BYPASS, сбрасываем биты USRSYSDIV и SYSDIV SYSCTRLRCC = (SYSCTRLRCC & ОхF8ЗFFFFF) I Ох800 ; // Сбрасываем биты OSCSRC, PWRDN и OEN SYSCTRL RCC = (SYSCTRL RCC & OxFFFFCFCF);   // Изменяем SYSDIV, устанавливаем USRSYSDIV и частоту кварца SYSCTRLRCC = (SYSCTRLRCC & ОхF87FFСЗF) I Ох01СО02СО; while ((SYSCTRLRIS & Ох40)==0); // Ждём установки бита PLLLRIS // Сбрасываем бит BYPASS SYSCTRLRCC = (SYSCTRLRCC & OxFFFFF7FF) ; #else // Устанавливаем бит BYPASS, сбрасываем биты USRSYSDIV и SYSDIV SYSCTRL RCC = (SYSCTRL RCC & ОхF8ЗFFFFF) I Ох800 ; #endif return; } void UartOInit(void) { SYSCTRL RCGC1 = SYSCTRL RCGC2 = UARTO CTRL = о; #ifdef CLOCK50MHZ UARTO IBRD = 27; UARTO FBRD = 9; #else UARTO IBRD = з; UARTO FBRD = 17; #endif UARTO LCRH = UARTO CTRL = GPIOPA AFSEL return; SYSCTRL RCGC1 I Охоооз; // Разрешаем тактирование UARTO и UART1 SYSCTRL RCGC2 I ОхОО01; // Разрешаем тактирование PORTA // Запрещаем UART // Задаём скорость передачи для тактовой частоты 50 мrц // Задаём скорость передачи для тактовой частоты 6 мrц Ох60; // 8 бит, без контроля чётности ОхЗ01; // Разрешаем приём, передачу и включаем модуль UART = GPIOPA AFSEL I Охз; // Модуль UARTO использует выводы GPIO } /* Вывод символа в UARTO (используется функцией printf) */ int sendchar (int ch) i f (ch == '\ n ') { 
20.4. Тестирование npozpaMMbl · 343 while ((UARTOFLAG & Ох8)); // Если UART занят  ждём UARTO DАТА = CR; // Выводим дополнительный символ CR для KoppeKTHoro } // отображения на экране while ((UARTOFLAG & Ох8)); // Если модуль занят  ждём return (UARTODATA = ch); // Выводим байт } /* Перенаправление TeKcTOBoro вывода */ int fputc(int ch, FILE *f) { return (sendchar(ch)); } void sysexit(int returncode) { /* 3аrлушка */ label: goto label; /* Бесконечный цикл */ Подпроrрамма SetClockFreq конфиrурирует модуль PLL для формирования системноrо TaKTOBoro сиrнала частотой 50 Мfц (процесс настройки зависит от используемоrо устройства). Если константа CLOCK50MHZ не определена, то эта подпроrрамма устанавливает тактовую частоту, равную 6 Мfц. Для инициализации модуля UARTO используется подпроrрамма UartOInit. Настройка модуля заключается в выборе скорости передачи (115 200 бит/с), раз рядности слова (8 бит) и числа стопбитов (1 стопбит), а также отключении KOH троля чётности. Эта же подпроrрамма переключает выводы порта А, используе мые модулем UARTO, в режим альтернативных функций. Прежде чем можно бу дет обращаться к модулям GPIO и UART, необходимо включить тактирование данных модулей. Это осуществляется записью соответствующих значений в pe rистры SYSCTRLRCGCl и SYSCTRLRCGC2. Перенаправление осуществляется функцией fputc (это имя зарезервировано для функции, осуществляющей вывод символов). Данная функция вызывает функцию sendchar для вывода символа в модуль UART. При обнаружении сим вола новой строки указанная функция выводит дополнительный символ возвра та каретки. Это необходимо для KoppeKTHoro отображения текста в окне HyperTerminal (в противном случае, текст новой строки перезаписывал бы пре дыдущую строку). После внесения изменений в файл Неllо.с перекомпилируем проrрамму. 20.4. Тестирование nporpaMMbI Если У вас уже есть оценочная плата LM3S811, то вы можете проверить работу проrраммы, заrрузив её во флэшпамять микроконтроллера и убедившись в Ha личии сообщения «Неllо World» в окне HyperTerminal. Для заrрузки и проверки проrраммы необходимо выполнить следующие действия (предполаrается, что все драйверы, поставлявшиеся вместе с оценочной платой, установлены). Прежде Bcero, необходимо настроить опции заrрузки во флэшпамять, BЫ брав пункт Configure Flash Tools из меню Flash (Рис. 20.13). В появившемся диа лоrовом окне выберите оценочную плату Luminary Eval Board (Рис. 20.14). Как видно из рисунка, flVision поддерживает самые разные средства отладки. 
tI 344 · rлава 20. Использование пакета RealView MDKARM компании Кеа } Hel'oWorld  ...Vision3  [С:\СоrtехМЗ\ВооkЕхаПlрlеs\НеllоWоrld\Неllо.с] i 18 ! I I I j i j j j :;:/ / Сlх OSCSRC., Pl"N"'RDN :SYSCTRLRCC = (SYSCTF aI Рис. 20.13. Вызов окна настройки npozpaMMamopa. . . . ,'.. . . DeViCe I 'f....; 0tIId 1  11mi ( . Aw I UrNtJ DebЦg UtiIIiii ,: '. · '. .' . . :'.с.. ..',. ":" '., '. ..' .... . ...... :,,: ...., . .,:' .... .', ....... ". ",";: ,', ....... '. ..:...... .', "'- . .' . " . ' . ' . ' . ' . . .. . .. .. . . . . '. . .. ;.: . F . .JaSh ... . .... ' М . :. .' COInmand . . . . .. .. . .. . . ', .... ......, . . ................. . .... . ..... .':: ':. '. ,.... ' ..;.... . . .... .....' .... '. r в.v-u . . .. 'е ... . .... . . ...... . ..... .. ..... . .. ... ... .... . .... ' .. ... " '" ..,. ... . ' , . '. .....:.,, ','.. . .... . : ;' . ",",: . i' . ..'! . ".:" . :. <..... ...'.... ......,.:. .... .. .... . .... :". :' . '. . ..... ..... . r.u. Tar&ll!tO . farFlash Pros.r ;> . . ' . '" .. . . . . . . .... . . . . . . .. . .:.. . . "" . . .. . .. .... . ..i.., ... '. . . . . ... . .. . . .. .. . . ... ' . . .. .. ". """ *- 0.' ._' . i , J t Luminar,y Eval Board Y' . . :. ...... . $.... 1 . ...... .. J .. '.: ,Р . ...Updete:)'> .... . " . '." .......... . I .....:.! 2:1. ...... . '. ..' '. ", .'--:-..'" .' ...... I ." .... '. ULINKARM Debugger . .' . .1",' , . ..' ". .,' ..... . '" .:' JnitFJe; ULINK Corte)( Dbugger ...;J.7'"" .,.., ." .... .' .' '. ' . . Irf.he<'"" ./.......'1 . . Con .. ........'. . ..Iмni . . . t := ' . . < . '..:J. .  ,Сortех-МЗ J.LINK . . . .' ......... I !' . .... .. '. ...... .' . ': .... ...:....:... ....... . . ...; .... .,' i " rяuпl . пdереndеnt :..:....... .' '.. . . '. ........ ..' ...:.... .... ..::.. ............ ..'. ............. . ." , '.' . . .'.:' I ".' '. '.' ..' .', ..... ..' . '. .' . . . . " . .'. · . '. . . . .' . 1 . . '. . ". . . . . .... . . .... .... .. .' . .' ...... . . .'. .' .. . . '. .' . '. . .' ' .' . ..' : . .  . .... " ..... . . '. .,' ..... . .'. '. .,.... " '. .' . . . '. '.'.' . . .' .... .... .... ..... '.' .' . .., . .',. '. . . .... '. '. . . . :.' . '. .... .'. .... . '. . .... . '. . . . ' " . / ";с: :; ' >1. ;.' се... .'.:... . . . . '. ..' .... . . .' ... . :. . . . . . . . " , ".". . .' . '.' '. . '. . ; 'ос . "" ..' ...... . ....... .' .', . ...." ':'. ....... == .:.. .............:' '.' , .,.. . . =к ' . '. ..... . '. . . .; .' . . .......,..'..',. [. .' ." ','. . ..... . ..: ,'.' .' I ...... . . . . :' .' . . . Рис. 20.14. Выбор драйвера npozpaMMamopa. После выбора оценочной платы необходимо щёлкнуть по кнопке Setting, что бы убедиться в корректности используемых настроек (Рис. 20.15). 
20.4. Тестирование npozpaMMbl . 345 Рис. 20.15. Окно 8ыбора nараметр08 проzраММUр08анuя флэшпамятu. Теперь мы можем заrрузить нашу проrрамму в микроконтроллер, выбрав в меню Flash пункт Download. После завершения проrраммирования в окне Output Window появится сообщение, показанное на Рис. 20.16. Если между пла той и HyperTerminal уже была установлена связь, то перед проrраммированием флэшпамяти может потребоваться закрыть проrрамму, отключить USВкабель от компьютера и повторно подключить ero. Lo8.d "с:\,соrtеХИЗ"ВОО)С!Х8nф1е8\\веllО1J'оrld\\ВеllоVоrldllАU И Conraect1D9= JIode-JТ.tG, Speed-l0000DВz Progrcmm1ng Попе. Ver1fy ок. Рис. 20.16. ВЫ80д сообщенuя об удачном npozpaMMup08aHuu. 
346 · Тлава 20. Использование пакета RealView MDKARM компании Keil После завершения проrраммирования вы можете запустить HyperTerminal и, подключив плату к виртуальному СОМ порту (по USB), получить текстовое сооб щение, переданное проrраммой, выполняющейся в микроконтроллере (Рис. 20.17). Рис. 20.17. Сообщение в окне прОёраммы HyperTerminal. 20.5. Использование отладчика Отладчик в ИСР JlVision поддерживает множество различных аппаратных средств отладки, в том числе и изделия линейки ULINK (ULINK2, ULINKPRO и ULINKME) компании КеН (Рис. 20.18). Рис. 20.18. Отладочные средства линейки ULINK. Среда JlVision поддерживает следующие внутрисхемные отладчики: · JTAGJet и JTAGJetTrace (компания Signum); · JLink и JTrace (компания Segger); 
20.5. Использование отладчика . 347 . оценочные платы Stellaris (компания Texas Instrument, бывшая Luminary Micro); . STLink (компания STMicroelectronics). Для отладки нашеrо при мера мы будем использовать отладчик ИСР flVision в связке с аппаратным отладчиком, входящим в состав оценочной платы Texas Instruments. Для изменения параметров отладки необходимо щёлкнуть правой кнопкой мыши на имени проекта Targetl в окне Project Workspace и выбрать из KOHTeKcTHoro меню пункт Options for Target 'Target 1'. Перейдём на вкладку Debug и выберем отладчик Luminary Eval Board (Рис. 20.19). Рис. 20.19. Выбор отладчика. Если после выбора отладчика нажать на кнопку Settings, то можно увидеть диалоrовое окно настроек параметров заrрузчика флэшпамяти, показанное на Рис. 20.15. В данном окне вы можете выбрать используемый протокол отладки, тактовую частоту канала обмена и ряд друrих параметров. При использовании отладчика ULINK2/ULINKPro этих опций будет rораздо больше (Рис. 20.20). 
348 · fлава 20. Использование пакета RealView MDKARM компании Keil Рис. 20.20. Опции отладчика ULINK2. Теперь мы можем начать сессию отладки, выбрав в меню Debug пункт Start/ Stop Debug Session (Рис. 20.21). Примечание. Если используется виртуальный СОМпорт на базе микросхе мы FTDI и плата уже осуществляет обмен данными с проrраммой HyperTerminal, то перед запуском сессии отладки нужно будет закрыть проrрамму, отключить USВкабель от ПК и снова подключить ero. ':t: F11 Cl r 0$ CSR С, Plr1RDN 4nd ОЕ1/ CТRLRCC · (SYSCТRLRCC , йиtп S'YSDIV, set иSRS:/S CТRLRCC - (STSCТRL_RCC , lIa.l t ипtil PLt'LRIS 1s set (SYSCТRLRIS , Ох40)- Cledr bypdSS (t {11 \':: т- : .. )... r: 1. = ,,} ' о (""'И .. : 1 . . t   'eYY n r Рис. 20.21. Запуск сессии отладки. После запуска отладчика в ИСР появится окно, отображающее содержимое реrистров процессора. Открыв окно с дизассемблированным кодом, вы также можете увидеть адрес текущей команды. Из Рис. 20.22 видно, что выполнение проrраммы остановилось на метке Reset  Handler, соответствующей первой команде исполняемоrо кода. 
20.5. Использование отладчика · 349 Рис. 20.22. Среда отладки в ИСР !lVisioп. Для установки точки останова в начале функции main можно щёлкнуть пра вой кнопкой мыши на lй строке кода основной проrраммы и выбрать в KOH текстном меню пункт Insert/Remove Breakpoint (Рис. 20.23). Примечание. Чтобы выполнение проrраммы всеrда останавливалось в начале функции main, можно также задействовать опцию отладчика Run to main(). "":':"#define NVIC  CCR int main (void) { ;ii I 1:1:e:  R StZUt:1XG>L.<L--u----шш-, ::UartOInit () ; 11 In ti cflZ(\; ,. .,. : ;t (;'eНO wor ld ! \ n') ; 1 . .... . ' . : . ' . : :!"' ______т_____ __щШ__ :;>, ..... } ! ...'Ж:, :?/YOid SetC lockFreq (void) !. }c".l&S{ I opy ;x"! # ifdef CLOCK50KHZ 1.8 t:a',.';e ,;эQ / / s е t БУР AS S , сl ed,C из RSYS:, . SYSCTRLRCC == (SYSCTRLRCC i ./ / Сl!: OSCSRC, PWRDN dпct ОЩ \ SYSCTRLRCC == (SYSCTRLRCC ! // СпЮlgе sysnr,/, set иSRSyj .' SYSCTRL RCC = (SYSCТRL RCC I   i .// ТЛlа1. t ипиl 'f'1...LL.RIS 1.5 S while « SYSCTRL RIS , Ох4й)! / I Cl е .;1.1: bypass  ! .....,..п"'" .. ..... ..............N.. . SYSCTRL RCC = (SYSCТRL RCC I) Run to Cursor line '#еlзе I \ j / Set BYPASS, cled,C USRSY.s1 : I . . . . . . : . . : ( . .. . . . :=L  RCC = (SYSCТRL  RCC i . ! return; i !е- Enable/Disable Вrеal<poiПt Select AII Show Disassembly at ОхООООО256 Set Progr вт Counter 1,I'\.;--\{ 1:' '-.,i.Сi('),.;(l.е set: Go То Line ..!J ..tf'i Рис. 20.23. Установка/снятие точек останова. После установки точки останова слева от строки кода появится красный KPy жок (СМ. СТрОКУ 29 на Рис. 20.23). Теперь мы можем запустить проrрамму на BЫ полнение, нажав кнопку Run на панели инструментов (Рис. 20.24). 
350 · [лава 20. Использование пакета RealView MDKARM компании Keil "С.е АО А1 А2 RЗ А4 А5 Ох2ОООО7еО 0МОООООЭеО 0К000CJt)XJ0 (bC(t()OOOCfO) 0ха4420ОО1 0X20tX0X)4 :me.i Рис. 20.24. Запуск npozpaMMbl на выполнение. Проrрамма начнёт выполняться и остановится при достижении функции main (Рис. 20.25). После этоrо мы сможем приступить к пошаrовой отладке CBO ero приложения (используя соответствующие кнопки панели инструментов), контролируя работу проrраммы по содержимому реrистров. ] +; . в «1ked i <t; System ' f ll-:, '  ,c::--,п,,. '.J I!J Fm  Вoot<:; i t{} fun". : . ТеТ:1 , ' . I!I --",'....,...;......,;.,...;.'...;...,.,:.",;,""'...;....;...................,"';'':'''''';'':'-'';;';''''''"'''''''''''''''''''''';'....,,.;'....:,;............., -. .  >.- -.,   .- -   . . ... .... ....... ..' .......... ................ .  ...'....... .......... .-............................ -.......   ,', ,- .--",.-.-,-., --'-'-"-;-"--'-"-"-,--'.'.-,-,-,,,-,",-,"-",.--, ICCCR - NVICCCR I Ох2DО; ;" Sl!:'t STКAI.IGN "'; etClocJtJ'req(); i/ Sеl-ыр c.lock sеtЦng (5()}ffi;;./Ы1Нz) UartOInt(); 1/ ILtallZ иtD prlntt ("Hello world'\n"); il.e (1); } 014 SetClock1req(yoi4) { #lde СLОСК50ВИZ /1 Set ВYPASS, clea.r иSRSYSlJIV a.пd SYSDN YSCТRLRCC · (SYSCТRLRCC 'ОxF8зrFFrr) I Dх600 ; 1/ C1L CSCSRC, PWRDlf ёUКi ОЕН YSCТRLRCC · (SТSCТRLRCC , OxrrrFCrCF); '/ Cboтge SYSDIV. set 1JSRSYSV:::\/ a11d Crys td.l J.'<1llle YSCТRLRCC - (SYSCТRLRCC 'охr87FFСЗF) I ОхОlСОD2СО; Рис. 20.25. Прекращение выполнения npozpaMMbl в точке останова. 20.6. СимуляУор в составе ИСР Vision имеется симулятор команд, который тоже можно ис пользовать для отладки приложений. Работа в симуляторе во MHoroM идентична работе с отладчиком и служит прекрасным подспорьем в изучении процессора CortexM3. Чтобы задействовать симулятор, выберите опцию отладки Use Simulator (Рис. 20.26). Сразу хочу предупредить, что симулятор может оказаться 
20.6. Сuмулятор . 351 неспособным симулировать работу определённых периферийных модулей ряда микроконтроллеров. Поэтому код, работающий с интерфейсом UART, может си мулироваться некорректно. Рис. 20.26. Выбор симулятора в качестве отладчика. Симулятор flVision имеет полную поддержку на уровне устройства различных микроконтроллеров с ядром CortexM3. В тех редких случаях, коrда симуляция Bcero устройства оказывается недоступной, для отладки проrраммы с использо ванием симулятора может потребоваться корректировка настроек памяти. Это можно сделать, выбрав в меню Debug пункт Memory Мар (Рис. 20.27). Например, вам может потребоваться включить в карту памяти диапазон aдpe сов модуля UART (Рис. 20.28). Если этоrо не сделать, то при попытке обращения к данному модулю вы получите сообщение об ошибке. Однако в большинстве случаев все необходимые настройки карты памяти задаются автоматически при выборе целевоrо микроконтроллера и вручную обычно ничеrо делать не требу ется. 
352 · rлава 20. Использование nакета RealView MDKARM компании Keil } HelloWorld  JJVisiоп3  EIe .Edt.....YJew !roje(t ll   iп   '  1iiI" ,\!  Start/Stop QebuQ Session CTRl +F5 'f.iJt I ,Е .. ..0& & ЁД.... ..:J "  .... &t r.!"-М   F,U1 !!!... ... ..................<,. f\} 5tep ! Register "''''1 iP SteQ Over " Core 1 tp. Step Qut d current Function .,} Run to ursor line О А4 01<000   reakpoints... R 7 о)(оoQ  1Qsert/Remove Вrеakpoint А8 O)(ooq  R 9 0)(000 .. _ &! Disable АВ Breakpoints R 1 1 ОхООО... КШ АВ Вreakpoirts - А13 (SP) 0)(200 Q show Ne Statement R (1 [1 -:O(, Rl O..::.oc' F;.=' 0'-':0(. А::: !}-:20С Fll Fl0 CTRl+Fll CTRl+Fl0 CTRl+B F9 #define NVICCCR <int main (void) I 29 NVIC  CCR = NVIC  CCR I Ох2 00; /... S е t: S за SetClockrreq (); // Setz.p .:lock set t.Hj э1 UartOlnit () ; / / Iп:l t.l.dl1.ze U,1:.'tO э2 printf (rrHello world'\n"); '33'while (1); 34. .3$..Yoid SetC lockrreq (void) e{ 7: # fdef СLОСК50ИНZ эв // Set BYPASS, .:ledL' USRSYSDrv dlicl S'i: SYSCTRLRCC = (SYSCTRLRCC & ОхF8ЗFFF // Сl1:.' OSCSRC, prVRDN dпd ОЕН SYSCTRLRCC = (SYSCTRLRCC & OxFFFFCF 1/ Chd12ge SYSDr!> s е t '[1SRSYSDI1 7 dl'Et .:: SYSCTRL RCC = (SYSCTRLRCC & OxF87FFC F5 CТRl +SНIFT +F9 F; 14 tLF; t o:!x!!=! 1=;1') !РС f ,}..оос, :p':. R o..:1 С EnaЫe/Disable Trace Recording i:f i ,ti Banked !  !  System ! { i:..' I nternal i >iJFllеППi ;;... ....._..............,.....",....-.........-:1 ЕхесlЖ Profiling setup Logic Analyzer. . . I / J.1.:> ;. , ,,.   1 Р.::'I т  Т':;:.. i со '" ":,._ [х! Load "С: \ \ Cort ! 4, БS \ Hello\ 29 ( ! > : ' :r t:: 1{ Fсt..,Еdtor(I,;FИе)... . !I; !!!  '-""..... ,-.......,......................,..--......._....._....;....:..."'"'................i.,.:....::.:.:...: ............, Adiieaa: I Мemory'Мap ctatoo Рис. 20.27. Вызов окна параметров карты памяти. Рис. 20.28. Настройка карты памяти для симулятора. 
20.7. Модификация таблицы векторов · 353 20.7. Модификация таблицы векторов в предыдущем примере мы использовали таблицу векторов, определённую в файле со стартовым кодом startup.s. Этот файл содержит таблицу векторов, а также заранее определённые обработчики сброса, немаскируемоrо прерыва ния, исключения Hard Fault и обычноrо прерывания. Указанные обработчики He обходимо переписать в соответствии с требованиями приложения. Например, если в приложении используется прерывание от периферийноrо устройства, то необходимо изменить таблицу векторов таким образом, чтобы при возникнове нии прерывания запускалась бы ваша процедура обработки прерывания. Используемые по умолчанию обработчики исключений написаны на acceM блере и находятся в файле startup.s. Однако ничто не мешает реализовать их на языке Си или же на ассемблере, но в друrом файле. При этом в файле startup.s необходимо будет использовать директиву ассемблера IMPORT для указания Toro, что метка начала обработчика исключения определена в друrом файле. К примеру, если мы хотим добавить обработчики исключений SYSTICK и MO дуля USART, то мы можем изменить файл startup.s следующим образом (Рис. 20.29): . закомментировать соответствующие строки таблицы векторов; . вставить в проrрамму директивы IMPORT для двух векторов исключений, об работчики которых будут описаны на языке Си. Это необходимо, если обра ботчики находятся в друrом Си или ассемблерном файле; . добавить в таблицу вектора исключений, используя директиву DСD. DCD DCD DCD DCD DCD /псп IИРОRТ DCD DCD DCD DCD DCD DCD /DCD IИРОRТ DCD DCD DCD DCD DCD о IntDefaultHandler IntDefaultHandler О IntDefaultHandler IntDefdultHaпdler SysTickHandler SузТiсkНаndlеr IntDefaultHandler IntDefaultHandler IntDefaultHandler IntDefaultHandler IntDefaultHandler IntDe:td.ultHdпdler UartOHandler UartOHandler IntDefaultHandler IntDefaultHandler IntDefaultHandler IntDefaultHandler ... Reserved ,.. SVCall Напаlех ;. Dbt:lg Moпi t ах Напаl ех ;" Reser J."ed ,. PeпdSV Наllаlех ;" SysT.lck Нdlд.llе,r ,.. архо Po,rt А ,.. ОРХО Po.rt В ,.. архо Po.rt С / ЭРХО Poxt D ... архо Po.rt Е ,..lJARTO ,.. UARTl ,.. SSI ,.. Х2С .: РЮ,.l POaиl t Рис. 20.29. Вставка векторов прерыванuй в ассем6лерный стартовый код. При использовании СМSISсовместимых библиотек драйверов устройств Ta кая корректировка файла startup. s не требуется, если, конечно же, имена обра ботчиков исключений соответствуют именам функций, указанных в стартовом коде CMSIS. Применение cTapToBoro кода CMSIS будет продемонстрировано в следующем примере. 
354 · rлава 20. Использование пакета RealView MDKARM компании Keil 20.8. Прерывания и стандарт CMSIS в данном примере, реализующем секундомер, используются исключение SYSTICK и прерывание модуля UARTO. Этот секундомер имеет три состояния, показанные на Рис. 20.30. Обнуление результата Ожидание Кнопка нажата Кнопка нажата Отсчёт прекращён Останов Пуск Идет отсчёт В исключении SYSTICK Отображение результата Рис. 20.30. Конечный автомат секундомера. Управление секундомером осуществляется с персональноrо компьютера по интерфейсу UART. Чтобы упростить код проrраммы, зафиксируем тактовую ча сто ту на уровне 50 мrц. Измерение временных интервалов осуществляется таймером SYSTICK, KOTO рый прерывает выполнение проrраммы каждые 100 мс. Для тактирования тай мера используется тактовый сиrнал ядра частотой 50 мrц. При каждом запуске обработчика исключения SYSTICK инкрементируется переменная TickCounter (если секундомер запущен). Поскольку передача текстовой информации по интерфейсу UART является относительно медленным процессом, то управление секундомером производит ся непосредственно в обработчике исключения, а отображение текста и значений секундомера осуществляется в основной проrрамме (уровень потока). Для управ ления пуском, остановом и сбросом секундомера используется простой конеч ный автомат. Обработка состояний этоrо автомата производится в обработчике прерывания UART, который запускается по каждому приёму символа. Давайте создадим новый проект и назовём ero StopWatch. Добавим в Hero файл stopwatch.c, а также несколько друrих файлов поддержки стандарта CMSIS. Заменим файл startup.s файлом startup rvmdk.s и поместим в файл stopwatch.c директиву вставки файла lm3s cmsis.h, как показано на Рис. 20.31. Также добавим в проект файлы system  lm3s.c и core  lm3s.c. Первый из них содержит функцию Systemlnit(), используемую в проrрамме. Файл core  lm3s. с содержит встроенные функции. Несмотря на то что мы не при меняем ни одной из этих функций, мы всё же включили данный файл в про ект для полноты картины. 
20.8. Прерыванuя u стандарт CMSIS · 355 Е! . Source Group 1 .  startup Jvmdk.s [? [I1 stopwatch. с '.... g Im3scmsis.h :. Q соrесmз.h Q stdint.h Q systemJm3s.h Q stdio.h 00  systemJm3s.c ffi [}1J corecm3.c &f6:,,(# inc 1 ude "1m3 3  CПIВ 1а . h rf '.,i.s4i;!#include "stdio. h" .:ei#pragroa import ( use  по semihost iщс зvi) .]Jstruct FILE { int handle; }; . "','FILE stdout; OxOD 11 Cddge etи ОхОА 11 Liпefeed *%Oid UartOlnit(void); ::': };ivoid 5etC lockfreq (void) ; .,иoid DisplayT1me (void) ; .,.........?,!YOid PrintValue (int value); ;\.int зепdсhаr (int сЬ); %int getkey(void); tYOid UARTOIRQHandler(void); '::::@!YOid SysT1CkHandler(VOid); '}'<"б )Щ.:о.,/I Globdl vd.r:i аЫ е$ . ....Yo1ati1e int Curr5tate; // St li111nf'l Т; /""1r'("r')ttnt' РУ. I / "r I! Regs I (tlIB... ! t{} Fun... !.. Те... I Рис. 20.31. Окно проекта «StopWatch», uспользующеzо CMSIS. Имена некоторых файлов специфичны для производителя микроконтролле ров (например, startup  rvmdk.s и lm3s  cmsis.h). Эти файлы, используе мые в проекте, можно взять из СМSISсовместимой библиотеки драйвера устрой ства или непосредственно из пакета файлов поддержки стандарта CMSIS, KOTO рые можно заrрузить с сайта www.oпarm.com. Использование стандарта CMSIS упрощает проrрамму s topw а tch. с, посколь КУ определения реrистров периферийных устройств и некоторые системные функции содержатся в файлах CMSIS. stopwatch.c #include «lmЗs cmsis.h» // Включаемый файл поддержки #include «stdio.h» // Для функции printf #pragma import( use по semihostingswi) struct FILE { int handle; }; FILE stdout; // Специальные символы для функции вывода текста #define CR ОхОD // Возврат каретки #define LF ОхОА // Перевод строки // Объявления функций void UartOInit(void); void SetClockFreq(void); void DisplayTime(void); CMSIS // Инициализация UARTO // Установка тактовой частоты 50 мrц // Отображение времени 
356 · Тлава 20. Использование пакета RealView MDKARM компании Keil int sendchar(int ch)j int getkey(void)j void UARTOIRQHandler(void)j void SysTickHandler(void); // rлобальные переменные volatile int CurrState; volatile unsigned long TickCounter; volatile int KeyReceived; volatile int userinput; // Состояния конечноrо автомата #define IDLE STATE О #define RUN STATE 1 #define STOP STATE 2 int main (void) { // Вывод символа в UART // Чтение символа из UART // Обработчик прерывания UARTO // Обработчик исключения SysTick // Состояние конечноrо автомата // Счётчик секундомера // Признак нажатия клавиши // Значение нажатой клавиши int CurrStateLocal; // Локальная копия текущеrо состояния Systemlni t () ; // Инициализация системы  часть стандарта CMSIS // Не требуется при использовании CMSIS v1.ЗО или выше, // поскольку в этих версиях вызывается из cTapToBoro кода // Настройка тактовой частоты (50 мrц) rлобальные переменные SetClockFreq(); // Инициализируем CurrState = О; KeyReceived = о; // Инициализируем аппаратуру SCB>CCR = SCB>CCR I Ох200; UartOlnit(); SysTickConfig(499999); printf (<<Секундомер\п»); while (1) { CurrStateLocal = CurrState; // Делаем локальную копию, поскольку // это значение может быть в любой момент изменено обработчиком UART. switch (CurrStateLocal) { case (IDLE STATE): printf (<<\пНажмите любую клавишу для пуска\п»); break; case (RUN STATE) : printf (<<\пНажмите любую клавишу для останова\п»); break; case (STOPSTATE): printf (<<\пНажмите любую клавишу для сброса\п»); break; default: CurrState = IDLE STATEj break; } // Конец switch() while (KeyReceived == О) { if (CurrStateLocal==RUNSTATE) { DisplayTime () ; } }; // Ждём действий пользователя // Устанавливаем STКALIGN // Инициализируем UartO // Инициализируем SysTick (функция CMSIS) 
20.8. Прерbl8анuя и стандарт CMSIS · 357 if (CurrStateLocal==STOPSTATE) { TickCounter=O; DisplayTime(); // Выводим нулевое значение } else if (CurrStateLocal==RUN STATE) DisplayTime(); // Выводим результат } if (KeyReceived!=O) KeyReceived=O; }; // Конец while() } // Конец функции main() // Конфиrурирование TaKToBoro сиrнала процессора и UART void SetClockFreq(void) { // Устанавливаем BYPASS, сбрасываем USRSYSDIV и SYSDIV SYSCTL>RCC = (SYSCTL>RCC & OxF83FFFFF) I Ox8QO ; // Сбрасываем OSCSRC, PWRDN и OEN SYSCTL>RCC = (SYSCTL>RCC & OxFFFFCFCF); // Меняем SYSDIV, задаём значения USRSYSDIV и Crystal SYSCTL>RCC = (SYSCTL>RCC & OxF87FFC3F) I ОхОlСО02СО; while ((SYSCTL>RIS & Ох40)==0); // Ждём установки PLLLRIS // Сбрасываем BYPASS SYSCTL>RCC = (SYSCTL>RCC & OxFFFFF7FF); return; } // Инициализация UARTO void UartOInit(void) { // Тактовый сиrнал для работы UART SYSCTL>RCGCl = SYSCTL>RCGCl ОхОО03; // Включаем тактирование UARTO и UARTl SYSCTL>RCGC2 = SYSCTL>RCGC2 ОхОООl; // Включаем тактирование PORTA // Настраиваем UART UARTO>CTL = о; // Отключаем UART UARTO>IBRD = 27; // Проrраммируем скорость передачи UARTO>FBRD = 9; // для тактовой частоты 50 мrц UARTO>LCRH = Ох60; // 8 бит, без контроля чётности UARTO>CTL = Ох301; // Разрешаем передачу и приём, включаем UART UARTO>IM = Охl0; // Разрешаем прерывание UART по приёму GPIOA>AFSEL = GPIOA>AFSEL I Ох3; // Назначаем выводы GPIO модулю UARTO NVICEnableIRQ(UARTOIRQn); // Разрешаем прерывание UART в NVIC // (функция CMSIS) return; } // Обработчик исключения SYSTICK void SysTickHandler(void) // Имя функции соответствует определённому // в стандарте CMSIS if (CurrState==RUNSTATE) TickCounter++; return; } // Обработчик прерывания приёмника UARTO 
358 · fлава 20. Использование пакета RealView MDKARM компании Keil void UARTOIRQHandler(void) // Имя ФУНКЦИИ объявлено в стартовом коде CMSIS { userinput = getkey(); // Ставим флаr приёма символа KeyReceived++; // Сбрасываем запрос прерывания UART UARTO>ICR = Ох10; // Обрабатываем состояния конечноrо автомата switch (CurrState) { case (IDLE STATE) : CurrState = RUN STATE; break; case (RUN STATE) : CurrState = STOP STATE; break; case (STOP STATE) : CurrState IDLE STATE; break; default: CurrState = IDLE STATE; break; // Конец switch() return; } // Выводит значение счётчика времени void DisplayTime(void) { unsigned long TickCounterCopy; unsigned long TmpValue; sendchar (CR) ; TickCounterCopy = TickCounter; // Делаем локальную копию, поскольку значение // может быть в любой момент изменено в обработчике SYSTICK TmpValue = TickCounterCopy / 6000; // Минуты printf (<<%d», TmpValue); TickCounterCopy = TickCounterCopy  (TmpValue * 6000); TmpValue = TickCounterCopy / 100; // Секунды sendchar ( , : ' ) ; printf (<<%d», TmpValue); TmpValue = TickCounterCopy  (TmpValue * 100); sendchar ( , : ' ) ; printf (<<%d», TmpValue); // Сотые доли секунды sendchar(' '); sendchar(' '); return; } // Выводит символ в UARTO (используется функцией printf) int sendchar (int ch) { if (ch == '\п') { while ((UARTO>FR & Ох8)); // Если UART занят  ждём 
20.8. ПрерЫ8анuя и стандарт CMSIS · 359 UARTO>DR = CR; // ВЫВОДИМ дополнительный символ CR для // KoppeKTHoro отображения в окне HyperTerminal } while ((UARTO>FR & Ох8)); return (UARTO>DR = ch); // Если UART занят  ждём // Выводим символ } // Получение команд пользователя int getkey (void) { // Читаем символ из последовательноrо порта while (UARTO>FR & Охl0); // Если FIFO приёмника пуст  ждём return (UARTO>DR); } // Перенаправляет текстовьм вывод int fputc(int ch, FILE *f) { return (sendchar(ch)); } void sysexit(int return code) { // Заrлушка label: goto label; // Бесконечный цикл По сравнению с предыдущим примером «Неllо World» процедура инициали зации модуля UART HeMHoro изменилась  было добавлено разрешение преры вания по приёму символа. Обратите внимание, что запрос прерывания UART нужно разрешать как в реrистре маски прерывания модуля UART, так и в KOH троллере NVIC. ДЛЯ разрешения исключения SYSTICK необходимо запроrрам мировать только реrистр управления и состояния SYSTICK. Также в проrрамме появилось несколько новых подпроrрамм, включая обра ботчики UART и SYSTICK, функцию вывода данных и процедуру инициализа цИИ SYSTICK. В зависимости от реализации периферийноrо устройства от обра ботчика может потребоваться ручной сброс запроса прерывания/исключения. В обработчике UART это осуществляется записью в реrистр сброса прерывания (UARTO>ICR). После Toro как проrрамма будет скомпилирована и заrружена в микрокон троллер, мы сможем убедиться в её работоспособности, подключив плату к ПК с запущенным приложением HyperTerminal. Результат работы проrраммы пред ставлен на Рис. 20.32. 
360 · fлава 20. Использование пакета RealView MDKARM компании Keil Stop Watch Prcss any kcy to start Press any key to stop 8:5:5'- Press any key to clear 0:0:8 Press any key to start Press anу key to stop 0:2:5 Press any key to clear 0:0:8 Press anу key to start ress any key to stop 0:8:90 Prp. RnY kp.y tn r.1p.Ar Рис. 20.32. Результат работы npozpaMMbl StopWatch. 20.9. Перевод существующих припожений на стандарт CMSIS Можно довольно леrко переделать любое приложение для процессора CortexM3 так, чтобы оно соответствовало стандарту CMSIS. ДЛЯ этоrо необходи мо сделать следующее: · Заменить стандартный стартовый код на стартовый код CMSIS, предназна ченный для целевоrо микроконтроллера. · Модифицировать проект, включив в Hero файлы CMSIS. · Модифицировать проrрамму, включив в неё заrоловочный файл CMSIS. · Заменить определения реrистров соответствующими определениями CTaH дарта CMSIS. · Заменить существующие функции работы с периферией процессора на функ цИИ CMSIS. · Привести имена обработчиков исключений в соответствии с именами, опре делёнными в стартовом коде CMSIS. · По мере возможности заменить процедуры инициализации периферийных устройств функциями СМSISсовместимой библиотеки драйвера устройства. Использование стандарта CMSIS позволит сделать приложение более перено симым (об этом уже rоворилось в [лаве 10). 
rЛАВА 21 проrРАММИРОВАНИЕ CORTEX..M3 в LabVIEW 21.1. Общие сведения Приложения для устройств на базе процессора CortexM3 можно создавать не только с помощью различных языков проrраммирования, таких как ассемблер или Си. Одной из возможных альтернатив является использование rрафической среды разработки LabVIEW, предлаrаемой компанией National Instruments. Про rpaMMbI, созданные в этой среде, можно запускать как на персональном компью тере, так и на микроконтроллерах ARM, включая устройства с ядром CortexM3. 21.2. 3накомство с LabVIEW Компания National Instruments предлаrает несколько версий среды LabVIEW, включая версии для персональных компьютеров, работающих под управлением Windows или Linux, а также версии для встраиваемых платформ, которые под держивают самые разные встраиваемые процессоры, включая CortexM3 и ARM7TDMI. rрафический язык проrраммирования среды LabVIEW поддерживает все воз можности, присущие обычным языкам проrраммирования, такие как циклы, условные операторы и использование различных типов данных. Основным отли чием работы в среде LabVIEW является то, что проrраммы создаются в виде блок схем. К примеру, простой цикл для вычисления суммы чисел от 1 до 10 может быть представлен блоком For Loop (Рис. 21.1).  a y result afterloo  is done I Numeric . 1.23 IJ2 Рис. 21.1. Простой цикл FOR для сложения чисел от 1 до 10. 
362 · fлава 21. Проzраммuрованuе CortexM3 в LabVIEW Пересылка данных изображается линиями связи (различным типам данных соответствуют разные стили линии), а переменные представляются иконками. К примеру, иконка U32 соответствует беззнаковому 32битному целому, а иконка 132  32битному целому со знаком. Аналоrом функций и подпроrрамм традиционных языков проrраммирова ния в среде LabVIEW являются модули, называемые виртуальными иHcтpYMeH тами (VI). Передача данных в УI и вывод данных из них осуществляется через точки соединения, к которым УI более BbIcoKoro уровня MorYT подключать BXOД ные и выходные переменные. Для при мера в правой части Рис. 21.2 показана блоксхема VI, который принимает четыре 32битных значения и возвращает наибольшее из них. В левой части рисунка этот виртуальный инструмент исполь зуется для определения наибольшеrо 32битноrо целоrо значения от четырёх ис точников: трёх элементов управления типа «ползунок» И одноrо reHepaTopa слу чайных чисел. Рис. 21.2. Блоки виртуальных инструментов VI и пoд VI: несколько уровней иерархии. Среда проrраммирования LabVIEW содержит большое число rOToBbIx к ис пользованию компонентов, которые весьма облеrчают разработку проrраммы. Среди них имеются компоненты, реализующие различные функции обработки данных (такие как функция вычисления абсолютноrо значения abs), функции обработки сиrналов (фильтры и элементы спектральноrо анализа), а также боль шое число компонентов для орrанизации ПОЛЬЗ0вательскоrо интерфейса. 21.2.1. Типичные области применения Попробуем оценить преимущества, которые нам даёт проrраммирование в среде LabVIEW, по сравнению с традиционным проrраммированием. Простота использования  среда проrраммирования LabVIEW значительно облеrчает разработку сложных приложений, избавляя от необходимости ДOCKO нально изучать аппаратное и проrраммное обеспечение. Блаrодаря этому пользо ватели с самым разным уровнем подrотовки, от студентов до специалистов, MO rYT разрабатывать свои приложения, не тратя время на изучение архитектуры 
21.2. Знакомство с LabVIEW · 363 процессора, а полностью сосредоточившись на разработке алrоритмов и COBep шенствовании функциональных возможностей устройства. Наличие библиотеки компонентов  orpoMHoe число проrраммных компо нентов, предоставляемых средой LabVIEW, также облеrчает разработку сложных приложений в сжатые сроки. Библиотека компонентов содержит сотни MaTeMa тических функций и функций обработки сиrналов, ускоряющих разработку ал rоритмов. Приложения, выполняющиеся на микроконтроллерах ARM, MorYT дa же подключаться к rрафическому интерфейсу пользователя, запущенному на ПК, что облеrчает управление встраиваемой системой и наблюдение за результатами её работы. Поддержка МНО20поточности  rрафическая среда проrраммирования по своей природе параллельна. Она позволяет запускать множество потоков в одно и то же время. В традиционных же системах проrраммирования неопытному разработчику потребуется довольно MHoro времени, прежде чем он сможет разо браться во встраиваемой системе реальноrо времени (RTOS) на уровне, достаточ ном для создания мноrопоточноrо приложения. Совместимость с тестовым оборудованием и оборудованием сбора данных  среда проrраммирования LabVIEW предоставляет простые в использовании ин терфейсные компоненты для связи с оборудованием сбора данных, а также под держивает большое число интерфейсных плат, которые MorYT при меняться как для управления промышленным оборудованием, так и для учебных целей. Среда LabVIEW очень популярна в университетах, лабораториях и различных нии. Она широко используется в системах сбора данных, для автоматизации Te стовых систем, для разработки и моделирования алrоритмов, для управления промышленным оборудованием, а также для создания прототипов встраивае мых систем. 21.2.2. Что нам нужно, чтобы использовать LabVIEW иАRМ Чтобы создавать проrраммы для микроконтроллера на базе процессора CortexM3, нам прежде Bcero необходим модуль «LabVIEW Emmbedded Module for ARM Microcontrollers», в состав KOToporo входит уже знакомый нам пакет MDKARM компании КеН. Для начала вы можете приобрести недороrой отладоч ный комплект (Рис. 21.3), в который входит печатная плата с установленным на ней микроконтроллером ARM (CortexM3/ARM7), отладчик ULINK2 от КеН, а также всё необходимое для разработки ПО (пробная версия пакета MDKARM имеется на прилаrаемом компактдиске). Более подробно об этом комплекте мож но узнать, обратившись на сайт компании National Instruments (www.пi.coт/arт). Вы можете использовать среду LabVIEW для написания проrрамм под любые микроконтроллеры с ядрами CortexM3 и ARM7. Однако в LabVIEW отсутствуют драйверы периферийных устройств для некоторых микроконтроллеров. В этом случае вам придёrся написать интерфейсный код на Си и использовать ero в про екте LabVIEW. 
364 · fлава 21. ПрОlраммuрованuе CortexM3 в LabVIEW Рис. 21.3. Отладочный комплект LabVIEW для процессора CortexM3. 21.3. Процесс разработки Процесс разработки приложения в среде LabVIEW обычно состоит из следую щих этапов (Рис. 21.4): · Создание проекта и виртуаЛЬНО20 инструмента. Для создания АRМпроекта можно воспользоваться мастером. На этом этапе производится настройка цe левой платформы и драйвера устройства. После создания проекта создаётся УI (обычно пустой). · Определение входов и выходов. Это MorYT быть как аппаратные интерфейсы микроконтроллера, так и пользовательские интерфейсы, запущенные на ПК, который подключён к системе. В случае аппаратных интерфейсов вам необхо димо будет определить их входы и выходы в качестве базовых средств ввода/ вывода, прежде чем вы сможете использовать их в своём виртуальном инстру менте. · Создание приложения с использованием rрафическоrо проrраммирования. · Компиляция проекта. · Симуляция виртуаЛЬНО20 инструмента. Созданный исполняемый образ мож но передать в среду MDKARM для проверки работоспособности приложе ния. · 3а2рузка в микроконтроллер и тестирование. По умолчанию проrрамма за rружается в микроконтроллер по завершении компиляции. Вы можете ис пользовать интерфейс LabVIEW для приостановки, останова или пошаrовоrо выполнения проrраммы. Вы также можете контролировать значения пере менных, щёлкая мышкой на соединениях во время исполнения проrраммы. 
21.3. Процесс разработки . 365 Симуляция Рис. 21.4. Пример процесса разработки. Каждый УI имеет два представления: . вид передней панели  содержит GUI виртуальноrо инструмента; . вид блоксхемы  служит рабочей областью для rрафическоrо проrраммиро вания. Коrда вы создаёте VI, он по умолчанию имеет пустую переднюю панель. Вы можете разместить на ней элементы управления и индикации, чтобы определить входы и выходы системы. Например, для предыдущеrо примера нахождения наибольшеrо целоrо из трёх источников и случайноrо значения передняя панель может выrлядеть так, как показано на Рис. 21.5. Рис. 21.5. Простая передняя панель для VI, показанноzо на Рис. 21.2. В вашем распоряжении имеется большое число библиотечных элементов управления и индикации. После добавления требуемых элементов на переднюю панель они появляются на блоксхеме. Далее вы можете изменить их параметры (например, используемые типы данных) и создать свою rрафическую проrрамму, объединив эти элементы с различными функциями LabVIEW. 
366 . Тлава 21. Проzраммuрованuе CortexM3 в LabVIEW 21.4. Пример использования среды LabVIEW 21.4.1. Соэдание проекта В данном подразделе мы создадим простое приложение, которое будет считы вать аналоrовый сиrнал и отображать ero в виде диаrраммы на ОLЕDдисплее. Воспользуемся мастером для создания HOBoro проекта: выберем на стартовом экране среды пункт more, а затем ARM project, как показано на Рис. 21.6. Теперь мы сможем создать пустой инструмент или воспользоваться существующим. В данном случае создадим новый VI. После этоrо выберем в качестве целевоrо устройства отладочную плату LM3S8962 (Рис. 21.7). crute New .I)esaiptioa. r:lrl !GdVl"'I! А: I ii Btank VI ! i i.[ ! I i ....." i i \.:.\ ,... PoIymorpbic VI Н I11 1 [БЬ From Temptate 11 ! 1I 1 ей Рюject !! i , R . : .\ . , I!I ! : j 111 1 \} Empty РrojЮ !!.1 :1 , j II! I 8 [:) r!t" from Wимd I1 LJ -u- · ; !I ! .  I1Instrument Driver Рюjedll ' , ! I I r:"'!r='!.LF:t jl 1 . ' . 1 . 1 IC'tiI! . II! I  = I' " , I В хControt 11 ! I [1 ! I '! ...,.1 II T'; . . .> '\] Ifr]Addtf):pr ! I I I '.C=:% . I I% i '' ;   . . '".,  ... .......  . .L. .. .. . .. .. . . ... .. ... . ._у . . . .'. ...,. Рис. 21.6. Создание HOBOZO проекта. МСВ2ЗОО МСВ2100 other Рис. 21.7. Выбор целевоzо устройства. 
21.4. Пример использования среды LabVIEW · 367 в результате указанных операций мастер проектов создает спецификацию, которая позволит запускать этот проект в симуляторе. Нам она не потребуется, поскольку мы работаем с реальной платой. В конце своей работы мастер сохраня ет созданный проект и пустой VI. 21.4.2. Определение ВХОДОВ и ВЫХОДОВ Следующий этап заключается в определении входов и выходов нашеrо прило жения. В данном случае нам необходимо определить только вход ADCO (OLED дисплей управляется библиотечными компонентами, поэтому нам не нужно описывать ero на данном этапе). Для выполнения указанной операции щёлкните правой кнопкой мыши на цели в окне проекта и выберите в контекстном меню пункт New > Elemental 1/0 (Рис. 21.8). После этоrо в окне New Elemental 1/0 определите требуемый вход, как показано на Рис. 21.9. Рис. 21.8. Определение базовоzо элемента ввода/вывода. 
368 · rлава 21. Проzраммuрованuе CortexM3 в LabVIEW AvaiWtJt.R8Ouкes $'" Digitallnput . DigitaI output Input дn Al2 АВ . PWМ output fВ DigOt вank Jnput ftj... Dфl вank Output ............... 1"' 1""-,, 1 ', < \, J (i ?'i\t):,,;; J "":..'.."..". ....H..<.... .Й .,'b.S'.,...'::;,:':.., . Х.. -$""",i:,' Рис. 21.9. Добавление базовоzо элемента ввода/вывода в проект. В этом окне имеются и друrие элементы ввода/вывода, такие как кнопки, CBe тодиоды, входы/выходы общеrо назначения (GPIO) и блоки широтно импульсноrо модулятора (PWM). Все они MorYT значительно упростить процесс разработки вашеrо проекта. 21.4.3. Соэдание nporpaMMbI Теперь мы можем приступить к описанию кода приложения в виде блок схемы. Среда LabVIEW имеет очень MHoro возможностей, которые просто физи чески невозможно рассмотреть в одной rлаве. К счастью, вместе со средой по ставляется подробная документация, а каждый элемент rрафическоrо проrрам мирования имеет контекстнозависимую подсказку. Чтобы просмотреть доступ ные компоненты, можно щёлкнуть правой кнопкой мыши в области блоксхемы (Рис. 21.10). Из рисунка видно, в частности, что в катеrории ARM имеется He сколько элементов управления ОLЕDдисплеями. 
21.4. Пример использования среды LabVIEW · 369 , \  ..,;;-- ; :. '11' ''''- '" r\' '"*'rr.. \i 'j'r, , , \ \' " '"' , :" . '" '" t.о\.l;'Ф<';" \.... \A.J t.f",;,.:;;w-I ' ,.' \ ''"'' j>1i:"::  2'," r ....  ,". "",' \" .." .,"" \"'.. "', ." щ,...."''"'''"',ц'"..... " . test.vi Eile, Edit ... efO 2PЩt /, Рис. 21.10. Доступ к функциям LabVIEW Помимо элементов управления ОLЕDдисплеями, в этой катеrории также можно найти базовые элементы ввода/вывода, модули интерфейсов CAN, I 2 C, SPI, а также функции управления прерываниями. Проrраммный код нашеrо приложения состоит из двух частей. В левой части блоксхемы будет расположен код, выполняющий следующие операции: . инициализация ОLЕDдисплея; . вывод на экран приветствия; . формирование небольшой задержки; . очистка экрана; . вывод в верхнюю часть экрана надписи «Analog Input О». 
370 · rлава 21. Проzрам.м.uрованuе CortexM3 в LabVIEW Большинство виртуальных инструментов, используемых в этой части про rpaMMbI, предназначены для оценочной платы LM3S8962 и содержатся в модуле «LabVIEW Emmbedded Module for ARM Microcontrollers» (Рис. 21.11). :r:! I ..... -,"" 1'::I -.:.s I ,,11 ,! :'"'"''....''''''' -: f .'"""': 1  l' "', .. 1IJ1.... . Н ........TI ! Рис. 21.11. Блоксхема npozpaMMbl осцuллоzрафа. В правой части блоксхемы мы расположим блок цикла While Loop, в KOTO ром отсчёты берутся с входа ADCO микроконтроллера и отображаются на экране в виде точки. При достижении координатой Х правоrо края ОLЕDдисплея она сбрасывается в О. Вычисленная позиция У также сохраняется в массиве. Этот массив содержит 128 элементов и используется для удаления cTaporo изображения перед рисова нием новой точки. 21.4.4. Компипяция nporpaMMbI и тестирование припожения После завершения разработки проrраммы нужно скомпилировать проrрам му и проверить её работоспособность. Сначала щёлкните левой кнопкой мыши на кнопке с изображением стрелки. Если проrрамма содержит ошибки, то изо бражение сменится на разломанную стрелку, показывая HeroTOBHOCTb проrрам мы. Щёлкнув на кнопке ещё раз, вы получите отчёт об ошибках, обнаруженных в проrрамме. После успешноrо завершения процесса компиляции проrрамма автоматиче ски заrружается в микроконтроллер и начинает выполняться. В нашем случае контроллер выводит осциллоrрамму для аналоrовоrо входа, как и было задумано (Рис. 21.12). 
21.5. Как это работает · 371 Рис. 21.12. Прuложенuе LabVIEW, 8blполняющееся на отладочной плате. 21.5. Как зто работает При компиляции проrраммы среда LabVIEW rенерирует Сикод для создан Horo виртуальноrо инструмента. Полученный код можно впоследствии скомпи лировать, используя пакет MDKARM (Рис. 21.13). Для реализации параллельной работы виртуальных инструментов полученный код использует библиотеку pe альноrо времени RealView RealTime Library (RLARM, www.keil.coт/arт/rlarт/). которая работает совместно с операционной системой RTX Real Time Kernel (www.keil.coт/arт/rlarт/kerпrl.asp) компании Keil. 
372 · [лава 21. Проzраммuрованuе CortexM3 в LabVIEW Рис. 21.13. Разработка приложения с использованием LabVIEW и ИСР !lVISION. Помимо мноrопоточности, ИСпользование библиотеки RLARM обеспечивает доступ к множеству драйверов, включая управление таймерами, стек протокола TCP/IP и стек протокола CAN. 21.6. Дополнительные возможности LabVIEW · Полухостинz. Среда LabVIEW поддерживает создание rрафических интер фейсов пользователя, запускаемых на хосте отладки (ПК). Эта возможность просто незаменима на этапе макетирования системы, поскольку разработка rрафическоrо интерфейса, работающеrо на микроконтроллере, может OKa заться весьма СЛОжной задачей. Библиотека LabVIEW содержит различные элементы пользовательскоrо интерфейса, такие как переключатели, ползунки и диаrраммы, позволяющие создавать профессиональные интерфейсы Bcero несколькими щелчками мыши. В рабочем режиме этот интерфейс (GUI) BЫ полняется на ПК, а данные передаются на работающий микроконтроллер че рез отладчик с использованием различных протоколов (JTAG, TSP/IP или Serial). Это позволяет управлять устройством и получать результаты ero рабо ты в реальном времени. · Интеzрация кода на Си. Среда LabVIEW допускает вставку Сикода в вирту альные инструменты. Это часто требуется при создании новых драйверов устройств и выполнения задач обработки данных, которые не MorYT быть pea лизованы с помощью имеющихся компонентов LabVIEW. · Отладка. Среда LabVIEW позволяет отлаживать приложения. Во время симу ляции или тестирования проекта вы можете использовать среду разработки УI в качестве отладчика, контролируя значения переменных при останове. В окне представления УI в виде блоксхемы предусмотрены кнопки паузы, по шаrовоrо выполнения, а также запуска профилирования значений (Рис. 21.14). 
21.6. Дополнительные возможности LabVIEW · 373 r . . . .... . .. . . . . ....... . ... . ... . .. .. .. . . . .. .. .. . .. .. . . . . . .. . t . e ..... st:2. . ..... . . . . . ... . vi . 8Iock . .. ...... . .. .. .... . . . . 0 ... . . . . . .. . .. . .. . . . . . ..... . .. . . . .. . .. 1".'..' 1< 1l  Фt - .. . ..Юjtct Qper.". '.IoOts Wi'...'. нtfp l,r-1.i-----..-.I:\лfi,I  -- - - - -   _# N. -  - - '. - - - - -   _т  -- - -- 1\ . '... .,. .., ,.,. I \ 11 1>1 !\I 11 I1 I1 11 11 1\;1 1$1 IARМСi-Щ l sc 1 1RfI. .."  :' Jst ri  1  1 [1 ;  ::1', ,11'.:.1. , Debug Controls: Run. Stop. Pause. Stepping control$ I Sm.fI de layl <\ [j] I Run continuo uslyl [!II 111 tf:St2. t..... Рис. 21.14. Отладка по блоксхеме VI. Кроме Toro, поскольку в составе ИСР Vision компании КеН имеется свой пол нофункциональный отладчик, вы можете отлаживать код приложения в нём (Рис. 21.15). '" ,; ..: .tI. 'f): _'GI!'i19  I '_9I'W,t I ...,.t 4 .. : . . .. . .. : . . . . .. . . . .. . . . .. 1II14,p f  ',( :'\ -М....< ,." J;>;;;.t ::0.' -М.A '...':: j;... : au.t; ft\;l f.Ш :' 'iЛ (JriIJ.{ ffJ . t))  1;.V1(..t..;.."t ,.-"s 1", 1J, }5 "'_t..V'Т -.о-- ..' 11.. i.. '"O\. ,.l..J J ,,....!oМt. i/)'!lMtl':!!»: cH1<1: .. tttltL: .. (bSb<>II1'i};;Z, Н I  ,r...t..f."...I1"H.0()9 .",t H4  1'1'l>h......H\, (A:r:a:!)i_...tl'!, t.lttht,..1'TP"") s , f>j.\.uжrМ.*'tI';..!:itj ,\t't>Ш,"'t;t:.l I :U: l' \11'11.".\"'11;" n;,; l00Ю: "'HO) .. 1r.V<::Qf.,J:' ....ц-. t...t..;-  - len th  I "....tnH.1AIt>.. 1 i t.,..1\.t Lt\",....ct, <! :.' z: ";; 100ft  ""ц 4, ,ir"C1.rt L".,.f....":\1.. f i..,Cr","'l '7.J" !'iz 1.vT{"<)"}, П; (1..;;,. i:. t.iM\; 7!,\t1!lЦ d.V.l' '" 'Ulb!t'J:IJ ; _.."HoII tiцooe,..t .I>lt I..lkt'" iIt.. .. I Ь.."'П.t.. ZeZl0.... <!.t 1 W, -\};' б' j Hd tcp!: н*tщ,.. . . \ф.1\t.e8>V.t......f 1 tt'II\f:' 1.&2:18., tt6de.tlD<!4 .:!. 1"!>i.cl...t..'t'" !tll!tOl:l:r:1I:cC l'oe W'itlq.C\l .\OI;i\r...llVlt..OiIJtt; f;&'t"'''; 1.4;f'Or, !1tll1oН .\ 'b.".;i'*toil:tcQe.tf;i...'...... t..1tt<lr;t.o f:tiltO i .\<*1';\ 1.*1111'\10 *l<t1 Itttil"f! 1.!\i,ЦП1 ttt\м-1 .:!. Рl\'''(:lщоt...rSNli" tt1t,.:r:a:cd t_ I 't\tto;let М''' "'1'..I!." Рис. 21.15. Отладка кода, cleHepupo8aHHolo LabVIEW, 8 ИСР flVisioп. 
374 · rлава 21. Проzрам.м.uрованuе CortexM3 в LabVIEW 21.7. Перенос проекта на друrие процессоры ARM Если вам недостаточно просто запустить приложение на отладочной плате, то вы можете портировать ero на друrие микроконтроллеры с процессором CortexM3 или на микроконтроллеры с друrим процессором компании ARM, поддерживаемые ядром реальноrо времени RTX RealTime Kernel. Как правило, перенос приложения состоит из следующих операций: · Портuрованuе ядра RTX RealTime Kerпel. При использовании устройств с процессором CortexM3 данный этап не требуется, поскольку процессор имеет всё необходимое для поддержки RTX RealTime Kernel. Если же вы соби раетесь задействовать микроконтроллер с ядром ARM7, то вам придётся BЫ полнить данную операцию. Хотя может получиться так, что порт ядра RTX RealTime Kernel для вашеrо микроконтроллера уже имеется в составе пакета MDKARM. Чтобы убедиться в этом, следует просмотреть содержимое папки \Keil\ARM\Startup. Если вы найдёте в данной папке файл RTX  Conf*.c для вашеrо микроконтроллера, значит, ядро ОС уже портировано на Hero. · Созданuе целu в LabVIEW и реzuстрация инструментария Keil. Этот этап можно выполнить, создав папку цели вручную. · Интеzрацuя отладочноzо модуля RealTime Ageпt Module. Вам может потребо ваться добавить параметры конфиrурации данноrо модуля в файл RTX config. с. · Разработка драйверов периферuи и устройств ввода/вывода. На этом этапе можно использовать редактор Element 1/0 Device Editor среды LabVIEW. Более подробно процесс переноса приложений описан в руководстве «LabVIEW Embedded for ARM Portiпg Guide», которое можно заrрузить с сайта компании National Instruments (httр://zопе.пi.сот/dеvzопе/сdа/tиt/р/id/б994). 
ПРИЛОЖЕНИЕ Д НАБОР КОМАНД CORTEXM3. СПРАВОЧНЫЙ МАТЕРИАЛ В этом приложении приведено описание набора команд СоrtехТММ3, взятое из руководства пользователя CortexM3 (данный материал воспроизводится с раз решения компании ARM). Приложение состоит из нескольких разделов. В двух первых разделах содержится информация общеrо характера: . краткое описание набора команд (раздел А.l); . соrлашения, используемые при описании команд (раздел А.2). Каждый из последующих разделов посвящён одной функциональной rруппе команд. Вместе эти разделы содержат описание всех команд, поддерживаемых процессором CortexM3: . команды доступа к памяти (раздел А.3); . общие команды обработки данных (раздел А.4); . команды умножения и деления (раздел А.5); . команды насыщения (раздел А.б); . команды работы с битовыми полями (раздел А.7); . команды управления и ветвления (раздел А.8); . прочие команды (раздел А.9). А.1. Краткое описание набора команд В процессоре реализован один из вариантов набора команд ThumЬ Ф . Все под держиваемые команды перечислены в Табл. A.l. Таблица A.l. Команды CortexM3 Мнемоника Операнды Краткое описание Флаrи Подраздел ADC, ADCS {Rd,} Rn, Ор2 Сложение с переносом N,Z,C,V А.4.1 ADD, ADDS {Rd,} Rn, Ор2 Сложение N,Z,C,V А.4.1 ADD, ADDW {Rd, } Rn, #imm12 Сложение N,Z,C,V А.4.1 ADR Rd, label 3arpY3Ka относительноrо адреса  А.З.1 AND, ANDS {Rd,} Rn, Ор2 Лоrическое И N,Z,C А.4.2 ASR, ASRS Rd, Rm, <Rs I #п> Арифметический сдвиr вправо N,Z,C А.4.3 В Label Переход  А.В.1 BFC Rd, #lsb, #width Очистка битовоrо поля  А.7.1 BFI Rd, Rn, #lsb, #width Вставка битовоrо поля  А.7.1 
376 · Приложение А. Набор команд CortexM3. Справочный материал Таблица А.l. Команды CortexM3 (продолжение) Мнемоника Операнды Краткое описание Флаrи Подраздел BIC, BICS {Rd, } Rn, Ор2 Очистка битов N,Z,C А.4.2 ВКРТ #imm Точка останова  А.9.! BL Label Переход со ссылкой  А.В.! BLX Rm Косвенный переход со ссылкой  А.В.! ВХ Rm Косвенный переход  А.В.! CBNZ Rn, label Сравнение и переход, если  А.В.2 результат не равен нулю CBZ Rn, label Сравнение и переход, если  А.В.2 результат равен нулю CLREX  Сброс монопольноrо доступа  А.З.9 CLZ Rd, Rm Подсчёт ведущих нулевых битов  А.4.4 CMN Rn, Ор2 Сравнение с отрицательным N,Z,C,V A.4.S операндом СМР Rn, Ор2 Сравнение N,Z,C,V A.4.S CPSID iflags Изменение состояния процессора,  А.9.2 запрещение прерываний CPSIE iflags Изменение состояния процессора,  А.9.2 разрешение прерываний DMB  Барьер памяти данных  А.9.З DSB  Барьер синхронизации данных  А.9.4 EOR, EORS {Rd, } Rn, Ор2 Исключающее ИЛИ N,Z,C А.4.2 ISB  Барьер синхронизации команд  A.9.S IT  Условный блок IFTHEN  А.В.З LDM Rn { ! } , reglist 3arpY3Ka нескольких реrистров  А.3.б с постинкрементом LDMDB, Rn { ! } , reglist 3arpY3Ka нескольких реrистров А.З.б  LDMEA с преддекрементом LDMFD, Rn { ! } , reglist 3arpY3Ka нескольких реrистров А.3.б  LDMIA с постинкрементом LDR Rt, [Rn, #offset] 3arpY3Ka слова в реrистр  А.3.2 LDRB, LDRBT Rt, [Rn, #offset] 3arpY3Ka байта в реrистр  А.3.2 LDRD Rt, Rt2, [Rn, #offset] 3arpY3Ka двух слов в реrистры  А.З.2 LDREX Rt, [Rn, #offset] Монопольная заrрузка в реrистр  А.3.В LDREXB Rt, [Rn] Монопольная заrрузка байта  А.З.В в реrистр LDREXH Rt, [Rn] Монопольная заrрузка полуслова  А.З.В в реrистр LDRH, LDRHT Rt, [Rn, #offset] 3arpY3Ka полуслова в реrистр  А.З.2 LDRSB, Rt, [Rn, #offset] 3arpY3Ka байта со знаком А.3.2  LDRSBT в реrистр LDRSH, Rt, [Rn, #offset] 3arpY3Ka полуслова со знаком А.З.2  LDRSHT в реrистр LDRT Rt, [Rn, #offset] 3arpY3Ka слова в реrистр  А.З.2 
А.l. Краткое описание набора команд . 377 Таблица А.l. Команды CortexM3 (продолжение) Мнемоника Операнды Краткое описание Флаrи Подраздел L8L, L8L8 Rd, Rm, <Rsl#n> Лоrический сдвиr влево N,Z,C А.4.3 L8R, L8R8 Rd, Rm, <Rs I #п> Лоrический сдвиr вправо N,Z,C А.4.3 MLA Rd, Rn, Rm, Ra Умножение со сложением, А.5.1 32битный результат  MLS Rd, Rn, Rm, Ra Умножение с вычитанием, А.5.1 32битный результат  MOV, MOVS Rd, Ор2 Пересылка N,Z,C А.4.6 MOVT Rd, #imm16 Пересылка старшеrо полуслова  А.4.7 MOVW, MOV Rd, # i mm 16 Пересылка 16битной константы N,Z,C А.4.6 MRS Rd, spec reg Пересылка из РСН в РОН  А.9.6 MSR spec reg, Rm Пересылка из РОН в рсн N,Z,C,V А.9.7 MUL, MULS Rd, Rn, Rm Умножение, 32битный результат N,Z А.5.1 MVN, MVNS Rd, Ор2 Пересылка с инверсией N,Z,C А.4.6 NOP  Нет операции  А.9.8 ORN, ORNS {Rd, } Rn, Ор2 Лоrическое ИЛИ с инверсией N,Z,C А.4.2 ORR, ORRS {Rd, } Rn, Ор2 Лоrическое ИЛИ N,Z,C А.4.2 РОР reglist Извлечение реrистра из стека  А.3.7 PUSH reglist Заrрузка реrистра в стек  А.3.7 RBIT Rd, Rn Перестановкабитов  А.4.8 REV Rd, Rn Перестановкабайтовслова  А.4.8 REV16 Rd, Rn Перестановка байтов в каждом  А.4.8 полуслове REV8H Rd, Rn Перестановка байтов в младшем  А.4.8 полуслове и расширение знака ROR, RORS Rd, Rm, <Rs I #п> Циклический сдвиr вправо N,Z,C А.4.3 RRX, RRXS Rd, Rm Расширенный циклический сдвиr N,Z,C А.4.3 вправо R8B, R8BS {Rd, } Rn, Ор2 Обратное вычитание N,Z,C,V А.4.1 SBC, SBCS {Rd, } Rn, Ор2 Вычитание с переносом N,Z,C,V А.4.1 SBFX Rd, Rn, #lsb, #width Извлечение битовоrо поля со знаком  А.7.2 8DIV {Rd,} Rn, Rm Знаковое деление  А.5.3 SEV  rенерация события  А.9.9 Знаковое умножение со сложени SMLAL RdLo, RdHi, Rn, Rm ем (32 х 32 + 64), 64битный pe  А.5.2 зультат SMULL RdLo, RdHi, Rn, Rm Знаковое умножение (32 х 32),  А.5.2 64битный результат S8AT Rd, #п, Rm {, shift #s} Знаковое насыщение Q А.6.1 STM Rn { ! } , reglist Сохранение нескольких  А.3.6 реrистров с постинкрементом STMDB, Rn { ! }, reglist Сохранение нескольких А.3.6  STMEA реrистров с преддекрементом 
378 · Приложение А. Набор команд CortexM3. Справочный материал Таблица А.l. Команды CortexM3 (продолжение) Мнемоника Операнды Краткое описание Флаrи Подраздел STMFD, Rn { ! } , reglist Сохранение нескольких А.3.6  STMIA реrистров с постинкрементом STR Rt, [Rn, #offset] Сохранение слова из реrистра  А.3.2 STRB, STRBT Rt, [Rn, #offset] Сохранение байта из реrистра  А.3.2 STRD Rt, Rt2, [Rn, #offset] Сохранение двух слов из  А.3.2 реrистров STREX Rd, Rt, [Rn, #offset] онопольноесохранениереrистра  А.3.В STREXB Rd, Rt, [Rn] онопольноесохранениебайта  А.3.В из реrистра STREXH Rd, Rt, [Rn] онопольноесохранение  А.3.В полуслова из реrистра STRH, STRHT Rt, [Rn, #offset] Сохранение полуслова из реrистра  А.3.2 STRT Rt, [Rn, #offset] Сохранение слова из реrистра  А.3.2 SUB, SUBS {Rd, } Rn, Ор2 Вычитание N,Z,C,V А.4.1 SUB, SUBW {Rd, } Rn, # imm12 Вычитание N,Z,C,V А.4.1 SVC #imm Вызов супервизора  А.9.10 SXTB Rd, Rm { , ROR #n} Расширение знака байта  А.7.3 SXTH Rd, Rm { , ROR #n} Расширение знака полуслова  А.7.3 ТВВ [Rn, Rm] Табличный переход  А.В.4 с однобайтными смещениями ТВН [Rn, Rm, LSL #1] Табличный переход  А.В.4 с двухбайтными смещениями TEQ Rn, Ор2 Проверка на равенство N,Z,C А.4.9 TST Rn, Ор2 Проверка битов N,Z,C А.4.9 UBFX Rd, Rn, #lsb, #width Извлечение беззнаковоrо А.7.2  битовоrо поля UDIV {Rd, } Rn, Rm Беззнаковое деление  А.5.3 Беззнаковое умножение со сложе UMLAL RdLo, RdH i, Rn, Rm нием (32 х 32 + 64), 64битный pe  А.5.2 зультат UMULL RdLo, RdHi, Rn, Rm Беззнаковое умножение (32 х 32),  А.5.2 64битный результат USAT Rd, #n, Rm {, shift #s} Беззнаковое насыщение Q А.6.1 UXTB Rd, Rm {,ROR #n} Дополнение нулями байта  А.7.3 UXTH Rd, Rm { , ROR #n} Дополнение нулями полуслова  А.7.3 WFE  Ожидание события  А.9.11 WFI  Ожидание прерывания  А.9.12 ПримечаНИJl: 1. В уrловых скобках указаны альтернативные формы операнда; в фиrурных скобках указаны необязательные операнды. 2. В столбце ((Операнды» таблицы приведены не все возможные варианты. 3. Операнд Ор2  ((rибкий» второй операнд, который может быть либо реrистром, либо константой. 4. С большинством команд может использоваться необязательный суффикс условия выполнения. Для получения более подробной информации обращайтесь непосредственно к описаниям команд. 
А.2. Соzлашения, используемые при описании команд · 379 А.2. Соrлашения, используемые при описании команд в этом разделе содержится более подробная информация об использовании команд: . операнды (подраздел А.2.1); . оrраничения на использование реrистров РС или SP (подраздел А.2.2); . «rибкий» второй операнд (подраздел А.2.3); . операции сдвиrа (подраздел А.2.4); . выравнивание адреса (подраздел А.2.5); . адресация относительно РС (подраздел А.2.6); . условное выполнение (подраздел А.2.7); . выбор разрядности команды (подраздел А.2.8). А.2.1. Операнды Операндом команды может быть реrистр, константа или же друrой параметр, специфичный для конкретной команды. Команда выполняет требуемые дей ствия над операндами и во мноrих случаях сохраняет результат в реrистр приёмник. При наличии в команде TaKoro реrистра он обычно указывается перед операндами. В некоторых командах операнды обладают определённой rибкостью в том смысле, что они MorYT быть как реrистрами, так и константами (см. подраздел А.2.3 «rибкий» второй операнд»). А.2.2. Оrраничения на использование реrистров РС или SP Мноrие команды имеют оrраничения на использование счётчика команд (РС) или указателя стека (SP) в качестве операндов или реrистраприёмника. Это бу дет указано при описании конкретных команд. примеЧdние Нулевой бит (бит [О]) любоrо адреса, который заrружается в РС командами ВХ, BLX, LOM, LOR или РОР, должен быть установлен в 1 для корректной работы про цессора, поскольку этот бит определяет требуемый набор команд, а процессор CortexM3 поддерживает только команды Thumb. А.2.3. «rибкий» второй операнд Мноrие команды обработки данных имеют «rибкий» второй операнд. В опи сании синтаксиса таких команд этот операнд обозначается как Operaпd2. Второй операнд Operaпd2 может быть: . константой; . реrистром снеобязательным сдвиrом (стр, 380). 
380 · Приложение А. Набор команд CortexM3. Справочный материал Константа Константа, используемая в качестве Operand2, записывается в виде: #coпstaпt rде coпstaпt может быть: · любой константой, которая может быть получена сдвиrом 8битноrо значения влево на произвольное число битов в пределах 32битноrо слова; · любой константой вида ОхООХУООХУ; · любой константой вида ОхХУООХУОО; · любой константой вида ОхХУХУХУХУ. примеЧQние в вышеприведённом описании символы Х и У обозначают шестнадцатерич ные числа. В некоторых командах coпstaпt может принимать значения из более широ Koro диапазона. Это будет указано особо в описании таких команд. Коrда константа используется в качестве BToporo операнда с командами MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ или TST, то в случае, если значение KOH станты больше 255 и оно может быть получено сдвиrом 8битноrо числа, во флаr переноса заносится значение 31ro бита константы. Если вторым операндом яв ляется любая друrая константа, то указанные команды не влияют на состояние флаrа переноса. Подстановка команд При указании константы с недопустимым значением используемый вами ac семблер может заменить команду на эквивалентную. Например, ассемблер может подставить вместо команды СМР Rd, #OxFFFFFFFE эквивалентную команду CMN Rd, #Ох02. Реrистр с необязатепьным сдвиrом В этом случае второй операнд записывается в виде: Rт {, shi ft} rде Rm shift реrистр, содержащий значение для BToporo операнда. необязательная операция сдвиrа, выполняемая над содержимым реrистра Rт. Для указания этой операции может использоваться одна из следующих мнемоник: ASR # п Арифметический сдвиr вправо на п битов, 1  п  32 LSL #п Лоrический сдвиr влево на п битов, 1  п  31 LSR #п Лоrический сдвиr вправо на п битов, 1  п  32 ROR #п Циклический сдвиr вправо на п битов, 1  п  31 RRX Расширенный циклический сдвиr вправо на 1 бит Если мнемоника отсутствует, то сдвиr не выполняется, эквивалентно LSL #0 
А.2. Соzлашения, используемые при описании команд . 381 Если операция сдвиrа отсутствует или задана операция 181 #0, то команда использует значение, находящееся в реrистре Rm. При указании операции сдвиrа она выполняется над содержимым реrистра Rm, а итоrовое 32битное значение используется в команде. Содержимое реrистра Rm при этом не изменяется. Некоторые команды при использовании реrистра со сдвиrом также изменяют состояние флаrа переноса. Более подробно операции сдвиrа и их влияние на флаr переноса рассматриваются в подразделе А.2.4 «Опе рации сдвиrа». А.2.4. Операции сдвиrа Операции сдвиrа реrистра выполняют сдвиr содержимоrо этоrо реrистра вправо или влево на заданное число битов (величина сдвиzа). Сдвиr реrистра MO жет осуществляться: . непосредственно командами A8R, 18R, 181, ROR и RRX с записью результата в реrистрприёмник; . при вычислении Operaпd2 командами, использующими в качестве BToporo операнда реrистр со сдвиrом (см. подраздел А.2.3 «rибкий» второй операнд»). Результат операции сдвиrа используется командой. Допустимые значения величины сдвиrа зависят как от типа сдвиrа, так и от команды (см. описание конкретных команд или подраздел А.2.3 «rибкий» второй операнд»). Если величина сдвиrа равна нулю, то сдвиr не осуществляется. Опера ции сдвиrа реrистра изменяют состояние флаrа переноса, за исключением тех случаев, коrда величина сдвиrа равна нулю. Далее приводятся описания различ ных операций сдвиrа и указывается влияние этих операций на флаr переноса. В данных описаниях Rm обозначает реrистр, содержащий сдвиrаемое число, а п  величину сдвиrа. Команда ASR Арифметический сдвиr вправо на п битов перемещает 32  п старших битов реrистра Rm на п позиций вправо, в 32  п младших битов результата. Исходный бит [31] реrистра копируется в п старших битов результата (Рис. A.l). Флаr переноса Q I I Рис. А.l. ASR #3. Операцию ASR #п можно использовать для деления содержимоrо реrистра Rm на 2 n с окруrлением результата к ближайшему меньшему целому. В случае команды A8RS или при использовании команды ASR #п во втором операнде команд MOV8, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ или TST во флаr переноса заrружается последний выдвинутый бит реrистра Rm, бит [пI]. 
382 · Приложение А. Набор команд CortexM3. Справочный материал ПримеЧQние . Если п  32, то во все биты результата помещается значение бита [31] реrистра Rm. · Если п  32 и операция влияет на флаr переноса, то в этот флаr заrружается значение бита [31] реrистра Rm. Команда LSR Лоrический сдвиr вправо на п битов перемещает 32  п старших битов реrи стра Rm на п позиций вправо, в 32  п младших битов результата. Старшие п битов результата обнуляются (Рис. А.2). I I I о о о 5 4 3 2 о Флаr переноса Q I I Рис. А.2. LSR #3. Операцию LSR #п можно использовать для деления содержимоrо реrистра Rm на 2 П , если содержимое реrистра рассматривается как целое число без знака. В случае команды LSRS или при использовании команды LSR #п во втором операнде команд MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ или TST во флаr переноса заrружается последний выдвинутый бит реrистра Rm, бит [пI]. ПримеЧQние · Если п  32, то все биты результата сбрасываются в о. · Если п  33 и операция влияет на флаr переноса, то он сбрасывается в о. Команда LSL Лоrический сдвиr влево на п битов перемещает 32  п младших битов реrистра Rm на п позиций влево, в 32  п старших битов результата. Младшие п битов pe зультата обнуляются (Рис. А.3). I I I I I о ю1т Флаr + + + I I I переноса  I I I о о о  ШddJ Рис. А.3. LSL #3. Операцию LSL #п можно использовать для умножения содержимоrо реrи стра Rm на 2 n , если содержимое реrистра рассматривается как целое число без зна ка или как целое число со знаком, представленное в дополнительном коде. При переполнении никаких предупреждений не выдаётся. 
А.2. Соzлашения, используемые при описании команд · 383 в случае команды 1S1S или при использовании команды 1S1 #п во втором операнде команд MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ или TST во флаr переноса заrружается последний выдвинутый бит реrистра Rm, бит [32п]. Эта операция не влияет на состояние флаrа переноса, если п = о. примеЧQние . Если п  32, то все биты результата сбрасываются в о. . Если п  33 и операция влияет на флаr переноса, то он сбрасывается в о. Команда ROR Циклический сдвиr вправо на п битов перемещает 32  п старших битов реrи стра Rm на п позиций вправо, в 32  п младших битов результата. Одновременно п младших битов реrистра копируются в п старших битов результата (Рис. А.4). . . . Флаr переноса Q I I Рис. А.4. ROR #3. в случае команды RORS или при использовании команды ROR #п во втором операнде команд MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ или TST во флаr переноса заrружается последний перемещённый бит реrистра Rm, бит [пI]. примеЧQние . Если п = 32, то результат равен содержимому реrистра Rm. При этом если опе рация влияет на флаr переноса, то в Hero заrружается значение бита [31] реrи стра Rm. . Операция ROR при величине сдвиrа п > 32 эквивалентна операции ROR с вели чиной сдвиrа, равной п  32. Команда RRX Расширенный циклический сдвиr вправо перемещает все биты реrистра Rm на одну позицию вправо и копирует содержимое флаrа переноса в бит [31] результа та (Рис. А.5). Флаr переноса qш _ .. Рис. А.5. RRX. в случае команды RRXS или при использовании команды RRX во втором опе ранде команд MOVS, MVNS, ANDS, ORRS, ORNS, EORS, BICS, TEQ или TST во флаr пере носа заrружается бит [О] реrистра Rm. 
384 · Приложение А. Набор команд CortexM3. Справочный материал А.2.5. Выравнивание адресов Под выровненным доступом понимают операции, в которых чтение и запись слов, двойных слов и более длинных последовательностей слов осуществляется по адресам, выровненным на rраницу слова, или же операции, при которых для обращения к полуслову используется адрес, выровненный на rраницу полуслова. Обращения к байтам выровнены по определению. Процессор CortexM3 поддерживает обращение к невыровненным данным только для следующих команд: · LDR, LDRT; · LDRH, LDRHT; · LDRSH, LDRSHT; · STR, STRT; · STRH, STRHT. Все остальные команды заrрузки и сохранения при обращении по HeBыpOB ненному адресу rенерируют исключение Usage Fault, поэтому они должны ис пользоваться только с выровненными адресами. Обращения к невыровненным данным, как правило, осуществляются медлен нее, чем к выровненным. Кроме Toro, некоторые области адресноrо пространства MorYT не поддерживать обращение по невыровненным адресам. В связи с этим компания ARM рекомендует всеrда использовать выровненные данные. Для пе рехвата непреднамеренных обращений по невыровненным адресам использует ся бит UNALIGNTRP реrистра CCR, разрешающий формирование исключения Usage Fault для всех обращений по невыровненным адресам. А.2.6. Адресация относительно РС Выражение, определяемое относительно значения счётчика команд РС, или, иначе, метка, является идентификатором, представляющим адрес команды или константы. В командах это выражение хранится в виде смещения относительно значения счётчика команд. Ассемблер автоматически вычисляет требуемое CMe щение, исходя из адреса метки и адреса текущей команды. Если величина смеще ния получается слишком большой, то ассемблер выдаёт сообщение об ошибке. примеЧQние · Для команд В, BL, CBNZ и CBZ значением Ре является адрес команды плюс 4 байта. · Для большинства прочих команд, использующих метки, значением Ре явля ется адрес команды плюс 4 байта, при этом бит [1] результата сбрасывается в о для выравнивания адреса по rранице слова. · В используемом вами ассемблере для выражений, определяемых относитель но ре, MorYT использоваться друrие формы записи, скажем метка плюс/минус число или запись вида [РС, #nurnber]. 
А.2. Соzлашения, используемые при описании команд · 385 А.2.7. Условное выпопнение Большинство команд обработки данных MorYT опционально изменять флаrи условий реrистра состояния прикладной проrраммы APSR в соответствии с pe зультатом операции. Одни команды влияют на все флаrи, друrие  только на He которые из них. Если команда не влияет на флаr, то ero состояние остаётся неиз менным. Чтобы узнать, на какие флаrи влияет та или иная команда, обратитесь к её описанию. Команда может быть выполнена условно в соответствии со значением флаrов, изменённых друrой командой, либо сразу же после команды, изменившей флаrи, либо после нескольких промежуточных команд, не влияющих на состояние фла rOB условий. Условное выполнение реализуется командами условноrо перехода либо добав лением к мнемонике обычных команд суффиксов, определяющих условие выпол нения команды. Все эти суффиксы перечислены в Табл. А.2. Код условия, опреде ляемый суффиксом, позволяет процессору проверять соответствие состояния флаrов заданному условию. Если код условия условно выполняемой команды не соответствует состоянию флаrов, то команда: . не выполняется; . ничеrо не сохраняет в реrистреприёмнике; . не воздействует ни на какие флаrи; . не rенерирует никаких исключительных ситуаций. Таблица А.2. Суффиксы условия выполнения Суффикс Флаrи Значение EQ Z=1 Равно NE Z=O Не равно е8 или Н8 С=1 Выше или равно (беззнаковое «») ее или LO с=о Ниже (беззнаковое «<») MI N= 1 Отрицательный результат PL N=O Положительный результат либо ноль V8 У=1 Переполнение ve у=о Нет переполнения HI С=lиZ=О Выше (беззнаковое «>>» L8 С = О или Z = 1 Ниже или равно (беззнаковое «») GE N=V Больше или равно (знаковое «») LT N;tV Меньше (знаковое «<») GT Z=ОиN=V Больше (знаковое «>>» LE Z=lиN;tV Меньше или равно (знаковое «») AL Безразлично Всеrда; действие по умолчанию при отсутствии суффикса Условно выполняемые команды, за исключением команд условных переходов, должны располаrаться внутри блока команд IFTHEN. Дополнительная информа ция о команде 1Т и оrраничения на её использование приведены в описании этой команды (см. подраздел А.8.З). 
386 · Приложение А. Набор команд CortexM3. Справочный материал Если это предусмотрено разработчиком ассемблера, то последний может aB томатически вставлять команду IT при обнаружении условно выполняемых KO манд вне Iтблока. Для сравнения содержимоrо реrистра с нулем и перехода соrласно результату используйте команды CBZ и CBNZ. Далее в этом подразделе описываются: · Флаrи условия · Суффиксы условия выполнения Фпаrи усповия В реrистре APSR содержатся следующие флаrи условия: N Устанавливается в 1, если результат операции был отрицателен, иначе сбрасывается в о. z Устанавливается в 1, если результат операции был равен нулю, иначе сбрасывается в о. с Устанавливается в 1, если в результате операции произошёл перенос, ина че сбрасывается в о. v Устанавливается в 1, если в результате операции произошло переполне ние, иначе сбрасывается в о. Перенос возникает: · если результат сложения больше или равен 232; · если результат вычитания положителен или равен нулю; · в результате работы внутренней схемы циклическоrо сдвиrа при выполнении команд пересылки данных или команд лоrических операций. Переполнение возникает, коrда знак результата, содержащийся в бите [31], OT личается от знака, который получился бы при бесконечно большой точности, Ha пример: · если при сложении двух отрицательных чисел получается положительное число; · если при сложении двух положительных чисел получается отрицательное число; · если при вычитании положительноrо числа из отрицательноrо получается по ложительное число; · если при вычитании отрицательноrо числа из положительноrо получается OT рицательное число. Операции сравнения полностью эквивалентны командам вычитания (в слу чае СМР) или сложения (в случае CMN), за исключением Toro, что результат опера ции не сохраняется. Для получения более подробной информации обратитесь к описанию команд. примеЧQние Большинство команд изменяют флаrи состояния только в том случае, если в мнемонике команды указан суффикс S (см. описание команд). 
А.2. СО2лашения, используемые при описании команд · 387 Суффиксы УСl10ВИЯ ВЫПОl1нения Команды, допускающие условное выполнение, имеют необязательное поле KO да условия, определяемоrо двухсимвольным суффиксом {coпd}. Условное BЫ полнение требует предварительноrо выполнения команды 1Т. Команда, содержа щая код условия, выполняется только в том случае, если состояние флаrов усло вий реrистра APSR соответствует заданному условию. Все допустимые суффиксы условия выполнения приведены в Табл. А.2. ДЛЯ уменьшения числа команд переходов в коде проrраммы можно использо вать условное выполнение команды 1Т. Также в Табл. А.2 показана взаимосвязь между суффиксами условия выполнения и флаrами N, Z, С и у. В Примере А.l показано использование условно выполняемой команды для вычисления абсолютноrо значения числа RO == ABS (Rl). В Примере А.2 показано использование условно выполняемых команд для из менения реrистра R4 в том случае, если значение RO больше Rl и R2 больше R3. Пример А.1. АБСОl1ютное значение MOVS IT RSBMI RO, Rl MI RO, Rl, #0 RO  Rl, изменяет состояние флаrов IT  пропускает следующую команду, если значение >O Если значение < О, то RO  Rl Пример А.2. Сравнение и изменение значения смр RO, Rl Сравниваем RO и Rl ITT GT IT  про пускаем две следующие команды, если условие GT не выполняется CMPGT R2, RЗ Если «больше», сравниваем R2 и RЗ, устанавливаем флаrи MOVGT R4, R5 Если всё ещё «больше», копируем R4  R5 А.2.8. Выбор разрядности команды Мноrие команды MorYT формировать как 16, так и 32битный машинный код в зависимости от используемых операндов и реrистраприёмника. Для HeKOTO рых из этих команд можно явно задать разрядность с помощью специальноrо суффикса. Суффикс . w указывает на необходимость rенерации 32битноrо кода, а суффикс . N  16битноrо кода. Если ассемблер не сможет сформировать машинный код заданной разрядно сти, то он выдаст сообщение об ошибке. примеЧQние Иноrда явное указание суффикса . W необходимо; например, если операнд яв ляется меткой или константой, как в случае команд перехода. Эта необходимость обусловлена тем, что ассемблер может оказаться не в состоянии автоматически сrенерировать машинный код требуемой разрядности. При использовании суффикса, определяющеrо разрядность команды, он по мещается непосредственно после мнемоники команды и суффикса условия BЫ полнения, при наличии последнеrо. В Примере А.3 показана запись команды с использованием суффикса разрядности. 
388 · Приложение А. Набор команд CortexM3. Справочный материал Пример А.3. Явное указание разрядности команды BCS.W label ADDS.W RO, RO, Rl rенерирует З2битный код даже для KopoTKoro перехода ; rенерирует З2битный код, даже если та же самая операция может быть выполнена 16битной командой А.3. Команды доступа к памяти Все поддерживаемые команды доступа к памяти перечислены в Табл. А.3. Таблица А.3. Команды доступа к памяти Мнемоника Краткое описание Подраздел AOR rенерация относительноrо адреса А.З.!. ADR CLREX Сброс монопольноrо доступа А.3.9. CLREX LOM {mode} 3аrрузка нескольких реrистров А.3.6. LDM и STM LOR{type} 3аrрузка реrистра с использованием А.З.2. LDR и STR, непосредственноrо смещения непосредственное смещение LOR{type} 3аrрузка реrистра с использованием А.3.З. LDR и STR, реrистровое смещения в реrистре смещение LOR{type}T 3аrрузка реrистра в непривилеrированном А.ЗА. LDR и STR, режиме непривилеrированный доступ LOR 3аrрузка реrистра с использованием А.З.5. LDR, относительная относительноrо адреса адресация LOREX{type} Монопольная заrрузка реrистра А.3.8. LDREX и STREX РОР Извлечение реrистра из стека А.3.7. PUSH и РОР PUSH 3аrрузка реrистра в стек А.З.7. PUSH и РОР STM {mode} Сохранение нескольких реrистров А.3.6. LDM и STM STR{type} Сохранение реrистра с использованием А.3.2. LDR и STR, непосредственноrо смещения непосредственное смещение STR{type} Сохранение реrистра с использованием А.З.3. LDR и STR, реrистровое смещения в реrистре смещение STR{type}T Сохранение реrистра А.3.4. LDR и STR, в непривилеrированном режиме непривилеrированный доступ STREX{type} Монопольное сохранение реrистра А.3.8. LDREX и STREX А.3.1. ADR rенерация относительноrо адреса. Синтаксис ADR{coпd} Rd, label rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистр приёмник. Rd 
А.3. Команды доступа к памяти · 389 label выражение, определяемое относительно РС; см. подраздел А.2.6 «Адресация относительно РС». Операция Команда ADR формирует адрес, прибавляя непосредственное значение к зна чению счётчика команд РС, и сохраняет результат в реrистреприёмнике. Эта команда упрощает rенерацию переместимоrо кода, поскольку адрес в дaH ном случае задаётся относительно значения РС. Если команда ADR предназначена для формирования адреса, используемоrо командами ВХ или BLX, то проrрам мист должен rарантировать, что бит [О] полученноrо адреса будет установлен в 1. Значение label должно находиться в пределах от 4095 до +4095 относитель но адреса в счётчике команд. примеЧQние Для использования Bcero диапазона значений смещения или для формирова ния адресов, не выровненных на rраницу слова, может потребоваться использо вание суффикса .w (см. подраздел А.2.8 «Выбор разрядности команды»). Оrраничения Rd не должен быть SP либо РС. Флаrи условия Команда не влияет на состояние флаrов. Пример ADR Rl, TextMessage Заносит в Rl адрес ячейки памяти, обозначенной меткой TextMessage А.3.2. LDR и STR, непосредсувенное смещение Заrрузка и сохранение реrистров с непосредственным смещением и пред или постиндексацией. Синтаксис ор{ type} {cond} Rt, [ Rn {, # о f f s е t} ] Непосредственное смещение ор{ type} {cond} Rt, [Rn, #offset]! Прединдексация ор{ type} {cond} Rt, [Rn], #offset Постиндексация opD { cond} Rt, Rt2, [ Rn {, # о f f s е t} ] Непосредственное смещение, два слова opD{cond} Rt, Rt2, [Rn, #offset]! Прединдексация, два слова opD{cond} Rt, Rt2, [Rn], #offset Постиндексация, два слова rде ар операция: LDR 3arpY3Ka реrистра STR Сохранение реrистра 
390 · Приложение А. Набор команд CortexM3. Справочный материал type тип операнда: В Беззнаковый байт) при заrрузке дополняется нулями до 32битноrо значения SB Знаковый байт) расширяется до 32битноrо значения (только LDR) Н Беззнаковое полуслово) при заrрузке дополняется HY лями до 32битноrо значения SH Знаковое полуслово) расширяется до 32битноrо значе ния (только LDR) Не указан) тип операнда  слово необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». заrружаемый или сохраняемый реrистр. реrистр) содержащий базовый адрес. смещение относительно Rn. Если смещение не указано, то адрес равен содержимому Rn. дополнительный реrистр для заrрузки или сохранения двойных слов. cond Rt Rn offset Rt2 Операция Команды LDR заrружают один или два реrистра данными из памяти. Команды STR сохраняют содержимое одноrо или двух реrистров в памяти. Команды заrрузки и сохранения с непосредственным смещением MorYT ис пользовать следующие режимы адресации. Относuтельная адресация Величина смещения прибавляется или вычитается из адреса) находящеrося в реrистре Rn. Результат используется в качестве адреса) по которому произво дится обращение к памяти. Реrистр Rn не изменяется. Синтаксис языка ассембле ра для этоrо режима адресации имеет вид: [Rп, #offset] Адресацuяспредuндексuрованuем Величина смещения прибавляется или вычитается из адреса) находящеrося в реrистре Rn. Результат используется в качестве адреса) по которому произво дится обращение к памяти) и сохраняется в реrистре Rn. Синтаксис языка acceM блера для этоrо режима имеет вид: [Rп, #offset]! Адресацuяспосmuндексuрованuем Значение) находящееся в реrистре Rп, используется в качестве адреса) по KOTO рому производится обращение к памяти. После выполнения операции величина смещения прибавляется или вычитается из этоrо значения и результат сохраня ется в реrистре Rn. Синтаксис языка ассемблера для данноrо режима имеет вид: 
А.3. Команды доступа к: памяти · 391 [Rп], #offset 3аrружаемое или сохраняемое значение может иметь разрядность байт) полу слово, слово или двойное слово. В командах заrрузки байты и полуслова MorYT быть как знаковыми) так и беззнаковыми (см. подраздел А.2.5 «Выравнивание адреса»). Допустимые значения смещения для всех режимов адресации приведены в Табл. А.4. Таблица А.4. Допустимые значения смещения Тип операнда Непосредственное Прединдексирование Постиндексирование смещение Слово, полуслово (со знаком и без знака), байт 255.. .4095 255.. .255 255.. .255 (со знаком и без знака) Кратное 4 Кратное 4 в диапазоне Кратное 4 в диапазоне Двойное слово в диапазоне  1020.. .1020 1020...1020  1020.. .1020 Оrраничения Для команд заrрузки: . Rt может быть SP или Ре только в командах заrрузки слова. . Rt должен отличаться от Rt2. . Rn должен отличаться от Rt и Rt2 в режимах с пред и постиндексированием. При использовании Ре в качестве Rt в команде заrрузки двойноrо слова: . бит [О] заrружаемоrо значения должен быть установлен в 1 для KoppeKTHoro выполнения команды; . переход производится по адресу) получаемому сбросом бита [О] заrруженноrо значения в О; . если команда условно выполняемая) то она должна быть последней командой в Iтблоке. Для команд сохранения: . Rt может быть SP только в командах сохранения двойноrо слова. . Rt не должен быть Ре. . Rn не должен быть Ре. . Rn должен отличаться от Rt и Rt2 в режимах с пред и постиндексированием. Фпаrи условий Команда не влияет на состояние флаrов. Примеры STR R2, [R9,#conststruc] Заrружает R8 из памяти по адресу, находящемуся в RI0 Заrружает (условно) R2 из слова, расположенноrо со смещением +960 байт относительно адреса, находящеrося в R5, и увеличивает R5 на 960 ; conststruc  это выражение, результатом KOToporo LDR R8, [RIO] LDRNE R2, [R5, #960]! 
392 · Прuложенuе А. Набор команд CortexM3. Справочный материал ; STRH R3, [R4], #4 . , LDRD R8, R9, [R3, #Ох20] ; является константа из диапазона 0...4095 Сохраняет R3 как полуслово по адресу, находящемуся в R4, затем увеличивает R4 на 4 Заrружает R8 и R9 из слов, расположенных со смещениями +32 байта и +36 байт соответственно относительно адреса, находящеrося в R3 Сохраняет RO по адресу, находящемуся в R8, а Rl  в слове памяти по адресу, который на 4 байта больше адреса, находящеrося в R8, после чеrо уменьшает R8 на 16 STRD RO, Rl, [R8], #16 А.3.3. LDR и STR, реrИСТрО80е смещение Заrрузка и сохранение реrистров с реrистровым смещением. Синтаксис op{type}{coпd} Rt, [Rп, Rт {, LSL #п}] rде ар операция: LDR Заrрузка реrистра STR Сохранение реrистра тип операнда: В Беззнаковый байт, при заrрузке дополняется нулями до 32битноrо значения SB Знаковый байт, расширяется до 32битноrо значения (только LDR) Н Беззнаковое полуслово, при заrрузке дополняется HY лями до 32битноrо значения SH Знаковое полуслово, расширяется до 32битноrо значе ния (только LDR) Не указан, тип операнда  слово необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». заrружаемый или сохраняемый реrистр. реrистр, содержащий базовый адрес. реrистр, содержащий смещение. необязательный сдвиr, О  п  3. type caпd Rt Rn Rm LSL #п Операция Команды LDR заrружают один реrистр данными из памяти. Команды STR сохраняют содержимое одноrо реrистра в памяти. Адрес памяти для заrрузки или сохранения данных задаётся относительно базовоrо адреса, находящеrося в реrистре Rп. Величина смещения определяется 
А.3. Команды доступа к памяти · 393 содержимым реrистра Rm, которое может быть сдвинуто на 0...3 бита влево по средством команды L8L. 3аrружаемое или сохраняемое значение может иметь разрядность байт, полу слово или слово. В командах заrрузки байты и полуслова MorYT быть как знако выми, так и беззнаковыми (см. подраздел А.2.5 «Выравнивание адреса»). Оrранмчения . Rn не должен быть Ре. . Rm не должен быть SP или РС. . Rt может быть SP или Ре только в командах заrрузки/сохранения слова. . Rt может быть Ре только в командах заrрузки слова. При использовании РС в качестве Rt в команде заrрузки слова: . бит [о] заrружаемоrо значения должен быть установлен в 1 для KoppeKTHoro выполнения команды; переход осуществляется по этому адресу, BыpOBHeHHO му на rраницу полуслова; . если команда условно выполняемая, то она должна быть последней командой в Iтблоке. Флаrм условий Команда не влияет на состояние флаrов. Примеры 5TR RO, [R1, R2, 151 #2] Сохраняет содержимое RO по адресу, равному R5 + R1 Заrружает однобайтное значение с адреса, paBHoro R5 + 2*R1, выполняет расширение знака ; до размера слова и помещает результат в RO Сохраняет RO по адресу, равному R1 + 4*R2 5TR RO, [R5, R1] 1DR5B RO, [R5, R1, 151 #1] А.3.4. LDR и STR, непривилеrированный доступ 3аrрузка и сохранение реrистров на непривилеrированном уровне доступа. Синтаксис ор{ type} Т {coпd} Rt, [Rп {, #offset}] rде Непосредственное смещение type операция: LDR 3аrрузка реrистра 8TR Сохранение реrистра тип операнда: В Беззнаковый байт, при заrрузке дополняется нулями до 32битноrо значения SB Знаковый байт, расширяется до 32битноrо значения (только LDR) ар 
394 · Приложение А. Набор команд CortexM3. Справочный материал cond н Беззнаковое полуслово, при заrрузке дополняется HY лями до 32битноrо значения SH Знаковое полуслово, расширяется до 32битноrо значе ния (только LDR) Не указан, тип операнда  слово необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». заrружаемый или сохраняемый реrистр. реrистр, содержащий базовый адрес. смещение относительно Rn (от О до 255). Если смещение не указа но, то адрес равен содержимому Rn. Rt Rn offset Операция Эти команды выполняют те же операции, что и команды доступа к памяти с непосредственным смещением (см. подраздел А.3.2 «LDR и STR, непосредствен ное смещение»). Отличие заключается в том, что эти команды осуществляют об ращение к памяти исключительно на непривилеrированном уровне, даже в коде, выполняющемся в привилеrированном режиме. При использовании в коде, выполняющемся в непривилеrированном режиме, эти команды полностью идентичны обычным командам доступа к памяти с He посредственным смещением. Оrраничения · Rn не должен быть Ре. · Rt не должен быть SP или РС. Фпаrи условий Команда не влияет на состояние флаrов. Примеры STRBTEQ R4, [R7] Сохраняет (условно) младший значащий байт содержимоrо R4 по адресу, содержащемуся в R7, на непривилеrированном уровне Заrружает в R2 полуслово с адреса, paBHoro R8 + 8, на непривилеrированном уровне LDRHT R2, [R2, #8] А.3.5. LDR, относительная адресация Заrрузка реrистра из памяти. Синтаксис LDR{type} {coпd} Rt, label LDRD{coпd} Rt, Rt2, label Заrрузка двух слов 
А.3. Команды доступа к памяти · 395 rде type coпd тип операнда: В Беззнаковый байт, при заrрузке дополняется нулями до 32битноrо значения SB Знаковый байт, расширяется до 32битноrо значения (только LDR) Н Беззнаковое полуслово, при заrрузке дополняется HY лями до 32битноrо значения SH Знаковое полуслово, расширяется до 32битноrо значе ния (только LDR) Не указан, тип операнда  слово необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». заrружаемый или сохраняемый реrистр. дополнительный реrистр для заrрузки двойноrо слова. выражение, определяемое относительно Ре; см. подраздел А.2.6 «Адресация относительно Ре». Rt Rt2 label Операция Команда LDR заrружает в реrистр данные из памяти. Адрес ячейки памяти определяется меткой (смещением относительно Ре). Заrружаемое значение может иметь разрядность байт, полуслово или слово. Байты и полуслова MorYT быть как знаковыми, так и беззнаковыми (см. подраздел А.2.5 «Выравнивание адреса»). Значение label должно находиться в допустимом для данной команды диа пазоне. Допустимые величины смещения label относительно Ре указаны в Табл. А.5. Таблица А.5. Допустимые значения смещения Тип операнда ДиапаЗ0Н значений смещения Слово, полуслово (со знаком и без знака), 4095.. .+4095 байт (со знаком и без знака) Двойное слово  1020...+ 1020 примеЧQние Для использования Bcero диапазона значений смещения может потребовать ся использование суффикса . W (см. подраздел А.2.8 «Выбор разрядности KOMaH ды»). Оrраничения . Rt может быть SP или РС только в командах заrрузки слова. . Rt2 не должен быть SP или Ре. . Rt должен отличаться от Rt2. 
396 · Приложение А. Набор команд CortexM3. Справочный материал При использовании Ре в качестве Rt в команде заrрузки двойноrо слова: · бит [О] заrружаемоrо значения должен быть установлен в 1 для KoppeKTHoro выполнения команды; переход осуществляется по этому адресу, BыpOBHeHHO му на rраницу полуслова; · если команда условно выполняемая, то она должна быть последней командой в Iтблоке. Флаrи условий Команда не влияет на состояние флаrов. Примеры LDR RO, LookUpTable ; LDRSB R7, localdata Заrружает в RO слово, расположенное по адресу, помеченному меткой LookUpTable Считывает байт с адреса, помеченноrо меткой localdata, выполняет расширение знака до размера слова и помещает результат в R7 А.3.6. LDM и STM 3аrрузка и сохранение нескольких реrистров. Синтаксис op{addrтode}{coпd} Rп{!}, reglist rде ар операция: LOM 3аrрузка нескольких реrистров STM Сохранение нескольких реrистров addr тade режим адресации: IA Инкрементирование адреса после каждоrо обращения к памяти (режим по умолчанию) ОБ Декрементирование адреса перед каждым обращением к памяти cand необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистр, содержащий базовый адрес. необязательный суффикс обратной записи. При наличии в MHeMO нике команды символа «!» последний адрес, по которому произ водилось чтение или запись данных, сохраняется в реrистре Rn. список из одноrо или нескольких реrистров, заrружаемых из па мяти или сохраняемых в памяти, заключённый в фиrурные скоб ки. Может включать в себя диапазоны реrистров. При наличии в списке более одноrо реrистра или диапазона реrистров элемен ты списка разделяются запятыми (см. пункт «Примеры» данноrо подраздела). Rn reglist 
А.3. Команды доступа к памяти · 397 . LDM и LDMFD являются синонимами LDMIA. Мнемоника LDMFD указывает на использование данной команды для извлечения данных из «полноrо» убыва ющеrо стека. . LDMEA является синонимом LDMDB и указывает на использование данной KO манды для извлечения данных из «пустоrо» возрастающеrо стека. . STM и STMEA являются синонимами STMIA. Мнемоника STMEA указывает на использование данной команды для помещения данных в «пустой» возраста ющий стек. . STMFD является синонимом STMDB и указывает на использование данной KO манды для помещения данных в «полный» убывающий стек. Операция Команды LDR заrружают в реrистры, указанные в reglist, слова из памяти, начиная с адреса, указанноrо в Rл. Команды STM сохраняют содержимое реrи стров, указанных в reglist, в памяти, начиная с адреса, указанноrо в Rл. Для команд LDM, LDMIA, LDMFD, STM, STMIA и STMEA адреса ячеек памяти, по которым производятся обращения, располаrаются в диапазоне от Rл до Rл + 4 * (л 1) с интервалом в 4 байта, rде л  число реrистров в reglist. Обра щения к памяти производятся в порядке возрастания номеров реrистров, при этом реrистру с наименьшим номером соответствует самый младший адрес, а pe rистру с наибольшим номером  самый старший адрес. При наличии в MHeMO нике команды суффикса, разрешающеrо обратную запись, значение Rл + 4 * (лl) сохраняется в реrистре Rл. Для команд LDMDB, LDMEA, STMDB и STMFD адреса ячеек памяти, по которым производятся обращения, располаrаются в диапазоне от Rл до Rл  4 * (л  1) с ин тер валом в 4 байта, rде л  число реrистров в reglist. Обращения к памяти про изводятся в порядке убывания номеров реrистров, при этом реrистру с наиболь шим номером соответствует самый старший адрес, а реrистру с наименьшим HO мером  самый младший адрес. При наличии в мнемонике команды суффикса, разрешающеrо обратную запись, значение Rл  4 * (л  1) сохраняется в реrистре Rл. Подобные мнемоники MorYT быть использованы для записи команд PUSH и РОР; см. подраздел А.3.7 «PUSH и РОР». Оrраничения . Rл не должен быть Ре. . reglist не должен содержать SP. . Rt должен отличаться от Rt2. . В любой команде STM reglist не должен содержать Ре. . в любой команде LDM reglist не должен содержать ре, если в нём содержит ся LR. . reglist не должен содержать Rп, если в команде указан суффикс обратной за писи. 
398 · Приложение А. Набор команд CortexM3. Справочный материал При наличии РС в reglist команды LDM: · бит [О] заrружаемоrо значения должен быть установлен в 1 для KoppeKTHoro выполнения команды; переход осуществляется по этому адресу, BыpOBHeHHO му на rраницу полуслова; · если команда условно выполняемая, то она должна быть последней командой в 1 тблоке. Флаrи условий Команда не влияет на состояние флаrов. Примеры LOM R8, {RO,R2,R9} STMOB Rl!, {RЗRб,Rll,R12} LOMIA  синоним для LOM Примерынеправильнойзаписи STM LOM R5 !, {R5 , R4 , R9 } R2 , {} Значение, сохраняемое в R5, непредсказуемо В списке должен находиться хотя бы один реrистр А.3.7. PUSH и РОР Заrрузка реrистров в стек и извлечение реrистров из стека (<<полный» убываю щий стек). Синтаксис PUSH{coпd} reglist POP{coпd} reglist rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». reglist непустой список реrистров, заключённый в фиrурные скобки. Может включать в себя диапазоны реrистров. При наличии в спи ске более одноrо реrистра или диапазона реrистров элементы спи ска разделяются запятыми. Команды PUSH и РОР являются синонимами для команд STMDB и LDM (или LDMIA), использующих в качестве реrистра базовоrо адреса реrистр SP и сохраня ющих в этом реrистре последний адрес. В таких случаях предпочтительно ис пользовать мнемоники PUSH и РОР. Операция Команда PUSH сохраняет содержимое реrистров в стеке, при этом реrистр с наименьшим номером сохраняется в слове памяти с самым младшим адресом, а реrистр с наибольшим номером  в слове с самым старшим адресом. Команда РОР заrружает реrистры из стека, при этом реrистр с наименьшим номером заrружается из слова памяти с самым младшим адресом, а реrистр с наибольшим HOMepo  из слова с самым старшим адресом. 
А.3. Команды доступа к памяти · 399 Старшим адресом для команды PUSH является содержимое реrистра SP, YMeHЬ шенное на 4, а младшим адресом для команды РОР  содержимое реrистра SP, т.е. эти команды реализуют «полный» убывающий стек. После завершения операции команда PUSH изменяет реrистр SP таким образом, чтобы тот указывал на слово памяти, в котором был сохранён реrистр с наименьшим номером. Команда РОР после завершения операции изменяет реrистр SP таким образом, чтобы тот YKa зывал на слово памяти, расположенное выше Toro слова, из KOToporo был считан реrистр с наибольшим номером. Если в списке reglist команды РОР присутствует реrистр Ре, то переход по соответствующему адресу будет произведён после завершения команды РОР. При этом бит [О] считанноrо из стека значения заносится в бит Т реrистра APSR. ДЛЯ корректной работы процессора указанный бит должен быть установлен в 1. Для получения дополнительной информации см. подраздел А.3.б «LDM и STM». Оrраничения . reglist не должен содержать SP. . reglist команды PUSH не должен содержать Ре. . reglist команды РОР не должен содержать РС, если в нём содержится LR. При наличии Ре в reglist команды РОР: . бит [О] заrружаемоrо значения должен быть установлен в 1 для KoppeKTHoro выполнения команды; переход осуществляется по этому адресу, BыpOBHeHHO му на rраницу полуслова; . если команда условно выполняемая, то она должна быть последней командой в Iтблоке. А.3.8. LDREX и STREX 3аrрузка и сохранение реrистров в режиме монопольноrо доступа. Синтаксис LDREX {солd} Rt, [Rл {, #offset}] STREX {солd} Rd, Rt, [Rл {, #offset}] LDREXB { солd} Rt, [Rn] STREXB { солd} Rd, Rt, [Rл] LDREXH { солd} Rt, [Rл] SТRЕХН{солd} Rd, Rt, [Rл] rде coпd Rd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник для сохранения возвращённоrо кода состоя ния. Rt заrружаемый или сохраняемый реrистр. 
400 · Приложение А. Набор команд CortexM3. Справочный материал Rn offset реrистр, содержащий базовый адрес. смещение относительно Rn. Если смещение не указано, то адрес равен содержимому Rn. Операция Команды LDREX, LDREXB и LDREXH заrружают из памяти в реrистр слово, байт и полуслово соответственно. Команды STREX, STREXB и STREXH пытаются coxpa нить в памяти слово, байт и полуслово соответственно. Адрес, используемый в любой команде монопольноrо сохранения данных, должен быть идентичен адресу в последней выполненной команде монопольной заrрузки. Значение, co храняемое в памяти командой монопольноrо сохранения, должно иметь такую же разрядность, что и значение, считанное последней командой монопольной за rрузки. То есть для осуществления синхронизации команда монопольной заrруз ки должна всеrда использоваться в паре с аналоrичной командой монопольноrо сохранения. При сохранении данных команда монопольноrо сохранения заносит О в реrистрприёмник. Если попытка сохранения была неудачной, то в реrистр приёмник заносится 1. Нулевое значение, возвращённое командой сохранения в реrистреприёмнике, rарантирует, что ни один процесс в системе не сможет по лучить доступ К использованной ячейке памяти между командами монопольной заrрузки и монопольноrо сохранения. Из соображений быстродействия число команд, располаrающихся между KO мандой монопольной заrрузки и командой монопольноrо сохранения, должно быть сведено к минимуму. примеЧQние Результат выполнения команды монопольноrо сохранения при обращении по адресу) отличному от использованноrо в предшествующей команде монопольной заrрузки, будет непредсказуемым. Оrраничения · Нельзя использовать Ре. · Rd не должен быть SP. · Rt не должен быть SP. · В командах STREX реrистр Rd должен отличаться от Rt и от Rn. · Величина offset должна находиться в диапазоне 0...1020 и быть кратной 4. Флаrи условий Команда не влияет на состояние флаrов. Примеры MOV Rl, #Охl try LDREX RO, [LockAddr] смр RO, #0 ITT EQ Инициализируем значение для признака блокировки Читаем признак блокировки Блокировка снята? IТблок для команд STREXEQ и CMPEQ 
А.4. Общие команды обработки данных · 401 STREXEQ RO, Rl, [LockAddr] CMPEQ RO, #0 BNE try Пробуем поставить блокировку Успешно? Нет  пробуем снова Да  поставили блокировку А.3.9. CLREX Сброс монопольноrо доступа. Синтаксис CLREX{coпd} rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Операция После команды CLREX любая последующая команда STREX, STREXB и STREXH заносит 1 в реrистрприёмник и, соответственно, не осуществляет запись в па мять. Принудительное блокирование монопольной записи в память может по требоваться в обработчике исключительной ситуации в том случае, если таковая возникнет во время операции синхронизации между командой монопольной за rрузки и соответствующей командой монопольноrо сохранения. Флаrи условий Команда не влияет на состояние флаrов. Примеры CLREX А.4. Общие команды обработки данных Все команды обработки данных перечислены в Табл. А.б. Таблица А.б. Команды обработки данных Мнемоника Краткое описание Подраздел АDС Сложение с переносом A.4.l. ADD, ADC, SUB, SBC и RSB АDD Сложение А.4.1. ADD, ADC, SUB, SBC и RSB ADDW Сложение А.4.1. ADD, ADC, SUB, SBC и RSB AND Лоrическое И А.4.2. AND, ORR, EOR, BIC и ORN ASR Арифметический сдвиr вправо А.4.3. ASR, LSL, LSR, ROR и RRX BIC Очистка битов А.4.2. AND, ORR, EOR, BIC и ORN CLZ Подсчёт ведущих нулевых битов А.4.4. CLZ CMN Сравнение с отрицательным операндом А.4.5. смр и CMN СМР Сравнение А.4.5. СМР и CMN EOR Исключающее ИЛИ А.4.2. AND, ORR, EOR, BIC и ORN 
402 · Приложение А. Набор команд CortexM3. Справочный материал Таблица А.б. Команды обработки данных (продолжение) Мнемоника Краткое описание Подраздел LSL Лоrический сдвиr влево А.4.3. ASR, LSL, LSR, ROR и RRX LSR Лоrический сдвиr вправо А.4.3. ASR, LSL, LSR, ROR и RRX MOV Пересылка А.4.6. МОУ и MVN MOVT Пересылка старшеrо полуслова А.4.? МОУТ MOVW Пересылка 16битной константы А.4.6. МОУ и MVN MVN Пересылка с инверсией А.4.6. МОУ и MVN ORN Лоrическое ИЛИ с инверсией А.4.2. AND, ORR, EOR, BIC и ORN ORR Лоrическое ИЛИ А.4.2. AND, ORR, EOR, BIC и ORN RBIT Перестановкабитов А.4.8. REV, REV16, REVSH и RBIT REV Перестановкабайтовслова А.4.8. REV, REV16, REVSH и RBIT REV16 Перестановка байтов в каждом полуслове А.4.8. REV, REV16, REVSH и RBIT REVSH Перестановка байтов в младшем полуслове А.4.8. REV, REV16, REVSH и RBIT и расширение знака ROR Циклический сдвиr вправо А.4.3. ASR, LSL, LSR, ROR и RRX RRX Расширенный циклический сдвиr вправо А.4.3. ASR, LSL, LSR, ROR и RRX RSB Обратное вычитание A.4.1. ADD, ADC, SUB, SBC и RSB SBC Вычитание с переносом A.4.1. ADD, ADC, SUB, SBC и RSB SUB Вычитание A.4.1. ADD, ADC, SUB, SBC и RSB SUBW Вычитание A.4.1. ADD, ADC, SUB, SBC и RSB TEQ Про верка на равенство А.4.9. TST и TEQ TST Про верка битов А.4.9. TST и TEQ А.4.1. ADD, ADC, 5UB, 5ВС и R5B Сложение, сложение с переносом, вычитание, вычитание с переносом и обрат ное вычитание. Синтаксис op{S} {cond} {Rd,} Rn, Operand2 op{cond} {Rd,} Rn, #iтm12 rде Только команды АОО и SUB ар операция: ADD Сложение ADC Сложение с переносом SUB Вычитание SBC Вычитание с переносом RSB Обратное вычитание необязательный суффикс. При наличии в мнемонике команды суффикса S состояние флаrов условий изменяется в соответствии S 
А.4. Общие команды обработки данных · 403 с результатом операции; см. подраздел А.2.7 «Условное выполне ние». imm12 необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. Если Rd отсутствует, то реrистром приёмником является Rn. реrистр, содержащий первый операнд. «rибкий» второй операнд; для получения дополнительной инфор мации обратитесь к подразделу А.2.3 «rибкий» второй операнд». любое число в диапазоне 9.. .4095. cond Rd Rn Operand2 Операция Команда АОО складывает Operand2 или imm12 с содержимым Rn. Команда АОС складывает Operand2 с содержимым Rn и прибавляет к результату значение флаrа переноса. Команда SUB вычитает Operand2 или imm12 из содержимоrо Rn. Команда SBC вычитает Operand2 из содержимоrо Rn и, если флаr переноса сброшен, уменьша ет результат на единицу. Команда RSB вычитает значение, находящееся в Rn, из Operand2. Достоин ством этой команды является большое число опций, поддерживаемых операн дом Operand2. Команды АОС и SBC используются для реализации функций мноrословной арифметики; см. пункт «При меры мноrословных арифметических операций» дa лее в этом подразделе. примеЧQние Мнемоники ADDW и SUBW эквивалентны мнемоникам АОО и SUB COOTBeTCTBeH но при использовании в качестве операнда константы imm12. Оrраничения . Operand2 не должен быть SP или Ре. . Rd может быть SP только в командах АОО и SUB со следующими оrраничения ми: Q Rn также должен быть SP; Q любые операции сдвиrа в Operand2 должны быть оrраничены сдвиrом влево не более чем на 3 бита. . Rn может быть SP только в командах АОО и SUB. . Rd может быть Ре только в команде ADD{cond} РС, РС, Rm, причём: Q использование суффикса S не допускается; Q Rm не должен быть Ре или SP; Q если команда условно выполняемая, то она должна быть последней KOMaH дой в Iтблоке. 
404 · Прuложенuе А. Набор команд CortexM3. Справочный материал · Rn может быть Ре не только в команде ADD{cond} РС, РС, Rm, но и в друrих вариантах команд АОО и SUB со следующими оrраничениями: о использование суффикса S не допускается; о второй операнд должен быть константой из диапазона о. . .4095. примеЧQние · При использовании Ре в операциях сложения и вычитания биты [1:0] реrи стра РС сбрасываются в 00 перед выполнением операции, выравнивая тем ca мым базовый адрес на rраницу полуслова. · При необходимости rенерации адреса команды вы должны скорректировать значение константы в соответствии со значением Ре. Специалисты компании ARM рекомендуют вместо команды АОО или SUB с Rn, равным ре, использо вать команду ADR, поскольку для последней ассемблер автоматически вычис ляет правильное значение константы. При использовании Ре в качестве Rd в команде ADD{cond} РС, РС, Rm: · бит [О] значения, заrружаемоrо в ре, иrнорируется; · переход производится по адресу, получаемому сбросом бита [О] заrружаемоrо значения в о. Фпаrи условия Если суффикс S указан, то эти команды изменяют состояние флаrов N, Z, С и V в соответствии с результатом операции. Примеры АОО SUBS RSB ADCHI R2, R1, RЗ R8, Rб, #240 R4, R4, #1280 R11, RO, RЗ Устанавливает флаrи в соответствии с результатом Вычитает содержимое R4 из константы 1280 Сложение выполняется, только если флаr С установлен, а флаr Z  сброшен Примеры MHorocпoBHbIX арифметических операций В При мере А.4 показаны две команды, которые выполняют сложение 64бит Horo целоrо, находящеrося в реrистрах R2 и R3, с друrим 64битным целым, Haxo дящимся в реrистрах RO и Rl, и помещают результат в реrистры R4 и R5. Мноrословные значения не обязательно должны храниться в последователь но расположенных реrистрах. В При мере А.5 приводится фраrмент кода, KOTO рый вычитает одно 96битное целое, хранящееся в реrистрах R9, Rl и Rll, из дpy roro, хранящеrося в реrистрах R6, R2 и R8. Результат вычитания сохраняется в реrистрах R6, R9 и R2. Пример А.4. Сложение 64..битных чисел ADDS АОС R4, RO, R2 R5, R1, RЗ Складываем младшие слова Складываем старшие слова, учитывая перенос 
А.4. Общие команды обработки данных · 405 Пример А.5. Вычитание 96..битных чисел SUBS SBCS SBC R6, R6, R9 R9, R2, Rl R2, R8, Rll Вычитаем младшие слова Вычитаем средние слова, учитывая перенос Вычитаем старшие слова, учитывая перенос А.4.2. AND, ORR, EOR, BIC и ORN Лоrическое И, Лоrическое ИЛИ, Исключающее ИЛИ, очистка битов и Лоrиче ское ИЛИ с инверсией. Синтаксис op{S} {cond} {Rd,} Rn, Operand2 rде ар s операция: AND Лоrическое И ORR Лоrическое ИЛИ EOR Исключающее ИЛИ BIC Лоrическое И с инверсией или, иначе, очистка битов ORN Лоrическое ИЛИ с инверсией необязательный суффикс. При наличии в мнемонике команды суффикса S состояние флаrов условий изменяется в соответствии с результатом операции; см. подраздел А.2.7 «Условное выполне ние». cand необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. Если Rd отсутствует, то реrистром приёмником является Rn. реrистр, содержащий первый операнд. «rибкий» второй операнд; для получения дополнительной инфор мации, обратитесь к подразделу А.2.3 «rибкий» второй операнд». Rd Rn Operand2 Операция Команды AND, EOR и ORR выполняют побитовые операции «И», «ИЛИ» И «Ис ключающее ИЛИ» соответственно между содержимым Rn и Operand2. Команда BIC выполняет побитовую операцию «И» между содержимым Rn и инвертированным значением Operand2. Команда ORN выполняет побитовую операцию «ИЛИ» между содержимым Rn и инвертированным значением Operand2. Оrраничения Нельзя использовать SP либо Ре. 
406 · Приложение А. Набор команд CortexM3. Справочный материал Флаrи условия Если суффикс 8 указан, то эти команды: · изменяют флаrи N и Z в соответствии с результатом операции; · MorYT изменять состояние флаrа С при вычислении Operaпd2; см. подраздел А.2.3 «rибкий» второй операнд»; · не влияют на состояние флаrа У. Примеры AND R9, R2, #OxFFOO ORREQ R2, RO, R5 ANDS R9, R8, #Ох19 EORS R7, Rll, #Ох18181818 BIC RO, Rl, #ОхаЬ ORNS R7, Rll, R14, ROR #4 ORNS R7, Rll, R14, ASR #32 А.4.3. ASR, LSL, LSR, ROR и RRX Арифметический сдвиr вправо, лоrический сдвиr влево, лоrический сдвиr вправо, циклический сдвиr вправо и расширенный циклический сдвиr вправо. Синтаксис op{S}{coпd} Rd, Rт, Rs op{S}{coпd} Rd, Rт, #п RRX{S}{coпd} Rd, Rт rде ар операция: A8R Арифметический сдвиr вправо L8L Лоrический сдвиr влево L8R Лоrический сдвиr вправо ROR Циклический сдвиr вправо необязательный суффикс. При наличии в мнемонике команды суффикса 8 состояние флаrов условий изменяется в соответствии с результатом операции; см. подраздел А.2.7 «Условное выполне ние». 8 coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. реrистр, содержащий сдвиrаемое значение. реrистр, в котором хранится величина сдвиrа для содержимоrо Rm. Используется только младший байт реrистра; соответственно, величина сдвиrа может быть в диапазоне о.. .255. Rd Rm Rs 
А.4. Общие команды обработки данных · 407 п Величина сдвиrа. Диапазон допустимых значений зависит от KO манды: A8R от 1 до 32 L8L от О до 31 L8R от 1 до 32 ROR от 1 до 31 примеЧQние Вместо команды L8L8 Rd, Rm, #0 лучше использовать команду MOV8 Rd, Rm. Операция Команды A8R, L8L, L8R и ROR сдвиrают содержимое реrистра Rm влево или вправо на число битов, определяемое константой пили реrистром Rs. Команда RRX сдвиrает содержимое реrистра Rm на один бит вправо. Все рассматриваемые команды сохраняют результат в реrистре Rd, при этом содержимое реrистра Rm не изменяется. Более подробно действия, выполняемые отдельными командами сдвиrа, описаны в подрзделе А.2.4 «Операции сдвиrа». Оrраничения Нельзя использовать SP либо Ре. Фпаrи усповия Если суффикс 8 указан, то: . эти команды изменяют состояние флаrов N и z; . во флаr С заносится значение последнеrо выдвинутоrо бита, если величина сдвиrа не равна нулю; см. подраздел А.2.4 «Операции сдвиrа». Примеры RRX R4, R5 Арифметический сдвиr вправо на 9 бит Лоrический сдвиr влево на 3 бита с изменением флаrов Лоrический сдвиr вправо на 6 бит Циклический сдвиr вправо на число битов, определяемое младшим битом R6 Расширенный циклический сдвиr вправо A8R 1818 18R ROR R7, R8, #9 Rl, R2, #3 R4, R5, #6 R4, R5, R6 А.4.4. CLZ Подсчёт ведущих нулевых битов. Синтаксис C1Z{coпd} Rd, Rт rде coпd Rd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистр приёмник. 
408 · Приложение А. Набор команд CortexM3. Справочный материал Rm реrистр операнда. Операция Команда CLZ определяет число ведущих нулевых битов в содержимом Rm и возвращает результат в Rd. Результат равен 32) если ни один бит реrистра Rm не установлен, и О, если установлен бит [31] реrистра. Оrраничения Нельзя использовать SP либо Ре. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры CLZ CLZNE R4, R9 R2, RЗ А.4.5. смр и CMN Сравнение и сравнение с отрицательным операндом. Синтаксис CMP{cond} Rn, Operand2 CМN{cond} Rn, Operand2 rде cond необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистр, содержащий первый операнд. «rибкий» второй операнд; для получения дополнительной инфор мации обратитесь к подразделу А.2.3 «rибкий» второй операнд». Rn Operand2 Операция Эти команды выполняют сравнение содержимоrо реrистра Rn со значением Operand2. Они изменяют флаrи условий в соответствии с результатом cpaBHe ния, но не сохраняют результат в реrистре. Команда СМР вычитает Operand2 из содержимоrо реrистра Rm, т.е. выполняет ту же операцию, что и команда SUBS, но без сохранения результата вычитания. Команда CMN складывает Operand2 с содержимым реrистра Rm) т.е. выполня ет ту же операцию, что и команда ADDS, но без сохранения результата сложения. Оrраничения · Нельзя использовать ре. · Operand2 не должен быть SP. 
А.4. Общие команды обработки данных · 409 Фпаrи усповия Эти команды изменяют состояние флаrов N, Z, С и V в соответствии с резуль татом операции. Примеры смр R2, R9 CMN RO, #6400 CMPGT 8Р, R7, 181 #2 А.4.б. МОУ и MVN Пересылка и пересылка с инверсией. Синтаксис MOV{8}{coпd} Rd, Operaпd2 MOV{coпd} Rd, #iттlб MVN{8}{coпd} Rd, Operaпd2 rде S необязательный суффикс. При наличии в мнемонике команды суффикса S состояние флаrов условий изменяется в соответствии с результатом операции; см. подраздел А.2.7 «Условное выполне ние». iттlб необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. Если Rd отсутствует, то реrистром приёмником является Rп. «rибкий» второй операнд; для получения дополнительной инфор мации обратитесь к подразделу А.2.3 «rибкий» второй операнд». любое число в диапазоне о.. .65535. coпd Rd Operaпd2 Операция Команда MOV копирует значение Operaпd2 в реrистр Rd. Если вторым операн дом команды MOV является реrистр со сдвиrом, отличным от LSL #0, то вместо команд MOV предпочтительней использовать соответствующие команды сдвиrа: . ASR{S} {cond} Rd, Rm, #п вместо MOV{S} {cond} Rd, Rm, ASR #п. . LSL{S}{cond} Rd, Rm, #nBMecToMOV{S}{cond} Rd, Rm, LSL #п,еслипО. . LSR{S}{cond} Rd, Rm, #nBMecToMOV{S}{cond} Rd, Rm, LSR #п. . ROR{S} {cond} Rd, Rm, #п вместо MOV{S} {cond} Rd, Rm, ROR #п. . RRX{S}{cond} Rd, RmBMecToMOV{S}{cond} Rd, Rm, RRX. Помимо этоrо, команда MOV поддерживает дополнительные формы записи Operaпd2, что позволяет использовать её вместо команд сдвиrа: . MOV{S} {cond} Rd, Rm, ASR Rs эквивалентна ASR{S} {cond} Rd, Rm, Rs. . MOV{S}{cond} Rd, Rm, L8L Rs эквивалентна LSL{S}{cond} Rd, Rm, Rs. 
410 · Приложение А. Набор команд CortexM3. Справочный материал · MOV {S} {cond} Rd, Rm, LSR Rs эквивалентна LSR {S} {cond} Rd, Rm, Rs. · MOV{S} {cond} Rd, Rm, ROR Rs эквивалентна ROR{S} {cond} Rd, Rm, Rs. См. подраздел А.4.3 «ASR, LSL, LSR, ROR и RRX». Команда MVN берёт значение Operaпd2, выполняет над ним побитовую опера цию «НЕ» и сохраняет результат в реrистре Rd. примеЧQние Команда MOVW выполняет ту же операцию, что и команда MOV, однако в каче стве операнда может использовать только константу iттlб. Оrраничения · Нельзя использовать Ре. · Operaпd2 не должен быть SP. При использовании Ре в качестве Rd в команде MOV: · бит [О] значения, заrружаемоrо в ре, иrнорируется; · переход производится по адресу, получаемому сбросом бита [О] заrружаемоrо значения в о. примеЧQние Несмотря на то что команду MOV можно использовать в качестве команды пе рехода, компания ARM настоятельно рекомендует использовать для этих целей команды BL и BLX) чтобы обеспечить переносимость кода между различными Ha борами команд ARM. Фпаrи усповия Если суффикс S указан, то эти команды: · изменяют флаrи N и Z в соответствии с результатом операции; · MorYT изменять состояние флаrа С при вычислении Operaпd2; см. подраздел А.2.3 «rибкий» второй операнд». · не влияют на состояние флаrа У. Примеры MOVS MOV MOVS MOV MOV МVNS Rll, #ОхОООВ Rl, #OxFA05 RI0, R12 R3, #23 R8, SP R2, #OxF Записывает число ОхОООВ в Rll, флаrи изменяются Записывает число OxFA05 в Rl, флаrи не изменяются Копирует содержимое R12 в RI0, флаrи изменяются Записывает число 23 в R3 Сохраняет значение указателя стека в R8 Записывает число OxFFFFFFFO (инвертированное число OxF) в R2, флаrи изменяются А.4.7. МОУТ Пересылка старшеrо полуслова. Синтаксис MOVT{coпd} Rd, #iттlб 
А.4. Общие команды обработки данных · 411 rде caпd iттlб необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. Если Rd отсутствует, то реrистром приёмником является Rп. «rибкий» второй операнд; для получения дополнительной инфор мации, обратитесь к подразделу А.2.3 «rибкий» второй операнд». любое число в диапазоне О.. .65535. Rd Operaпd2 Операция Команда MOVT заrружает 16битную константу iттlб в старшее полуслово (биты [31:16]) реrистраприёмника Rd. Состояние битов Rd [15:0] при этом не из меняется. Пара команд MOV и MOVT позволяет заrружать в реrистры произвольные 32битные константы. Оrраничения Rd не должен быть SP или Ре. Флаrи усповия Эта команда не влияет на состояние флаrов. Примеры MOVT R3, #OxF123 Заrружает OxF123 в старшее полуслово R3, младшее полуслово и реrистр APSR не изменяются А.4.8. REV, REV16, REVSH и RBIT Перестановка байтов и битов. Синтаксис op{cond} Rd, Rn rде ар caпd операция: REV Перестановкабайтовслова RЕVlб Перестановка байтов каждоrо полуслова в отдельности REVSH Перестановка байтов младшеrо полуслова и расшире ние знака до 32 бит RBIT Перестановка битов 32битноrо слова в обратном по рядке необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». 
412 · Приложение А. Набор команд CortexM3. Справочный материал Rd реrистрприёмник. Если Rd отсутствует, то реrистром приёмником является Rn. реrистр, содержащий операнд. Rn Операция Эти команды предназначены для изменения порядка байтов при хранении данных: REV преобразует 32битное число с обратным порядком байтов (big endian) в число с прямым порядком байтов (littleendian) или Hao борот, число с прямым порядком байтов в число с обратным по рядком. преобразует 16битное число с обратным порядком байтов (big endian) в число с прямым порядком байтов (littleendian) или Hao борот, число с прямым порядком байтов в число с обратным по рядком. преобразует: 16битное число со знаком с обратным порядком байтов в 32бит ное число со знаком с прямым порядком байтов; 16битное число со знаком с прямым порядком байтов в 32бит ное число со знаком с обратным порядком байтов. RЕVlб REVSH Оrраничения Нельзя использовать SP либо РС. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры REV RЗ, R7 REV16 RO, RO REVSH RO, R5 REVHS RЗ, R7 RBIT R7, R8 Меняет порядок байтов содержимоrо R7 и сохраняет результат в RЗ Меняет порядок байтов каждоrо полуслова RO Меняет порядок байтов 16битноrо числа со знаком Переставляет байты при условии «выше или равно» Изменяет порядок битов содержимоrо R8 и сохраняет результат в R7 А.4.9. TST и TEQ Проверка битов и проверка на равенство. Синтаксис TST{cond} Rn, Operand2 TEQ{cond} Rn, Operand2 
А.4. Общие команды обработки данных · 413 rде cond необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Rn Operand2 реrистр, содержащий первый операнд. «rибкий» второй операнд; для получения дополнительной инфор мации обратитесь к подразделу А.2.3 «rибкий» второй операнд». Операция Эти команды выполняют сравнение содержимоrо реrистра Rn со значением Operand2. Они изменяют флаrи условий в соответствии с результатом cpaBHe ния, но не сохраняют результат в реrистре. Команда TST выполняет побитовую операцию «Лоrическое И» между coдep жимым Rn и значением Operand2. То есть эта команда аналоrична команде ANDS, за исключением Toro, что результат операции не сохраняется. Для проверки состояния отдельноrо бита Rn используют команду TST, второй операнд которой является константой; в этой константе проверяемый бит YCTa новлен в 1, а остальные биты сброшены в о. Команда TEQ выполняет побитовую операцию «Исключающее ИЛИ» между содержимым Rn и значением Operand2. То есть эта команда аналоrична команде EORS, за исключением Toro, что результат операции не сохраняется. Команда TEQ используется для проверки равенства двух значений, не изменяя при этом флаrов С или У. Кроме Toro, команду TEQ можно использовать для про верки знака числа. После сравнения флаr N будет равен результату операции «Исключающее ИЛИ» между знаковыми битами обоих операндов. Оrраничения Нельзя использовать SP либо Ре. Фпаrи усповия Команды TST и TEQ: . изменяют флаrи N и Z в соответствии с результатом операции; . MorYT изменять состояние флаrа С при вычислении Operand2; см. подраздел А.2.3 «rибкий» второй операнд»; . не влияют на состояние флаrа У. Примеры TEQEQ RI0, R9 Выполняет побитовое «И» между RO и ОхЗF8, реrистр APSR изменяется, но результат не сохраняется Проверяет (условно) равенство содержимоrо RI0 и R9, реrистр APSR изменяется, но результат не сохраняется TST RO, #ОхЗF8 
414 · Приложение А. Набор команд CortexM3. Справочный материал А.5. Команды умножения и деления Команды умножения и деления перечислены в Табл. А.7. Таблица А.7. Команды умножения и деления Мнемоника Краткое описание Подраздел MLA Умножение со сложением) 32битный результат A.5.l. MUL) MLA и MLS MLS Умножение с вычитанием) 32битный результат A.5.l. MUL) MLA и MLS MUL Умножение) 32битный результат A.5.l. MUL) MLA и MLS SDIV Знаковое деление А.5.3. SDIV и UDIV SMLAL Знаковое умножение со сложением (32 х 32 + 64») А.5.2. UMULL) UMLAL) 64битный результат SMULL и SMLAL SMULL Знаковое умножение (32 х 32») 64битный А.5.2. UMULL) UMLAL) результат SMULL и SMLAL UDIV Беззнаковоеделение А.5.3. SDIV и UDIV UMLAL Беззнаковое умножение со сложением А.5.2. UMULL) UMLAL) (32 х 32 + 64») 64битный результат SMULL и SMLAL UMULL Беззнаковое умножение (32 х 32») 64битный А.5.2. UMULL) UMLAL) результат SMULL и SMLAL А.5.1. MUL, MLA и MLS Умножение, умножение со сложением и умножение с вычитанием (32битные операнды) 32битный результат). Синтаксис MUL{S} {cond} Rd, Rn, Rт Умножение MLA{cond} Rd, Rn, Rт, Ra Умножение со сложением MLS { cond} Rd, Rn, Rт, Ra Умножение с вычитанием rде S необязательный суффикс. При наличии в мнемонике команды суффикса S состояние флаrов условий изменяется в соответствии с результатом операции; см. подраздел А.2.7 «Условное выполне ние». cond необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. Если Rd отсутствует, то реrистром приёмником является Rn. реrистры, содержащие перемножаемые значения. реrистр, содержащий прибавляемое или вычитаемое значение. Rd Rn, Rm Ra Операция Команда MUL перемножает содержимое Rn и Rm и помещает 32 младших знача щих бита результата в реrистр Rd. 
А.5. Команды умножения и деления · 415 Команда MLA перемножает содержимое Rn и Rm, прибавляет содержимое Ra и помещает 32 младших значащих бита результата в реrистр Rd. Команда MLS перемножает содержимое Rn и Rm, вычитает произведение из co держимоrо Ra и помещает 32 младших значащих бита результата в реrистр Rd. Результат выполнения этих команд не зависит от Toro, имели операнды знак или нет. Оrраничения . Нельзя использовать SP либо Ре. При использовании суффикса S с командой MUL: . Rd, Rn и Rm должны быть в диапазоне RO. . . R7; . Rd должен быть тем же реrистром, что и Rm; . использование суффикса cond не допускается. Флаrи условия Если суффикс S указан, то команда MUL: . изменяет флаrи N и Z в соответствии с результатом операции; . не влияет на состояние флаrов С и у. Примеры MUL MLA MULS MULLT MLS RI0, R2, R5 RI0, R2, Rl, R5 RO, R2, R2 R2, R3, R2 R4, R5, Rб, R7 Умножение, RI0 = R2 х R5 Умножение со сложением, RI0 = (R2 х Rl) + R5 Умножение с изменением флаrов, RO = R2 х R2 Умножение (условное), R2 = R3 х R2 Умножение с вычитанием, R4 = R7  (R5 х Rб) А.5.2. UMULL, UMLAL, SMULL и SMLAL Знаковое и беззнаковое умножение с опциональным сложением (32битные операнды, 64битный результат). Синтаксис op{coпd} RdLo, RdHi, Rп, Rm rде ор операция: UMULL Беззнаковое длинное умножение UMLAL Беззнаковое длинное умножение со сложением SMULL Знаковое длинное умножение SMLAL Знаковое длинное умножение со сложением необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». RdHi, RdLo реrистрыприёмники. Для команд UMLAL и SMLAL в них же xpa нится значение, прибавляемое к произведению. cond Rn, Rm реrистры, содержащие перемножаемые значения. 
416 . Приложение А. Набор команд CortexM3. Справочный материал Операция Команда UMULL интерпретирует содержимое реrистров Rn и Rm как целые чис ла без знака. Команда перемножает эти числа, помещая 32 младших значащих би та результата в реrистр RdLo, а 32 старших значащих бита результата  в RdHi. Команда UMLAL интерпретирует содержимое реrистров Rn и Rm как целые чис ла без знака. Команда перемножает эти числа, прибавляет к 64битному произве дению 64битное число, находящееся в реrистрах RdHi и RdLo, и заносит резуль тат обратно в реrистры RdHi и RdLo. Команда SMULL интерпретирует содержимое реrистров Rn и Rm как целые чис ла со знаком, представленные в дополнительном коде. Команда перемножает эти числа, помещая 32 младших значащих бита результата в реrистр RdLo, а 32 CTap ших значащих бита результата  в RdHi. Команда SMLAL интерпретирует содержимое реrистров Rn и Rm как целые чис ла со знаком, представленные в дополнительном коде. Команда перемножает эти числа, прибавляет к 64битному произведению 64битное число, находящееся в реrистрах RdHi и RdLo, и заносит результат обратно в реrистры RdHi и RdLo. Оrраничения · Нельзя использовать SP либо Ре. · RdHi и RdLo должны быть разными реrистрами. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры UMULL SMLAL RO, R4, R5, Rб R4, R5, RЗ, R8 Без знака (R4, RO) = R5 х Rб Со знаком (R5, R4) = (R5, R4) + RЗ х R8 A.S.3. SDIV и UDIV Знаковое и беззнаковое деление. Синтаксис SDIV{cond} {Rd,} Rn, Rm UDIV{cond} {Rd,} Rn, Rm rде cond необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. Если Rd отсутствует, то реrистром приёмником является Rn. реrистр, содержащий делимое. реrистр, содержащий делитель. Rd Rn Rm 
А.б. Команды насыщения . 417 Операция Команда SDIV выполняет целочисленное деление (со знаком) числа, находяще rося в Rn, на число, находящееся в Rm, и сохраняет результат в реrистре Rd. Ko манда UDIV выполняет целочисленное деление (беззнаковое) числа, находящеrо ся в Rn, на число, находящееся в Rm, и сохраняет результат в реrистре Rd. Если число, находящееся в Rm, не делится нацело на число, находящееся в Rd, то результат окруrляется к нулю (дробная часть отбрасывается). Оrраничения Нельзя использовать SP либо Ре. Фl1аrи УСl10ВИЯ Эта команда не влияет на состояние флаrов. Примеры SDIV UDIV RO, R2, R4 R8, R8, Rl ; Деление чисел со знаком, RO = R2/R4 Деление чисел без знака, R8 = R8/Rl А.б. Команды насыщения в этом разделе описываются команды насыщения (фиксации крайних значе ний) SSAT и USAT. А.б.1. SSAT и USAT Знаковое и беззнаковое насыщение с заданной разрядностью и опциональ ным сдвиrом перед насыщением. Синтаксис op{coпd} Rd, #п, Rт{, shift #s} rде ар cand операция: SSAT Насыщение значения со знаком в пределах знаковоrо диапазона USAT Насыщение беззнаковоrо значения в пределах беззна KOBoro диапазона необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистр приёмник. определяет диапазон насыщения: 1  n  32 для команды SSAT О  n  31 для команды USAT реrистр, содержащий исходное значение. Rd n Rm 
418 . Приложение А. Набор команд CortexM3. Справочный материал зhift #3 необязательный сдвиr, при меняемый к содержимому Rm перед Ha сыщением. Допускаются следующие команды сдвиrа: ASR #3, rде 3 должно находиться в диапазоне 1.. .31 1S1 #3, rде 3 должно находиться в диапазоне О.. .31 Операция Эти команды выполняют насыщение до знаковоrо или беззнаковоrо пбитноrо значения. Команда SSAT выполняет заданную операцию сдвиrа, после чеrо фиксирует полученное значение в пределах знаковоrо диапазона 2пl  х  2пl  1. Команда USAT выполняет заданную операцию сдвиrа, после чеrо фиксирует полученное значение в пределах беззнаковоrо диапазона О  х  2 п  1. В случае команды SSAT это означает: · Если фиксируемое значение меньше 2пl, то результат будет равен 2п1. · Если фиксируемое значение больше 2пl  1, то результат будет равен 2пl  1. · В противном случае, результат будет равен фиксируемому значению. В случае команды USAT это означает: · Если фиксируемое значение меньше О, то результат будет равен о. · Если фиксируемое значение больше 2 п  1, то результат будет равен 2 п  1. · В противном случае, результат будет равен фиксируемому значению. Если результат операции отличается от фиксируемоrо значения, значит, воз никло наСblщение. В случае насыщения обе команды устанавливают флаr Q реrи стра APSR в 1. В противном случае, состояние флаrа Q не изменяется. Для сброса флаrа Q нужно использовать команду MSR; см. подраздел А.9.7 «MSR». ДЛЯ чтения состояния флаrа Q можно использовать команду MRS; см. подраздел А.9.6 «MRS». Оrраничения · Нельзя использовать SP либо Ре. Флаrи условия Эти команды не влияют на состояние флаrов. В случае насыщения данные команды устанавливают флаr Q в 1. Примеры 33АТ R7, #16, R7, 131 #4 Выполняет лоrический сдвиr влево на 4 бита содержимоrо R7, после чеrо фиксирует ero в пределах 16битноrо знаковоrо диапазона и заносит результат обратно в R7 Фиксирует (условно) содержимое R5 в пределах 7битноrо беззнаковоrо диапазона и сохраняет ero в RO U3ATNE RO, #7, R5 
А.?: Команды работы с битО8ыми полями · 419 А.7. Команды работы с битовыми полями Команды, оперирующие наборами смежных битов реrистров (битовыми по лями), перечислены в Табл. А.8. Таблица А.В. Команды работы с битовыми полями Мнемоника Краткое описание Подраздел BFC Очистка битовоrо поля А.7.1. BFC и BFI BFI Вставка битовоrо поля А.7.1. BFC и BFI SBFX Извлечение битовоrо поля со знаком А.7.2. SBFX и UBFX SXTB Расширение знака байта А.7.3. SXT и UXT SXTH Расширение знака полуслова А.7.3. SXT и UXT UBFX Извлечение беззнаковоrо битовоrо поля А.7.2. SBFX и UBFX UXTB Дополнение нулями байта А.7.3. SXT и UXT UXTH Дополнение нулями полуслова А.7.3. SXT и UXT А.7.1. BFC и BFI Очистка битовоrо поля и вставка битовоrо поля. Синтаксис BFC{cond} Rd, #lsb, #width BFI{cond} Rd, Rn, #lsb, #width rде cond width необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. реrистр источник. позиция младшеrо значащеrо бита поля. Должна находиться в диапазоне О.. .31. размер битовоrо поля. Должен находиться в диапазоне 1.. .32  lsb. Rd Rn lsb Операция Команда BFC очищает битовое поле в реrистре. Она сбрасывает width битов реrистра Rd, начиная с младшеrо бита с номером 1 sb. Остальные биты реrистра Rd остаются неизменными. Команда BFI копирует битовое поле из одноrо реrистра в друrой. Эта команда замещает width битов в реrистре Rd, начиная с младшеrо бита с номером lsb, co держимым width битов реrистра Rт, начиная с бита [О]. Остальные биты реrи стра Rd остаются неизменными. 
420 · Приложение А. Набор команд CortexM3. Справочный материал Оrраничения Нельзя использовать SP либо Ре. Фl1аrи УСl10ВИЯ Эти команды не влияют на состояние флаrов. Примеры BFC BFI R4, #8, #12 R9, R2, #8, #12 Сбрасываем биты с 8ro по 19й (12 бит) реrистра R4 Замещаем биты с 8ro по 19й (12 бит) реrистра R9 значениями битов с Oro по 11й реrистра R2 А.7.2. SBFX и UBFX Извлечение битовоrо поля со знаком и извлечение битовоrо поля без знака. Синтаксис SBFX{coпd} Rd, Rп, #lsb, #width UBFX{coпd} Rd, Rп, #lsb, #width rде cond необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистр приёмник. реrистр источник. позиция младшеrо значащеrо бита поля. Должна находиться в диапазоне о.. .31. размер битовоrо поля. Должен находиться в диапазоне 1...32lsb. Rd Rn lsb width Операция Команда SBFX извлекает битовое поле из реrистра Rn, расширяет ero до 32бит Horo значения и сохраняет результат в реrистре Rd. Команда UBFX извлекает битовое поле из реrистра Rn, дополняет ero нулями до 32битноrо значения и сохраняет результат в реrистре Rd. Оrраничения Нельзя использовать SP либо Рс. Фl1аrи условия Эти команды не влияют на состояние флаrов. Примеры SBFX RO, R1, #20, #4 UBFX R8, R11, # 9 , #10 Берём биты с 20ro по 2Зй (4 бита) из R1, расширяем до 32 бит и сохраняем результат в RO Берём биты с 9ro по 18й (10 бит) из R11, дополняем нулями до 32 бит и сохраняем результат в R8 
A.Z Команды работы с битовыми полями · 421 А.7.3. SXT и UXT Расширение знака и дополнение нулями. Синтаксис SXT exteпd{coпd} Rd, Rт {, ROR #п} UXT exteпd{coпd} Rd, Rт {, ROR #п} rде exteпd coпd разрядность операнда: В преобразование 8битноrо значения в 32битное Н преобразование 16битноrо значения в 32битное необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». реrистрприёмник. реrистр, содержащий преобразуемое значение. предварительный сдвиr операнда, допустимы следующие MHeMO ники: Rd Rm ROR #п ROR #8 ROR #16 ROR #24 Если ROR значение из Rm циклически сдвиrается на 8 бит вправо значение из Rm циклически сдвиrается на 16 бит вправо значение из Rm циклически сдвиrается на 24 бит вправо #п не указано, то сдвиr операнда не производится. Операция Эти команды выполняют следующие операции: 1. Циклически сдвиrают содержимое Rm на О, 8, 16 или 24 бит вправо. 2. Извлекают биты из полученноrо значения: а) SXTB извлекает биты [7:0] и расширяет знак до 32 бит; б) UXTB извлекает биты [7:0] и дополняет нулями до 32 бит; в) SXTH извлекает биты [15:0] и расширяет знак до 32 бит; r) UXTH извлекает биты [15:0] и дополняет нулями до 32 бит. Оrраничения Нельзя использовать SP либо Ре. Флаrи условия Эти команды не влияют на состояние флаrов. Примеры SXTH R4, R6, ROR #16 ; Циклически сдвиrает R6 вправо на 16 бит, затем берёт младшее полуслово, расширяет eo знак до 32 бит и сохраняет результат в R4 UXTB R3, RI0 ; Берёт младший байт содержимоrо RI0, дополняет нулями до 32 бит и сохраняет результат в R3 
422 · Приложение А. Набор команд CortexM3. Справочный материал А.8. Команды ветвления и управления Команды, оперирующие наборами смежных битов реrистров (битовыми по лями), перечислены в Табл. А.9. Таблица А.9. Команды ветвления Мнемоника Краткое описание Подраздел В Переход А.В.1. В) BL) ВХ и BLX В1 Переход со ссылкой А.В.1. В) BL) ВХ и BLX В1Х Косвенный переход со ссылкой А.В.1. В) BL) ВХ и BLX ВХ Косвенный переход А.В.1. В) BL) ВХ и BLX CBNZ Сравнение и переход) если не ноль А.В.2. CBZ и CBNZ CBZ Сравнение и переход) если ноль А.В.2. CBZ и CBNZ IT Блок IFTHEN А.В.З. IT твв Табличный переход с однобайтными А.В.4. ТВВ и ТВН смещениями твн Табличный переход с двухбайтными А.В.4. ТВВ и ТВН смещениями А.8.1. В, BL, ВХ и BLX Команды перехода. Синтаксис B{coпd} label BL{coпd} label BX{coпd} Rт BLX{coпd} Rт rде В BL ВХ BLX coпd переход (непосредственное смещение). переход со ссылкой (непосредственное смещение). косвенный переход (смещение в реrистре). косвенный переход со ссылкой (смещение в реrистре). необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». выражение, определяемое относительно Ре; см. подраздел А.2.6 «Адресация относительно РС». реrистр, содержащий адрес перехода. Бит [О] реrистра Rm должен быть установлен в 1, однако адрес перехода получается сбросом этоrо бита в о. label Rm 
А.8. Команды ветвления и управления · 423 Операция Все указанные команды выполняют переход к метке label или по адресу, Ha ходящемуся в реrистре Rm. Кроме Toro: . команды BL и BLX заносят адрес следующей команды в реrистр LR (реrистр связи, =RI4); . команды ВХ и BLX rенерируют исключение Usage Fault, если бит [О] реrистра Rm равен О. Команда B{cond} label является единственной условно выполняемой KO мандой, которая может располаrаться как внутри, так и снаружи Iтблока. Все остальные команды перехода при условном выполнении должны располаrаться внутри IТблока, а при безусловном выполнении  снаружи Iтблока. Для полу чения дополнительной информации обратитесь к подразделу А.8.3 «IT». Допустимые диапазоны для различных команд перехода указаны в Табл. А.lО. Таблица А.l0. Диапазоны переходов Команда Диапазон переходов В label 16...+16 Мбайт Bcoпd label (вне Iтблока) 1.. .+1 Мбайт Bcoпd label (внутри Iтблока) 16...+16 Мбайт BL{ coпd} label 16...+16 Мбайт ВХ {coпd} Rm Любое значение в реrистре BLX {coпd} Rm Любое значение в реrистре примеЧQние Для использования Bcero диапазона переходов может потребоваться исполь зование суффикса .w (см. подраздел А.2.8 «Выбор разрядности команды»). Оrраничения . Нельзя использовать Ре в команде BLX. . Для команд ВХ и BLX бит [О] реrистра Rm должен быть установлен в 1, однако переход будет осуществляться по адресу, полученному сбросом этоrо бита в О. . Если любая из этих команд используется внутри Iтблока, то она должна быть последней командой в блоке. примеЧQние Команда Bcoпd  это единственная условно выполняемая команда, которая может вызываться вне Iтблока. Тем не менее, внутри Iтблока она имеет боль ший диапазон переходов. Флаrи условия Эти команды не влияют на состояние флаrов. Примеры в BLE loopA ng Переход к метке loopA Условный переход к метке ng 
424 · Приложение А. Набор команд CortexM3. Справочный материал B.W target Переход к метке target в пределах 16 Мбайт BEQ target Условный переход к метке target BEQ.W target Условный переход к метке target в пределах 1 Мбайт BL funC ; Переход со ссылкой (вызов) к функции funC, адрес возврата запоминается в LR ВХ LR Возврат из вызванной функции BXNE RO Условный переход по адресу, находящемуся в RO BLX RO Переход со ссылкой (вызов) по адресу, находящемуся в RO А.8.2. CBZ и CBNZ Сравнение и переход, если ноль/если не ноль. Синтаксис CBZ Rп, label CBNZ Rп, label rде Rm label реrистр, содержащий операнд. метка перехода. Операция Команды CBZ и CBNZ используются для Toro, чтобы избежать изменения фла rOB условия, а также для уменьшения объёма кода. Команда CBZ Rn, label не изменяет флаrов условия, а в остальном эквива лентна rруппе команд: СМР Rn, #0 BEQ label Команда CBNZ Rn, label не изменяет флаrов условия, а в остальном эквива лентна rруппе команд: СМР Rn, #0 BNE label Оrраничения · Rn должен быть в диапазоне RO.. .R7. · Адрес назначения должен находиться в диапазоне от 4 до 130 байт после KO манды. · Эти команды не должны использоваться внутри Iтблока. Фпаrи усповия Эти команды не влияют на состояние флаrов. Примеры CBZ CBNZ R5, target RO, target ; Переход вперёд, если R5 равно О Переход вперёд, если RO не равно О 
А.8. Команды ветвления и управления · 425 А.8.3. IT Условный блок IFTHEN. Синтаксис IT{x{y{z}}} coпd rде х условие выполнения 2й команды блока. у условие выполнения 3й команды блока. z условие выполнения 4й команды блока. coпd условие выполнения lй команды блока. Для задания условия выполнения 2й, 3й и 4й команды Iтблока может ис пользоваться одна из следующих мнемоник: Т «то», применяет к команде условие coпd. Е «иначе», применяет к команде условие, обратное coпd. примеЧQние в качестве условия coпd допускается использование мнемоники AL (условие «всеrда»). В этом случае все команды в Iтблоке должны быть безусловно выпол няемыми, а в качестве каждоrо из условий Х, у и z должны быть указаны MHeMO ники Т (или не указано ничеrо), но не Е. Операция Команда IT переводит до 4 последующих команд в режим условноrо выполне ния. Условия выполнения MorYT быть одинаковыми для всех команд или же He которые из условий MorYT быть лоrической инверсией друrих. Условно выполня емые команды, расположенные после команды IT, образуют Iтблок. Во всех командах Iтблока, включая любые команды перехода, должен быть указан суффикс условия выполнения {coпd}. примеЧQние Используемый вами ассемблер может автоматически вставлять требуемые KO манды IT при обнаружении в коде условно выполняемых команд. Это можно уточнить, обратившись к документации на ассемблер. Команда ВКРТ в Iтблоке выполняется всеrда, независимо от истинности усло вия её выполнения. Исключения MorYT возникать как между командой IT и соответствующим IT блоком, так и внутри caMoro блока. В этом случае процессор переходит к COOTBeT ствующему обработчику исключения, сохраняя информацию, необходимую для возврата, в реrистре связи и реrистре PSR, который затем помещается в стек. Для возврата из обработчика исключения можно использовать любую пред назначенную для этоrо команду, в таком случае выполнение команд Iтблока бу дет корректно возобновлено. Это единственная ситуация, при которой команде, 
426 · Прuложенuе А. Набор команд CortexM3. Справочный материал модифицирующей содержимое РС, разрешается переход на команду внутри IT блока. Оrраничения Следующие команды не MorYT присутствовать в Iтблоке: . 1T; · CBZ и CBNZ; · CPS1D и CPS1E. Прочие оrраничения, касающиеся использования Iтблоков: · Команды перехода и прочие команды, изменяющие РС, должны либо распола rаться вне Iтблока, либо быть последней командой блока. Речь идёт о следу ющих командах: CJ ADD РС, РС, Rm; CJ MOV РС, Rm; CJ В, BL, ВХ, BLX; CJ любые команды LDM, LDR или РОР, осуществляющие запись в РС; CJ твв и ТВН. · Не допускается переход внутрь 1тблока, кроме как при возврате из обработ чика исключения. · Все условно выполняемые команды, за исключением команды В cond, долж ны находиться внутри 1тблока. Команда В cond может использоваться как вне Iтблока, так и внутри Hero, однако в последнем случае она имеет больший диапазон переходов. · у любой команды 1тблока должен быть указан суффикс условия выполне ния, который может либо совпадать, либо быть лоrической инверсией усло вия выполнения остальных команд блока. примеЧQние Используемый вами ассемблер может накладывать дополнительные оrрани чения на использование 1тблока, скажем, запрещать размещение внутри Hero директив ассемблера. Фяаrи усяовия Эта команда не влияет на состояние флаrов. Примеры ITTE NE Следующие 3 команды  условно выполняемые ANDNE RO, RO, R1 ANDNE не изменяет флаrи условия ADDSNE R2, R2, #1 ADDSNE изменяет флаrи условия MOVEQ R2, RЗ ; Условное копирование СМР RO, #9 Преобразуем шестнадцатеричное число (O 15) в реrистре RO в АSСIIсимвол ('O''9', 'A''F') ITE GT Следующие 2 команды  условно выполняемые ADDGT R1, RO, #55 Преобразуем ОхА > 'А' ADDLE R1, RO, #48 Преобразуем ОхО > ' О ' IT GT IТблок с единственной условно выполняемой командой 
А.В. Команды ветвления и управления · 427 ADDGT R1, R1, #1 Условно инкрементируем R1 ITTEE EQ Следующие 4 команды  условно выполняемые MOVEQ RO, R1 Условное копирование ADDEQ R2, R2, #10 Условное сложение ANDNE RЗ, RЗ, #1 Условное «Лоrическое И» BNE.W dloop Команда перехода может быть только последней командой IТблока IT NE Следующая команда  условно выполняемая ADD RO, RO, R1 Синтаксическая ошибка: не указан код условия выполнения А.8.4. ТВВ и твн Табличный переход с однобайтными/двухбайтными смещениями. Синтаксис ТВВ [Rп, Rт] ТВН [Rп, Rт, 181 #1] rде Rn Rm реrистр, содержащий адрес таблицы переходов. Если в качестве Rn используется РС, то адресом таблицы является адрес первоrо байта после команды ТВВ или ТВН. индексный реrистр. Этот реrистр содержит индекс элемента Ta блицы. В таблицах с двухбайтными смещениями корректное зна чение смещения получается удвоением содержимоrо Rm (опера ция L8L #1). Операция Эти команды выполняют переход в прямом направлении, используя таблицу однобайтных (ТВВ) или двухбайтных (ТВН) смещений относительно РС. Реrистр Rn является указателем на таблицу, а Rm  индексом элемента таблицы. В KOMaH де ТВВ величина смещения получается удвоением беззнаковоrо однобайтноrо значения, извлечённоrо из таблицы. Аналоrично, в команде ТВН величина смеще ния получается удвоением беззнаковоrо 2байтноrо значения, извлечённоrо из таблицы. Переход осуществляется по адресу, отстоящему на полученную величи ну от адреса байта, следующеrо за командой ТВВ или ТВН. Оrраничения . Rn не должен быть SP. . Rm не должен быть SP либо РС. . Если любая из этих команд используется внутри Iтблока, то она должна быть последней командой в блоке. Фпаrи усповия Эти команды не влияют на состояние флаrов. 
428 · Приложение А. Набор команд CortexM3. Справочный материал Примеры AOR.W RO, BranchTableByte ТВВ [RO, R1] R1  индекс, RO  базовый адрес таблицы пере ходов Case1 ; Далее располаrаются соответствующие команды Case2 Далее располаrаются соответствующие команды СаsеЗ ; Далее располаrаются соответствующие команды BranchTableByte ОСВ О ОСВ ((Case2Case1)/2) ОСВ ((СаsеЗСаsе1)/2) Вычисление смещения для варианта Case1 Вычисление смещения для варианта Case2 Вычисление смещения для варианта СаsеЗ ТВН [РС, R1, L8L #1] R1  индекс, РС используется в качестве базовоrо адреса таблицы переходов BranchTable Н OCI ((CaseA  BranchTableH)/2) ; OCI ((CaseB  BranchTable Н)/2) OCI ((CaseC  BranchTable Н)/2) CaseA Вычисление смещения для варианта CaseA Вычисление смещения для варианта CaseB Вычисление смещения для варианта CaseC Далее располаrаются соответствующие команды CaseB Далее располаrаются соответствующие команды CaseC Далее располаrаются соответствующие команды А.9. Прочие команды Все остальные команды, поддерживаемые процессором CortexM3, перечисле ны в Табл. A.l1. Таблица А.ll. Прочие команды Мнемоника Краткое описание Подраздел ВКРТ Точка останова A.9.1. ВКРТ CPSID Изменение состояния процессора, запрещение прерываний А.9.2. CPS CPSIE Изменение состояния процессора, разрешение прерываний А.9.2. CPS DMB Барьер памяти данных А.9.З. DMB DSB Барьер синхронизации данных А.9.4. DSB ISB Барьер синхронизации команд A.9.S. ISB MRS Пересылка из реrистра специальных функций в реrистр А.9.6. MRS MSR Пересылка из реrистра в реrистр специальных функций А.9.7. MSR NOP Нет операции А.9.В. NOP SEV Послать событие А.9.9. SEV SVC Вызов супервизора A.9.10. SVC WFE Ожидание события A.9.11. WFE WFI Ожидание прерывания A.9.12. WFI 
А.9. Прочие команды . 429 А.9.1. ВКРТ Точка останова. Синтаксис ВКРТ #imm rде тт выражение) результатом KOToporo является целое число от О до 255 (8битное значение). Операция Команда ВКРТ переводит процессор в режим отладки. Отладочные средства MorYT использовать это для считывания информации о состоянии системы при достижении команды) расположенной по заданному адресу. Значение imm процессором иrнорируется. При необходимости отладчик MO жет использовать это значение для сохранения дополнительной информации о точке останова. Компания ARM не рекомендует использовать с командой ВКРТ значение ОхАВ для любых целей) за исключением поддержки полухостинrа. Ko манда ВКРТ может располаrаться внутри Iтблока) однако выполняться она будет всеrда, независимо от условия) заданноrо в команде IT. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры ВКРТ #ОхЗ Точка останова с параметром, равным ОхЗ (отладчик может извлечь эту константу, определив её положение по значению РС) примеЧQние Компания ARM не рекомендует использовать с командой ВКРТ значение ОхАВ для любых целей) за исключением поддержки полухостинrа. А.9.2. CPS Изменение состояния процессора. Синтаксис CPSeffect if1ags rде effect iflags действие) производимое над реrистром специальноrо назначения: IE очистка реrистра 10 установка реrистра один или несколько флаrов: l установка или очистка реrистра PRIMASK f установка или очистка реrистра FAULTMASK 
430 · Приложение А. Набор команд CortexM3. Справочный материал Операция Команда CPS изменяет содержимое реrистров PRIMASK и FAULTMASK. Оrраничения · Команда CPS должна вызываться только в привилеrированном режиме. В He привилеrированном режиме она не выполняет никаких действий. · Команда CPS не может выполняться условно и) соответственно) не должна ис пользоваться внутри Iтблока. Фпаrи условия Эта команда не влияет на состояние флаrов. Примеры CPSIO 1 Запрещает прерывания и конфиrурируемые обработчики отказов (установка PRlМASK) Запрещает прерывания и все обработчики отказов (установка FAULTМASK) Разрешает прерывания и конфиrурируемые обработчики отказов (очистка PRlМASK) Разрешает прерывания и все обработчики отказов (очистка FAULTМASK) CPSIO f CPSIE 1 CPSIE f А.9.3. DMB Барьер памяти данных. Синтаксис ОМВ { coпd} rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Операция Команда ОМВ используется в качестве барьера памяти данных. Она rарантиру ет) что все обращения к памяти) явно указанные до вызова команды ОМВ) будут выполнены до Toro) как начнут выполняться явные обращения к памяти) появля ющиеся после команды ОМВ. Команда ОМВ не влияет на порядок или выполнение команд, не обращающихся к памяти. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры ОМВ ; Барьер памяти данных А.9.4. DSB Барьер синхронизации данных. 
А.9. Прочие команды · 431 Синтаксис DSB{cond} rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Операция Команда DSB используется в качестве специальноrо барьера для синхрониза ции памяти данных. Команды) располаrающиеся после DSB) не будут выполнять ся до завершения команды DSB. Команда DSB завершается после Toro) как будут выполнены все явные обращения к памяти) запущенные перед командой. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры DSB ; Барьер синхронизации данных A.9.S. ISB Барьер синхронизации команд. Синтаксис ISB {cond} rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Операция Команда 1 SB используется в качестве барьера для синхронизации команд. Она очищает конвейер процессора) в результате чеrо все команды) следующие за ISB) повторно извлекаются из кэша или памяти после завершения команды ISB. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры ISB ; Барьер синхронизации команд А.9.б. MRS Пересылает содержимое реrистра специальноrо наgначения в реrисrр общеrо назначения. 
432 · Приложение А. Набор команд CortexM3. Справочный материал Синтаксис МRS{coпd} Rd, specreg rде cond необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Rd реrистрприёмник. spec reg любой из следующих реrистров: APSR, IPSR, EPSR, IEPSR, IAPSR, EAPSR, PSR, MSP, PSP, PRIMASK, BASEPRI, BASEPRI МАХ, FAULTMASK или CONTROL. Операция Команда MRS используется совместно с командой MSR для выполнения опера ции вида «чтениемодификациязапись» для изменения содержимоrо реrи стров xPSR, скажем для сброса флаrа Q. При переключении между двумя процессами необходимо сохранять состоя ние заменяемоrо процесса, включая содержимое соответствующих реrистров xPSR. Аналоrично, необходимо восстанавливать состояние запускаемоrо процес са. Для выполнения этих операций используют команды MRS (сохранение COCTO яния) и MSR (восстановление состояния). примеЧQние Мнемоника BASEPRI  МАХ эквивалентна мнемонике BASEPRI при использо вании с командой MRS; см. подраздел А.9.7 «MSR». Оrраничения Rd не может быть SP либо РС. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры MRS RO, PRIМASK Сохраняет содержимое PRIМASK в RO А.9.7. MSR Пересылает содержимое реrистра общеrо назначения в реrистр специальноrо назначения. Синтаксис MSR{coпd} specreg, Rd rде cond необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Rn реrистр источник. 
А.9. Прочие команды . 433 spec reg любой из следующих реrистров: APSR, IPSR, EPSR, IEPSR, IAPSR, EAPSR,PSR,MSP,PSP,PRIMASK,BASEPRI,BASEPRI МАХ, FAULTMASK или CONTROL. Операция Доступность реrистров специальноrо назначения определяется режимом pa боты процессора. В непривилеrированном режиме доступен только реrистр APSR. В привилеrированном режиме доступны все реrистры специальноrо назна чения. В непривилеrированном режиме запись в нереализованные биты или биты, содержащие состояние выполнения проrраммы, реrистра PSR иrнорируются. примеЧQние При указании мнемоники BASEPRI  МАХ команда выполняет запись в pe rистр BASEPRI только в случае, если: . Rn содержит ненулевое значение и текущее значение BASEPRI равно о; . Rn содержит ненулевое значение, меньшее текущеrо значения BASEPRI. СМ. подраздел А.9.6 «MRS». Оrраничения Rd не может быть SP либо РС. Флаrи условия Эта команда изменяет состояние флаrов, явно указанных в Rn. Примеры MRS CONTROL, Rl Заrружает содержимое Rl в реrистр CONTROL А.9.8. NOP Нет операции. Синтаксис NOP {coпd} rде cond необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Опрация Команда NOP не выполняет никаких действий. Команда NOP не всеrда требует времени для выполнения  процессор может убрать её из конвейера раньше, чем она достиrнет стадии исполнения. Используйте команду NOP для заполнения памяти проrрамм, например для размещения последующей команды по 64битной rранице. 
434 · Приложение А. Набор команд CortexM3. Справочный материал Флаrи условия Эта команда не влияет на состояние флаrов. Примеры NOP ; Нет операции А.9.9. SEV rенерация события. Синтаксис SEV { coпd} rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Операция Команда SEV rенерирует событие для передачи ero всем процессорам MHoro процессорной системы. Она также устанавливает в 1 локальную защёлку собы тия. Более подробно использование команды SEV описано в разделе 14.3 «MHoro процессорный обмен». Флаrи условия Эта команда не влияет на состояние флаrов. При меры SEV ; Послать событие А.9.10. SVC Вызов супервизора. Синтаксис SVC{coпd} #imm rде coпd тт необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». выражение, результатом KOToporo является целое число от О до 255 (8битное значение). Операция Команда SVC rенерирует исключение SVCall. 
А.9. Прочие команды · 435 Значение imm процессором иrнорируется. При необходимости, обработчик исключения может использовать это значение для определения запрашиваемой службы. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры SVC #ОхЗ2 Вызов супервизора (обработчик SVC может считать значение, переданное в команде, определив адрес команды по сохранённому в стеке значению РС) А.9.11. WFE Ожидание события. Синтаксис WFE{coпd} rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Операция Если локальная защёлка события сброшена, то команда WFE приостанавлива ет работу процессора до наступления любоrо из указанных событий: . возникновение исключения, не маскированноrо реrистром маскирования ис ключений или текущим уровнем приоритета; . перевод исключения в состояние ожидания, если установлен бит SEVONPEND реrистра SCR; . запрос на перевод в режим отладки, если она разрешена. Событие, сrенерированное периферией или друrим процессором мноrопро цессорной системы с использованием команды SEV. Если локальная защёлка события установлена в 1, то команда WFE очищает её и завершается. Для получения информации об использовании команды WFE и pe rистра события обратитесь к подразделу 14.2.1 «Спящие режимы». Флаrи условия Эта команда не влияет на состояние флаrов. Примеры WFE ; Ожидание события А.9.12. WFI Ожидание прерывания. 
436 · Приложение А. Набор команд CortexM3. Справочный материал Синтаксис WFI { coпd} rде coпd необязательный суффикс условия выполнения; см. подраздел А.2.7 «Условное выполнение». Операция Команда WFI приостанавливает работу процессора до наступления любоrо из указанных событий: · исключительной ситуации; · запроса на переход в режим отладки, независимо от Toro, разрешена она или нет. Флаrи условия Эта команда не влияет на состояние флаrов. Примеры WFI ; Ожидание прерывания 
ПРИ ЛОЖЕ НИ Е Б 16БИТНЫЕ КОМАНДЫ THUMB И ВЕРСИИ АрхитЕктуры ARM Поддержка большинства 16битных команд Thumb@ реализована в архитек туре у4Т (ARM7TDMI). Однако некоторые команды появились только в последу ющих версиях (У5, у6 и У7) архитектуры. Эти команды указаны в Табл. Б.l. Таблица Б.l. Поддержка 16битных команд в различных версиях архитектуры ARM Команда v4T v5 v6 СоrtехТММ3 (v7M) ВКРТ Нет Да Да Да BLX Нет Да Да Только BLX <reg> CBZ, CBNZ Нет Нет Нет Да CPS Нет Нет Да CPSIE <i/f>,CPSID <i/f> сру Нет Нет Да Да NOP Нет Нет Нет Да IT Нет Нет Нет Да REV (различные формы) Нет Нет Да REV, REVl б, REVSH SEV Нет Нет Нет Да SETEND Нет Нет Да Нет SWI Да Да Да Изменена на SVC SXTB, SXTH Нет Нет Да Да UXTB, UXTH Нет Нет Да Да WFE, WFI Нет Нет Нет Да 
ПРИ ЛОЖЕ НИ Е В ИСКЛЮЧЕНИЯ ПРОЦЕССОРА CORTEXM3 КРАТКАЯ СПРАВКА Исключения, поддерживаемые процессором CortexM3, перечислены в Табл. B.l. В этой же таблице указаны реrистры, используемые для задания ypOB ня приоритета прерываний и для разрешения данных прерываний. В.1. Типы исключений и их разрешение Таблица В.l. Исключения процессора CortexM3 Тип Приоритет Наименование (адрес реrистра уровня Разрешение исключения приоритета) 1 Reset 3 Всеrда разрешено 2 NMI 2 Всеrда разрешено 3 Hard Fault 1 Всеrда разрешено 4 MemManage Проrраммируемый Реrистр SHCSR модуля NVIC Fault (OxEOOOED18) (OxEOOOED24), бит [16] 5 Bus Fault Проrраммируемый Реrистр SHCSR модуля NVIC (OxEOOOED19) (OxEOOOED24), бит [17] 6 Usage Fault Проrраммируемый Реrистр SHCSR модуля NVIC (OxEOOOED1A) (OxEOOOED24), бит [18] 7. ..10    11 SVCall Проrраммируемый Всеrда разрешено (OxEOOOED1F) 12 Debug monitor Проrраммируемый Реrистр DEMCR модуля NVIC (OxEOOOED20) (OxEOOOEDFC), бит [16] 13    14 PendSV Проrраммируемый Всеrда разрешено (OxEOOOED22) 15 SYSTICK Проrраммируемый Реrистр SYSTCSR модуля (OxEOOOED23) SYSTICK (ОхЕОООЕ010), бит [1] 16. ..255 IRQ Проrраммируемый Реrистры NVICISERx модуля (ОхЕОООЕ400.. .ОхЕОООЕ7ЕС) NVIC (ОхЕОООЕ100.. .ОхЕОООЕ17С) 
В.2. Содержимое стека после сохранения в нём контекста · 439 8.2. Содержимое стека поспе сохранения в нём контекста Таблица В.2. Стековый фрейм исключения Адрес Данные Порядок эаrруэки в стек OLDSP (N+З2) 7 (Ранее заrруженные данные)  (N+28) PSR 2 (N+24) РС 1 (N+20) LR 8 (N+ 16) R12 7 (N+12) RЗ 6 (N+8) R2 5 (N+4) R1 4 НОВЫЙ SP (N) 7 RO 3 Примечание. Если используется выравнивание стека по rранице двойноrо слова, а указатель стека на момент возникновения исключения не был выровнен, то вершина cTeKoBoro фрейма может располаrаться по адресу ([OLDSP4] AND OxFFFFFFF8) с соответствующим сдвиrом остальноrо содержимоrо таблицы на одно слово вниз. 
ПРИЛОЖЕНИЕ r рЕrистры КОНТРОЛЛЕРА NVIC И БЛОКА УПРАВЛЕНИЯ СИСТЕМОЙ КРАТКАЯ СПРАВКА в следующих таблицах (Табл. [.l. ..f.40) содержится описание битов различ ных реrистров контроллера векторных прерываний NVIC, включая реrистры, связанные с системным таймером SYSTICK. Таблица Теl. Реrистр типа контроллера прерываний ICTR (ОхЕОООЕОО4) Биты Обозначение Тип Значение после Описание сброса Количество входов прерываний с шаrом 32: 4:0 INTLINESNUM R  0= 1...32; 1 = 33. ..64; . . . Таблица Те2. Дополнительный реrистр управления ACR (ОхЕОООЕОО8) Значение Биты Обозначение Тип после Описание сброса Если этот бит установлен, запрещается перекрытие цикла исполнения Iтблока друrой 2 DISFOLD R/W О командой. Такое перекрытие (называемое IT foldiпg) является одним из методов оптимизации, позволяющим ускорить выполнение условно выполняемых команд Если этот бит установлен, запрещается использование внутренних буферов записи процессора. В результате команда, 1 DISDEFWBUF R/W О расположенная за командой сохранения данных, не будет запущена до завершения операции сохранения. Этот бит не влияет на буферы записи, расположенные вне процессора (например, в мосте между шинами) Если этот бит установлен, запрещается О DISMCYCINT R/W О прерывание команд, выполняющихся за несколько тактов Примечание. Реrистр ACR появился во 2й ревизии процессора CortexM3. 
Приложение r. Pezucmpbl контроллера NVIC и блока управления системой · 441 Таблица Т.З. Реrистр управления и состояния системноrо таймера SYSTCSR (ОхЕОООЕОI0) Значение Биты Обозначение Тип после Описание сброса Читается как 1, если с момента последнеrо чтения 16 COUNTFLAG R О данноrо реrистра таймер досчитал до о. Этот бит сбрасывается в О автоматически после чтения или при обнулении текущеrо значения таймера 2 CLKSOURCE R/W О О  внешний тактовый сиrнал (STCLK); 1  тактовый сиrнал процессора 1  разрешить rенерацию прерывания SYSTICK при 1 TICKINT R/W О достижении таймером нулевоrо значения; О  не rенерировать прерывание О ENABLE R/W О Разрешение таймера SYSTICK Таблица Т.4. Реrистр значения перезаrрузки системноrо таймера SYSTRVR (охЕОООЕОI4) Биты Обозначение Тип Значение Описание после сброса 23:0 RELOAD R/W О Значение, заrружаемое в таймер при достижении им нулевоrо значения Таблица Т.5. Реrистр текущеrо значения системноrо таймера SYSTCVR (ОхЕОООЕОI8) Биты Обозначение Тип Значение Описание после сброса При чтении возвращается текущее значение счётчика. 23:0 CURRENT R/Wc О При записи в реrистр счётчик обнуляется; очистка счётчика также сбрасывает флаr COUNTFLAG реrистра SYSTCSR (см. Табл. [.3) Таблица Т.б. Реrистр калибровочноrо значения системноrо таймера SYSTCALIB (ОхЕОООЕОIС) Биты Обозначение Тип Значение Описание после сброса 1  нет внешнеrо опорноrо сиrнала (сиrнал 31 NOREF R  STCLK недоступен); О  внешний тактовый сиrнал доступен 1  калибровочное значение не соответствует 30 SKEW R  10MC интервалу; О  калибровочное значение точное Калибровочное значение для периода 10 мс. Разработчик SoC должен подать это значение 23:0 TENMS R/W О (в двоичном коде) на соответствующие входы процессора. Если при чтении данноrо поля возвращается О, значит, калибровочное значение недоступно 
442 · Приложение r. Pezucтpbl контроллера NVIC и блока управления системой Таблица Те7. Реrистры разреmения внешних прерываний NVICISERx (OxEOOOEIOO.. .OxEOOOEIIC) Адрес Обозначение Тип Значение Описание после сброса Разрешает внешние прерывания с номерами от О до 31: ОхЕОООЕ100 NVICISERO R/W О бит [О]  прерывание N 9 O; бит [1]  прерывание N91; . . . бит [31]  прерывание N931 ОхЕОООЕ104 NVICISER1 R/W О Разрешает внешние прерывания с номерами от 32 до 63 . . . . . . . . . . . . . . . Таблица Тев. Реrистры отмены разреmения внешних прерываний NVICICERx (OxEOOOEI80.. .OxEOOOEI9C) Адрес Обозначение Тип Значение Описание после сброса Отменяет разрешение внешних прерываний с номерами от О до 31: ОхЕОООЕ180 NVICICERO R/W О бит [О]  прерывание N9O; бит [1]  прерывание N91; . . . бит [31]  прерывание N931 ОхЕОООЕ184 NVICICER1 R/W О Отменяет разрешение внешних прерываний с номерами от 32 до 63 . . . . . . . . . . . . . . . Таблица Те9. Реrистры установки признака отложенноrо прерывания NVICISPRx (ОхЕОООЕ200.. .OxEOOOE2IC) Адрес Обозначение Тип Значение Описание после сброса Устанавливает признак отложенноrо прерывания для внешних прерываний с номерами от О до 31: ОхЕОООЕ200 NVICISPRO R/W О бит [О]  прерывание N9O; бит [1]  прерывание N91; . . . бит [31]  прерывание N931 Устанавливает признак отложенноrо ОхЕОООЕ204 NVICISPR1 R/W О прерывания для внешних прерываний с номерами от 32 до 63 . . . . . . . . . . . . . . . 
Приложение r. Pezucmpbl контроллера NVIC и блока управления системой · 443 Таблица Т.l0. Реrистры сброса признака отложенноrо прерывания NVICICPRx (ОхЕОООЕ280.. .ОхЕОООЕ29С) Адрес Обозначение Тип Значение Описание после сброса Сбрасывает признак отложенноrо прерывания для внешних прерываний с номерами от О до 31: ОхЕОООЕ280 NVICICPRO R/W О бит [О]  прерывание N 2 O; бит [1]  прерывание N21; . . . бит [31]  прерывание N231 Сбрасывает признак отложенноrо ОхЕОООЕ284 NVICICPR1 R/W О прерывания для внешних прерываний с номерами от 32 до 63 . . . . . . . . . . . . . . . Таблица Т.ll. Реrистры активности внешних прерываний NVICIABRx (ОхЕОООЕ300. . . ОхЕОООЕ31 С) Адрес Обозначение Тип Значение Описание после сброса Признак активности внешних прерываний с номерами от О до 31: ОхЕОООЕ200 NVICIABRO R О бит [О]  прерывание NQO; бит [1]  прерывание N Q 1; . . . бит [31]  прерывание N231 ОхЕОООЕ204 NVICIABR1 R О Признак активности внешних прерываний с номерами от 32 до 63 . . . . . . . . . . . . . . . Таблица Т.12. Реrистры уровня приоритета внешних прерываний PRIx (OxEOOOE400...0xEOOOE4EF; адресация в таблице  побайтовая) Адрес Обозначение Тип Значение после Описание сброса ОхЕОООЕ400 PRI О R/W О Уровень приоритета внешнеrо прерывания NQO ОхЕОООЕ401 PRIl R/W О Уровень приоритета внешнеrо прерывания NQ1 . . . . . . . . . . . . . . . ОхЕОООЕ41 F PRI 31 R/W О Уровень приоритета внешнеrо  прерывания NQ31 . . . . . . . . . . . . . . . 
444 · Приложение r. Pezucmpbl контроллера NVIC и блока управления системой Таблица Т.13. Реrистр идентификатора ЦПУ CPUID (OxEOOOEDOO) Биты Обозначение Тип Значение после сброса Описание 31:24 IMPLEMENTER R Ох41 Код производителя; для компании ARM = Ох41 23:20 VARIANT R ОхО/Ох1/0х2 Номер версии, определяемый реализацией 19:16 Constant R ОхР Константа 15:4 PARTNO R ОхС23 Номер изделия 3:0 REVISION R ОхО/Ох1 Ревизия Таблица Те14. Реrистр управления и состояния прерываний ICSR (OxEOOOED04) Биты Обозначение Тип Значение Описание после сброса 31 NMIPENDSET R/W О Немаскируемое прерывание отложено Запись 1 в этот бит переводит исключение 28 PENDSVSET R/W О PendSV в состояние ожидания. При чтении возвращается текущее состояние Запись 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их отложенных исключений 8:0 VECTACTIVE R О Номер обрабатываемоrо в данный момент исключения Таблица Те15. Реrистр смещения таблицы векторов VTOR (OxEOOOED08) Биты Обозначение Тип Значение Описание после сброса 29 TBLBASE R/W  Таблица расположена в области кода (О) или в области ОЗУ (1) 28:7 TBLOFF R/W Смещение таблицы относительно начала  области кода или области ОЗУ 
Приложение r. Pezucmpbt конmроллера NVIC и блока управления сисmемой · 445 Таблица Т.16. Реrистр управления прерываниями и сбросом AIRCR (охЕОООЕООС) Биты Обозначение Тип Значение Описание после сброса Ключ доступа; при записи в реrистр в данном поле должно быть записано значение Ох05РА) 31:16 УЕСТКЕУ R/W  иначе запись будет проиrнорирована. При чтении реrистра в этих битах возвращается значение ОхРА50 Отображает формат хранения данных: 1  обратный порядок байтов (BE8)) 15 ENDIANNESS R  О  прямой порядок байтов; этот бит может быть изменён только в момент сброса 10:8 PRIGROUP R/W О rруппированиеприоритетов 2 SYSRESETREQ W  Формирует запрос rенерации сиrнала сброса Очищает всю активную информацию о состоянии исключений; обычно 1 VECTCLRACTIVE W  используется при отладке или операционной системой для восстановления после системной ошибки (сброс является более безопасным методом) Сбрасывает процессор CortexM3 (за исклю О VECTRESET W чением компонентов отладки)) однако не  сбрасывает блоки) внешние по отношению к процессору Таблица Т.l7. Реrистр управления системой SCR (OxEOOOEDIO) Биты Обозначение Тип Значение Описание после сброса Формирование события при откладывании. Разрешает пробуждение процессора из 4 SEVONPEND R/W О спящеrо режима командой WFE при появлении HOBoro отложенноrо прерывания) независимо от приоритета этоrо прерывания 3 Зарезервировано    2 SLEEPDEEP R/W О Разрешает формирование сиrнала SLEEPDEEP при переходе в спящий режим 1 SLEEPONEXIT R/W О Включает функцию Sleepon exit О Зарезервировано    
446 · Приложение r. Pezucmpbl конmроллера NVIC и блока управления сисmемой Таблица r.18. Реrистр управления конфиrурацией CCR (OxEOOOED14) Значение Биты Обозначение Тип после Описание сброса Включить выравнивание на rраницу двойноrо слова при сохранении данных в стеке во время 9 STKALIGN R/W О или 1 исключения. В ревизии 1 процессора этот бит по умолчанию сброшен в О, а в ревизии 2  установлен в 1. В ревизии О процессора такая возможность отсутствует Иrнорировать отказы шины при обработке 8 BFHFNMIGN R/W О исключения Hard Fault и немаскируемоrо прерывания 7:5 Зарезервировано   Зарезервировано 4 DIVOTRP R/W О Перехватывать деление на ноль 3 UNALIGNTRP R/W О Перехватывать обращения к невыровненным данным 2 Зарезервировано   Зарезервировано Разрешить пользовательскому коду выполнять 1 USERSETMPEND R/W О запись в реrистр проrраммной rенерации прерывания STIR Разрешить обработчикам исключений О NONBASETHRDENA R/W О возвращаться в состояние потока на любом уровне вложенности Таблица Те19. Реrистры уровня приоритета системных исключений PRIx (OxEOOOED18...0xEOOOED23; адресация в таблице  побайтовая) Значение Адрес Обозначение Тип после Описание сброса OxEOOOED18 PRI 4 R/W О Уровень приоритета исключения MemManage Fault OxEOOOED19 PRI5 R/W О Уровень приоритета исключения Bus Fault OxEOOOED1A PRI 6 R/W О Уровень приоритета исключения Usage Fault OxEOOOEDIB     OxEOOOED1C     OxEOOOED1D     OxEOOOEDIE     OxEOOOED1F PRI  11 R/W О Уровень приоритета исключения SVCall OxEOOOED20 PRI12 R/W О Уровень приоритета исключения монитора отладки OxEOOOED21     OxEOOOED22 PRI 14 R/W О Уровень приоритета исключения PendSV OxEOOOED23 PRIlS R/W О Уровень приоритета исключения SYSTICK 
Приложение r. Pezucmpbl конmроллера NVIC и блока управления сисmемой · 447 Таблица Т.20. Ре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 было прервано исключением с более высоким приоритетом Исключение 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, если исключение монитора отладки активно 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 активно *Бит 12 (USGFAULTPENDED) в ревизии О процессора CortexM3 отсутствует. 
448 · Приложение r. Pezucmpbl контроллера NVIC и блока управления системой Таблица Те21. Реrистр состояния отказа системы управления памятью MMFSR (ОхЕОООЕО28; размер  1 байт) Биты Обозначение Тип Значение Описание после сброса 7 MMARVALID  О Индицирует корректность содержимоrо реrистра MMAR 6:5     4 MSTKERR R/Wc О Ошибка заrрузки в стек 3 MUNSTKERR R/Wc О Ошибка извлечения из стека 2     1 DACCVIOL R/Wc О Нарушение доступа к данным О IACCVIOL R/Wc О Нарушение доступа к команде Таблица Те22. Реrистр состояния отказа шины BFSR (ОхЕОООЕО29; размер  1 байт) Биты Обозначение Тип Значение Описание после сброса 7 BFARVALID  О Индицирует корректность содержимоrо реrистра BF AR 6:5     4 STKERR R/Wc О Ошибка заrрузки в стек 3 UNSTKERR R/Wc О Ошибка извлечения из стека 2 IMPRECISERR R/Wc О «Неточное» нарушение доступа к данным 1 PRECISERR R/Wc О «Точное» нарушение доступа к данным О IBUSERR R/Wc О Нарушение доступа к команде Таблица Те23. Реrистр состояния отказа проrраммы UFSR (ОхЕОООЕО2А; размер  1 полуслово) Значение Биты Обозначение Тип после Описание сброса Попытка выполнения операции деления на ноль 9 DIVBYZERO R/Wc О (может быть установлен только при YCTaHO вленном бите DIVOTRP реrистра CCR) Ошибка HeBbIpoBHeHHoro доступа (может быть 8 UNALIGNED R/Wc О установлен только при установленном бите UNALIGNTRP реrистра CCR) 7:4     3 NOCP R/Wc О Попытка выполнения команды сопроцессора 2 INVPC R/Wc О Попытка выхода из обработчика исключения с некорректным значением EXCRETURN 1 INVSTATE R/Wc О Попытка переключения внекорректное состояние (например) в состояние ARM) О UNDEFINSTR R/Wc О Попытка выполнения неопределённой команды 
Приложение r. Pezucmpbl контроллера NVIC и блока управления системой · 449 Таблица Т.24. Реrистр состояния тяжёлоrо отказа HFSR (OxEOOOED2C) Биты Обозначение Тип Значение Описание после сброса 31 DEBUGEVT R/Wc О Исключение Hard Fault было вызвано событием отладки Исключение Hard Fault было вызвано отказом 30 FORCED R/Wc О шины) отказом системы управления памятью или отказом проrраммы 29:2     1 VECTBL R/Wc О Исключение Hard Fault было вызвано ошибкой выборки вектора О     Таблица Те25. Реrистр состояния отказа отладки DFSR (OxEOOOED30) Биты Обозначение Тип Значение после сброса Описание 4 EXTERNAL R/Wc О Активирован сиrнал EDBGRQ 3 УСАТСН R/Wc О Произведена выборка вектора 2 DWTTRAP R/Wc О Произошло событие совпадения DWT 1 ВКРТ R/Wc О Выполнена команда ВКРТ О HALTED R/Wc О Останов запрошен контроллером NVIC Таблица Т.26. Реrистр адреса отказа системы управления памятью MMFAR (OxEOOOED34) Значение Биты Обозначение Тип после Описание сброса 31:0 ADDRESS R  Адрес памяти) обращение к которому вызвало отказ системы управления памятью Таблица Т.27. Реrистр адреса отказа шины BFAR (OxEOOOED38) Биты Обозначение Тип Значение Описание после сброса 31:0 ADDRESS R  Адрес памяти) обращение к которому вызвало отказ шины Таблица Т.28. Дополнительный реrистр состояния отказа AFSR (OxEOOOED3C) Биты Обозначение Тип Значение после Описание сброса 31:0 Определяется R/Wc О Определяется производителем производителем 
450 · Приложение r. Pezucmpbl конmроллера NVIC и блока управления системой Таблица Те29. Реrистр типа модуля MPU MPUTYPE (ОхЕОООЕО90) Биты Обозначение Тип Значение Описание после сброса Число областей команд, поддерживаемых данным 23:16 IREGION R  MPU; поскольку в архитектуре ARMv7M используется унифицированный модуль MPU, это поле всеrда содержит О 15:8 DREGION R  Число областей, поддерживаемых данным MPU О SEPARATE R  Этот бит всеrда равен о, поскольку используется унифицированный модуль MPU Таблица r.зо. РеI'ИСТР управления MPU MPUCTRL (ОхЕОООЕО94) Биты Обозначение Тип Значение Описание после сброса 2 PRIVDEFENA R/W О Разрешение доступа к карте памяти в привилеrированном режиме Установленный бит разрешает работу модуля MPU в обработчиках NMI и исключения Hard 1 HFNMIENA R/W О Fault. Если бит сброшен, то при выполнении этих обработчиков модуль MPU не используется (блокируется) О ENABLE R/W О Установка этоrо бита в 1 разрешает работу модуля MPU Таблица r.Зl. РеI'ИСТР номера реI'иона MPU MPURNR (ОхЕОООЕО98) Биты Обозначение Тип Значение после Описание сброса 31:0 REGION R/W О Определяет номер проrраммируемой области Таблица r.З2. РеI'ИСТр базовоI'О адреса области MPU MPURBAR (ОхЕОООЕО9С) Биты Обозначение Тип Значение Описание после сброса 31:N ADDR R/W О Базовый адрес области Если бит установлен в 1, то номер области MPU, проrраммируемой на данном этапе, будет 4 V ALID R/W О определяться полем REGION этоrо реrистра. Если бит сброшен в о, то используется область, заданная реrистром MPURNR Если бит V ALID установлен в 1, ТО это поле 3:0 REGION R/W О используется вместо реrистра номера области MPURNR; в противном случае, содержимое данноrо поля иrнорируется 
Приложение r. Pezucmpbl конmроллера NVIC и блока управления сисmемой · 451 Таблица Т.ЗЗ. РеI'ИСТР атрибутов и размера области MPU MPURASR (ОхЕОООЕОАО) Биты Обозначение Тип Значение после сброса Описание 31:29 Зарезервировано   Зарезервировано 28 XN R/W О Исполнение команд запрещено 27 Зарезервировано   Зарезервировано 26:24 АР R/W 000 Поле прав доступа к данным 23:22 Зарезервировано   Зарезервировано 21:19 ТЕХ R/W 000 Поле расширения типа 18 S R/W  Разделяемая 17 С R/W  Кэшируемая 16 В R/W  Буферируемая 15:8 SRD R/W ОхОО Запрет подобластей 7:6 Зарезервировано   Зарезервировано 5:1 SIZE R/W  Размер области MPU О ENABLE R/W О Разрешение области Таблица r.З4. РеI'ИСТРЫ псевдонимов реI'ИСТрОВ MPURBAR/ MPURASR (ОхЕОООЕОА4.. .ОхЕОООЕОВ8) Адрес РеI'ИСТР Описание OxEOOOEDA4 Псевдоним D9C Псевдоним 1 реrистра MPURBAR OxEOOOEDA8 Псевдоним DAO Псевдоним 1 реrистра MPURASR OxEOOOEDAC Псевдоним D9C Псевдоним 2 реrистра MPURBAR OxEOOOEDBO Псевдоним DAO Псевдоним 2 реrистра MPURASR OxEOOOEDB4 Псевдоним D9C Псевдоним 3 реrистра MPURBAR OxEOOOEDB8 Псевдоним DAO Псевдоним 3 реrистра MPURASR Таблица Т.З5. РеI'ИСТР управления остановом и состояния отладчика DHCSR (OxEOOOEDFO) Значение Биты Обозначение Тип после Описание сброса Ключ доступа к функциям отладки; при записи 31:16 КЕУ W  в реrистр в этом поле должно быть записано значение ОхА05Р) иначе запись будет проиrнорирована 25 SRESETST R  Ядро было сброшено или находится в состоянии сброса. Бит сбрасывается при чтении 24 SRETIREST R  Команда завершена с момента последнеrо чтения реrистра. Бит сбрасывается при чтении 19 SLOCKUP R  Если бит установлен в 1) то ядро находится в состоянии блокировки 18 SSLEEP R  Если бит установлен в 1) то ядро находится в спящем режиме 17 SHALT R  Если бит установлен в 1) то ядро остановлено 
452 · Приложение r. Pezucmpbl контроллера NVIC и блока управления системой Таблица r.З5. Реrистр управления остановом и состояния отладчика DHCSR (OxEOOOEDFO) (продолжение) Значение Биты Обозначение Тип после Описание сброса 16 SREGRDY R  Операция чтения/записи реrистра завершена 15:6 Зарезервировано   Зарезервировано 5 CSNAPSTALL R/W  Прерывание «зависших» операций обращения к памяти 4 Зарезервировано   Зарезервировано Маскирование прерываний в спящем режиме; бит 3 CMASKINTS R/W  может быть изменён только при остановленном процессоре Выполнение одной команды (пошаrовая работа 2 CSTEP R/W  процессора); действителен только при установленном бите CDEBUGEN 1 CHALT R/W  Останов процессорноrо ядра; действителен только при установленном бите CDEBUGEN О CDEBUGEN R/W  Разрешение отладки в режиме останова Таблица r.З6. Реrистр выбора реrистра ядра DCRSR (OxEOOOEDF4) Биты Обозначение Тип Значение после Описание сброса 16 REGWnR W  Направление передачи данных: Запись = 1, Чтение = О 15:5 Зарезервировано    Реrистр, к которому производится обращение: 00001 = Rl; . . . 01111 = R15; 10000 = хРSR/Флаrи; 10001 = MSP; 4:0 REGSEL W  10010 = PSP; 10100 = Реrистры специальноrо назначения: [31:24]  CONTROL, [23:16]  FAULTMASK, [15:8]  BASEPRI, [7:0]  PRIMASK. Остальные значения зарезервированы Таблица r.з7. Реrистр содержимоrо реrистра ядра DCRDR (OxEOOOEDF8) Биты Обозначение Тип Значение Описание после сброса 32:0 Data R/W  Реrистр данных для хранения результата чтения реrистра или значения, записываемоrо в реrистр 
Приложение r. Pezucmpbl конmроллера NVIC и блока управления сисmемой · 453 Таблица Т.3В. Реrистр управления исключением и монитором отладки DEMCR (OxEOOOEDFC) Значение Биты Обозначение Тип после Описание сброса Разрешение работы системы трассировки; 24 TRCENA R/W О должен быть установлен в 1 для использования модулей DWT) ЕТМ) ITM и TPIU 23:20 Зарезервировано   Зарезервировано Указывает на то) что вызов монитора отладки 19 MONREQ R/W О произошёл в результате ручной установки бита признака отложенноrо прерывания) а не в результате события аппаратноrо отладчика Выполнение одной команды (пошаrовая работа 18 MONSTEP R/W О процессора); действителен только при установленном бите MONEN rенерация запроса исключения Debug monitor; 17 MONPEND R/W О процессор приступит к обработке исключения соrласно ero приоритету 16 MONEN R/W О Разрешение исключения Debug monitor 15:11 Зарезервировано   Зарезервировано 10 VCHARDERR R/W О Перехват тяжёлых отказов 9 VCINTERR R/W О Перехват отказов) возникающиХ при входе в обработчик исключения и при выходе из Hero 8 VCBUSERR R/W О Перехват отказов шины 7 VCSTATERR R/W О Перехват отказов проrраммы) вызванных некорректной информацией о состоянии Перехват отказов проrраммы) вызванных 6 VCCHKERR R/W О обращением к невыровненным данным либо делением на ноль 5 VCNOCPERR R/W О Перехват отказов проrраммы) вызванных попыткой обращения к сопроцессору Перехват ошибок) возникающих при входе в обработчик исключения и при выходе из Hero 4 VCMMERR R/W О Перехват отказов системы управления памятью 3:1 Зарезервировано   Зарезервировано О VCCORERESE R/W О Перехватсбросаядра Таблица Т.39. Реrистр проrраммной rенерации прерывания STIR (OxEOOOEFOO) Значение Биты Обозначение Тип после Описание сброса При записи в это поле какоrолибо числа 8:0 INTID W  устанавливается бит признака отложенноrо прерывания для прерывания с соответствующим номером 
454 · Приложение r. Pezucmpbl контроллера NVIC и блока управления системой Таблица r.40. Реrистры идентификатора периферии контроллера NVIC (OxEOOOEFDO. . .OxEOEFFC) Адрес Обозна Тип Значение после Описание чение сброса OxEOOOEFDO PERIPHID4 R ОхО4 Идентификатор периферийноrо устройства OxEOOOEFD4 PERIPHID5 R ОхОО Идентификатор периферийноrо устройства OxEOOOEFD8 PERIPHID6 R ОхОО Идентификатор периферийноrо устройства OxEOOOEFDC PERIPHID7 R ОхОО Идентификатор периферийноrо устройства ОхЕОООЕРЕО PERIPHIDO R ОхОО Идентификатор периферийноrо устройства ОхЕОООЕРЕ4 PERIPHIDl R ОхВО Идентификатор периферийноrо устройства ОхЕОООЕРЕ8 PERIPHID2 R OxOB/OxlB/Ox2B* Идентификатор периферийноrо устройства OxEOOOEFEC PERIPHID3 R ОхОО Идентификатор периферийноrо устройства ОхЕОООЕРРО PCELLIDO R OxOD Идентификатор компонента OxEOOOEFF4 PCELLIDl R ОхЕО Идентификатор компонента OxEOOOEFF8 PCELLID2 R ОхО5 Идентификатор компонента OxEOOOEFFC PCELLIDO R OxBl Идентификатор компонента *ОхОВ для ревизии О процессора CortexM3, OxlB  для ревизии 1 и Ох2В  для ревизии 2. 
ПРИЛОЖЕНИЕ Д РУКОВОДСТВО ПО ЛОКАЛИ3АЦИИ ОШИБОК В пРоrРАММАХ ДЛЯ CORTEXM3 Д.1. Общие сведения Среди различных задач, возникающих при использовании процессора CortexM3, чуть ли не на первом месте стоит задача локализации ошибок в случае некорректной работы проrраммы. К счастью, в процессоре CortexM3 предусмо трено несколько реrистров состояния отказов, облеrчающих выполнение указан ной задачи (Табл. д.!). Причём, к трём из данных реrистров (MMFSR, BFSR и UFSR) можно обращаться одновременно с помощью команд пересылки 32бит ных значений. В таком случае используется специальный комбинированный pe rистр состояния отказов CFSR (Рис. д.!). Таблица Д.l. Реrистры состояния отказов процессора CortexM3 Адрес Реrистр Полное название Размер OxEOOOED28 MMFSR Реrистр состояния отказа системы управления памятью Байт OxEOOOED29 BFSR Реrистр состояния отказа шины Байт OxEOOOED2A UFSR Реrистр состояния отказа проrраммы Полуслово OxEOOOED2C HFSR Реrистр состояния тяжёлоrо отказа Слово OxEOOOED30 DFSR Реrистр состояния отказа отладки Слово OxEOOOED3C AFSR Дополнительный реrистр состояния отказа Слово Бит 31 16 15 8 7 О ОхЕОООЕDЗС I AFSR I ОхЕОООЕDЗО I DFSR I ОхЕОООЕО2С I HFSR I ОхЕОООЕО28 11 UFSR 11 BFSR 11 MFSR I С: CFSR Рис. Д.l. Обращение к pezucmpaM состояния отказов. 
456 · Приложение д. Руководство по локализации ошибок в npozpaMMax для CortexM3 При наличии СМSISсовместимой библиотеки к этим реrистрам можно обра щаться как к элементам структуры: · SCB > CFSR  реrистр состояния конфиrурируемых отказов; · SCB > HFSR  реrистр состояния тяжёлоrо отказа; · SCB > DFSR  реrистр состояния отказа отладки; · SCB > AFSR  дополнительный реrистр состояния отказа. Ещё одним источником информации является значение счётчика команд, co храняемое в стеке. При входе в обработчик исключения отказа содержимое счёт чика располаrается по адресу [SP+24]. Поскольку в процессоре CortexM3 имеет ся два указателя стека, то перед извлечением данноrо значения из стека обработ чик должен определить используемый указатель. В случае отказов шины или системы управления памятью вы можете даже определить адрес, обращение к которому вызвало ошибку. Для отказов системы управления памятью этот адрес содержится в реrистре MMFAR, а для отказов шины  в реrистре BFAR. Причём, содержимое указанных реrистров можно счи тать достоверным только в том случае, если установлен бит MMARV ALID (pe rистр MMFSR) или ВР ARV ALID (реrистр BFSR) соответственно. Реrистры ммр AR и BFAR физически являются одним и тем же реrистром, поэтому в каждый MO мент времени только один из них может содержать корректное значение (Табл. Д.2). Таблица Д.2. Реrистры адреса отказа процессора CortexM3 Адрес Реrистр Полное название Размер OxEOOOED34 MMFAR Реrистр адреса отказа системы управления памятью Слово OxEOOOED38 BFAR Реrистр адреса отказа шины Слово При использовании СМSISсовместимых драйверов устройств к реrистрам адресов отказов можно обращаться аналоrично реrистрам состояния отказов: · SCB > MMFAR  реrистр адреса отказа системы управления памятью; · SCB > BFAR  реrистр адреса отказа шины. Последним источником информации о причинах ошибки может стать pe rистр связи (LR). Если отказ был вызван некорректным значением EXCRETURN, то при входе в обработчик отказа содержимое данноrо реrистра будет таким же, как и на момент возникновения ошибки. Обнаружив некорректность содержи Moro LR, проrраммист может использовать данную информацию для определе ния причин записи в этот реrистр HeBepHoro значения возврата. Д.2. Обработчики исключений отказов в большинстве случаев обработчики отказов, используемые при разработке устройства, довольно сильно отличаются от тех же обработчиков, присутствую щих в уже работающей системе. На этапе создания проrраммы данные обработ чики нужны, rлавным образом, для Toro, чтобы извещать проrраммиста о воз никших проблемах, тоrда как в работающей системе обработчики отказов долж ны, в первую очередь, заниматься восстановлением работоспособности этой си стемы. В данном подразделе мы коснёмся только вопроса формирования сообще 
Д.2. Обработчики исключений отказов · 457 ний об ошибках, поскольку действия, необходимые для восстановления системы, очень сильно зависят от назначения и параметров KOHKpeTHoro устройства. Если проrрамма достаточно сложная, то в самом обработчике отказа никаких сообщений обычно не выводится. Вместо этоrо содержимое соответствующих реrистров сохраняется в памяти, а детальный отчёт о возникшей проблеме фор мируется уже в обработчике исключения SVCall. Такое решение позволяет пре дотвратить возникновение отказов, которые MorYT вызвать блокировку процес сора, при отображении или выводе служебной информации. В простых приложе ниях такие предосторожности, как правило, излишни, и выводом информации может заниматься сам обработчик отказа. Д.2.1. ВЫВОД содержимоrо реrистров состояния отказов Прежде Bcero, обработчик отказа должен передать проrраммисту значение co ответствующеrо реrистра состояния отказа. Речь идёт о следующих реrистрах: . UFSR; . BFSR; . MMFSR; . HFSR; . DFSR; . AFSR (опция). Д.2.2. ВЫВОД содержимоrо РС и прочих реrистров, .. сохраненных в стеке Чтобы извлечь из стека значение ре, в обработчике отказа может использо ваться следующий код: TST LR, #Ох4 Проверяем 2й бит значения EXCRETURN в реrистре LR ITTEE EQ Если ноль (равно), то MRSEQ RO, MSP использовался основной стек, помещаем MSP в RO LDREQ RO, [RO,#24] Извлекаем старое значение РС из стека MRSNE RO, PSP Иначе, использовался стек процесса, помещаем PSP в RO LDRNE RO, [RO,#24] Извлекаем старое значение РС из стека И всё же большинство проектов для процессора CortexM3 создаётся на языке Си. Однако в проrраммах на Си определить местоположение cTeKoBoro фрейма для последующеrо обращения к нему бывает весьма непросто, что связано с He возможностью получить стандартными средствами языка значение указателя стека. Для передачи содержимоrо cTeKoBoro фрейма в обработчик отказа, напи санный на языке Си, необходимо использовать своеобразную ассемблерную «надстройку». Эта «надстройка» будет извлекать значение указателя стека и пере давать ero в функцию, формирующую сообщения об ошибке (Рис. Д.2). Данный механизм идентичен описанному в fлаве 12. В следующем примере мы продемон стрируем использование BCTpoeHHoro ассемблера, поддерживаемоrо пакетами RVDS и MDKARM. 
458 · Приложение д. Руководство по локализации ошибок в npozpaMMax для CortexM3 Бит 2 = О Определяем стек, использованный вызывающим процессом, по значению реrистра LR (бит [2]) Бит 2 = 1 При сохранении KOHTeK ста использовался MSP При сохранении KOHTeK ста использовался PSP Извлекаем сохранённое значение РС из стека Рис. Д.2. Извлечение из стека исходноzо значения РС. Сначала напишем ассемблерную «надстройку». Адрес этой «надстройки» дол жен располаrаться в таблице векторов на месте вектора исключения Hard Fault. Данная «надстройка» копирует значение используемоrо указателя стека в pe rистр RO, после чеrо вызывает собственно обработчик, написанный на Си. // Ассемблерная «надстройка» для обработчика тяжёлоrо отказа // Определяет адрес cTeKoBoro фрейма и передаёт ero // как указатель в обработчик исключения азm void hard fault handler asm(void)     TST LR, #4 ITE EQ MRSEQ RO, MSP MRSNE RO, PSP В cpp(hard faulthandlerc) Вторую часть обработчика напишем на Си. Используя переданный указатель, мы можем считать содержимое реrистров, сохранённых в стеке: // Обработчик исключения Hard Fault, принимающий // в качестве входноrо параметра адрес cTeKoBoro фрейма void hardfaulthandlerc(unsigned int * hardfaultargs) { unsigned int stacked rO; unsigned int stacked rl; unsigned int stacked r2; unsigned int stacked rЗ; unsigned int stacked r12; unsigned int stacked lr; unsigned int stackedpc; unsigned int stackedpsr; stacked rO stacked rl ((unsigned long) hardfaultargs[O]); ((unsigned long) hardfaultargs[l]); 
Д.2. Обработчики исключений отказов · 459 stacked r2 = ((unsigned long) hardfaultargs[2]);  stacked rЗ = ((unsigned long) hаrdfаultаrgs[З]); stacked r12 ((unsigned long) hardfaultargs[4]);  stacked lr ((unsigned long) hardfaultargs[5]);  stackedpc = ((unsigned long) hardfaultargs[6]); stackedpsr = ((unsigned long) hardfaultargs[7]); printf (<<[Обработчик Hard Fault]\n»); printf (<<RO = %х\п», stackedrO); printf (<<Rl = %х\п», stackedrl); printf (<<R2 = %х\п», stackedr2); printf (<<RЗ = %х\п», stасkеdrЗ); printf (<<R12 = %х\п», stackedr12); printf (<<LR = %х\п», stacked lr); printf (<<РС = %х\п», stackedpc); printf (<<PSR = %х\п», stackedpsr); printf (<<BFAR = %х\п», (* ((volatile unsigned long *) (ОхЕОООЕDЗ8)))); printf (<<CFSR = %х\п», (* ((volatile unsigned long *) (ОхЕОООЕD28)))); printf (<<HFSR = %х\п», (* ((volatile unsigned long *) (ОхЕОООЕD2С)))); printf (<<DFSR = %х\п», (* ((volatile unsigned long *) (ОхЕОООЕDЗО)))); printf (<<AFSR = %х\п», (* ((volatile unsigned long *) (ОхЕОООЕDЗС)))); exit(O); // Завершаем работу return; Хочу обратить ваше внимание на то, что данный обработчик будет работать некорректно, если указатель стека указывает на неверную область памяти (Ha пример, изза переполнения стека). Это касается любоrо кода, написанноrо на Си, поскольку практически любая функция, написанная на Си, использует стек. Чтобы облеrчить себе работу по поиску ошибок, можно сrенерировать файл листинrа с дизассемблированным кодом. Д.2.3. Чтение реrистра адреса отказа После сброса бита MMARVALID или BFARVALID содержимое реrистра aдpe са отказа может оказаться стёртым. Поэтому обращаться к этому реrистру необ ходимо следующим образом: 1. Прочитать реrистр BFAR/MMAR. 2. Проверить бит BFARVALID/MMARVALID. Если он сброшен, то содержимое реrистра BFAR/MMAR следует считать недействительным. 3. Сбросить бит BFARVALID/MMARVALID. Бит корректности содержимоrо реrистра адреса проверяется уже после чте ния caMoro реrистра  это сделано для Toro, чтобы избежать вытеснения текуще ro обработчика более высокоприоритетным между чтением бита корректности и собственно реrистра адреса. В противном случае, возможен следующий cцeHa рий развития событий: 1. Читаем бит BFARVALID/MMARVALID. 
460 · Приложение д. Руководство по локализации ошибок в npozpaMMax для CortexM3 2. Бит корректности установлен, приступаем к чтению реrистра BFAR/MMFAR. 3. Исключение с более высоким приоритетом прерывает выполнение текущеrо обработчика, в результате чеrо возникает новый отказ и запускается соответствующий обработчик отказа. 4. Обработчик отказа с более высоким приоритетом сбрасывает бит BFARV ALID/MMARV ALID, вызывая очистку реrистра BFAR/MMFAR. 5. После возврата в исходный обработчик отказа читается реrистр BFAR/ MMFAR. Но поскольку ero содержимое уже некорректно, мы получаем неверно е значение адреса отказа. Таким образом, чтобы rарантировать корректность содержимоrо реrистра адреса отказа, бит корректности необходимо читать только после чтения реrи стра адреса. Д.2.4. Сброс битов состояния отказов После формирования сообщения об отказе соответствующий бит реrистра состояния отказа необходимо сбрасывать, чтобы не ввести в заблуждение обра ботчик исключения при последующем ero запуске. Если бит корректности адреса не сбросить, то при возникновении очередноrо отказа содержимое реrистра адреса отказа изменено не будет. Д.2.5. Прочие вопросы После входа в обработчик отказа часто возникает необходимость сохранения содержимоrо реrистра связи. Однако если отказ был вызван ошибкой стека, то помещение реrистра LR в стек может лишь усуrубить ситуацию. Как мы знаем, реrистры RO.. .R3 и R12 к этому моменту уже сохранены в стеке, поэтому можем спокойно скопировать содержимое LR в любой из указанных реrистров. Д.3. Опредепение причины отказа На основе полученной информации мы можем выяснить причину HeKoppeKT ной работы проrраммы. Наиболее распространённые причины возникновения отказов приведены в Табл. Д.3...Д.7. Таблица Д.3. Отказы системы управления памятью (реrистр MMFSR) Бит Возможные причины отказа MMARVALID Показывает, что в реrистре MMFAR содержится корректное значение адреса, (бит 7) обращение к которому вызвало отказ Ошибка произошла во время сохранения контекста в стеке (при входе MSTKERR в исключение). (бит 4) 1. Указатель стека повреждён. 2. Размер стека слишком велик, в результате чеrо указатель стека попал в область, не определённую или запрещённую конфиrурацией модуля MPU. Ошибка произошла во время восстановления контекста из стека (при выходе из MUNSTKERR исключения). (бит 3) 1. Указатель стека был повреждён в обработчике исключения. 2. Конфиrурация модуля MPU была изменена в обработчике исключения. 
д.з. Определение причины отказа · 461 Таблица Д.3. Отказы системы управления памятью (реrистр MMFSR) (продолжение) Бит DACCVIOL (бит 1) IACCVIOL (бит О) Возможные причины отказа Нарушение прав доступа к памяти, заданных конфиrурацией модуля MPU. Например, попытка пользовательскоrо приложения обратиться к области, доступной только для привилеrированноrо доступа 1. Нарушение прав доступа к памяти, определённых конфиrурацией модуля MPU. Например, попытка пользовательскоrо приложения обратиться к области, доступной только в привилеrированном режиме. Для отыскания проблемноrо кода можно воспользоваться значением РС, сохранённым в стеке. 2. Переход в область памяти, не поддерживающую выборку команд. 3. Неверный код возврата из исключения. 4. Некорректное значение элемента таблицы векторов. Как пример, заrрузка в память исполняемоrо образа для традиционноrо процессора ARM или же возникновение исключения до инициализации таблицы векторов. 5. Повреждение значения РС, находящеrося в стеке, во время обработки исключения. Таблица Д.4. Отказы шины (реrистр BFSR) Бит BFARRVALID (бит 7) STKERR (бит 4) UNSTKERR (бит 3) IMPRECISERR (бит 2) PRECISERR (бит 1) Возможные причины отказа Показывает, что в реrистре BFAR содержится корректное значение адреса, обращение к которому вызвало отказ Ошибка произошла во время сохранения контекста в стеке (при входе в исключение). 1. Указатель стека повреждён. 2. Размер стека слишком велик, в результате чеrо указатель стека попал в область, не определённую или запрещённую конфиrурацией модуля MPU. 3. Используется неинициализированный указатель PSP. Ошибка произошла во время восстановления контекста из стека (при выходе из исключения). Если при сохранении контекста ошибки не было, то причиной отказа, скорее Bcero, является повреждение указателя стека во время выполнения обработчика исключения Ошибка на шине при обращении к данным. Ошибка может быть вызвана: 1. Обращением к неинициализированному устройству. 2. Обращением в пользовательском режиме к устройству, допускающему обращение только в привилеrированном режиме. 3. Выполнением пересылки с размером, не поддерживаемым устройством. Ошибка на шине при обращении к данным. Адрес, обращение к которому вызвало отказ, может содержаться в реrистре BFAR. Ошибка может быть вызвана: 1. Обращением к неинициализированному устройству. 2. Обращением в пользовательском режиме к устройству, допускающему обращение только в привилеrированном режиме. 3. Выполнением пересылки с размером, не поддерживаемым устройством. 
462 · Приложение д. Руководство по локализации ошибок в npozpaMMax для CortexM3 Бит Таблица Д.4. Отказы шины (реrистр BFSR) (продолжение) IBUSERR (бит О) Возможные причины отказа 1. Переход в недопустимую область памяти; например, вызванный неверным значением указателя на функцию. 2. Некорректное значение кода возврата из исключения; например, при порче сохранённоrо в стеке значения EXCRETURN, в результате чеrо возврат из исключения ошибочно интерпретируется как операция перехода. 3. Некорректное значение элемента таблицы векторов. Как при мер, заrрузка в память исполняемоrо образа для традиционноrо процессора ARM или же возникновение исключения до инициализации таблицы векторов. 4. Повреждение значения РС, находящеrося в стеке, во время выполнения подпроrраммы. 5. Обращение к реrистрам контроллера NVIC или SCB в пользовательском режиме (непривилеrированное). Таблица Д.5. Отказы nporpaMMbI (реrистр UFSR) Бит DIVBYZERO (бит 9) UNALIGNED (бит 8) NOCP (бит 3) INVPC (бит 2) Возможные причины отказа Произошло деление на ноль при установленном бите DIVOTRP. Местоположение команды, вызвавшей отказ, можно определить по значению РС, сохранённому в стеке Была попытка HeBbIpoBHeHHoro доступа при установленном бите UNALIGNTRP. Местоположение команды, вызвавшей отказ, можно определить по значению РС, сохранённому в стеке Попытка выполнения команды сопроцессора. Местоположение команды, вызвавшей отказ, можно определить по значению РС, сохранённому в стеке 1. Некорректное значение EXCRETURN во время возврата из исключения. Например: а) возврат в режим потока при EXCRETURN = ОхРРРРРРР1; б) возврат в режим обработчика при EXCRETURN = OxFFFFFFF9. При этом текущее содержимое реrистра LR соответствует тому, которое было на момент возврата из исключения, вызвавшеrо отказ. 2. Неверное значение признака активности исключения. Например: а) возврат из исключения при сброшенном бите признака активности исключения. Может быть вызвано записью в бит VECTCLTRACTIVE реrистра AIRCR или сбросом бита признака активности в реrистре SHCSR контроллера NVIC; б) возврат из исключения в режим потока при наличии одноrо и более активных исключений. 3. Повреждение стека, вызвавшее заrрузку HeBepHoro значения в реrистр IPSR. В данном случае содержимое РС, находящееся в стеке, будет соответствовать месту, в котором было прервано выполнение основной проrраммы. Для определения причины отказа лучше Bcero использовать функцию трассировки исключений модуля DWT. 4. Некорректное для текущей команды значение бита ICI/IT. Данная ошибка может возникнуть в том случае, если в обработчике прерывания, прервавшеrо выполнение операции rрупповой заrрузки/сохранения, было изменено значение РС, находящееся в стеке. Это приведёт к тому, что после возврата из прерывания бит ICI окажется установленным при выполнении команды, не использующей биты ICI. То же может произойти изза повреждения содержимоrо реrистра PSR, наХодящеrося в стеке. 
д.з. Определение причины отказа · 463 Таблица Д.5. Отказы nporpaMMbI (реrистр UFSR) (продолжение) Бит INVSTATE (бит 1) UNDEFINSTR (бит О) Возможные причины отказа 1. Заrрузка в счётчик команд адреса перехода со сброшенным младшим битом. Адрес перехода можно определить по содержимому РС, находящемуся в стеке. 2. Младший бит адреса вектора в таблице векторов сброшен в о. Точку входа в обработчик исключения можно определить по содержимому РС, находящемуся в стеке. 3. Повреждение PSR, находящеrося в стеке, во время обработки исключения и, как результат, попытка переключения ядра процессора в состояние ARM при возврате в прерванную проrрамму. 1. Попытка выполнения команды, не поддерживаемой процессором CortexM3. 2. Некорректное/повреждённое содержимое ячейки памяти. 3. Заrрузка на этапе компоновки объектноrо кода ARM. Проверьте настройки компилятора. 4. Проблема с выравниванием команд. Так, если при работе с инструментарием GNU после применения директивы .ascii не указать директиву .align, то последующие команды MorYT оказаться невыровненными (будут расположены по нечётным адресам). Таблица Д.б. Тяжёлые отказы (реrистр HFSR) Бит DEBUGEVF (бит 31) FORCED (бит 30) VECTBL (бит 1) Возможные причины отказа Отказ был вызван событием отладки: 1. События точки останова/наблюдения. 2. Выполнение команды ВКРТ при запрещённом исключении монитора отладки (MONEN = О) и запрещённой отладке в режиме останова (CDEBUGEN = О). Некоторые компиляторы Си MorYT по умолчанию вставлять в проrрамму код поддержки полухостинrа, использующий команды ВКРТ. 1. Попытка выполнить команду SVC/BKPT из обработчика SVCall/Debug monitor или из обработчика друrоrо исключения с таким же или более высоким приоритетом. 2. Отказ произошёл изза Toro, что соответствующий обработчик запрещён или не может быть запущен по причине маскирования исключения или же выполнения обработчика друrоrо исключения с таким же или более высоким приоритетом. Ошибка выборки вектора. Возможные причины: 1. Отказ шины во время выборки вектора. 2. Некорректные настройки смещения таблицы векторов. Таблица Д.7. Отказы отладки (реrистр DFSR) Бит Возможные причины отказа EXTERNAL (бит 4) Активация сиrнала EDBGRQ УСАТСН (бит 3) Произошло событие захвата вектора прерывания DWTTRAP (бит 2) Произошло событие точки наблюдения модуля DWT 1. Была выполнена команда ВКРТ. 2. Модуль РРВ rенерировал событие точки останова. BRPT (бит 1) В некоторых случаях команды ВКРТ вставляются в итоrовый код стартовой процедурой при инициализации отладки по методу полухостинrа. В рабочем коде таких команд быть не должно. Пожалуйста, обратитесь к документации на используемый вами компилятор HALTED (бит О) Запрос останова в контроллере NVIC 
464 · Приложение д. Руководство по локализации ошибок в npozpaMMax для CortexM3 Д.4. Прочие возможные проблемы Прочие проблемы, наиболее часто возникающие при разработке проrрамм для процессоров с ядром CortexM3, указаны в Табл. Д.8. Таблица Д.В. Прочие возможные проблемы Ситуация Проrрамма не запускается Проrрамма «падает» после исполнения нескольких команд Процессор не переходит в спящий режим после выполнения команды WFE Выполнение проrраммы неожиданно останавливается Неожиданное поведение SEVONPEND Уровень приоритета прерывания работает не так, как ожидалось Возможные причины Возможно, неправильно сконфиrурирована таблица векторов: 1. Таблица расположена по недопустимому адресу. 2. Младшие биты векторов (включая вектор исключения Hard Fault) не установлены в 1. 3. В таблице используются команды переход а (как в таблице векторов классических процессоров ARM). Сrенерируйте листинr с дизассемблированным кодом и удостоверьтесь, что таблица векторов настроена правильно Такое поведение проrраммы может быть вызвано некорректными установками формата хранения данных, некорректной инициализацией указателя стека (проверьте таблицу векторов) или же использованием объектной библиотеки для традиционноrо процессора ARM (код ARM вместо кода Thumb). Функции данных библиотек MorYT вызываться из cTapToBoro кода. Пожалуйста, проверьте настройки компилятора и компоновщика и убедитесь, что используются библиотечные файлы Thumb и Thumb2 Выполнение команды WFE не всеrда вызывает переход процессора в спящий режим. Если внутренний реrистр события был установлен до вызова команды WFE, то она просто очистит этот реrистр и выполнится как NOP. Поэтому команду WFE рекомендуется вызывать в цикле Если включена функция SleepOnExit, то при возврате из обработчика исключения в режим потока процессор будет переходить в спящий режим даже при отсутствии команд WFE/WFI Бит SEVONPEND реrистра SCR разрешает запрещённым прерываниям выводить процессор из спящеrо режима, вызванноrо командой WFE, но не WFI. Событие вывода из спящеrо режима rенерируется только в момент перевода прерывания в состояние ожидания. Если на момент исполнения команды WFE бит признака отложенноrо прерывания был уже установлен, то появление HOBoro запроса прерывания не вызовет rенерации указанноrо события и, соответственно, не выведет процессор из спящеrо режима В отличие от мноrих друrих процессоров, нулевое значение в процессоре Cortex М3 соответствует максимально возможному уровню приоритета исключений с проrраммируемым приоритетом. Чем больше значение уровня приоритета, тем ниже собственно приоритет. При проrраммировании реrистров уровня приоритета убедитесь, что вы заносите значения в реализованные (старшие) биты реrистров. Большинство микроконтроллеров с ядром CortexM3 имеют 3битные (8 уровней) или 4битные (16 уровней) реrистры уровня приоритета. При этом используются старшие биты реrистров. Поэтому если вы попытаетесь записать в реrистр значения вида ОхО3, ОхО7 и т.п., в нём окажется ноль 
Д.4. Прочие возможные проблемы · 465 Таблица Д.В. Прочие возможные проблемы (продолжение) Ситуация Выполнение команды SVC вызывает rенерацию исключения отказа Параметры, передаваемые в исключение SVCall, искажаются Исключение SYSTICK возникает при сброшенном бите TICKINT Интерфейс JTAG заблокирован Возможные причины Процессор CortexM3 не поддерживает рекурсивную обработку исключений  исключение не может быть обработано до тех пор, пока ero приоритет не окажется выше текущеrо приоритета. Как следствие, вы не можете использовать команду SVC в обработчиках исключений SVCall, Hard Fault и NMI, а также в обработчиках друrих исключений, приоритет которых выше или равен приоритету исключения SVCall При передаче параметров в обработчики исключений, скажем SVCall, значения данных параметров (реrистры RO.. .R3) необходимо извлекать из cTeKoBoro фрейма, а не из реrистровоrо банка. Это связано с тем, что до входа в обработчик SVCall может возникнуть друrое исключение, которое будет обработано первым. Поскольку обработчики исключений MorYT изменять реrистры RO.. .R3 и R12 (стандарт AAPCS не требует от Сиподпроrрамм сохранять содержимое этих реrистров), то при входе в обработчик SVCall содержимое указанных реrистров следует считать неопределённым. Соответственно, для корректной передачи параметров необходимо использовать стек. Это потребует написания на ассемблере некоторой «надстройки», которая будет определять значение KoppeKTHoro указателя стека и передавать ero в качестве указателя в обработчик, написанный на Си. При мер подобноrо кода можно найти в [лаве 11 настоящей книrи, а также в руководстве по применению AN179, выпущенному компанией ARM. Аналоrичные меры предосторожности следует принимать при передаче данных из обработчика исключения в прерванную проrрамму. Обработчик должен сохранить передаваемые данные в стековом фрейме. В противном случае, содержимое реrистров будут перезаписано при восстановлении контекста Бит TICKINT реrистра управления и состояния таймера SYSTICK используется для разрешения и запрещения исключения SYSTICK. Однако если это исключение уже находится в состоянии ожидания, то сброс бита TICKINT не предотвратит rенерацию исключения. Чтобы rарантированно заблокировать rенерацию исключения SYSTICK, необходимо сбросить не только бит TICKINT, но и соответствующий бит признака отложенноrо прерывания в реrистре ICSR контроллера NVIC Во мноrих микроконтроллерах на базе процессора Cortex М3 интерфейс JT AG выведен на контакты, используемые портами ввода/вывода. Если сразу же после запуска проrраммы эти выводы конфиrурируются в качестве линий ввода/вывода, то вы не сможете войти в режим отладки или стереть флэш память микроконтроллера 
466 · Приложение д. Руководство по локализации ошибок в npozpaMMax для CortexM3 Ситуация Таблица Д.В. Прочие возможные проблемы (продолжение) Возникают неожиданные прерывания Проблемы при использовании обычных прерываний в качестве проrраммных Неожиданное переключение в состояние ARM при выполнении команд BLX и ВХ Неожиданное запрещение прерываний Возможные причины Некоторые микроконтроллеры имеют буфер записи в мосте шины периферийных устройств. Поэтому возможна следующая ситуация: обработчик исключения сбрасывает прерывание, выполняя запись в устройство, производится выход из обработчика, после чеrо этот обработчик запускается повторно изза Toro, что периферийное устройство не успело снять запрос прерывания. Данную проблему можно решить следующим образом: 1. Перед выходом из исключения выполнить в процедуре обработки прерывания пустую операцию записи в периферийное устройство. Однако при этом может увеличиться время выполнения обработчика. 2. Сбрасывать прерывание в начале процедуры обработки прерывания, чтобы к моменту выхода из обработчика оно rарантированно было бы сброшено. Однако данный способ не сработает, если длительность обработчика окажется меньше задержки, обусловленной буферированием записи (это можно определить только опытным путём). Некоторые проrраммисты пытаются использовать незадействованные типы исключений, имеющиеся в контроллере NVIC, в качестве проrраммных прерываний. Однако исключения внешних прерываний, так же как исключение PendSV, являются «неточными». То есть никто не rарантирует, что обработчик TaKoro исключения будет запущен сразу же после перевода этоrо исключения в состояние ожидания. Чтобы удостовериться в запуске обработчика, можно воспользоваться методом циклическоrо опроса Если вы используете ассемблер GNU и вызываете функцию, описанную в друrом файле, то следует убедиться, что данный идентификатор действительно является именем функции, т.е. объявлен как: .text .global имя  функции . type имя  функции, %function В противном случае, вызов функции или переход по указанной метке может привести к случайному переключению в состояние ARM. Кроме Toro, при вызове компоновщика необходимо указать ключи rnсоrtехrnЗ rnthurnb, иначе компоновщик может взять неверную версию Сибиблиотеки В процессорах CortexM3 и ARM7TDMI поразному реализован возврат из исключений. В процессоре ARM7TDMI, если прерывание было запрещено в обработчике, то при возврате из исключения оно снова разрешается за счёт восстановления содержимоrо реrистра CPSR (бит 1). В случае же процессора CortexM3, если вы запретите прерывания, установив реrистр PRIMASK (используя команду CPSID 1 или функцию   disable  irq()), то вам необходимо будет повторно разрешить эти прерывания до выхода из обработчика. В противном случае, после возврата из исключения реrистр PRIMASK останется установленным, что вызовет блокировку всех прерываний 
Д.4. Прочие вОЗМОЖНblе проблеМbl · 467 Таблица Д.В. Прочие возможные проблемы (продолжение) Ситуация Неожиданные обращения по невыровненным адресам Возможные причины Процессор CortexM3 поддерживает невыровненные пересылки при выполнении операций заrрузки/сохранения одноrо реrистра. Компиляторы языка Си, как правило, rенерируют невыровненные пересылки только при обращении к элементам упакованных структур или при ручном манипулировании указателями. Поэтому данная проблема большей частью касается проrраммирования на ассемблере, коrда пользователь может случайно сформировать невыровненную пересылку, даже не заметив этоrо. Рассмотрим, к примеру, чтение 32битноrо реrистра периферийноrо устройства. При использовании друrих процессоров ARM младшие два бита адреса будут проиrнорированы (поскольку мост AHBAPB принудительно сбрасывает эти биты в О). Если тот же код будет выполняться процессором CortexM3, то невыровненная пересылка будет разбита на несколько выровненных, а результат операции может оказаться совершенно друrим. Этот же вопрос может оказаться актуальным при переносе ПО с процессора CortexM3 на друrой процессор ARM, не поддерживающий невыровненные пересылки. Обнаружить использование проrраммой невыровненных пересылок очень просто. Для этоrо достаточно установить бит UNALIGNTRP реrистра CCR контроллера NVIC, после чеrо любая невыровненная пересылка будет вызывать исключение Usage Fault, что позволит отследить и убрать из проrраммы все нежелательные обращения по невыровненным адресам 
ПРИЛОЖЕНИЕ Е ПРИМЕР СЦЕНАРИЯ КОМПОНОВЩИКА ДЛЯ ПАКЕТА SOURCERY G++ КОМПАНИИ CODESOURCERY Е.1. Сценарий компоновщика для Cortex..M3 Приведённый ниже сценарий компоновщика!), предназначенный для процес сора СоrtехТММ3, написан на основе типовоrо сценария, который поставляется с пакетом разработки Sourcery G++ Lite (файл genericm.ld). Данный сценарий предполаrает использование cTapToBoro кода и таблицы векторов CS3 (CodeSourcery Соmтоп Startup Code Sequence), т.е. рассчитан на конкретный ин струментарий. При работе в друrих средах разработки) основанных на Си компиляторе GNU, следует обращаться к документации и при мерам) входящим в состав используемоrо пакета. /* Linker script for genericm * * Version:Sourcery G++ Lite 2009qllбl * BugURL:https://support.codesourcery.com/GNUToolchain/ * * Copyright 2007, 2008 CodeSourcery, Inc. * * The authors hereby grant permission to use, сору, modify, distribute, * and license this software and its documentation for any purpose, provided * that existing copyright notices are retained in all copies and that this * notice is included verbatim in any distributions. No written agreernent, * license, or royalty fee is required for any of the authorized uses. * Modifications to this software rnау Ье copyrighted Ьу their authors * and need not follow the licensing terrns described here, provided that * the new terms are clearly indicated оп the first page of each file where * they apply. * */ ООТРОТ FORМAT (<<еlfЗ2littlеаrm», «еlfЗ2Ьigаrm», «еlfЗ2littlеаrm») ENTRY( start) SEARCH DIR ( . ) GROUP(lgcc lc lсsЗ lсsЗuпhоstеd lсsЗmiсrо) MEMORY { /* ROM is а readable (r), executable region (х) */ l)Файл cortexm3.1d используется в Примере 5 и Примере 6 из [лавы 19. 
Е.l. Сценарий компоновщика для CortexM3 · 469 rom (rx) : ORIGIN = О, LENGTH = 32k /* RAМ is а readable /* executable region ram (rwx) : ORIGIN = } /* These force the linker to search for particular symbols from * the start of the link process and thus ensure the user's * overrides are picked ир */ EXTERN( cs3resetgeneric m) INCLUDE micronames.inc EXTERN(cs3interruptvectormicro) EXTERN( cs3startc main cs3stack cs3heapend) (r), writable (w) and (х) Ох20000000, LENGTH = lбk */ */ PROVIDE ( PROVIDE ( PROVIDE ( PROVIDE ( cs3heapstart end); cs3heapend = cs3regionstartram + cs3regionsizeram); cs3regionnum = ( cs3regionsend  cs3regions) / 20); cs3 stack = cs3 regionstartram + cs3 regionsizeram); SECTIONS { .text : CREATE OBJECT SYMBOLS cs3regionstartrom *(.cs3.regionhead.rom) ASSERT (.  cs3 regionstart . , rom, «.cs3.regionhead.rom not permitted»); /* Vector table */ cs3interruptvector = cs3interruptvectormlcro; *(.сsЗ.iпtеrruрtvесtоr) /* vector table */ /* Make sure we pulled in ап interrupt vector. */ ASSERT (. != cs3interruptvectormicro, «No interrupt vector»); /* Мар CS3 vector syrnbols to handler names in С */ cs3 reset = Reset Handler;    cs3 isr nmi = NMI Handler;     cs3 isr hard fault = HardFault Handler;    *(.text .text.* .gnu.linkonce.t.*) *(.plt) * ( . gnu. warning) *(.glue7t) *(.glue 7) *(.vfpllveneer) *(.ARМ.extab* .gnu.linkonce.armextab.*) *(.gccexcepttable) } >rom .ehframehdr : ALIGN (4) КЕЕР (*(.ehframehdr)) 
470 · Приложение Е. Пример сценария компоновщика для пакета Sourcery G++ } >rorn .eh frarne : ALIGN (4) { КЕЕР (*(.ehfrarne)) } >rorn /* .ARМ.exidx is sorted, so has to go in its own output section. */ exidx start = ., .ARМ.exidx : *(.ARМ.exidx* .gnu.linkonce.arrnexidx.*) >rorn exidx end = .; .rodata : ALIGN (4) { *(.rodata .rodata.* .gnu.linkonce.r.*) . = ALIGN(4); КЕЕР (* ( . ini t) ) . = ALIGN(4); preinitarraystart = .; КЕЕР (*(.preinitarray)) preinitarrayend = ., . = ALIGN(4); initarraystart = ., КЕЕР (*(SORT(.initarray.*))) КЕЕР (*(.initarray)) init arrayend ., . = ALIGN(4); КЕЕР (* (.fini)) . = ALIGN(4); finiarraystart = ., КЕЕР (*(.finiarray)) КЕ ЕР (* (S О R Т ( . fin i  а r r а у . * ) ) ) finiarrayend = ., . = ALIGN(Ox4); КЕЕР (*crtbegin.o(.ctors)) КЕЕР (*(EXCLUDEFILE (*crtend.o) .ctors)) КЕЕР (*(SORT(.ctors.*))) КЕЕР (*crtend.o(.ctors)) . = ALIGN(Ox4); КЕЕР (*crtbegin.o(.dtors)) КЕЕР (*(EXCLUDE FILE (*crtend.o) .dtors)) КЕЕР (*(SORT(.dtors.*))) КЕЕР (*crtend.o(.dtors)) 
Е.l. Сценарий компоновщика для CortexM3 · 471 /* Add debug inforrnation . = ALIGN(4); rnydebugregions = .; LONG ( сsЗhеарstаrt) LONG (сsЗhеарепd) LONG ( сsЗ stack) */ . = ALIGN(4); сsЗ regions = ., LONG (О) LONG ( сsЗrеgiопiпitrаrn) LONG ( сsЗrеgiопstаrtrаrn) LONG (сsЗrеgiопiпitsizеrаrn) LONG ( сsЗrеgiопzеrоsizеrаrn) сsЗ regionsend = ., . = ALIGN (8); * ( . rorn) *(.rorn.b) etext = ., >rorn .data : ALIGN (8) { сsЗ region start rarn = ., data = .; *(.сsЗ.rеgiопhеаd.rаrn) KEEP(*(.jcr)) *(.got.plt) *(.got) * (. shdata) *(.data .data.* .gnu.linkonce.d.*) . = ALIGN (8); * ( . r аrn ) edata = .; } >rarn AT>rorn .bss : bss = ., * ( . s hb s s ) *(.bss .bss.* .gnu.linkonce.b.*) * (СОММОN) . = ALIGN (8); * ( . r аrn . Ь ) ebss = .; end = .; end = .; >rarn AT>rorn сsЗrеgiопiпit ram = LOADADDR (.data); сsЗrеgiопiпitsizеrаrn = edata  ADDR (.data); сsЗrеgiопzеrоsizеrаrn = end  edata; сsЗrеgiопsizеrаrn = LENGTH(rarn); 
472 · Приложение Е. Пример сценария компоновщика для пакета Sourcery G++ .stab О (NOLOAD) .stabstr О (NOLOAD) /* DWARF debug sections. * Symbols in the DWARF debugging sections are relative to the beginning * of the section so we begin thern at о. */ /* DWARF 1 */ .debug .line /* GNU DWARF 1 .debugsrcinfo .debugsfnarnes /* DWARF 1.1 and .debugaranges .debugpubnarnes /* DWARF 2 */ .debuginfo .debugabbrev .debugline .debugfrarne .debugstr .debugloc .debugrnacinfo /* DWARF 2.1 */ .debugranges О {*(.debugranges)} /* SGI/MIPS DWARF 2 extensions */ .debugweaknarnes О *(.debugweaknarnes) .debugfuncnarnes О *(.debugfuncnarnes) .debugtypenarnes О *(.debugtypenarnes)} .debugvarnarnes О *(.debugvarnarnes)} .note.gnu.arrn.ident О КЕЕР (*(.note.gnu.arrn.ident)) .ARМ.attributes О {КЕЕР (*(.ARМ.attributes)) } /DISCARD/ : { *(.note.GNUstack) * ( . s tab) } * ( . stabstr) о : { *(.debug) } о: {*(.line) } extensions */ о : { *(.debugsrcinfo) О : { *(.debugsfnarnes) DWARF 2 */ о {*(.debugaranges)} О {*(.debugpubnarnes)} о о о о о о о *(.debuginfo .gnu.linkonce.wi.*) *(.debugabbrev) } * ( . debug line) } *(.debugfrarne) } * ( . debug str) } * (. debug loc) } *(.debugrnacinfo) 
ПРИЛОЖЕНИЕ Ж функции ДОСТУПА К ЯДРУ СТАНДАРТА CMSIS Стандарт проrраммноrо интерфейса микроконтроллеров с ядром Соrtех ТМ (CMSIS) определяет следующие базовые функции: . функции доступа к периферии ядра; . встроенные (intrinsic) функции. В данном приложении приводятся основные сведения об этих функциях. He которые из функций CMSIS используют стандартные типы данных) определён ные в файле stdint.h (Табл. ж.!). Таблица Ж.l. Стандартные типы данных, используемые в функциях CMSIS Тип Описание uint32t 32битное целое без знака uint16t 16битное целое без знака uint8t 8битное целое без знака Ж.1. Нумерация исключений и прерываний Ряд функций CMSIS) работающих с прерываниями) в качестве входноrо пара метра используют порядковые номера прерываний. Причём) эти номера отлича ются от номеров реrистров состояния прерываний IPSRx. В стандарте CMSIS прерывания периферийных устройств нумеруются) начиная с нуля) а для обозна чения системных исключений используются отрицательные значения. (Табл. Ж.2). Таблица Ж.2. Нумерация исключений и прерываний Номер Номер Имя исключения преры исключения Исключение (элемент перечисления Имя обработчика вания в процессоре IRQnТype) исключения в CMSIS (IPSR)   Сброс  ResetHandler 14 2 NMI NonMaskableIntIRQn NMIHandler 13 3 Hard Fault  HardFaultHandler 12 4 MemManage MemoryManagementIRQn MemManageHandler Fault 
474 · Приложение ж. Функции доступа к ядру стандарта CMSIS Таблица Ж.2. Нумерация исключений и прерываний (продолжение) Номер Номер Имя исключения преры исключения Исключение (элемент перечисления Имя обработчика вания в процессоре IRQnТype) исключения в CMSIS (IPSR) 11 5 Bus Fault BusFaultIRQn BusFaultHandler 10 6 Usage Fault UsageFaultIRQn U sageF aultHandler 5 11 SVCall SVCallIRQn SVCHandler 4 12 Debug monitor DebugMonitorIRQn DebugMonHandler 2 14 PendSV PendSV IRQn PendSV Handler 1 15 SysTick SysTickIRQn SysTickHandler Прерывание О <Зависит от <Зависит от микро О 16 периферийноrо устройства микроконтроллера> контроллера> Прерывание 1 <Зависит от <Зависит от микро 1 17 периферийноrо устройства микроконтроллера> контроллера> Прерывание 2 <Зависит от <Зависит от микро 2 18 периферийноrо устройства микроконтроллера> контроллера> <Зависит от <Зависит от микро . . . . . . . . . микроконтроллера> контроллера> Ж.2. Функции доступа к контроллеру NVIC Следующие функции позволяют использовать различные возможности KOH троллера NVIC. Имя функции void NVICSetPriorityGrouping(uint32t PriorityGroup) Описание Изменяет настройки rруппирования приоритета в контроллере прерываний NVIC (функция недоступна в процессорах CortexMO/Ml) Параметры PriorityGroup  значение поля rруппирования приоритетов (PRIGROUP) Возвращаемое Нет значение Имя функции uint32t NVIC GetPriorityGrouping(void) Описание Читает настройки rруппирования приоритета из контроллера прерываний NVIC (функция недоступна в процессорах CortexMO/M1) Параметры Нет Возвращаемое Содержимое поля rруппирования приоритетов (PRIGROUP) значение 
Ж.2. Функции доступа к контроллеру NVIC · 475 Имя функции void NVICEnableIRQ(IRQnТype IRQn) Описание Разрешает прерывание в контроллере NVIC Параметры IRQnType IRQn  положительный номер прерывания. Системные исключения (отрицательные значения) не поддерживаются Возвращаемое Нет значение Имя функции void NVICDisableIRQ(IRQnType IRQn) Описание Запрещает прерывание в контроллере NVIC Параметры IRQnType IRQn  положительный номер прерывания. Системные исключения (отрицательные значения) не поддерживаются Возвращаемое Нет значение Имя функции uint32t NVICGetPendingIRQ(IRQnType IRQn) Описание Считывает бит отложенности внешнеrо прерывания Параметры IRQnType IRQn  номер прерывания. Системные исключения (отрицательные значения) не поддерживаются Возвращаемое 1  если прерывание отложено, О  в противном случае значение Имя функции void NVICSetPendingIRQ(IRQnType IRQn) Описание Устанавливает бит отложенности внешнеrо прерывания Параметры IRQnType IRQn  номер прерывания. Системные исключения (отрицательные значения) не поддерживаются Возвращаемое Нет значение Имя функции void NVICClearPendingIRQ(IRQnType IRQn) Описание Сбрасывает бит отложенности внешнеrо прерывания Параметры IRQnType IRQn  номер прерывания. Системные исключения (отрицательные значения) не поддерживаются Возвращаемое Нет значение Имя функции uint32t NVICGetActive(IRQnType IRQn) Описание Считывает бит активности внешнеrо прерывания (функция недоступна в процессорах CortexMO/Ml) Пара метры IRQnType IRQn  номер прерывания. Системные исключения (отрицательные значения) не поддерживаются Возвращаемое 1  если прерывание активно, О  в противном случае значение 
476 · Приложение ж. Функции доступа к ядру стандарта CMSIS Имя функции void NVICSetPriority(IRQnТype IRQn, uint32t priority) Описание Устанавливает приоритет прерывания или системноrо исключения с проrраммируемым уровнем приоритета IRQnType IRQn  номер прерывания. Параметры uint32t priority  приоритет прерывания. Функция автоматически сдвиrает полученное значение влево для ero размещения в реализованных битах реrистра приоритета Возвращаемое Нет значение Имя функции uint32t NVIC GetPriority(IRQnТype IRQn) Описание Считывает приоритет прерывания или системноrо исключения с проrраммируемым уровнем приоритета Параметры IRQnType IRQn  номер прерывания Возвращаемое Приоритет прерывания. Функция автоматически сдвиrает считанное значение значение вправо, чтобы убрать нереализованные биты реrистра приоритета Имя функции uint32t NVICEncodePriority (uint32t PriorityGroup, uint32t PreemptPriority, uint32t SubPriority) Формирует значение приоритета прерывания из значений параметра rруппирования приоритетов, приоритета rруппы и субприоритета. В случае Описание конфликта между параметром rруппирования приоритетов и доступными битами приоритета (NVICPRIOBITS) используется минимально возможное значение параметра rруппирования приоритетов (функция недоступна в процессорах CortexMO/Ml) uint32t PriorityGroup  пара метр rруппирования приоритетов; Параметры uint32t PreemptPriority  приоритет rруппы (начиная с О); uint32t SubPriority  субприоритет (начиная с О) Возвращаемое Приоритет прерывания значение Имя функции void NVICDecodePriority (uint32t Priority, uint32t PriorityGroup, uint32t* pPreemptPriority, uint32t* pSubPriority) Декодирует приоритет прерывания, извлекая из ero значения приоритет rруппы и субприоритет с учётом заданноrо значения пара метра rруппирования приоритетов. В случае конфликта между параметром rруппирования приоритета и доступными битами приоритета (NVICPRIOBITS) используется минимально возможное значение параметра rруппирования приоритетов (функция недоступна в процессорах CortexMO/Ml) uint32t Priority  приоритет прерывания; uint32t PriorityGroup  параметр rруппирования приоритетов; uint32t PreemptPriority  приоритет rруппы (начиная с О); uint32t SubPriority  субприоритет (начиная с О) Описание Параметры Возвращаемое значение Нет 
Ж.3. Функции для управления системой и системным таймером · 477 Ж.3. Функции для управления системой v и системным таимером Следующие функции предназначены для конфиrурирования системы. Имя функции void SystemInit (void) Описание Инициализирует систему Параметры Нет Возвращаемое Нет значение Имя функции void SystemCoreClockUpdate(void) Обновляет значение переменной SysternCoreClock. Эта функция должна вызываться после каждоrо изменения тактовой частоты процессора. Описание Данная функция появилась в версии 1.30 стандарта CMSIS. В более ранних версиях стандарта указанная функция отсутствовала, а для хранения значения тактовой частоты использовалась rлобальная переменная SysternFrequency Пара метры Нет Возвращаемое Нет значение Имя функции void NVICSystemReset(void) Описание Инициирует запрос сброса системы Параметры Нет Возвращаемое Нет значение Имя функции uint32t SysTick Config(uint32t ticks) Инициализирует и запускает таймер SYSTICK, а также разрешает Описание соответствующее исключение. Функция проrраммирует системный таймер таким образом, чтобы он rенерировал исключение SYSTICK каждые «ticks» тактов TaKToBoro сиrнала ядра Параметры uint32t ticks  число тактов между двумя последовательными прерываниями Возвращаемое Нет значение 
478 · Приложение Ж. Функции доступа к ядру стандарта CMSIS Ж.4. Функции доступа к реrистрам ядра Следующие функции предназначены для доступа к реrистрам специальных функций процессора. Имя функции Описание uint32 t get MSP (void) Читает значение MSP     void set MSP (uint32 t topOfMainStack) ИзменяетзначениеМSР     uint32 t get PSP (void) Читает значение PSP     void set PSP(uint32 t topOfProcStack) Изменяет значение PSP     uint32 t get BASEPRI (void) Читает значение BASEPRI     void set BASEPRI (uint32 t basePri) ИзменяетзначениеВАSЕРRI     uint32 t get PRIMASK (void) Читает значение PRIMASK     void set PRIMASK (uint32 t priMask) Изменяет значение PRIMASK     uint32 t get FAULTMASK (void) Читает значение FAULTMASK     void set FAULTMASK (uint32 t faultMask) Изменяет значение FAULTMASK     uint32 t get CONTROL (void) Читает значение CONTROL     void set CONTROL (uint32 t control) Изменяет значение CONTROL     Ж.5. Встроенные функции CMSIS Стандартом CMSIS предусмотрен ряд встроенных функций, предназначен ных для вызова команд процессора, которые не MorYT быть сrенерированы CTaH дартным конструкциями языка Си. Функции   enable  fault  irq и   disable  fault  irq недоступны для процессоров CortexMO/Ml. Функции для вызова команд управления системой Имя функции Команда Описание void WFI (void) WFI Ожидание прерывания (в спящем режиме)   void WFE (void) WFE Ожидание события (в спящем режиме)   void SEV (void) SEV rенерация события   void enable i rq (void) CPSIE i Разрешение прерываний (очистка    PRIMASK) void disable irq (void) CPSID i Запрещение прерываний (установка    PRIMASK) void enable fault irq (void) CPSIE f Разрешение прерываний (очистка     FAULTMASK) void disable fault irq (void) CPSID f Запрещение прерываний (установка     FAULTMASK) void NOP (void) NOP Нет операции   void ISB(void) ISB Барьер синхронизации команд   void DSB (void) DSB Барьер синхронизации данных   void ОМВ (void) ОМВ Барьер памяти данных   в следующей таблице приведены функции для вызова команд монопольноrо доступа к данным. Эти функции недоступны в процессорах CortexMO/Ml. 
Ж.б. Функции вывода отладочных сообщений · 479 Имя функции Команда Описание uint8 t LDREXB (uint8 t *addr) LDREXB Монопольная заrрузка байта     в реrистр uintlб t LDRЕХН(uintlб t *addr) LDREXH Монопольная заrрузка     полуслова в реrистр uint32 t LDREXW(uint32 t *addr) LDREX Монопольная заrрузка слова     в реrистр Монопольное сохранение uint32 t STREXB (uint8 t value, байта. Возвращает статус     STREXB uint8 t *addr) операции записи (успех = О,  отказ = 1) Монопольное сохранение uint32 t STREXH (uintlб t value, полуслова. Возвращает статус     STREXH uint8 t *addr) операции записи (успех = О,  отказ = 1) Монопольное сохранение uint32 t STREXW (uint32 t value, слова. Возвращает статус     STREX uint8 t *addr) операции записи (успех = О,  отказ = 1) Сброс признака монопольноrо void CLREX (void) CLREX доступа,установленноrо   операцией монопольноrо чтения в следующей таблице приведены функции для вызова специфических команд обработки данных. Функция   RBIT недоступна в процессорах CortexMO/Ml. Имя функции Команда Описание uint32 t REV(uint32 t val ие) REV Изменение порядка байтов в слове     uint32 t RЕVlб (uint32 t value) RЕVlб Изменение порядка байтов в каждом     полуслове Изменение порядка байтов uint32 t REVSH(uint32 t value) REVSH в младшем полуслове и расширение     результата до 32 бит uint32 t RBIT (uint32 t value) RBIT Изменение порядка битов в слове  Ж.б. Функции вывода отладочных сообщений в стандарте CMSIS также определена одна функция, позволяющая выводить отладочные сообщения с использованием модуля ITM. Имя функции uint32t ITMputchar(uint32t chr) Выводит символ через Ой канал вывода модуля ITM. При отсутствии Описание подключённоrо отладчика функция сразу же завершается. Если отладчик подключён и трассировка разрешена, то функция выводит символ в интерфейс ITM и ожидает ero передачи Параметры uint32t chr  передаваемый символ Возвращаемое Переданный символ chr значение 
ПРИЛОЖЕНИЕ 3 СОЕДИНИТЕЛИ ДЛЯ ПОДКЛЮЧЕНИЯ ОТЛАДОЧНЫХ СРЕДСТВ 3.1. Общие сведения в этом приложении рассматриваются несколько разновидностей соедините лей, наиболее часто применяющихся для подключения отладочных средств. Большинство средств разработки для процессоров ARM используют, как мини мум, одну из предложенных цоколёвок. При проектировании печатной платы pe комендуется использовать стандартную разводку сиrналов отладчика, чтобы из бежать проблем с ero подключением. 3.2. Универсальный 20контактный разъём На новых печатных платах с микроконтроллерами ARM устанавливаются 20KOHTaKTHыe разъёмы с шаrом выводов 0.05 дюйма (Samtec FTSH120), исполь зуемые как для отладки, так и для трассировки. Примечание. Сиrналы, наименования которых на последующих рисунках выделены серым цветом, не реализованы в ядре СоrtехТММ3. Универсальный 20контактный разъём поддерживает протоколы отладки JTAG и SerialWire (см. Рис. 3.1 и 3.2). При использовании протокола SerialWire линия TDO может задействоваться в качестве выхода модуля SerialWire Viewer (SWV) для вывода трассировочной информации. На этот разъём также выведен 4битный порт трассировки, используемый в тех случаях, коrда для передачи Рис. 3.1. 20контактный универсальный разъём. 
3.3. 10конmакmНblЙ разъём · 481 1 2 VT ref IЗ D ТМ5/5 WIO GNO D EI ТС K/5WCLK GNO IЗ (] TOO/5WO ffRACECTL/EXTa КЕУ [] ТО IIEXTbINC GNOOetec t EI [] nRE5E Т GN OIТgtPwr +Сар IЗ D TRACECLK GN O/TgtPwr +Сар [] D TRACEOATAO GNO [] I:J TRACEOATA1 GNO r:J I:J TRACEOATA2 GNO D r:J ТRАСЕОАТАЗ 19 20 Рис. 3.2. Цоколёвка 20KOHтaKтHOZO унuверсальноzо разъёма. трассировочных данных требуется канал с повышенной пропускной способ ностью (например, при включении модуля трассировки ЕТМ). Соединитель FTSH120 имеет меньшие размеры, чем традиционные соедини тели IDC, и рекомендуется для применения в новых разработках. Данный соеди нитель, в частности, установлен на демонстрационной плате MCBSTM32E компа нии Keil. 3.3. 10"контактный разъём Если в устройстве нет модуля ЕТМ, то для подключения отладчика можно ис пользовать 10контактный разъём с шаrом 0.05 дюйма, который имеет ещё MeHЬ шие размеры. Как и 20контактный универсальный разъём, данный соединитель поддерживает протоколы JTAG и SerialWire (Рис. 3.3 и 3.4). 1 2 VТref I:J IЗ ТМ 51 5WI0 GNO D D ТС K/5 WCLK GNO I:J Е3 ТОО 15WO КЕУ Е3 TOI GNOOetect [] D nRE5E Т 9 10 Рис. 3.3. 10контактНblЙ разъём. Рис. 3.4. Цоколёвка 10KoHтaKтHozo разъёма. 3.4. Традиционный 20контактный раэъём IDC Стандартным разъёмом для подключения отладочных средств на отладочных платах компании ARM является 20контактный разъём IDC (Рис. 3.5). Этот разъ 
482 . Приложение 3. Соединители для подключения отладочных средств ём поддерживает отладку по протоколам JTAG и SerialWire (SWIO и SWCLK), а также вывод данных модуля SWV. Вывод nICEDETECT позволяет отлаживае мому микроконтроллеру определять подключение отладчика. При отсутствии отладчика этот вывод «подтянут» К питанию, а при подключении отладчика дaH ный вывод «подтяrивается» К земле. Эта возможность используется в некоторых отладочных платах, поддерживающих несколько конфиrураций JTAG. Сиrнал nSRST является опциональным. Поскольку для сброса системы с процессором CortexM3 отладчик может задействовать контроллер NVIC, в микроконтролле рах этот сиrнал, как правило, не реализуют. ЗVЗ nTR5T ТОI тм 51 5WIO те K/5WCLK RTCK то O/5WV NC /пSRSТ NC NC 19 1 2 [;] [1 [;] [1 [;] о о [] о Е1 [] Е1 о [] о о [] [;] о о зvз GNO GNO GNO GNO GNO GNO GNO GNO nlCEOEТECТ 20 Рис. 3.5. Цоколёвка 20KoHтaKтHozo разъёма IDC. 3.5. Традиционный 32"контактный разъём MICTOR При необходимости реализации порта трассировки в некоторых системах на базе процессоров ARM используется разъём MICTOR (например, для трассиров ки команд посредством модуля ЕТМ; см. Рис. 3.6). Этот разъём также поддержи вает протоколы отладки JTAG/SWD. Параллельно разъёму MICTOR может быть подключён 20контактный разъём IDC (одновременно используется только один из них). Как правило, микроконтроллеры с процессором CortexM3 имеют шину Tpac сировки разрядностью Bcero 4 бита, поэтому большинство выводов разъёма, предназначенных для передачи трассировочной информации, не задействуются. Разъём MICTOR используется, rлавным образом, со старшими процессорами ce мейства Cortex (CortexA8/A9, CortexR4), а также в мноrопроцессорных системах, требующих порт трассировки большей разрядности. В этом случае также задей ствуются и ряд друrих контактов разъёма. Для систем на базе процессора CortexM3 рекомендуется использовать универсальный 20контактный разъём, позволяющий выполнять отладку и трассировку посредством модуля ЕТМ. 
3.5. Традиционный 32конmакmный разъём MICTOR · 483 1 NC 3 NC 5 GNO 7 Pulldown 9 N C/n SRST 1 11 ТО O/SW V 1З RTCK 15 ТС K/SWCLK 17 TMS/SWIO 19 ТОI 21 nTRST 23 0/TRACEDATA[15J 25 0/TRACEDATA(14] 27 0/TRACEDATAl13! O/TRACEOATAt 121 37 29 З1 0/TRACEDATAfl1J 33 O/TRACEDATA[lOl 35 0/TRACEDATA[9 ] З7 0/TRACEDATA[8 ] 1 ..........J  О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О О с..........,  NC NC TRACECLK Pulldown Pulldown Pullup (Vref) VSupply 0/TRACEDATAf71 О /ТRАСЕDАТА[б] О/ТНАСЕОАТ Al5 J O/TRACEDAT Af4'1 TRACEOA Т А[3] TRACEOA Т А[2] TRACEOA Т А[ 1 ] О О 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 З2 З4 З6 38 2 38 О /fRACECTRL TRACEOA Т А[О] Рис. 3.6. Цоколёвка 38KoHmaKmHozo разъёма MICTOR. 
ПРИЛОЖЕНИЕ И СЕМЕЙСТВО МИКРОКОНТРОЛЛЕРОВ STELLARIS8 Материал предоставлен компанией «КОМПЭЛ» и российским представительством компании «Texas Instruments» 
И.l. Прuступая к работе · 485 И.1. Приступая к работе Разработка продукции Компания Texas Instruments оказывает разнообразную поддержку разработчикам, блаrодаря которой вы сможете леrко и быстро выводить свою продукцию на рынок. Компактные, универсальные, с широкими KOM муникационными возможностями  именно так можно охарактеризовать предлаrаемые оценочные наборы, которые являются недороrим и эффективным решением, позволяющим ознакомиться с нашими микрокон троллерами и быстро приступить К реализации cBoero проекта (www.ti.com/stellarisevkits). Оценочный набор Оценочный набор Оценочный набор Оценочный набор Stellaris LM3S811 Stellaris LM3S1968 Stellaris LM3S2965 Stellaris LM3S3748 JlI'E Оценочный набор Stellaris LM3S6965 Оценочный набор Stellaris LM3S8962 Оценочный набор Оценочный набор Stellaris LM3S9B92 Stellaris LM3S9B90 Набор для разработки Stellaris LM3S9B96 Stellaris DK Оценочный набор Оценочный набор LM3S9B96FPGA Stellaris EVALBOT + Stel1aris LM3S9B92 книrа «Micrium ЕУ ALBOT flC/OS 111» Набор для разработки Stellaris RSID Набор для разработки Stellaris ZigBee Оценочный набор Stellaris. LM4F232 Наши наборы референсдизайнов позволяют ускорить создание продукции, поскольку содержат rOToBoe ап паратное и проrраммное обеспечение) а также всю необходимую документацию, включая файлы проекта ( www.ti.com/stellaris rdkits). Набор референсдизайна интеллектуальноrо дисплейноrо модуля Stel1aris  одноплатный компьютер Набор референсдизайна Stellaris для управления шаrовым двиrателем Набор референс дизайна интеллектуальноrо дисплейноrо модуля Stellaris Набор референс  дизайна Stellaris для управления бесщёточным двиrателем постоянноrо тока ,\"',' Набор референс дизайна интелектуальноrо дисплейноrо модуля Stellaris с 3.5 дюймовым экраном Набор референс  диза йна Stellaris для управления щёточным двиrателем постоянноrо тока с интерфейсом CAN Набор референсдизайна Stel1aris для преобразования последовательных протоколов в Ethernet Набор референсдизайна Stellaris для управления асинхронным двиrателем переменноrо тока 
486 · Приложение и. Семейство микроконтроллеров Stеllаris Ф И.2. Семейство микроконтропперов Stellaris@l Stellaris представляет собой передовое семейство надёжных микроконтроллеров для систем реальноrо Bpe мени, в основе которых лежат процессоры новой серии CortexM'" компании ARM.. Удостоенные мноrочис ленных наrрад 32битные микроконтроллеры Stellaris  это современные мноrофункциональные системы на кристалле, позволяющие реализовывать мноrозадачные приложения реальноrо времени. Сложные приложе ния, которые были не по зубам микроконтроллерам предыдущих поколений, теперь можно леrко реализовать с помощью мощных, экономически выrодных и простых в проrраммировании микроконтроллеров семейства Stellaris. Семейство микроконтроллеров Stellaris предназначено для применения в критичных к стоимости приложе ниях, требующих значительной вычислительной мощности и широких коммуникационных возможностей. К таким приложениям относятся системы энерrосбережения, системы управления электроприводом, систе мы мониторинrа (дистанционное управление, пожарная сиrнализация, системы безопасности и т.д.), системы отопления, вентиляции, кондиционирования воздуха и управления зданием, системы контроля и преобразо вания энерrии, сетевое оборудование и коммутаторы, системы промышленной автоматики, электронные Kac совые терминалы, испытательное и измерительное оборудование, медицинские приборы и иrровые устрой  ства. Семейство Stellaris  это микроконтроллеры будущеrо! Почему выбрана АRМ-архитектура? · При начальной цене в 1 доллар за микроконтроллер на базе технолоrии ARM семейство Stellaris обеспечива ет унификацию, которая исключает в дальнейшем модернизацию архитектуры или обновление проrрамм ных средств. · «3косистема» проrраммных инструментов и решений от ARM является крупнейшей в мире: каждый rод на рынок встраиваемых систем поставляется более 5 млрд АRМ-процессоров. · Архитектура ARM Cortex обеспечивает разработчикам доступ к совместимому по набору команд семейству микроконтроллеров с ценой от 1 доллара и тактовой частотой до 1 [[ц. Почему выбрано ядро Cortex-M3? Cortex М3  версия процессорноrо ядра с набором команд ARMv7, которая имеет следующие особенности: · набор команд оптимизирован для однотактноrо обращения к флэшпамяти; · детерминированная и быстрая обработка прерываний: время реакции на прерывание равно 12 тактам или 6 тактам при вложенных прерываниях; · три дежурных режима со стробированием TaKToBoro сиrнала для снижения энерrопотребления; · однотактное умножение и деление на аппаратном уровне; · производительность процессора 1.25 DМIРS/М[ц (выше, чем у ARM7 и ARM9); · дополнительные возможности отладки, включая установку точек останова и флэшкоррекцию проrрамм;. Преимущества по сравнению с приложениями дЛЯ ARM7: · требуется примерно половина объёма флэшпамяти (кодовоrо пространства); · в 2...4 раза быстрее в приложениях микроконтроллерноrо управления; · не требуется кода ассемблера. Почему следует выбирать семейство Stellaris? Разработанное для важных микроконтроллерных приложений, семейство Stellaris позволяет войти в наибо лее быстро растущую в отрасли «экосистему» микроконтроллеров с совместимым кодом стоимостью от 1 дол  лара и тактовой частотой до 1 [[ц. · Простота разработки проrрамм с помощью бесплатноrо набора библиотек StellarisWare. · Встроенные аналоrовые компараторы и АЦП предоставляют возможности для аппаратной и проrраммной оптимизации параметров системы. · Улучшенные коммуникационные возможности, включая контроллеры 10/100 Ethernet МАС/РНУ, USB и USB OTG, CAN, а также расширенные интерфейсы периферии. · Оптимизированная по производительности архитектура с быстрыми внутренними шинами и быстродей ствующей флэшпамятью. · Порты ввода/вывода общеrо назначения микроконтроллера способны rенерировать прерывания, совмести мы с 5 В и имеют проrраммируемую наrрузочную способность и управляемую скорость нарастания выход  Horo напряжения. 
И.2. Семейство микроконтроллеров Stеllаris Ф · 487 Почему следует выбирать решения Texas Instruments? Разработчики встраиваемых систем, выбравшие решения компании Texas Instruments на базе процессоров ARM, получают: . OrpoMHoe множество разнообразных микроконтроллеров, совместимых по набору команд  от дешёвых моделей стоимостью от 1 доллара до высокопроизводительных с тактовой частотой более 1 rrц, входящих в самые разные семейства, начиная с микроконтроллеров семейства Stellaris и заканчивая микропроцессо рами семейства Sitara  только Texas Instruments способна предложить такой широкий ассортимент изде лий, совместимых по набору команд. . Высокую степень интеrрации и лёrкость разработки всех узлов будущеrо устройства блаrодаря использова  нию решений Texas Instruments в области аналоrовой техники, управления электропитанием и обработки смешанных сиrналов. . Непревзойдённую поддержку по продажам в любой стране мира и поддержку технических специалистов Texas Instruments и наших дистрибьюторов. . Доступ К недороrим и специализированным наборам для проектирования и проrраммному обеспечению, способ ствующим более быстрому выводу изделий на рынок. . Бесплатный набор библиотек StellarisWare. Компания Texas Instruments поставила в общей сложности свыше 6 млрд микроконтроллеров с ядрами ARM, что составляет почти 25% от продаж АRМмикроконтроллеров по всему миру. Доверьте ваше будущее лидеру! Обобщённая структура микроконтроллеров семейства Stellaris .' Cor"tex. Intelllgent Processors Ьу АRМ' 
488 · Приложение и. Семейство микроконтроллеров Stеllаris Ф И.3. Проrраммное обеспечение StellarisWare 8 StellarisWare 8 упрощает разработку nporpaMMHoro обеспечения При использовании микроконтроллеров Stellaris все части проrраммы, включая обработчики прерываний и стартовый код, можно писать на языках BbIcoKoro уровня Си/Си++. Чтобы ещё больше упростить процесс соз дания проrраммы, мы предлаrаем вам пакет StellarisWare., содержащий при меры кода и бесплатные библио теки для поддержки приложений: · Stellaris Peripheral Driver Library  библиотека драйверов периферии, содержащая функции управления и инициализации периферийных устройств микроконтроллеров Stellaris; · Stellaris USB Library  библиотека USB, позволяю щая реализовывать приложения с функциями USB Device, USB Host или USB OnTheGo (OTG); · Stellaris Graphic Library  rрафическая библиотека; · Stellaris Boot Loader  заrрузчик для проrраммиро вания в условиях эксплуатации; · Stellaris InSystem Programming  библиотека функций для внутрисхемноrо проrраммирования; · Stellaris Utilities  библиотека оптимизированных часто используемых функций, таких как функции контроля CRC и вычисления таблиц AES; · Stellaris IEC 60730 Library  библиотека функций для поддержки требований стандарта IEC 60730 Class В; · Stellaris IQMath Library  библиотека математиче ских функций, позволяющая ускорить выполнение операций с плавающей ТОчкой на процессорах с фиксированной точкой; · Stellaris Wireless Library  библиотека функций для работы с беспроводными решениями Texas Instruments; · Stellaris Open Source Support  библиотека под  держки открытых реализаций Ethernet и RTOS; · Stellaris Code Examples  разнообразные примеры проrраммноrо кода. Чтобы узнать о последних изменениях в составе пакета StellarisWare, воспользуйтесь ссылкой www.ti.com/stellariswaresoftware. Во мноrих микроконтроллерах семейства Stellaris функции пакета StellarisWare «зашиты» в ПЗУ. Это позво ляет использовать данные библиотеки для быстрой разработки эффективных и функциональных приложе ний в тех случаях, коrда весь объём встроенной флэшпамяти занят пользовательской проrраммой. Набор библиотек StellarisWare имеет следующие особенности и преимущества: · бесплатен для использования с микроконтроллера ми Stellaris; · упрощает и ускоряет разработку приложений  может использоваться как для разработки, так и в качестве примеров; · позволяет создавать полнофункциональный код, который леrко поддерживать; · написан целиком на языке Си, за исключением тех участков кода, rде это оказалось совершенно невоз можно. Но даже написанный на Си, этот набор би блиотек достаточно эффективно использует pecyp сы памяти и процессора блаrодаря компактности набора команд Thumb2, поддерживаемоrо ядром CortexM3; · полностью использует все возможности ядра CortexM3 по обслуживанию прерываний и не Tpe бует никаких специфических средств компилятора или ассемблерных вставок; · может быть скомпилирован как с включением кода для контроля ошибок (на этапе разработки прило жения), так и без TaKoBoro (при создании финаль ной версии проrраммы); · доступен как в виде объектных файлов, так и в ис ходных кодах, Т.е. вы можете использовать библио теку «как есть» или же адаптировать её под свои нужды; · компилируется в пакетах ARM/Keil, IAR, Code Composer Studio, Code Red, Code Sourcery, а также средств разработки GNU. Последнюю версию пакета StellarisWare всеrда можно найти по адресу www.ti.com/stellarisware. 
И.3. Проzраммное обеспечение StеllаrisWаrе Ф . 489 Библиотека драйверов периферии Stellaris Peripheral Driver Library Библиотека драйверов периферии Stellaris Peripheral Driver Library  это бесплатный набор проrрамм для управления периферией микроконтроллеров семейства Stellaris на базе ядра ARM CortexM3. Существенно превосходящая по своим возможностям инструменты конфиrурирования периферии на базе GUI  интерфейса библиотека Stellaris Peripheral Driver Library выполняет как инициализацию, так и управление периферией в режиме опроса или по прерываниям. Библиотека Stellaris Peripheral Driver Library обеспечивает поддержку двух моделей проrраммирования: прямой доступ к реrистрам и проrраммный драйвер. Каждую модель проrраммирования можно использо вать по желанию разработчика независимо или совместно, в зависимости от требований приложения или проrраммной среды. Модель прямоrо доступа к реrистрам включает файлы заrоловка для каждоrо микрокон троллера семейства Stellaris и обеспечивает, в общем случае, более компактный и эффективный код в среде разработки, которая знакома большинству разработчиков встраиваемоrо проrраммноrо обеспечения, ранее работавших с 8 и 16битными микроконтроллерами. Модель проrраммирования с использованием драйве ров позволяет инженерампроrраммистам не вникать в особенности работы аппаратных средств, таких как функционирование каждоrо реrистра, битовые поля, их взаимодействие и учёт последовательности работы периферии, что, как правило, сокращает время разработки приложения. rрафическая библиотека Stellaris Graphics Library fрафическая библиотека Stellaris Graphics Library  это бесплатный набор базовых функций и специальных rрафических элементов для создания rрафических пользовательских интерфейсов устройств на базе микро контроллеров Stellaris, имеющих rрафический дисплей. Библиотека rрафики состоит из трёх основных ypOB ней функциональности: уровень драйвера дисплея, который используется в приложении; уровень rрафиче ских примитивов для построения точек, линий, прямоуrольников, окружностей, шрифтов, растровых изо бражений и текста как в активном буфере дисплея, так и в неотображаемом буфере для предотвращения эф фекта мерцания, а также уровень специальных rрафических элементов, которые обеспечивают отображение компонентов пользовательскоrо интерфейса на дисплее (кнопки, ползунки, поля списка и др.) и их взаимодей ствие с пользователем в конкретном приложении. 6ибпиотека USВ-устройств  Stellaris USB Library Все микроконтроллеры Stellaris с USВинтерфейсами проходят тест на функционирование в режиме USB Device и USB Embedded Host. Библиотека USB устройств Stellaris USB Library  это бесплатный набор типов данных и функций для создания приложений с функциональностью USB Device, Host или OntheGo (OTG) дЛЯ систем на базе микроконтроллеров Stellaris. Предлаrается несколько проrраммных интерфейсов: от уровня простоrо управления USВконтроллером до интерфейсов BbIcoKoro уровня, которые осуществляют АР! поддержку специальных устройств. Примеры USB Device НIDклавиатура НIDмышь CDC Serial Накопитель данных Generic Bulk Аудиоустройство Обновление ПО устройств Осциллоr а Предоставляется INFфайл Windows для поддерживаемых классов USB (в предварительно скомпилированной библиотеке DLL, что экономит в емя аз аботки). При меры USB Host При меры USB OTG Накопитель данных НIDклавиатура НIDмышь Протокол SRP (протокол запроса сессии) Протокол HNP (протокол обмена с хостом) 
490 . Приложение и. Семейство микроконтроллеров Stellaris. Библиотека Stellaris IEC 60730 Library Стандарт IEC 60730 Class В охватывает большую часть бытовых электроприборов, таких как стиральные/су шильные машины, холодильники, морозильники, электроплиты. Библиотека Stellaris IEC 60730 Library позво ляет создавать встраиваемые приложения, удовлетворяющие требованиям по безопасности стандарта IEC 60730 Class В. Функции этой библиотеки используются совместно с такими аппаратными узлами микро контроллеров семейства Stellaris, как сторожевые таймеры и прецизионный reHepaTop. Библиотека поддержи вает требования стандарта IEC 60730 по однократному (в момент запуска) и периодическому тестированию проrраммы. Поскольку библиотека Stellaris IEC 60730 Library обеспечивает фундаментальную верификацию основных операций микроконтроллера, она часто используется в приложениях для заводскоrо тестирования устройств, не попадающих под требования стандарта IEC 60730. Библиотека Stellaris IQMath Library Библиотека Stel1aris IQMath Library, предлаrаемая компанией Texas Instruments, представляет собой набор высоко оптимизированных математических функций для проrраммистов Си/Си++, позволяющий с наимень шими затратами конвертировать алrоритмы, в которых требуются операции с плавающей точкой, в код, ис пользующий арифметику с фиксированной точкой. Эти подпроrраммы обычно применяются в приложениях реальноrо времени с интенсивными вычислениями, rде критична как скорость выполнения проrраммы, так и высокая точность. Указанные функции выполняются rораздо быстрее своих аналоrов, написанных на CTaH дартном Си. Библиотека Stellaris IQMath Library также позволяет преодолеть оrраничения, присущие арифме тике с фиксированной точкой, путём задания проrраммируемоrо динамическоrо диапазона и разрешения. Библиотеки Stellaris Wireless Library Блаrодаря своей высокой производительности и коммуникационным возможностям микроконтроллеры ce мейства Stellaris с ядром ARM CortexM3, предлаrаемые компанией Texas Instruments, являются идеальным выбором для использования в самых разных беспроводных приложениях. Микроконтроллеры Stel1aris и бес проводные решения от Texas Instruments привносят интеллектуальность и расширенную функциональность в такие приложения, как измерения, домашняя автоматизация и безопасность. Пакет StellarisWare облеrчает вывод беспроводных приложений на рынок, предоставляя функции для использования протоколов RFID, Low Power RF, ZigBee и Bluetooth. Поддержка стандарта CMSIS Помимо разнообразных библиотек, входящих в состав пакета StellarisWare, компания Texas Instruments также обеспечивает поддержку стандарта CMSIS, стандартизованноrо уровня аппаратных абстракций для процессо ров семейства CortexM. Стандарт CMSIS описывает простые проrраммные интерфейсы с процессором, aдpeco ванные изrотовителям микросхем и поставщикам промежуточноrо ПО, которые позволяют упростить повтор ное использование проrраммноrо кода и ускорить вывод новых устройств на рынок. Примеры кода для микроконтроллеров Stellaris Все наборы для проектирования и оценочные наборы Stellaris поставляются вместе с обширным набором при ложен ий, которые представляют собой примеры использования микроконтроллеров Stellaris и набора библио тек StellarisWare. Каждый набор co держит приложение для быстроrо старта, которое специально предна значено для демонстрации функ ций, заложенных в оценочную пла ту. Поскольку приложение для бы  cTporo старта одновременно ис пользует большую часть периферии на плате, наборы также поставляют ся вместе с примерами для работы с периферией. Эти приложения пред  ставляют собой примеры aBTOHOM Horo кода для всей периферии, KOTO рая поддерживается в наборе. При ложения для быстроrо старта и при  меры для работы с периферией co держат исходный код и файлы про екта для поддержки пользователя при разработке системы. Для всех проектов примеров прилаrается техническая документация, в KOTO рой описывается функциональ ность каждоrо приложения. /  , 'яtOf"t,t 
И.3. Проzраммное обеспечение StellarisWare. · 491 Поддержка внутрисистемноrо проrраммирования Stellaris Микроконтроллеры 5tellaris поддерживают различные механизмы внутрисистемноrо проrраммирования. Все микроконтроллеры семейства 5tellaris поставляются с заrрузчиком, «зашитом» во встроенном ПЗУ, ли бо записанным во флэшпамяти. Это обеспечивает максимальную rибкость при проrраммировании rотовой продукции. Также мы бесплатно предлаrаем исходный код проrраммызаrрузчика, который позволит обнов лять ваши устройства в условиях эксплуатации. Системный заzрузчик Stellar;s в ПЗУ Большинство микроконтроллеров 5tellaris имеют системный заrрузчик, расположенный во встроенном ПЗ Этот заrрузчик позволяет проrраммировать флэшпамять подобных микроконтроллеров (как на производ стве, так и в условиях эксплуатации) с использованием интерфейса UART, !2С или 551. Блаrодаря широким возможностям выбора интерфейсов, а также возможности передачи сиrналов при обновлении проrрамм в си стеме, пользователи получают максимальную rибкость с помощью системноrо заrрузчика 5tellaris. Системный заzрузчик Stellar;s во флэш-памяти Для приложений, требующих проrраммирования в условиях эксплуатации, мы также предлаrаем исходный код бесплатноrо системноrо заrрузчика 5tellaris, который можно поместить в приложении в начале флэшпамяти. Блаrодаря широким возможностям выбора интерфейсов, включающих UART, !2С, 551, U5B Host, U5B Device и Ethernet, а также возможности передачи сиrналов при обновлении проrрамм в системе, пользователи получают максимальную rибкость с помощью системноrо заrрузчика 5tellaris. Библиотека драйверов периферии 5tellaris Peripheral Driver Library включает исходный код и содержит дополнительную информацию, касающуюся систем Horo заrрузчика 5tellaris, в том числе примеры приложений, в которых используется данный заrрузчик. . Бесплатная лицензия и бесплатное использование (для пользователей микроконтроллеров 5tellaris). . Компактный код, который можно разместить в начале флэшпамяти, чтобы использовать ero как заrрузчик приложения. . Заrрузчик также используется для обновления проrраммноrо обеспечения приложений, работающих на микроконтроллерах 5tellaris. . Поддерживаемые интерфейсы: UART (по умолчанию), 1 2 С, 55!, U5B Host (накопитель данных), U5B Device (DFU) и Ethernet (протокол ВООТР). Последовательный заzрузчик флэш-памяти Stellar;s Младшие представители семейства 5tellaris поставляются с предустановленным во флэшпамять бесплат ным последовательным заrрузчиком. Данный заrрузчик может использоваться совместно с утилитой LMFlash, стандартным JT АGотладчиком или же промышленным проrрамматором для заrрузки кода приложения во флэшпамять микроконтроллера на производстве. Последовательный заrрузчик  это компактное приложение, которое позволяет проrраммировать флэш память без использования интерфейса отладчика или проrрамматора. Мы поставляем бесплатную утилиту для проrраммирования флэшпамяти под названием LMFlash, которая может запускаться из командной CTpO ки или же посредством rрафическоrо интерфейса. Утилита обеспечивает полное использование всех команд последовательноrо заrрузчика. Для пользователей, создающих собственный проrрамматор флэшпамяти, мы также поставляем простую утилиту заrрузки по интерфейсу UART, которая обеспечивает полное использова ние всех команд последовательноrо заrрузчика. В руководстве по применению AN01242 при водится исходный код И информация о последовательном заrрузчике и утилите заrрузки sflash.exe. . Предустанавливается во флэшпамять всех микроконтроллеров 5tellaris, не имеющих системноrо заrрузчи ка в ПЗУ. . Представляет собой компактную проrрамму, позволяю щую проrраммировать флэш  память без использования отладчика. . Поддерживает интерфейсы UART и 55!. . Имеется бесплатная утилита LMFlash, которая обеспечива ет выполнение всех команд, поддерживаемых последова тельным заrрузчиком. 
492 · Приложение и. Семейство микроконтроллеров Stеllаris Ф И.4. Наборы референс"дизаЙНО8 и модули rибкость при изrотовлении продукции Мы обеспечиваем rибкость выбора стратеrии вывода продукции на рынок для целоrо спектра приложений. Инженеры MorYT начать оценку продукции и её разработку с помощью оценочноrо набора Stellaris Evaluation Kit (www.ti.com/steUarisevkits) или rOToBoro набора референсдизайнов Stellaris Reference Design Kit (www.ti.com/stellarisrdkits). Разработчики MorYT использовать стандартные, rOToBbIe к работе модули Stellaris Modules (www.ti.com/stellarismodules) или включить во встраиваемое приложение бесплатное эта лонное аппаратное и проrраммное обеспечение, созданное с помощью открытых инструментов разработки. Наши модули позволяют ускорить вывод продукции на рынок блаrодаря rOToBbIM устройствам в удобном формфакторе и применению эффективноrо проrраммноrо обеспечения. С помощью набора референс дизайна и модулей, обеспечивающих открытые средства проектирования, можно получить предварительно собранные блоки или создать свои собственные модули. Пакеты по проектированию печатных плат для каж доrо модуля, которые можно получить по адресу www.ti.com/steUarismodules. предоставляют пользователю электрические схемы, перечни комплектующих (ВОМ) и GеrЬеrфайлы. Модуль Stellaris для преобразования последова тельных протоколов в Ethernet Интеллектуальный дисплейный модуль Stellaris с питанием через Ethernet (Powerover Ethernet) ,. . . r. . . .. ' . Модуль Stellaris для Модуль Stellaris для управления щёточным управления бесщёточным двиrателем постоянноrо тока двиrателем постоянноrо тока Интеллектуальный дисплейный модуль Stellaris с интерфейсом Ethernet Интеллектуальный дисплейный модуль Stellaris с 3.5дюймовым экраном *:  .:  . },. .............,.... . ., - ' - ... Модуль Stellaris для управления шаrовым двиrателем Модуль Stellaris для управления асинхронным двиrателем переменноrо тока 
И.5. Микроконтроллеры реальноzо времени · 493 И.5. Микроконтроллеры реальноrо времени Мы предлаrаем 30 недороrих полнофункциональных микроконтроллеров Stel1aris на базе ARM CortexM3 с малым числом выводов в двух вариан тах корпусов: в 48BЫBOДHOM корпусе LFQP и в новом KOM пактном 48BЫBOДHOM корпусе QFN (Табл. И.1) . Серии LM3S100 и LM3S300 прекрасно подходят для базовых встраиваемых приложений и модерниза ции 8 и 16битных систем. Серии LM3S600 и LM3S800 оптимизированы для встраиваемых приложений) в KO торых требуется реализация алrоритмов управления повышенной сложности. Все микроконтроллеры Stellaris обеспечивают высокую производительность и высокую степень интеrрации) которые предпочтитель ны для сравнительно недороrих приложений) rде требу ется реализация сложных алrоритмов управления. К этим приложениям относятся) например) системы управления приводом) медицинские приборы, системы отопления, вентиляции) кондиционирования воздуха и управления зданием, системы промышленной aBTOMa тики, электронные системы на транспорте, кассовые терминалы и иrровые устройства. Оценочный набор Stellaris LM3S811 . Оценочная плата с 50мrц микроконтроллером LM3S811. . ОLЕDдисплей с разрешением 96х16 точек. . Проrраммируемая пользователем кнопка и светодиод. . Удобная кнопка сброса (RESET) и светодиодный инди катор питания. . Потенциометр с дисковым переключателем на входе BCTpoeHHoro в кристалл АЦП. . Последовательный интерфейс внутрисхемной отлад ки через USB. . USВкабель. . 20выводной JТАG/SWDкабель. . Компактдиск, содержащий: LI оценочную версию сред разработки; LI полную документацию; LI руководство по быстрому старту и исходный код; LI набор библиотек StellarisWare, включая библиотеку драйверов периферии и примеры исходноrо кода. . Примеры приложений, демонстрирующие использование различных операционных систем реальноrо времени) можно заrрузить на www.ti.com/stellarislm3s811. Информациядпязаказаоценочныхнаборов Коп Описание EKK Оценочный набор Stellaris LM3S811 дЛЯ КеН RealView LM3S811 MDKARM (оrраничение размера кода  32 Кбайт) EKI Оценочный набор Stellaris LM3S811 дЛЯ IAR Systems Em LM3S811 bedded Workbench (оrраничение размера кода  32 Кбайт) EKC Оценочный набор Stellaris LM3S811 дЛЯ CodeSourcery LM3S811 G++ (30ДHeBHoe оrраничение) EKT Оценочный набор Stellaris LM3S811 дЛЯ Code Red Techno LM3S811 logies Red Suite (оrраничение размера кода  32 Кбайт) EKS Оценочный набор Stellaris LM3S811 дЛЯ Code Composer LM3S811 Studio'" от компании Texas Instruments (полная версия с ПDИВЯЗКОЙ к плате) Микроконтроллеры Stellaris на базе ARM CortexM3 серии LM3S1000 сочетают в ce  ,'"'' бе расширенные порты ввода/ вывода общеrо назначения и увеличенный объём BCTpoeH ной памяти) а также обладают низким энерrопотреблением) оптимизированным дЛЯ YCT ройств С батарейным питани ем. Микроконтроллеры серии LM3S1000 (Табл. И.2) предлаrаются в 64BЫBOДHЫX корпусах LQFP) 100BЫBO дных корпусах LQFP или 108BЫBOДHЫX корпусах BGA и обеспечивают высокую производительность и высокую степень интеrрации, которые хорошо подходят для He дороrих приложений, реализующих сложные алrорит мы управления. К этим приложениям относятся, напри  мер) системы управления приводом, медицинские при  боры, системы отопления, вентиляциИ, кондициониро вания воздуха и управления зданием, системы промыш  ленной автоматики, электронные системы на транспор те, кассовые терминалы и иrровые устройства. Оценочный набор Stellaris LM3S1968 . Оценочная плата LM3S1968 с приложением для бы cTporo начала разработки: LI микроконтроллер Stellaris LM3S1968  256 Кбайт флэшпамяти, 64 Кбайт SRAM, 8канальный АЦП и до 52 портов ввода/вывода общеrо назначения; LI все порты ввода/вывода LM3S1968 выведены на Map кированные внешние контактные площадки; CJ поддержка энерrосбереrающеrо спящеrо режима (hibernate); LI простой запуск: USВкабель обеспечивает последо вательную связь, отладку и питание; LI rрафический ОLЕDдисплей с разрешением 128х64 точек и 16 rрадациями ceporo; LI пользовательский светодиод) переключатели и кнопки, электромаrнитный динамик; LI стандартный 20контактный JТАGразъём дЛЯ OT ладки от ARM. . USB и JТАGкабели. . Компакт диск, содержащий: LI оценочную версию сред разработки, полную ДOKY ментацию, руководство по быстрому старту и исхо дный код; LI набор библиотек StellarisWare, включая библиотеку драйверов периферии и примеры исходноrо кода. Информациядпязаказаоценочныхнаборов Коп Описание EKK Оценочный набор Stellaris LM3S1968 дЛЯ КеН RealView LM3S1968 MDKARM (оrраничение размера кода  32 Кбайт) EKI Оценочный набор Stellaris LM3S1968 дЛЯ IAR Systems LM3S 1968 Embedded Workbench (оrраничение размера кода  32 Кбайт) EKC Оценочный набор Stellaris LM3S1968 дЛЯ LM3S1968 CodeSourcery G++ (30ДHeBHoe оrраничение) EKT Оценочный набор Stellaris LM3S1968 дЛЯ Code Red LM3S1968 Technologies Red Suite (90ДHeBHoe оrраничение) EKS Оценочный набор Stellaris LM3S1968 дЛЯ Code Composer LM3S1968 Studio'" от компании Texas Instruments (полная версия с ПDИВЯЗКОЙ к плате) 
494 . Приложение И. Семейство микроконтроллеров Stеllаris Ф Таблица И.1. Микроконтроnnеры серий LM3S100/300/600/800 Характеристики Флэшпамять, Кбайт  ОЗУ, Кбайт ; Библиотеки в ПЗУ со t:: ОМА SAFERTOS" Макс.такт.частота,мrц = со. Встроенный t=( =:: прецизионный reHepaTop MPU SysTick (24битный) Таймеры общеrо назначения Часы реальноrо времени :! Сторожевой таймер со.  Модуль тим  )1 Вход защиты тим 5  reHepaTop i  «мёртвоrо»   времени  = Модуль ССР QЕIканалы Инте )фейс внешней периферии .. 10/100 МАС+РНУ ..cu   Е! IEE 1588 = :!  u CANMAC u'= =  USB О, Н или О   UART 6 = I 2 C  SSIISPI I 2 S  Модули АЦП ё КаналыАЦП tI: tI:      =. Быстродействие  .ё. АЦП (выб/с) =  Встроенный датчик   температуры Аналоrовые/цифровые компараторы Порты ввода/вывода общ. назнач. (совместимы с 5 В) Режим эверrосбережения с резерв. от батареи LDОстабилизатор напряжения Рабочая температvра 2/ ..... <= ..... tn   ....,;j 8 2 20 .; 2 .; 1 1/ N <= ..... tn   ....,;j 8 2 20 .; 2 .; 1 2 1 1 1 <:) <=  tn   ....,;j 16 4 25 .; .; 3 .; 1 6 2 1 1 ..... <=  tn   ....,;j 16 2 20 .; .; 2 .; 1 2 1 .; 2 1 3 250К 500К .; ас <=  tn   ....,;j 16 4 25 .; .; 3 .; 1 6 2 1 1 1 8 .; 3/ 2/ 1/ 3/ <:) .....  tn   ....,;j 16 4 25 .; .; 3 .; 1 6 1 .; 6 2 Lt') .....  tn   ....,;j 16 4 25 .; .; 3 .; 1 2 1 .; 6 2 1 4 \ос .....  tn   ....,;j 16 4 25 .; .; 3 .; 1 4 1 .; 6 2 1 1 1 4 1"- .....  tn ('f')  ....,;j 16 4 25 .; .; 3 .; 1 6 1 .; 6 1 6 250К 250К 250К 500К .; .; .; ас N  tn   ....,;j 16 4 25 .; .; 3 .; 1 6 2 1 1 1 8 .; <:) <= \ос tn ('f')  ....,;j 32 8 50 .; .; 3 .; 1 6 2 1 1 1/ 1/ 1/ / 3/ 3/ ..... <= \ос tn   ....,;j ас <= \ос tn   ....,;j .; I/E .; I/E .; .; I/E I/E .; .; I/E I/E .; .; .; .; .; .; I/E I/E I/E I/E I/E I/E 32 8 32 8 50 50 .; .; 3 .; 1 6 1 .; .; 3 .; 1 .; 6 1 6 2 1 1 2 1 1 1 8 500К .; 1/ 2...18 0...18 8...36 12...33 5...28 3...36 7...32 3...32 3...30 7...28 8...36 0...36 5...28 .; I/E Тип корпуса u о... Z u о... Z о... Z о... Z о... Z о... Z о... Z о... Z о... Z о... Z о... Z о... Z с.. Z ....... .......             O'ty  O'Q 0'0' 0'0' 0'0' 0'0' 0'0' 0'0' 0'0' 0'0' 0'0' 0'0' 0'0' 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 N N            Серийное производство (Р), опытные образцы (S) р р р р р р р р р р р р р 
И.5. Микроконтроллеры реальноzо времени · 495 с:>  м tf") Lt')  ос ос с:>  ос  м Lt')  ос ос        м с:> с:> с:>      м \ос \ос \ос \ос \ос \ос \ос \ос ос ос ос ос ос ос ос ос ос V'J V'J V'J V'J V'J V'J V'J V'J  V'J   V'J V'J    tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf")                                   32 32 32 32 32 32 32 32 64 64 64 64 64 64 64 64 64 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8                                                    50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50                                                    3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3                  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 6 6 2 4 6 6 6   6  6 2 6 6 6  1 1 1 1 1 1 1   1  1 1 1 1 1                   6 6 6 6 6 6 4 4 6 6 6 6 6 6 6 4 6       1   1      1                                                                                       2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1   1 1 1 1 1 1 1   1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1                  1 1 1 1 1 1 1 1   1 1 1 1 1 1 1 2 4 2 4 2 6 6 8   8 4 2 2 6 6 8 500К 500К 500К 500К 500К 500К 500К 1М   500К 500К 250К 500К 1М 1М 1М                  / / 1/ 1/ 3/ 1/ 1/ / 3/ 3/ 1/ 1/ 1/ 3/ 1/ 1/ / 6...34 4...32 7...34 3...32 0...34 1...30 0...30 9...28 8...36 0...36 5...28 1...32 7...34 0...34 1...30 0...30 7...28                                   I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E z z z z z z z z z z z z z z z z z                  аа аа аа аа аа аа аа аа аа аа аа аа аа аа аа аа аа 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000                  р р р р р р р р р р р р р р р р р 
496 · Приложение и. Семейство микроконтроллеров Stellaris. Таблица И.2. Микроконтроnnеры серии LM3S1000 Характеристика Флэшпамять, Кбайт  ОЗУ, Кбайт ; Библиотеки в ПЗУ  r::: DMA SAFERTOS" Макс. такт. частота, мrц &. Встроенный t:{ =: прецизионный reHepaTop MPU S]1sTick (24битный) Таймеры общ. назначения Часы реальноrо времени Сторожевой таймер Модуль тим  =  Вход защиты mим  g: reHepaTop «MёpT ; ; Boro» времени .....  = Модуль ССР QЕIканалы Интерфейс внешней периферии  u .... 10/100 МАС+РНУ ..c 3  Е IEE 1588   CANMAC ,= =.& USB D, НилиО   UART 5 ; I 2 C  SSI/SPI PS  Модули АЦП S Каналы АЦП I:IC I:IC - :  < s Быстродействие  .& ....... АЦП (выб/с) :  Встроенный датчик   температуры Аналоrовые/цифровые компараторы :21 Q..  )1 ,=  20 Порты ввода/вывода общ. назнач. ... (совместимы с 5 В) Режим энерrосбережения с резерв. от батареи LDОстабилизатор напряжения Рабочая температура С:> tf") ос  tf") tf")  ..... .....    V'J V'J V'J tf") tf") tf")    .;j .;j .;j 64 16 64 16 С:> м Lt') \ос  .....   V'J V'J tf") tf")   .;j .;j 64 16 64 16 64 16 50   4  1 6 1  6 3 1 2 1 2 I Lt') \ос   V'J tf")  .;j 64 16 50   4  1 6 1  8 3 1 2 1 4 I \ос N \ос tf")  tf")   V'J V'J tf") tf")   .;j .;j 64 16 50   4  1 6 1  8 3 1 2 1 4  96 16 50   4  1 8 2 1 3  Lt') 0'1 tf") tf")     V'J V'J tf") tf")   .;j .;j 96 32 50   3  1 2 1  4 2 1 1 1 2  96 32 50   3  1 6 1  6 1 2 1 2 1 4  м со   tf") С:> Lt') Lt') \ос    V'J V'J V'J tf") tf") tf")    .;j .;j .;j 96 64 96 128 64 32 50   4  1 8 3 2 2  ос с> С:> \ос \ос   t'.) V'J tf") tf")    .;j 128 32   50   4  1 6 3 2 1 1 8 500К 500К   128 128 32 32 50   4  1 8 2 2 2 1 8  Q t/') м м \ос \ос   V'J t'.) tf") tf")   .;j .;j 128 32   25 50 25 50 50 50 4 46     I      I  I/E I/E I/E I/E I/E I/E 4 43 4 43   I 29 57 21 46 14 52 25 50   4  1   4  1 23 60 о 33   I 17 52     I/E I/E   3  1 6 1  4 1   4  1 4 1  4   3  1   4  1 2 1  8   4  1   4  1 6 1  6 1 8 1 8 1 2 1 2 1 2 1 2 2 3 1 2 6 3 2 2 3 1 2 3 2 2 3 2 2 1 2 1 8 1 6 500К  2/ 1/ 3/ 3/ 3/ 1/ 1/ 3/ 1/ 1/ 3/ / 2/ / 2/ 3/ 1/ 1 2  250К 1М  9 9 41 44 46 1 8  500К 500К 500К 250К 500К 500К 250К 500К   7 52  I 15 9 11 о 58 43          I I  I/E I/E I/E I/E I/E I/E 52 33  I Тип корпуса <<<<<<  <<<<<<  <<   C.:J  C.:J  C.:J  C.:J  C.:J  C.:J   C.:J  C.:J  C.:J  C.:J  C.:J  C.:J   C.:J  C.:J  З'З'З'З'З'З' З' З'З'З'З'З'З' З' З'З' З' 000000000000000000 о 000000000000000000  000000 зЗзЗзЗзЗзЗзЗ з зЗзЗзЗзЗзЗзЗ \о зЗзЗ  Серийное производство (Р), опытные образцы (S)                  
И.5. Микроконтроллеры реальноzо времени · 497 \ос  Lt') \ос   \ос  \ос с:>  со  со с:> со 0\  \ос  \ос \ос \ос N N tf") tf") tf") Lt')    Lt')   tf") Lt') \ос \ос       \ос \ос \ос \ос \ос   со со со 0\ 0\ 0\ 0\ 0\ \ос 0\   z z  N                       V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J  V'J  V'J  V'J V'J  V'J V'J   tf") V'J tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf")  tf") tf") tf") tf") tf") tf") tf")                                             128 128 128 128 128 128 128 256 256 256 256 256 256 256 256 256 256 128 128 64 64 32 16 32 32 32 32 32 64 64 32 32 32 64 64 64 64 64 64 64 20 20 12 12 8 6                   I             I                                      50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50        1 1         1 1 1 1 1 1          I                                     4 4 4 4 4 3 3 4 4 3 4 4 3 4 4 4 4 3 3 3 3 3 3                        1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 4 6 6 6 6 4 8   6   6  6 6 6       1 1 1 1 1 1 3   1   1  1 1 1       I         I              4 4 8 8 6 6 2 8 8 6 8 8 4 8 8 4 4 6 6 6 6 6 6 1 1   1     1     2 2 2                                                                                                                          2 2 3 3 3 3 1 3 3 2 3 2 2 3 3 3 3 3 3 3 3 3 3 1 1 2 2 1 1 1 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 1 2 1 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2                        1 1 1 1 1 1 1 1 1   1 1 1  1 1 1 1 1 1 1 1 6 4 4 4 4 4 6 8 8   8 4 8  8 8 8 8 8 8 8 8 500К 500К 500К 500К 1М 500К 1М 1М 1М   500К 1М 1М  1М 1М 1М 1М 1М 1М 1М 1М         I   I            / / 2/ 2/ 1/ 1/ / 2/8 2/8 3/ 2/ 2/ 1/ / 3/ 3/ 3/ 2/8 2/8 2/8 2/8 2/8 2/8     о о 12 12 7 21 1 О О 17 23 17 27 21 7 5 5 О О О О О О ... ... .. . ... ... ... ... .. . ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 33 33 56 56 43 56 33 67 33 56 60 52 56 52 60 52 52 67 33 67 33 33 33     I  I                                        1 1 I/E 1 I/E I/E 1 1 1 I/E I/E I/E I/E I/E I/E I/E 1 1 1 1 1 1 1   <  < <    < < < < < < <          e,:)  e,:) e,:)    e,:) e,:) e,:) e,:) e,:) e,:) e,:)        СУ СУ з СУ з з СУ СУ СУ з з з з з з з СУ СУ СУ СУ СУ СУ СУ    ,....:j ,....:j ,....:j ,....:j ,....:j ,....:j ,....:j ,....:j ,....:j ,....:j   000 о 000 000  о  000 000 000 000 000 000 000 о о  о    \о \о 00 О 00 00 \о О \о 00 00 00 00 00 00 00 о о \о О \о \о \о                 р р р р р р s s р р р р р р р р s s s s s s [а] ШИМуправление ПрИВОДОМ выполняется с помощью специальных аппаратных средств (выводы PWM) или с помощью функций управления ПРИВОДОМ) имеющихся у таймеров общеrо назначения (выводы ССР). Подробности см. в технической документации. [Ь] Минимум  число выводов) предназначенных для портов ввода/вывода общеrо назначения; дополнительные выводы доступны) если не используется какаялибо периферия. Подробности см. в технической документации. {с] Промышленный диапазон (1): 40...+850C) расширенный диапазон (Е): 40...+105°C. [d] lО8выводной корпус BGA и 64выводной корпус LQFP предлаrаются только для промышленноrо диапазона рабочих температур. 
498 · Приложенuе И. Семейство микроконтроллеров Stellaris. И.б. Микроконтроnnеры с интерфейсом Ethernet Микроконтроллеры Stellaris на базе ARM CortexM3 серии LM3S6000 сочетают в себе возможность работы в режиме реальноrо времени, расширенные порты ввода/вывода общеrо назначения и увеличенный объём встроенной памяти, а также обладают низким энерrопотреблением, оптимизированным для приложений с резервным питанием от батареи. Микроконтроллеры серии LM3S6000 являются первыми в мире микрокон троллерами с полностью интеrрированным 10/100Мбит/с Еthеrпеtрешением, совместимым с ARM архитектурой. Микроконтроллеры серии LM3S6000 (Табл. И.3) содержат не только Ethernet МАСконтроллер (МАС), но и трансивер (РНУ). Кроме Toro, отдельные микроконтроллеры серии LM3S6000 обеспечивают ап паратную поддержку протокола Precision Time Protocol соrласно IEEE 1588. Оценочный набор Stellaris LM3S6965 Особенности оценочноrо набора Ethernet Stellaris LM3S6965 Ethernet Оценочные наборы Stellaris LM3S6965 обеспечива ют компактную и универсальную платформу для оценки микроконтроллеров Stellaris на базе ARM CortexM3 с интерфейсом Ethernet. Набор содержит два примера приложений, демонстрирующих реали зацию встраиваемоrо вебсервера. [отовое к работе приложение для быстроrо старта включает в себя встраиваемый вебсервер, использующий Ethernet стек Open Source lwIP. Набор также содержит веб сервер с ОС реальноrо времени FreeRTOS.org nO и EthernetcTeK Open Source uIP. Каждая плата имеет внутрисхемный интерфейс отладки InCircuit Debug Interface (ICDI), который обеспечивает возможность аппаратной отладки не только для размещённоrо на плате микроконтроллера Stellaris, но и для любой платы на базе контроллеров Cortex М3/М4 от Texas Instruments. Оценочный набор содержит все кабели, проrраммное обеспечение и документацию, необхо димые для быстроrо проектирования и запуска при ложен ия для микроконтроллеров Stellaris. Кроме TO ro, примеры приложений, демонстрирующие исполь зование различных ОС реальноrо времени и KOMMep ческих EthernetcTeKoB, можно заrрузить на www.ti.com/stellarislm3s6965. . Оценочная плата LM3S6965. · Микроконтроллер Stellaris LM3S6965 с интеrриро ванным 10/100Мбит!с Еthеrпеtконтроллером (МАС+РНУ). · Простая установка: USВкабель обеспечивает по следовательную связь, отладку и питание. · [рафический ОLЕDдисплей с разрешением 128х64 точек и 16 rрадациями ceporo. · Пользовательский светодиод, переключатели и кнопки. . Электромаrнитный динамик. · Все порты ввода/вывода LM3S6965 выведены на маркированные внешние контактные площадки. · Стандартный 20контактный JТАGразъём дЛЯ OT ладки от ARM. . Разъём карты MicroSD. · Убирающийся Еthеrпеtкабель, USВкабель и JTAG кабель. · Приложение для быстроrо старта работает как с Ethernet, так и без Hero (непосредственная связь с компьютером). · Компактдиск, содержащий: CJ оценочную версию сред проrраммирования; CJ руководство по быстрому старту и исходный код; CJ полную документацию; CJ набор библиотек StellarisWare, включая библиоте ку драйверов периферии и пример исходноrо KO да. Информация для заказа оценочных наборов Ко Описание EKKLM3S6965 Оценочный набор Stellaris LM3S6965 Ethernet для КеН RealView MDKARM (оrраничение размера ко а  32 Кбайт Оценочный набор Stellaris LM3S6965 Ethernet дЛЯ IAR Systems Embedded Workbench (оrраничение азме а ко а  32 Кбайт О еночный набо Stel1aris LM3S6965 Ethernet ля CodeSourcer G++ зо невное or аничение Оценочный набор Stellaris LM3S6965 Ethernet для Code Red Technologies Red Suite (90ДHeBHoe or аничение EKSLM3S6965 Оценочный набор Stellaris LM3S6965 дЛЯ Code Composer Studio'" от компании Texas Instruments (полная ве сия спивязкой К плате ЕКI  LM3S6965 EKC LM3S6965 EKTLM3S6965 
И.б. Микроконтроллеры с интерфейсом Etherпet · 499 Таблица И.3. Микроконтроnnеры серии LM3S6000 с:> с:> с:> N N  с:> .... ос tf")  с:> tf") .... ос ос с:> N Lt') с:> .... N N tf") tf") .... .... .... tf") tf") tf") Lt') .... .... tf") Lt') u") \ос .... ....    Lt') \ос \ос \ос \ос \ос   0\ 0\ 0\ 0\ 0\ 0\ Характеристика \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос \ос V'J V'J V'J V'J V'J V'J V'J V'J V'J   V'J        tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf")                                       IФлэшпамять, Кбайт 64 64 96 96 96 96 128 128 128 128 128 128 128 256 256 256 256 256 256 ,.Q !озу, Кбайт 16 16 32 32 32 64 32 32 32 32 32 64 64 64 64 64 64 64 64  t:II: !Библиотеки в пзу                      пМА =                    SAFERTOS'"                    Макс. такт. частота, Мfц 25 25 25 25 50 50 25 50 50 50 50 50 50 50 50 50 50 50 50 Q Встроенный с.. Iпрецизионный 1:[                    =: lI'eHepaToP MPU   I              I   SysTick (24битный)     I  I             Таймеры общеrо 3 3 3 3 3 4 4 4 4 3 4 3 4 4 4 4 4 3 4 назначения Часы реальноrо времени                    Сторожевой таймер 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 :! !модуль тим  2   2 6 4      6   6 4 6 с..  QI IВxoд защиты  QI 1 1 1 1 1 1 1 1 ,= тим             =  := Q feHepaTop «MёpT QI 1:[ I!!:! Q                    = = BOrO» времени  Модуль ССР 4 4 4 4 4 6 6 6 6 6 6 4 4 6 6 6 6 4 4 = ЕIканалы       1      1    1 1 2 !Интерфейс внешней                  Iпеои hерии QI j  10/100 МАС+РНУ    I I  I             :!  е EE 1588    := :!                 ,.Q u CAN МАС 5,=                     USB D, Н или О                      UART 1 1 1 1 2 2 3 3 2 2 2 1 2 3 2 3 3 3 3 I:[ 2C 2 2 2 2 QI :z:     1 1 1 1 1  1 2 1 1 1 5 = SSI/SPI 1 1 1 1 1 1 1 2 2 1 1 1 1 2 2 1 2 1 1 Q = [2S                     Модули АЦП    1 1 1   1 1 1  1  1 1  1 1 t:II: t:II: e Каналы АЦП    2 3 4   8 3 4  4  8 8  3 4   < с:ь Быстродействие    50K 1250К 500К   500К 500К 1М  500К  5001< 1М  500К 1М -..х  АЦП (выб/с) g i Встроенный датчик ; е rrемпеоатvры           I         <= налоrовые/цифровые 1/ 3/ 2/ 2/ 2/ 2/ 3/ 2/ 2/ 1/ 3/ 2/ 2/ 2/ 2/ 3/ 3/ 3/ 2/ !компараторы lПорты ввода/вывода 10 8 23 12 14 6 5 10 5 15 11 23 5 10 5 7 1 6 О бщ. назнач. (совместимы ... .. . .. . . .. .. . . .. ... ... ... ... .. . . .. ... ... . .. ... ... . .. ... t5 В) 30 35 46 34 43 41 46 46 38 41 41 46 41 46 38 38 46 43 42 ежим энерrосбережения                     резерв. от батаоеи tDОстабилизатор     I  I             lНапряжения Wабочаятемпеоатvоа I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E I/E ,   ft,c / (3 с..<: ёE ft,ёE (3 ёE ft,ёE   с..<:  ft,(3 ёЭ ,ёЭ e,:) e,:) Тип корпуса CI CI CI CI g CI CI CI g QO   QO QO gз QO  gз g QO  8 QO QO 8 00 00 00 00 00 00 00 00 O 00 00 З 00 g 00 O з.... з...... з...... з...... з...... з...... з...... з...... з...... з...... ...... з...... з...... з...... ...... з...... з.... з...... Серийное производство (Р), р р р р р р р р р р р р р р р р р р р !опытные образцы (S) [а] ШИМуправление приводом выполняется с помощью специальных аппаратных средств (выводы PWM) или с помощью функций управления приводом, имеющихся у таймеров общеrо назначения (выводы ССР). Подробности см. в технической документации. [Ь] Минимум  число выводов, предназначенных для портов ввода/вывода 06щеrо назначения; дополнительные выводы доступны, если не используется какаялибо периферия. Подробности см. в технической документации. [с] Промышленный диапазон (1): 40...+850C, расширенный диапазон (Е): 40...+1050C. [d] 108выводной корпус BGA предлаrается только для промышленноrо диапазона рабочих температур. 
500 · Приложение И. Семейство микроконтроллеров Stellaris. И.7. Микроконтроллеры с интерфейсом USB  Оценочный набор Stellaris LM3S3748 USB Host/Device Оценочная плата Stellaris LM3S3748 демонстрирует клю чевые особенности микроконтроллера LM3S3748, включая полноскоростной (12 Мбит/с) контрол лер USB 2.0 Host/ Device, АЦП и после Оценочный набор Stellaris довательные интер LM3S3748 USB Host/Device фейсы. В режиме USB Device компактный переключатель позволяет выбрать питание через шину или автономное питание. [отовое к pa боте приложение для быстроrо старта использует четыре сиrнала АЦП, образующие два дифференциальных канала, для реализации проrраммноrо осциллоrрафа с частотой вы  борки 1 Мвыб/с с ЖКдисплеем, демонстрируя BЫCOKOCKO ростную систему сбора и обработки данных с усовершен ствованным пользовательским интерфейсом, который раз работан с помощью rрафической библиотеки StellarisWare Graphics Library. Приложение для быстроrо старта использу ет USВбиблиотеку StellarisWare USB Library для работы в pe жимах USB Host и USB Device, записывает растровые изобра жения сиrналов, отображаемых на дисплее, и СSVданные во встроенный USВнакопитель и имеет возможность соедине ния с компьютером для дистанционноrо отображения дан  ных. Плата LM3S3748 также содержит внутрисхемный ин терфейс отладки InCircuit Debug Interface (lCDI) , который обеспечивает возможность аппаратной отладки не только для установленноrо на плате микроконтроллера Stllaris, но и для любой платы на базе микроконтроллера Stellarls. В режи  ме отладочноrо интерфейса встроенный в плату микрокон троллер блокируется, что позволяет проrраммировать или осуществлять отладку внешней платы. Примеры приложе ний, демонстрирующие использование различных ОС pe альноrо времени и коммерческих коммуникационных CTe ков, можно заrрузить на www.ti.com/stellarislm3s3748. · 50мrц микроконтроллер Stellaris LM3S3748 со BCTpoeH ной 128Кбайт флэшпамятью и 64Кбайт SRAM. · Приложение для быстроrо старта, реализующее 2каналь ный осциллоrраф. · Поддержка питания через шину или aBToHoMHoro пита ния через USB. · Цветной rрафический ЖКдисплей с разрешением 128х128 точек. · Пользовательский светодиод и навиrационный переклю чатель. · 8OM электромаrнитный динамик с усилителем. · Разъём карты MicroSD. · Стандартный 20контактный JТАGразъём для отладки от ARM и JT AG/SWD кабель. · Порты ввода/вывода LM3S3748 выведены на маркирован ные внешние контактные площадки. · USВкабели и измерительные щупы осциллоrрафа, необхо Димые для работы приложения быстроrо старта. · USВнакопитель. · Компактдиск) содержащий: CJ оценочную версию проrраммных инструментов, пол ную документацию, руководство по быстрому старту и исходный код; CJ набор библиотек StellarisWare, включая библиотеку драй веров периферии и пример исходноrо кода. Информация для заказа оценочных наборов Ко EKK LM3S3748 EKI LM3S3748 EKC LM3S3748 EKT LM3S3748 EKS LM3S3748 Описание Оценочный набор Stellaris LM3S3748 USB Host/ Device для Keil RealView MDKARM (оrраничение азме а ко а  32 Кбайт Оценочный набор Stellaris LM3S3748 дЛЯ IAR Systems Embedded Workbench (оrраничение азме а ко а  32 Кбайт Оценочный набор Stellaris LM3S3748 дЛЯ CodeSourcer G++ (30ДHeBHoe or аничение) Оценочный набор Stellaris LM3S3748 дЛЯ Code Red Technolo ies Red Suite (90ДHeBHoe or аничение) Оценочный набор Stellaris LM3S3748 дЛЯ Code Composer Studio'" от компании Texas Instruments полная ве сия спивязкой К плате Оценочный набор Stellaris LM3S9B92 Ethernet+CAN Имея в своём COCTa ве две платы, на одной из которых находится микроконтроллер LM3S9B92 с интерфей сами Ethernet+USB OTG+CAN, а на дpy rой реализован интер фейс внутрисхемной отладки BDICDI, oцe ночный набор Stellaris Оценочный набор Stellaris LM3S9B92 предостав LM3S9B92 Etherпet+CAN ляет недороrую, KOM пактную и универсальную платформу для оценки микр контроллеров Stellaris на базе ARM CortexM3 с интерфеи сами Ethernet, USB и CAN. В оценочной плате используется микроконтроллер LM3S9B92, который позволяет реализо вывать сложные алrоритмы управления и имеет 8 ШИМ выходов для обеспечения управления приводом и снабже ния энерrией и 2 модуля квадратурноrо энкодера (QEI) дЛЯ подключения импульсных датчиков положения. Кроме TO ro, микроконтроллер LM3S9B92 способен работать с внеш ним 16мrц кварцевым reHepaTopoM, который обеспечива ет основную тактовую частоту, используемую для непо: средственноrо тактирования АRМядра или внутреннеи схемы ФАПЧ дЛЯ увеличения частоты TaKToBoro сиrнала ядра до 80 мrц. Для тактирования Еthеrпеtконтроллера используется 25мrц кварцевый reHepaTop. Микрокон троллер LM3S9B92 также имеет встроенный LDO стабилизатор напряжения, который обеспечивает питание внутренних цепей. Информация для заказа оценочных наборов Ко Описание EKK Недороrой оценочный набор Stellaris LM3S9B92 LM3S9 B92 ДЛЯ Keil RealView MDKARM (оrраничение азме а ко а  32 Кбайт ЕКI Недороrой оценочный набор Stellaris LM3S9B92  дЛЯ IAR Systems Embedded Workbench LM3S9B92 or аничение азме а ко а  32 Кбайт EKC Недороrой оценочный набор Stellaris LM3S9B92 LM3S9B92 дЛЯ CodeSourcer G++ (30ДHeBHoe or аничение) Недороrой оценочный набор Stellaris LM3S9B92 EKT дЛЯ Code Red Technologies Red Suite (90ДHeBHoe LM3S9B92 or аничение Оценочный набор Stellaris LM3S9B92 дЛЯ Code EKS Composer Studio'" от компании Texas Instruments LM3S9B92 полная ве сия спивязкой К плате 
И.7. Микроконтроллеры с интерфейсом USB . 501 Таблица И.4. Микроконтроnnеры с интерфейсом USB ..... 0'1 CIC) 0'1 \ос \ос \ос \ос \ос ..... tf") tt tt N N N N N Lt') t-.. CIC) ....... z  N Характеристика \ос tf") tf") tf") tf") tf") tf") tf") tf")  V'J V'J V'J  V'J V'J V'J tf") tf") tf") tf") tf") tf") V'J tf") tf") tf")                   Флэmпамять, Кбайт 128 128 128 128 256 128 64 32 16 ,Q ()ЗУ, Кбайт 32 64 64 64 32 20 12 8 6  I:IC  Библиотеки в ПЗУ           DMA ==  I        SAFERTOS"          Макс. такт. частота,Мfц 50 50 50 50 50 50 50 50 50 е Встроенный  прецизионный      1=(      reHepaToP MPU          SvsTick (24битный)      I    Таймеры общеrо 4 4 4 4 3 3 3 3 3 назначения Часы реальноrо времени        I  Сторожевой таймер 1 1 1 1 2 2 2 2 2 :а Модvль тим 8 8          ВХОД защиты   4 4 ,= ШИМ         =   :z: е reHepaTop I=( I!!:! е = = «мёртвоrо»           времени = Модvль ССР 8 8 8 7 6 6 6 6 6 QЕIканалы   1 1      Интерфейс внешней          tnери Ьерии  j 't 10/100 МАС+РНУ          :а  Е nEE 1588 :z: :!          ,Q v CAN МАС 5,=          t USB D, Нили О О Н Н Н D D D D D  е UART 1 3 2 3 3 3 3 3 3 I=(  :z: [2С 1 2 2 2 2 2 2 2 2 5 = е SSI/SPI 1 2 2 2 2 2 2 2 2 == I 2 S           Модvли АЦП 1 1 1 1 1 1 1 1 1 tI:: I:IC e Каналы АUП 4 8 8 8 8 8 8 8 8   < Q Быстродействие 500К 500К 1М 1М 1М 1М 1М 1М 1М -  АЦП (выб/с) е Встроенный датчик =           :z:  температvры <= Аналоrовые/цифровые 2/ 2/ 2/ 2/ 2/8 2/8 2/8 2/8 2/8 компараторы Порты ввода/вывода общ. назнач. (совместимы 0...33 14...61 3...61 0...61 0...33 0...33 0...33 0...33 0...33 с5 В) Режим энерrосбережения          с резерв. от батареи LDОстабилизатор          напряжения Рабочая температvра 1 1 1 1 1 1 1 1 1 Тип корпуса 64LQFP 100LQFP 100LQFP 100LQFP 64LQFP 64LQFP 64LQFP 64LQFP 64LQFP Серийное производство (Р), Р Р Р Р S S S S S опытные образцы (S) [а] ШИМуправление ПРИВОДОМ выполняется с помощью специальных аппаратных средств (выводы PWM) или с помощью функций управления приводом, имеющихся у таймеров общеrо назначения (выводы ССР). Подробности см. в технической документации. [Ь] Минимум  число выводов, предназначенных для портов ввода/вывода общеrо назначения; дополнительные выводы доступны, если не используется какаялибо периферия. Подробности см. в технической документации. [с] Промышленный диапазон (1): 40...+850C, расширенный диапазон (Е): 40...+1050c. 
502 . Приложение и. Семейство микроконтроллеров Stellaris. И.8. Микроконтропперы с интерфейсами USB и CAN  Оценочный набор Stellaris LM3S3748 Информация для заказа оценочных наборов USB Host/Device Ко g::н:ей набор Stellaris LM3S3748 USB Host! Оценочная плата S3748 Device для КеН RealView MDKARM (оrраничение Stellaris LM3S3748 азме а ко а  32 Кбайт демонстрирует клю EKI ОцеНОЧНЫЙ Ь Н d а d БО d р w Stеll k а ь riS LM h ( 3S3748 дЛЯ IAR чевые особенности L M 3 S 3748 Systems Ет е е or епс оrраничение азме а ко а  32 Кбайт микроконтроллера EKC Оценочный набор Stellaris LM3S3748 дЛЯ LM3S3748, включая LM3S3748 CodeSourcer G++ (30ДHeBHoe or аничение) П ( ОЛН Б ОСКО ) РОСТНОЙ EKT Оценочный набор Stellaris LM3S3748 дЛЯ Code Red 12 М ит/с контрол LM3S3748 Technolo ies Red Suite (90ДHeBHoe or аничение) лер USB 2.0 Host! Оценочный набор Stellaris LM3S3748 дЛЯ Code Device, АЦП и после Оценочный набор Stellaris EKS Composer Studio'" от компании Texas Instruments довательные интер LM3S3748 USB Host/Device LM3S3748 полная ве сия спивязкой К плате фейсы. В режиме USB Device компактный переключатель позволяет выбрать Оценочный набор Stellaris LM3S9B92 питание через шину или автономное питание. [отовое к pa Ethernet+CAN боте приложение для быстроrо старта использует четыре сиrнала АЦП, образующие два дифференциальных канала, для реализации проrраммноrо осциллоrрафа с частотой BЫ борки 1 Мвыб!с с ЖКдисплеем, демонстрируя BЫCOKOCKO ростную систему сбора и обработки данных с усов ершен  ствованным пользовательским интерфейсом, который раз работан с помощью rрафической библиотеки StellarisWare Graphics Library. Приложение для быстроrо старта использу ет USВбиблиотеку StellarisWare USB Library для работы в pe жимах USB Host и USB Device, записывает растровые изобра жения сиrналов, отображаемых на дисплее, и СSVданные во встроенный USВнакопитель и имеет возможность соедине ния с компьютером для дистанционноrо отображения дaH ных. Плата LM3S3748 также содержит внутрисхемный ин терфейс отладки InCircuit Debug Interface (ICDI), который обеспечивает возможность аппаратной отладки не только для установленноrо на плате микроконтроллера Stellaris, но и для любой платы на базе микроконтроллера Stellaris. В режи ме отладочноrо интерфейса встроенный в плату микрокон троллер блокируется, что позволяет проrраммировать или осуществлять отладку внешней платы. Примеры приложе ний, демонстрирующие использование различных ОС pe альноrо времени и коммерческих коммуникационных CTe ков, можно заrрузить на www.ti.com/stellarislm3s3748. . 50мrц микроконтроллер Stellaris LM3S3748 со BCTpoeH ной 128Кбайт флэшпамятью и 64Кбайт SRAM. . Приложение для быстроrо старта, реализующее 2каналь ный осциллоrраф. . Поддержка питания через шину или aBToHoMHoro пита ния через USB. . Цветной rрафический ЖКдисплей с разрешением 128х128 точек. . Пользовательский светодиод и навиrационный переклю чатель. . 8OM электромаrнитный динамик с усилителем. . Разъём карты MicroSD. . Стандартный 20контактный JТАGразъём для отладки от ARM и JТАG/SWDкабель. . Порты ввода/вывода LM3S3748 выведены на маркирован ные внешние контактные площадки. . USВкабели и измерительные щупы осциллоrрафа, необхо димые для работы приложения быстроrо старта. . USВнакопитель. . Компактдиск, содержащий: CJ оценочную версию сред проrраммирования, полную документацию, руководство по быстрому старту и исхо дный код; CJ набор библиотек StellarisWare, включая библиотеку драй веров периферии и пример исходноrо кода. Имея в своём COCTa ве две платы, на одной из которых находится микроконтроллер LM3S9B92 с интерфей сами Ethernet+USB OTG+CAN, а на дpy rой реализован интер фейс внутрисхемной отладки BD ICDI, oцe ночный набор Stel1aris Оценочный набор Stellaris LM3S9B92 предостав LM3S9B92 Etherпet+CAN ляет недороrую, KOM пактную и универсальную платформу для оценки микро контроллеров Stellaris на базе ARM CortexM3 с интерфей сами Ethernet, USB и CAN. В оценочной плате используется микроконтроллер LM3S9B92, который позволяет реализо вывать сложные алrоритмы управления и имеет 8 тим  выходов для обеспечения управления приводом и снабже ния энерrией и 2 модуля квадратурноrо энкодера (QEI) дЛЯ подключения импульсных датчиков положения. Кроме TO ro, микроконтроллер LM3S9B92 способен работать с внеш ним 16мrц кварцевым reHepaTopoM, который обеспечива ет основную тактовую частоту, используемую для непо средственноrо тактирования АRМядра или внутренней схемы ФАПЧ для увеличения частоты TaKToBoro сиrнала ядра до 80 мrц. Для тактирования Еthеrnеtконтроллера используется 25мrц кварцевый reHepaTop. Микрокон троллер LM3S9B92 также имеет встроенный LDO стабилизатор напряжения, который обеспечивает питание внутренних цепей. Информация для заказа оценочных наборов Ко Описание EKK Недороrой оценочный набор Stellaris LM3S9B92 LM3S9B92 дЛЯ Keil RealView MDK:ARM (оrраничение азме а ко а  32 Кбаит ЕКI Недороrой оценочный набор Stellaris LM3S9B92 LM3  S 9B92 дЛЯ IAR Systems Embedded Workbenc or аничение азме а ко а  32 Кбаит EKC Недороrой оценочный набор Stellaris LM3S9B92 LM3S9B92 дЛЯ CodeSourcer G++ (30ДHeBHoe or аничение) ЕКТ Недороrой оценочный набор Stellaris LM3S9B92 LM3S9B92 дЛЯ Code Red Technologies Red Suite (90ДHeBHoe or аничение EKS Оценочный набор Stellaris LM3S9B92 дЛЯ Code LM S9B92 Composer Studio'" от компаии Texas Instruments 3 полная ве сия спивязкои К плате 
И.В. Микроконтроллеры с интерфейсами USB и CAN · 503 Таблица И.5. Микроконтроnnеры с интерфейсами USB и CAN м ..-1 М \ос М М  0\  0\ М М ..-1 tf") Lt') Lt') Lt') \ос tf") tf") tf") t!: t!: Lt') \ос 0\ \ос \ос \ос \ос \ос       Характеристика Lt') Lt') Lt') Lt') Lt') Lt') Lt') Lt') Lt') Lt') Lt') Lt') Lt') V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf") tf")                           лэшпаМJlТЬ, Кбайт 128 128 128 128 128 128 128 128 128 128 128 128 128 ,Q озу, Кбайт 32 32 32 32 32 64 64 64 64 64 64 64 64  I:IC Библиотеки в пзу I I I I I I I I I I I I I   ОМА I I I I I I I I I I I == I I SAFERTOS nO              Макс. такт. част.. Мfц 50 80 50 80 50 50 50 50 50 50 50 50 80 с::> Встроенный преци   I  I         I 1:[ sионный reHeoaToP =: MPU I I I I I I I I I I I I I SvsTick (24битный) I I I I I I I I I I I I I Таймеры общеrо 3 4 3 4 3 3 3 4 3 4 3 3 4 назначеНИJl асыреал.времени I I I I I I I I I I I I I :а Стооожевойтаймео 1 2 1 2 1 1 1 1 1 1 1 1 2 rr МОIlVЛЬ тим  6  6 6    6 8  6 8   ВХОД защиты ,= 4 4 1 1 4 1 4  = тим        :z: с::> I:[ [енератор «MёpT I!!:! с::> = =  I  I I    I I  I I !.! Iвoro» воемени = МОIlVЛЬ ССР 5 8 6 8 5 5 3 8 2 5 6 5 8 ЕIканалы  2  1      1   2 Интерфейс внешней             I пеои Ьеоии  i tS 10/100 МАС+РНУ              :а  EEE 1588 :Z: :а               v CAN МАС 1 2 1 1 1 1 1 1 1 2 1 1 2 ,= .x. USB О. НилиО Н О О О О Н Н Н Н Н О О О e UART 2 3 1 3 1 2 1 3 1 2 1 1 3 I:[ r 2 C 2 2 1 2 2 2 2 1 2 1 2  :Z:   6= SSI/SPI 1 2 1 2 1 1 2 2 1 2 1 1 2 с::> == [2S I I             МОIlVЛИ АIIП 1 2 1 2 1 1 1 1 1 1 1 1 2 I:IC tI:: 5- Каналы АЦП 6 16 6 8 4 6 8 8 8 8 6 4 16 i  < Q Быстродействие 500К 1М 500К 1М 500К 500К 500К 500К 500К 1М 500К 500К 1М -  АЦП (вы б/с) с::> Встроенный датчик = !. I I I I I I I I I I I I I =  температvоы <= Аналоrовые/цифро / 2/ 16 1/  2/ 16 / / / 2/  / 2/  1/  / 3/ 16 вые компаоатооы Порты ввода/вывода 27...61 12.. .61 27...61 0...61 О.. .33 0...33 0...72 бщ. назнач. (совместимы 1...33 О.. .67 0...33 0...33 О.. .33 1...33 ,. 5 В) Режим энерrосбережеНИJl I I I I .; I I I I I I I  ,. резеов. от батаоеи DОстабилизатор I I I I I I I I I I I I I наПОJlжеНИJl РабочаJl темпеоатvоа 1 1 1 1 1 1 1 1 1 1 1 1 1                     CI     CI CI CI CI   CI CI CI CI CI CI CI CI Тип корпуса     "7       "7   с6 I I  с6 6 с6 6  6 о    о о о о  о \о ...... \о \о \о \о ...... ...... ...... ...... \о \о ...... Серийное производство р S р S р р р р р р р р s РУ, опытные обоазuы (S) 
504 · Приложение и. Семейство микроконтроллеров Stellaris. Таблица И.5. Микроконтроnnеры с интерфейсами USB и CAN (продолжение) .... \ос .... .... \ос .... \ос .... \ос .... \ос \ос \ос   0\ f'I") f'I") f'I") f'I")   f'I") f'I") f'I") f'I") 0\ 0\ =   =.. =.. =.. =.. =:: =::   Характеристика   an an  an an an an an an an an VJ VJ VJ VJ VJ VJ VJ  VJ VJ VJ  VJ f'I") f'I") f'I") f'I") f'I") f'I") f'I") f'I") f'I") f'I") f'I") f'I") f'I")              .;j .;j .;j  .;j  .;j  .;j .;j  .;j .;j IФлэmпаМJlТЬ Кбайт 256 256 256 128 128 64 64 64 64 256 256 32 16 ,Q озу, Кбайт 64 64 96 24 24 24 24 24 24 48 48 12 8  I:IC Библиотеки в пзу ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./   РМА ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ == SAFERTOS"              Макс. такт. част. Mfu 80 80 80 80 80 80 80 80 80 80 80 80 80 е Встроенный преци Q.. ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ 1:[ зионный reHepaTop =: MPU ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ SvsTick (24битный) ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ Таймеры общеrо 4 4 4 3 3 3 3 4 4 4 4 3 3 назначеНИJl Часы реал. времени ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ :а Сторожевой таймер 2 2 2 2 2 2 2 2 2 2 2 2 2 Q.. !Модvль тим 6 6 8 6 6 6 6 6 6 8 8 6 6    !Вход защиты )= 4 4 4 4 4 4 4 4 4 4 4 4 4  = tmИМ  :z:e ё lI'eHepaTop «MёpT == ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ !.! 8oro» времени == Модvль ССР 8 8 8 6 6 6 6 8 8 8 8 6 6 >- ЕIканалы 2 1 2 2 1 2 1 2 1 2 1 1 1 Интерфейс внешней   ./       ./    пери J}ерии    10/100 МАС+РНУ              :а  е ttEE 1588 :z: :а              ,Qv CAN МАС 2 1 2 1 1 1 1 2 1 1 1 1 1 5)=  USB D, Н или О О О О D D D D О О D D D D e UART 3 3 3 3 3 3 3 3 3 3 3 3 3 I:[ 2С 2 2 2 2 2 2 2 2 2 2  :z: 2 2 2 5 = SSI/SPI 2 2 2 2 2 2 2 2 2 2 2 2 2 е == 2S ./ ./ I ./           Модvли АПП 2 2 2 2 2 2 2 2 2 2 2 2 2 I:IC I:IC e Каналы АЦП 16 8 16 16 8 16 8 16 8 16 8 8 8  < s Быстродействие 1М 1М 1М 1М 1М 1М 1М 1М 1М 1М 1М 1М 1М -.,Х '--' АЦП (выб/с) g i строенный датчик : е ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ <= rrемператvры IAналоrовые/цифро 2/16 2/ 16 3/ 16 2/ 16 2/ 16 2/ 16 2/16 2/ 16 2/16 2/ 16 2/ 16 2/ 16 2/16 !Вые компараторы Порты ввода/вывода общ. назнач. (совместимы О. ..67 О.. .33 0...72 0...67 0...33 0...67 О.. .33 0...67 О.. .33 О.. .67 0...33 0...33 О.. .33 ,. 5 В) Режим энерrосбережеНИJl ./ ./  ./ ./ I ./ ./ ./ ./ ./ ./ ./ IC резерв. от батареи ILDОстабилизатор ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ ./ !наПРJlжеНИJl абочаJlтемператvра 1 1 1 1 1 1 1 1 1 1 1 1 1                           Ifип корпуса CI CI CI CI СУ CI CI CI CI CI а CI а  "7   "7  "7       с6  с6 с6  о  о  о    з \о О О \о О \о О \о О \о \о \о      ерийноепроизводство(Р), S S S S S S S S S S S S S пытные образцы (S) [а] ШИМуправление ПРИВОДОМ выполняется с помощью специальных аппаратных средств (ВЫВОДЫ PWM) или с помощью функций управления ПРИВОДОМ, имеющихся у таймеров общеrо назначения (ВЫВОДЫ ССР). Подробности см. В технической документации. [Ь] Минимум  число ВЫВОДОВ, предназначенных для портов ввода/вывода общеrо назначения; дополнительные выводы доступны, если не используется какаялибо периферия. Подробности см. в технической документации. [с] Промышленный диапазон (1): 40...+850C, расширенный диапазон (Е): 40...+105°C. 
И.9. Микроконтроллеры с интерфейсом CAN . 505 И.9. Микроконтроллеры с интерфейсом CAN Микроконтроллеры Stellaris на базе ARM CortexM3 серии LM3S2000 сочетают в себе возможность работы в промышленных сетях, расширенные порты ввода/ вывода общеrо назначения и увеличенный объём встроенной памяти, а также об лада ют низким энерrопотреблением, оптимизированным для приложений с pe зервным питанием от батареи. Микроконтроллеры серии LM3S2000 (Табл. И.6), разработанные для приложений с интерфейсом CAN, работают по технолоrии Bosch CAN 2.0 А/В, которая является «золотым» стандартом для промышленных сетей, предназначенных для связи на короткие расстояния. Оценочный набор Stellaris LM3S2965 CAN Оценочный набор Stellaris LM3S2965 обеспечивает компактную и универсальную платформу оценки микро контроллеров Stellaris на базе ARM CortexM3. С помощью двух плат, на одной из которых установлен микро контроллер LM3S2965 с интерфейсом CAN, а на друrой  микроконтроллер LM3S2110 с интерфейсом CAN, оценочный набор позволяет подrотовить CAN ceTЬ к работе. Приложение для быстроrо старта демонстриру ет передачу и приём САNпакетов между двумя оценочными платами. Плата LM3S2965 также имеет внутри схемный интерфейс отладки ICDI, который позволяет осуществлять аппаратную отладку не только для YCTa новленноrо на плате микроконтроллера Stellaris, но и для любой платы на базе микроконтроллера Stellaris. Оценочный набор содержит все кабели, проrраммное обеспечение и документацию, необходимые для бы строй разработки и запуска приложений для микроконтроллеров Stellaris. Кроме Toro, примеры приложений, демонстрирующие использование различных ОС реальноrо времени и коммерческих CANcTeKoB, можно за rрузить на www.ti.com/stellarislm3s2965. Особенности оценочноrо набора Stellaris LM3S2965 CAN . Полностью rотовая к работе сеть CAN с приложением для быстроrо старта, которое обеспечивает CAN ceTЬ и CAN трафик. . Оценочная плата LM3S2965 CAN и отдельная плата LM3S2110 CAN Device. . Микроконтроллеры Stellaris LM3S2965 и LM3S2110, каждый из которых содержит МАСконтроллер CAN. . Простая установка: USВкабель обеспечивает последовательную связь, отладку и питание. . rрафический ОLЕDдисплей с разрешением 128х64 точек и 16 rрадациями ceporo. . Пользовательский светодиод, переключатели и кнопки. . Электромаrнитный динамик. . Все порты ввода/вывода LM3S2965 и LM3S2110 выведены на маркированные внешние контактные площадки. . Стандартный 20контактный JТАGразъём для отладки от ARM. . Плоский САNкабель, USВкабель и JТАGкабель. . Компактдиск, содержащий: [J оценочную версию сред разработки; [J руководство по быстрому старту и исходный код; [J полную документацию. Информация дпя заказа оценочных наборов Ко EKK LM3S2965 EKILM3S2965 EKC LM3S2965 EKTLM3S2965 EKS LM3S2965 
506 · Приложение И. Семейство микроконтроллеров Stellaris* ТаблиЦQ И.б. Микроконтроnnеры серии LM3S2000 Q Q'\ \о Q М М ('f') ..... QQ \о ..... ('f') t--. ..... ..... ('f') ('f') Q Q ..... ..... ..... м    11') \о \о \о М М М М М М М М М М Характеристики (.I:) (.I:) (.I:) (.I:) (.I:) (.I:) (.I:) (.I:) (.I:) (.I:) ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f')           .....:1 .....:1 ....,;j .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 IФлэшпамять, Кбайт 64 64 64 96 96 96 96 128 128 128 .Q озу, Кбайт 16 16 32 32 32 32 64 32 32 16 е-о tI:: Библиотеки в пзу 1 .;           DMA 1 .; t::         SAFERTOS'"           Макс. такт. част., Мfц 25 25 50 25 25 50 50 50 50 50 Q Встроенный прецизионный а..         1:{   =: I"енератор MPU .; .; .; .; .; .; .; .; .; .; SvsTick (24битный) .; .; .; .; .; .; .; .; .; .; Таймеры общеrо назначения 3 3 3 3 3 3 4 4 4 4 Часы реальноrо времени .; .; .; .; .; .; .; .; .;  :! торожевойтаймер 1 1 1 1 1 1 1 1 1 1 а.. u МОllVЛЬ тим 2 8 2 2 6 6 u      ,= =  8ход защиты тим 1  3  1 1 1   1  Е-о4  g feHepaTop «мёртвоrо» : ; времени .;  .;  .; .; .;   .; а..  =- l\{ОДVЛЬ ССР 4 6 1 4 4 4 6 8 8  QЕIканалы          1 tинтерФейс внешней периФерии           u j  10/100 МАС+РНУ           :!  EEE 1588 = :!           .Q1j CAN МАС 1 1 1 1 1 1 1 1 1 1 5,=  USB D, Н илиО           e- UART 1 2 1 1 2 2 2 3 2 1 I:{e-o I 2 C 1 1 1 1 1 1 2 2 1 u =  6= SSI/SPI 1 1 1 1 1 1 1 2 2 Q  t:: 2S           Е: ОllVЛИ АЦП  1 1  1 1 1  1 1 tI:: tI:: 3- аналы АЦП  4 6  3 3 3  8 6   -< с !Быстродействие АЦП  250К 1М  250К 250К 250К  500К 1М ....х :='I(выб/с) Q строенный датчик :  .; .;  .; .; .;  .; .; = u емператvры -<= k\налоrовые/цифровые 3/  3/  / 2/ 2/  2/ 3/  2/ 2/  2/  !компараторы 1П0рты ввода/вывода общ. назнач. 11. ..40 26...56 О. ..33 37...60 20. ..49 5...34 11.. .48 21...60 15...52 1...33 I(совместимы с 5 В) Режим энерrосбережения с резерв.   .;    .; .; .; .; от батареи LDОстабилизатор напряжения .; .; .; .; .; .; .; .; .; .; Рабочая температvра I/E I/E I I/E I/E I/E I/E I/E I/E I < <  < < <  < <  < c.:; c.:;  c.:; c.:; c.:; Clс.:; c.:; c.:;  Тип корпуса Clj:Q Clj:Q CI Clj:Q Clj:Q Clj:Q j:Q Clj:Q Clj:Q CI OO OO  OO OO OO 000 OO OO  00 00  00 00 00  00 00  ...... ...... \о ...... ...... о...... ...... ...... \о ...... ерийное производство (Р), Р Р Р Р Р Р Р Р Р Р опытные образцы (S) 
И.9. Микроконтроллеры с интерфейсом CAN · 507 Q t--. ..... ..... ос) Q Q'\ \с ('f') ..... ос) Q'\ Q'\ ос) Q 11') ('f') м ('f') 11') t--. t--. ('f') ('f') t--. Q'\ ..... ..... ..... ('f')  11') \с Q'\ \с \с \с \с \с t--. t--. t--. t--. Q'\ Q'\ Q'\ Q'\ Q'\ Q'\ Q'\ = М М М М М М М М М М М М М М М М М V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J V'J ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f')                  .....:1 .....:1 .....:1 .....:1 .....:1 ....,;j .....:1 .....:1 ....,;j .....:1 ....,;j .....:1 .....:1 ....,;j .....:1 ....,;j ....,;j 128 128 128 128 128 128 128 128 128 256 256 256 256 256 256 256 256 32 32 32 32 32 64 64 64 64 64 64 64 64 64 64 64 96    .; .;   .; .;        .;    .; .;   .; .;        .;                  25 50 50 50 50 50 50 50 80 50 50 50 50 50 50 50 80         .;        .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; 4 4 4 4 4 3 3 3 4 4 4 4 3 4 4 4 4 .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 4  4 2 4  6 8 8    4  6 6 8 1  1 1 2  1 3 4    1  1 1 4 .;  .; .; .;  .; .; .;    .;  .; .; .; 6 6 6 2 2 4 6 1 8 8 8 8 4 8 6 6 8 1    1  1  2    1  1 2 2         .;        .;                                   2 1 1 1 1 1 1 1 2 1 1 1 1 2 2 2 2                  1 2 3 1 1 1 2 1 3 3 2 2 3 3 3 3 3 1 1 1 1   1 1 2 2 2 2 1 1 1 2 2 1 1 2 1 1 1 1 1 2 2 2 2 1 2 2 2 2         .;        .;  1 1 1 1  1 1 2  1 1 1 1  1 2  4 4 4 8  4 6 16  8 8 3 8  4 16  500К 500К 500К 500К  500К 1М 1М  500К 500К 500К 1М  1М 1М  .; .; .; .;  .; .; .;   .; .; .;  .; .; 31  31  11  31  / 2/ 11  / 31 16 21  21  21  3/ 31  31  31  3/16 12. ..52 15.. .46 16...53 3...33 1...33 37...60 20...56 О.. .33 О.. .67 21...60 15.. .52 15.. .52 18...57 12.. .52 10.. .60 3...56 О.. .67 .; .; .;    .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; .; I/E I/E I/E I I I/E I/E I I I/E I/E I I/E I/E I/E I/E I < < <   < <   < <  < < <                  <  0'j:Q 0'j:Q 0'j:Q с/ о' 0'j:Q 0'j:Q с/ о' 0'j:Q 0'j:Q о' 0'j:Q 0'j:Q 0'j:Q O' о' OO OO OO   OO OO   OO OO  OO OO OO j:Q  00 00 00   00 00  о 00 00 о 00 00 00 000 о ...... ...... ...... \о \о ...... о...... \о  ...... о......  о...... ...... ......  о ...... ...... ...... ...... р р р р р р р р s р р р р р р р s [а] ШИМуправление ПРИВОДОМ выполняется с помощью специальных аппаратных средств (выводы PWM) или с помощью функций управления ПРИВОДОМ) имеющихся у таймеров общеrо назначения (выводы ССР). Подробности см. в технической документации. [Ь] Минимум  число выводов) предназначенных для портов ввода/вывода общеrо назначения; дополнительные выводы доступны) если не используется какаялибо периферия. Подробности см. в технической документации. [с] Промышленный диапазон (1): 40...+850C) расширенный диапазон (Е): 40...+1050c. [d] 108выводной корпус BGA и 64выводной корпус LQFP предлаrаются только для промышленноrо диапазона рабочих температур. 
508 · Приложение и. Семейство микроконтроллеров Stellaris* И.10. Микроконтроллеры с интерфейсами Ethernet и CAN Микроконтроллеры Stellaris на базе ARM CortexM3 серии LM3S8000 сочетают в себе возможность работы в промышленных сетях, расширенные порты ввода/вывода общеrо назначения и увеличенный объём BCTpO енной памяти, а также обладают низким энерrопотреблением, оптимизированным для приложений с резерв ным питанием от батареи. Микроконтроллеры серии LM3S8000 являются первыми в мире микроконтролле рами, сочетающими полностью интеrрированное 10/100Мбит/с Еthеrnеtрешение и сетевую технолоrию Bosch CAN с АRМархитектурой. Микроконтроллеры серии LM3S8000 (Табл. И.7) содержат до трёх контрол леров CAN 2.0 А/В, Ethernet МАСконтроллер (МАС) и трансивер (РНУ). Кроме Toro, отдельные микрокон троллеры серии LM3S8000 обеспечивают аппаратную поддержку протокола Precision Time Protocol соrласно IEEE 1588. Оценочный набор Stellaris LM3S8962 Ethernet+CAN Оценочный набор Stellaris LM3S8962 обеспечивает компактную и универсальную платформу для оценки микроконтроллеров Stellaris на базе ARM CortexM3 с интерфейсами Ethernet и CAN. С помощью двух плат, на одной из которых содержится микрокон  троллер LM3S8962 с интерфейсами Ethernet и CAN, а на друrой  микроконтроллер LM3S2110 с интерфей сом CAN, оценочный набор позволяет подrотовить сеть CAN к работе. Набор содержит также два приме ра демонстрационноrо приложения встраиваемоrо вебсервера. [отовое к работе приложение для бы cTporo старта включает в себя встраиваемый веб сервер, использующий EthernetcTeK Ореn Source lwIP, и демонстрирует передачу и приём САNпакетов между двумя оценочными платами. Набор также co держит вебсервер с ОС реальноrо времени FreeRTOS.org ТII и EthernetcTeK Ореn Source uIP. Плата LM3S8962 также имеет внутрисхемный интерфейс OT ладки ICDI, который позволяет осуществлять аппа ратную отладку не только для установленноrо на пла те микроконтроллера Stellaris, но и для любой платы на базе микроконтроллера Stellaris. Оценочный набор содержит все кабели, проrраммное обеспечение и дo кументацию, необходимые для быстрой разработки и запуска приложений для микроконтроллеров Stellaris. Кроме Toro, примеры приложений, демон  стрирующие использование различных ОС реально ro времени и коммерческих стеков Ethernet и CAN, можно заrрузить на www.ti.com/stellarislm3s8962. Информация дпя заказа оценочных наборов Ко EKK LM3S8962 EKI  LM3S8962 EKC LM3S8962 EKTLM3S8962 EKSLM3S8962 Особенности оценочноrо набора Stellaris LM3S8962 · Полностью rотовая к работе сеть Ethernet+CAN с приложением для быстроrо старта, которое OДHO временно обеспечивает трафик Ethernet и CAN сети. · Оценочная плата LM3S8962 Ethernet+CAN и OT дельная плата LM3S2110 CAN Device. · Микроконтроллер Stellaris LM3S8962 с полностью интеrрированным 10/100Мбит/с Ethernet (МАС+РНУ) и CAN МАС. · Микроконтроллер Stellaris LM3S2110 с полностью интеrрированным CAN МАС. · Простая установка: USВкабель обеспечивает по следовательную связь, отладку и питание. · [рафический ОLЕDдисплей с разрешением 128х64 точек и 16 rрадациями ceporo. · Пользовательский светодиод, переключатели и кнопки. · Электромаrнитный динамик. · Все порты ввода/вывода LM3S8962 и LM3S2110 BЫ ведены на маркированные внешние контактные площадки. · Стандартный 20контактный JТАGразъём дЛЯ OT ладки от ARM. · Убирающийся Еthеrnеtкабель, плоский CAN кабель, USВкабель и JТАGкабель. . Компакт диск, содержащий: [J оценочную версию сред проrраммирования; [J полную документацию; [J руководство по быстрому старту и исходный код; [J набор библиотек StellarisWare, включая библиоте ку драйверов периферии и пример исходноrо KO да. 
И.l0. Микроконтроллеры с интерфейсами Etherпet и CAN · 509 Таблица И.7. Микроконтроnnеры серии LM3S8000 Q ос) Q Q ('f') ос) Q ('f') ос) N Q ..... ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') \D r-.. r-.. i/') i/') \D r-.. r-.. r-.. Q\ Q\ Q\ Q\ Q\ Q\ ос) ос) QO QO QO ос) ос) ос) ос) ос) ос) ос) Характеристики (.I:) (.I:) rJ} rJ} (.I:) (.I:) rJ} (.I:) rJ} rJ} rJ} rJ} ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f')             .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 IФлэшпамять, Кбайт 96 96 128 128 128 128 256 256 256 256 256 256 .Q юзу, Кбайт 64 64 32 64 64 64 64 64 64 64 64 64 е-о "= Библиотеки в пзу               DMA t:::             SAFERTOS'"             акс.такт.частота,Мfц 50 50 50 50 50 50 50 50 50 50 50 50 = Встроенный а.. прецизионный           1:{   =: reHepaToo MPU .; .; .; .; .; .; .; .; .; .; .; .; SvsTick (24битный) .; .; .; .; .; .; .; .; .; .; .; .; Таймеры общеrо 4 4 4 4 4 4 4 4 4 4 4 4 назначения !Часы оеальноrо времени .; .; .; .; .; .; .; .; .; .; .; .; Стооожевойтаймер 1 1 1 1 1 1 1 1 1 1 1 1 :а Мопvль тим          6  6 а.. u ВХОД защиты  u 1 1 )=: тим            =:  Е-4 = = [енератор u 1:{ I::! = = = «мёртвоrо»          .;  .;  времени = опvль ССР 2 4 2 2 4 6 2 4 6 2 2 6 QЕIканалы 2         2  1 Интерфейс внешней             периt еоии u i  10/100 МАС+РНУ .; .; .; .; .; .; .; .; .; .; .; .; :а  S EE 1588 .; .; .; .; .; .; = :а       .Q v CAN МАС 3 1 1 1 1 1 2 1 1 1 3 1 )=:  USB D, Н или О               UART 1 2 2 2 2 3 1 2 3 2 2 1 I:{e-o u = I 1 C 1 1 1 1 1 1 1 1 2 1 1  5 =: = SSIISPI 2 1 1 1 1 2 1 1 1 1 2 1 t::: OC 2 S             'i:' Iмопvли АIIП  1   1 1  1 1 1  1 "= "= ё  !каналы АIIП  8   4 8  4 8 4  8   -< ё !Быстродействие  1М   500К 500К  1М 1М 500К 1М ...х. IAЦП (выб/с)  g i строенный датчик ;е  .;   .; .;  .; .; .;  .; -<= rrемператvры IAналоrовые/цифровые / 3/ / / 3/ 1/ / 3/ 3/ 1/ / 1/ Iкомпаратооы Порты ввода/вывода общ. назнач. (совместимы 8...35 7...36 10...31 11...32 5...35 4...38 13...34 6...36 3...38 5...42 17...46 4. ..38 с5 В) Режим энерrосбережения   .; .; .; .; .; .; .; .; .; .; с резерв. от батареи LDОстабилизатор .; .; .; .; .; .; .; .; .; .; .; .; напряжения Рабочая температvра I/E I/E I/E I/E I/E I/E I/E I/E I1E I/E I/E I/E < < < < < < < < < < < <             Тип корпуса Sj:Q Sj:Q Sj:Q Sj:Q Sj:Q Sj:Q Sj:Q Sj:Q Sj:Q Sj:Q Sj:Q Sj:Q СОС СОС СОС СОС СОС СОС СОС СОС СОС СОС СОС СОС се се се се се се се се се се се се ..... ..... ..... ..... ..... ..... .......... ..... ..... ..... ..... ..... ..... ..... ..... .......... ..... ..... .......... ..... ..... Серийное производство (Р), Р Р Р Р Р Р Р Р Р Р Р Р !опытные обоазцы(S) [а] ШИМуправление ПрИВОДОМ выполняется с помощью специальных аппаратных средств (выводы PWM) или с помощью функций управления приводом, имеющихся у таймеров общеrо назначения (выводы ССР). Подробности см. в технической документации. [Ь] Минимум  число выводов, предназначенных для портов ввода/вывода общеrо назначения; дополнительные выводы доступны, если не используется какаялибо периферия. Подробности см. в технической документации. [с] Промышленный диапазон (1): 40...+850C, расширенный диапазон (Е): 40...+105°C. [d] 108выводной корпус BGA предлаrается только для промышленноrо диапазона рабочих температур. 
510 · Приложение и. Семейство микроконтроллеров Stellaris* И.11. Микроконтроллеры с интерфейсами Ethernet, USB и CAN Микроконтроллеры Stellaris на базе ARM CortexM3 серии LM3S9000 обеспечивают высокую производительность и сочетают в себе возможность работы в промышленных сетях и расширенные возможности интерфейсов перифе рии, а также обладают низким энерrопотреблением, оптимизированным для приложений с резервным питанием от батареи. Микроконтроллеры серии LM3S9000 являются первыми в мире микроконтроллерами, сочетающими пол ностью интеrрированное 10/100Мбит/с Еthеrnеtрешение, модуль USB OntheGo и сетевую технолоrию Bosch CAN, совместимую с АRМархитектурой. Микроконтроллеры серии LM3S9000 (Табл. И.8) содержат до двух контролле ров CAN 2.0 А/В, Ethernet МАСконтроллер (МАС) и трансивер (РНУ), а также полноскоростной модуль USB с функ циональностью OTG или Host/Device. Все микроконтроллеры серии LM3S9000 содержат два отдельных блока АЦП, набор библиотек StellarisWare Т1l , записанный в ПЗУ, включая библиотеку драйверов периферии и системный заrруз чик, криптоrрафические АЕSтаблицы, а также схему обнаружения ошибок CRC. Кроме Toro, отдельные микрокон троллеры серии LM3S9000 также содержат в ПЗУ ядро SafeRTOSТ1I и обеспечивают аппаратную поддержку протоко ла Precision Time Protocol соrласно IEEE 1588. Микроконтроллеры серии LM3S9000 также содержат встроенный 16мrц reHepaTop повышенной точности с воз можностью проrраммной настройки и второй сторожевой таймер с независимым тактовым reHepaTopoM. Отдель ные микроконтроллеры серии LM3S9000 также снабжены rибким интерфейсом внешней периферии (EPI), который представляет собой специально выделенную параллельную шину (до 32 бит) для внешней периферии, которая под держивает SDRAM, SRАМ/флэшпамять и связь MachinetoMachine (М2М) (со скоростью до 150 Мбайт/с). Оценочный набор Stellaris LM3S9B92 Ethernet+USB+CAN С помощью двух плат, на одной из которых содержится микроконтроллер LM3S9B92 с интерфейсами Ethernet, USBOTG и CAN, а друrая реализует интерфейс внутрисхемной отладки, оценочный набор Stellaris LM3S9B92 обе спечивает недороrую, компактную и универсальную платформу для оценки микроконтроллеров Stellaris на базе ARM CortexM3 с интерфейсами Ethernet, USB и CAN. В оценочной плате используется микроконтроллер LM3S9B92, который позволяет реализовывать сложные алrоритмы управления и имеет 8 ШИМвыходов для обеспечения управления приводом и источниками питания и 2 модуля квадратурноrо энкодера (QEI) дЛЯ подключения импульс ных датчиков положения. Микроконтроллер LM3S9B92 также способен работать с внешним 16мrц кварцевым re нератором, обеспечивающим основную тактовую частоту, которая используется для непосредственноrо тактирова ния АRМядра или внутренней схемы ФАПЧ для увеличения частоты TaKToBoro сиrнала ядра до 80 мrц. Для такти рования Еthеrnеtконтроллера используется 25мrц кварцевый reHepaTop. Микроконтроллер LM3S9B92 также име ет встроенный LDОстабилизатор напряжения, который обеспечивает питание внутренних цепей. Информация для заказа Ко EKKLM3S9B92 EKILM3S9B92 EKC LM3S9B92 EKT LM3S9B92 EKSLM3S9B92 Оценочный набор Stellaris LM3S9B90 Еthеrпеt+USВ-ОТG+САN С помощью двух плат, на одной из которых содержится микроконтроллер LM3S9B90 с интерфейсами Ethernet, USBOTG и CAN, а друrая реализует интерфейс внутрисхемной отладки, оценочный набор Stellaris LM3S9B90 обе спечивает недороrую, компактную и универсальную платформу для оценки микроконтроллеров Stellaris на базе ARM CortexM3 с интерфейсами Ethernet, USB и CAN. В оценочной плате используется микроконтроллер LM3S9B90, который имеет модуль Hibernation для эффективноrо снижения энерrопотребления устройства во время увеличен Horo периода бездействия. Микроконтроллер LM3S9B90 также способен работать с внешним 16мrц кварцевым re нератором, обеспечивающим основную тактовую частоту, которая используется для непосредственноrо тактирова ния АRМядра или внутренней схемы ФАПЧ для увеличения частоты TaKToBoro сиrнала ядра до 80 мrц. Для такти рования Еthеrnеtконтроллера используется 25мrц кварцевый reHepaTop, а для часов реальноrо времени  4.l94304мrц кварцевый reHepaTop. Микроконтроллер LM3S9B90 также имеет встроенный LDОстабилизатор Ha пряжения, который обеспечивает питание внутренних цепей. Информация для заказа Ко EKKLM3S9B90 ЕКI  LM3S9B90 EKCLM3S9B90 EKTLM3S9B90 EKS LM3S9B90 
И.11. Микроконтроллеры с интерфейсами Etherпet, USB и CAN · 511 Особенности оценочноrо набора . Высокопроизводительный микроконтроллер Stel laris с встроенной памятью большоrо объёма; [J 32битное ядро ARM CortexM3; [J 256Кбайт основная флэшпамять, 96Кбайт SRAM; [J набор библиотек StellarisWare, записанный в ПЗУ. . 10/100Мбит/с Еthеrпеtпорт с двумя индикаторны ми светодиодами. . Полноскоростной порт USB 2.0 OTG. . Виртуальный последовательный коммуникацион ный порт. . Контактные площадки увеличенноrо размера для портов ввода/вывода общеrо назначения. Содержимое оценочноrо набора . Оценочная плата (ЕУВ). . Плата интерфейса внутрисхемной отладки BD ICDI. . Кабели: [J USВкабель; [J 10контактный плоский JТАGкабель; [J 8контактный плоский кабель для питания/UАRт. . Компактдиск, содержащий: [J полный исходный код, электрическую схему и rерберфайлы для производства печатной платы; [J набор библиотек StellarisWare, включая библиоте ку драйверов периферии и пример исходноrо KO да; [J набор оценочных средств разработки проrрамм Horo обеспечения цля Stellaris. ,А МfSIf08 Микроконтроллер Stellaris LM3S9B96 с SAFERTOS в ПЗУ Оценочный набор Stellaris LM3S9B90 Etherпet+USBOTG+CAN Оценочный набор Stellaris LM3S9B92 Etherпet+USB OTG+CAN Таблица И.В. Микроконтроnnеры серии LM3S9000 <::> N t--. <::> N i/') \D t--. Q'\ Q'\ Q'\ Q'\ Q'\ Q'\ Q'\ Q'\ t--. t--. Q'\ = = = = .....:1 Характеристики Q'\ Q'\ Q'\ Q'\ Q'\ Q'\ Q'\ Q'\ (.I:) (.I:) (.I:) (.I:) (.I:) (.I:) (.I:) rJ} ('f') ('f') ('f') ('f') ('f') ('f') ('f') ('f')         .....:1 .....:1 .....:1 .....:1 .....:1 .....:1 .....:1  Флэшпамять Кбайт 128 128 256 256 256 256 256 128 ,.Q озу, Кбайт 64 64 64 96 96 96 96 48 е-о "= Библиотеки в пзу .; .; .; .; I .; .; .;   VMA I I t::: .; .; .; .; .; .; SAFERTOS'"       1  Макс. такт. част., Мfц 80 80 80 80 80 80 80 80 = 100 а.. Встроенный преци 1=( .; .; .; I I I .; I =: зионный reHepaTop MPU I .; .; .; .; .; .; .; SvsTick (24битный) I .; .; .; .; .; .; .; [аймеры общеrо 4 4 4 4 4 4 4 4 Iназначения !Часы реальноrо .; I .; I I I .; I !времени :! Стою ожевой таймер 2 2 2 2 2 2 2 2 а.. u Мопvль ШИМ 8 6 8 8 8 6    )=: u Вход защиты  4 4 4 4 4 4 Е-о4 =:  ШИМ   = = u [енератор «MёpT I::! = = =  .; .;  .; .; .; I ! Iвoro» времени = = Iмопvль ССР 8 8 8 8 8 8 8 8  iQЕIканалы  2 2  2 2 2 2 Интерфейс внешней .; .;  .; .; .; .;  перисЬерии u j  10/100 МАС+РНУ .; .; .; .; .; .; I .; :! r!S EIfEE 1588 .; I .; .; = :!     ,.Q у CAN МАС 2 2 2 2 2 2 2 2 )=: .x USB О, Н или О О О О О О О О О e UART 3 3 3 3 3 3 3 3 I=(e-o I 2 C 2 2 2 2 2 2 2 u = 2 6 =: SSIISPI 2 2 2 2 2 2 2 2 = t::: 2S .; I .; .; .; .; .; I f: Мопvли АllП 2 2 2 2 2 2 2 2 "= "= e Каналы АllП 16 16 16 16 16 16 16 16   -< <:ь Быстродействие 1М 1М 1М 1М 1М 1М 1М 1М .. ЦП (выб/с) g i JJстроенный датчик :  .; .; .; .; .; .; .; .; -<= температуры Аналоrовые/цифро 31 31 21 31 31 31 31 21 вые компараторы 16 16 16 16 16 16 16 16 lПорты ввода/вывода О О О О О О О О !Общ. назнач. (совместимы ... ... ... ... . .. ... ... ... с5 В) 60 65 60 60 65 65 65 60 Режим энерrосбережения .;  .; I    .; с резерв. от батареи LDОстабилизатор .; I .; .; .; .; .; .; напряжения Рабочая температура 1 1 1 1 1 1 1 1 р.. р.. р..  р.. р..  р..         Тип корпуса CI CI CI CI CI CI CI CI .......:1 .......:1 .......:1 .......:1 .......:1 .......:1 .......:1 .......:1 С С С С С С С С С С С С З с З З ....... ....... ....... ....... ....... Серийное производство S S S S S S S S 'р)", опытные образцы (S) [а] ШИМуправление ПРИВОДОМ выполняется с помощью специальных аппаратных средств (выводы PWM) или с помощью функций управления ПРИВОДОМ, имеющихся у таймеров общеrо назначения (выводы ССР). Подробности см. в технической документации. [Ь] Минимум  число выводов, предназначенных для портов ввода/вывода общеrо назначения; дополнительные выводы доступны, если не используется какаялибо периферия. Подробности см. в технической документации. [с] Промышленный диапазон (1): 40...+850C, расширенный диапазон (Е): 40...+105°C. 
512 · Приложение И. Семейство микроконтроллеров Stellaris* И.12. Набордпя проектирования на базе микроконтроллера Stellaris LМ3S9В9б Набор для проектирования на базе микроконтроллера Stellaris LM3S9B96 (DKLM3S9B96)  это полнофункцио нальный набор для проектирования устройств на базе микроконтроллеров серии LM3S9000. Плата для проектиро вания LM3S9B96 содержит максимально возможный набор периферии для демонстрации возможностей микрокон троллеров и обеспечивает максимальную rибкость за счёт применения конфиrурируемых выводов для всех портов ввода/вывода. Плата для проектирования LM3S9B96 предоставляет платформу для оценки приложений с повышен ными требованиями к размеру памяти, а также приложений, которые используют новые функциональные возмож ности микроконтроллеров, например I2Sаудио, расширенный интерфейс периферии (EPI) и обмен данными по ин терфейсам Ethernet, USB OTG и CAN. Целевые области применения включают сетевые системы, rрафические поль зовательские интерфейсы (GUI) и приложения, использующие человекомашинный интерфейс (HMI). Плата для проектирования LM3S9B96 является также полезным инструментом для разработки систем с использованием таких средств, как .NET Micro Framework от Мicrоsоft и Embedded LabView от National Instruments. [отовое к работе приложение для быстроrо старта способно выбирать устройства периферии платы из набора для проектирования DKLM3S9B96 с помощью демонстрационноrо меню на сенсорном экране. Возможны различные pe жимы работы, в том числе демонстрация поддержки USВмыши; TPTPcepBep для файловой системы, который ocy ществляет доступ к lМбайт последовательной флэшпамяти; вебсервер, использующий lwIP TCP/IPcTeK; доступ к карте MicroSD; устройство просмотра изображений JPEG; последовательную командную строку и аудиоплеер. Пла та для проектирования содержит встроенный внутрисхемный последовательный интерфейс отладки (ICDI), который поддерживает как JTAG, так и SWDотладку, Стандартный 20контактный отладочный разъём от ARM поддержива ет несколько способов отладки. Набор также содержит MHoro примеров приложений и полный исходный код. Особенности набора для проектирования Stellaris LM3S9B96 · 3.5дюймовый цветной rрафический ЖКдисплей: а ТРТ ЖКмодуль с разрешением 320х240 точек; а резистивный сенсорный интерфейс. · 80M[ц микроконтроллер LM3S9B96 с 256Кбайт флэш памятью, 96 Кбайт SRAM и интеrрированными интер фейсами Ethernet МАС+РНУ, USB OTG и CAN. · 8Мбайт SDRAM (опционально подключаемая по ин терфейсу ЕРIплата). · Конфиrурируемая плата для сиrналов интерфейса внешней периферии (EPI). · lМбайт последовательная флэшпамять. · Прецизионный источник опорноrо напряжения 3 В. · Операционная система SafeRTOS'" в ПЗУ микрокон троллера. · Стерео I2Sаудиокодек: а линейный выход; а выход на rоловные телефоны; а вход микрофона; а линейный вход. · САNинтерфейс. · Разъём 101100 BaseT Ethernet. · Разъём USB OTG: а режимы Device, Host и OTG. · Пользовательский светодиод и кнопка. · Дисковый потенциометр. · Разъём карты MicroSD. · Стандартный 10контактный JТАGразъём для отлад ки от ARM. · Встроенный интерфейс внутрисхемной отладки (ICDI). · Виртуальный последовательный порт USB. · Перемычки для удобноrо распределения ресурсов портов ввода/вывода. · Поддержка набора библиотек StellarisWare, включая rрафическую библиотеку и библиотеку драйверов Пе риферии. Информация для заказа Ко DKLM3S9B96 Содержимое набора для проектирования Stellaris LM3S9B96 Набор для проектирования Ste//aris DKLM3S9B96 обе спечивает инженеров средствами, необходимыми для проектирования прототипа 20товО20 к работе вcтpaи ваеМО20 приложения и включает в себя следующие KOM поненты: · плату для проектирования Stellaris. LM3S9B96 с ЕР!  платой 8Мбайт SDRAM и конфиrурируемой платой для сиrналов интерфейса внешней периферии (EPI); · USВкабель типа MiniB (длиной около 1 м) для отла дочных функций; · USВкабель с вилкой MicroA и розеткой StdA (для co единения с флэшнакопителем); · USВкабель с вилкой StdA и вилкой MicroB (для под соединения к компьютеру); · флэшнакопитель USB (128 Мбайт); · 20проводной приёмный кабель; · Еthеrпеtкабель; · карта MicroSD; · 5B источник питания с международным адаптером; · компактдиск с инструментами разработки, ДOKYMeH тацией и примерами исходноrо кода: а включает оценочные версии инструментов разработ ки от КеН, IAR, Code Red Technologies и Code Sourcery. Набор для проектuрования Ste//aris LM3S9B96 менты от КеН IAR Code Red Technolo ies и CodeSourcer 
И.13. Платы расширения набора для проектирования Stellaris LМ3S9В9б · 513 И.13. Платы расширения набора для проектирования Stellaris LM3S9B96 Плата расширения памяти Stellaris Flash & SRAM Memory Ех ansion Board Плата Stel1aris Flash & SRAM Memory Expansion Board (DK LM3S9B96FS8) компании Texas Instruments представляет co бой опциональную плату pac ширения для отладочной пла ты Stellaris DKLM3S9B96. ДaH ная плата расширения подключается напрямую к порту интерфейса внешней периферии (EPI) микроконтролле ра Stellaris LM3S9B96, предоставляя в распоряжение пользователя внешнюю флэшпамять, внешнее ОЗУ и интерфейс контроллера ЖКдисплея, а также дeMOH стрируя лёrкость одновременноrо подключения к ми кроконтроллеру микросхем внешней памяти и различ ной периферии посредством rибкоrо интерфейса EPI, сконфиrурированноrо в режиме Host Bus 8 с мульти плексированием шин адреса/данных. Отладочная плата DKLM3S9B96 (поставляется отдельно) предоставляет законченную платформу для ознакомления с возмож ностями микроконтроллеров Stellaris серии LM3S9000. Данная плата имеет боrатый набор коммуникационных интерфейсов, таких как 10/100 Ethernet, CAN, РиН Speed USB OnTheGo и 1 2 S. Приложение для быстроrо старта, демонстрирующее возможности платы расширения, BЫ водит на 3.5дюймовый цветной VGАдисплей платы DKLM3S9B96 JРЕGизображения из ОЗУ и флэш памяти платы расширения. Особенности платы Stellaris Flash & SRAM Memory Expansion Board . 8 Мбайт флэшпамяти. . 1 Мбайт статическоrо ОЗУ. . Интерфейс ЖКдисплея, отображённый на адресное пространство памяти. . Микросхема EEPROM с интерфейсом еС объёмом 1 Кбит для хранения конфиrурационных параметров. . Индикатор наличия питания. Комплект поставки платы Stellaris Flash & SRAM Memory Expansion Board Вместе с набором для разработки DKLM3S9B96 плата расширения Stellaris Flash & SRAM Memory Expansion Board представляет собой инструментальное средство, необходимое для разработки и макетирования встраи ваемых приложений, в которое входит: . плата расширения памяти Stellaris DKLM3S9B96FS8; . пластиковые монтажные стойки. Информация для заказа KLM3S9B96FS8 писание лата расширения Stellaris Flash & RAM Memor Ех ansion Board Плата расширения Stellaris FPGA Expansion Board Плата Stellaris FPGA Expansion Board (DKLM3S9B96 FPGA) компании Texas Instruments представляет собой оп циональную плату расширения для отладочной платы Stellaris DK LM3S9B961. Данная плата расширения под ключается напрямую к порту интерфейса внешней периферии (EPI) платы Stellarls OK LM3S9B96, демонстрируя воз можности микроконтроллера семейства Stellaris по орrаниза ции машинномашинноrо (М2М) параллельноrо интер фейса с высокой пропускной способностью. Подключив данную плату расширения к отладочной плате DK LM3S9B96, пользователи cMorYT воспроизводить на боль шом 3.5дюймовом ЖКдисплее отладочной платы видео изображение, формируемое платой расширения, а также управлять функциями платы расширения. Пользователи MorYT исследовать различные возможности порта EPI, за rружая собственные прошивки в ПЛИС Xilinx Spartan 3Е платы расширения. Отладочная плата DKLM3S9B96 (по ставляется отдельно) предоставляет законченную плат форму для ознакомления с возможностями микрокон  троллеров Stellaris серии LM3S9000. Данная плата имеет боrатый набор коммуникационных интерфейсов, таких как 10/100 Ethernet, CAN, Риll Speed USB On1heGo и es. Особенности платы Stellaris FPGA Expansion Board . ПЛИС Xilinx Spartan 3Е объёмом 100 тыс. вентилей. . Модуль цветной КМОП VGA (640х480) видеокамеры с матрицей 1/13 дюйма. . 1 Мбайт асинхронноrо статическоrо ОЗУ с временем доступа 10 нс для орrанизации видеобуфер,а. . Микросхема EEPROM с интерфейсом 1 С объёмом 1 Кбит для хранения конфиrурационных параметров. . Стандартные разъёмы lх6 и 2х5 для проrраммирова ния ПЛИС. . 8 тестовых контактов ПЛИС предоставляют пользова телю 5 линий ввода и 3 линии ввода/вывода. . Интерфейс ЕРI работает в режиме GPM D16A12 на ча стоте 50 мrц. . ПО обработки видео имеет следующие возможности: L] вывод цветноrо видеоизображения с разрешением QVGA (полноэкранный режим ЖКдисплея платы DKLM3S9B96); L] вывод rрафическоrо экранноrо меню поверх видео изображения; L] rрафический пользовательский интерфейс на базе вид  жетов, использующий возможности ceHcopHoro экрана; L] пауза/возобновление воспроизведения с сохранени  ем захваченноrо кадра в формате ВМР на SDKapTY; L] управление яркостью, насыщенностью и KOHTpaCT ностью изображения; L] зеркальное отображение и переворот изображения. Комплект поставки платы Stellaris FPGA Expansion Board Вместе с набором для разработки DKLM3S9B96 плата pac ширения Stellaris FPGA Expansion Board представляет собой инструментальное средство, необходимое для разработки и макетирования встраиваемых приложений, в которое входит: . плата расширения Stellaris FPGA Expansion Board с ПЛИС Spartan компании Xilinx; . цветной VGАвидеодатчик компании Omnivision. Информация для заказа Код Описание DKLM3S9B96FPGA Плата асширения Stellaris FPGA EXDanslOn Board 
514 . Приложение И. Семейство микроконтроллеров Stellaris* И.14. Плата расширения Stellaris LM3S9B96 Пnата расширения Stellaris LМ3S9В9б ЕМ2 Expansion Board Плата Stellaris LM3S9B96 ЕМ2 Expansion Board (DKLM3S9B96EM2) компании Texas Instruments представля ет собой опциональную плату расширения для отладочной платы Stellaris DKLM3S9B96. Данная плата расши рения подключается напрямую к порту интерфейса внешней периферии (EPI) платы Stellaris DK LM3S9B96. Плата расширения ЕМ2 служит переходником между соединителем интерфейса ЕРI отладочной платы и coe динителем оценочноrо радиочастотноrо модуля (РЧ). Данная плата расширения позволяет на основе набора Stellaris DKLM3S9B96 разрабатывать беспроводные приложения с использованием различных оценочных РЧ модулей. Отладочная плата DKLM3S9B96 (поставляется отдельно) предоставляет законченную платформу для озна комления с возможностями микроконтроллеров Stellaris серии LM3S9000 и обеспечивает боrатый набор KOM муникационных интерфейсов) таких как 10/100 Ethernet) CAN) Full Speed USB OnTheGo и 1 2 S. Особенности пnаты Stellaris LМ3S9В9б ЕМ2 Expansion Board · Два набора соединителей для подключения до двух оценочных РЧ модулей. . Микросхема EEPROM с интерфейсом 1 2 С объёмом 1 Кбит для хранения конфиrурационных параме тров. · Разъёмы цифровоrо и аналоrовоrо аудиоинтерфей сов. . Разъём порта SDIO MODl. · Тактовый reHepaTop частотой 32 к[ц) подключён ный К основному разъему ЕМ2 платы расширения. Информация ДЛЯ заказа КОД Описание Плата расширения Stellaris DKLM3S9B96EM2 LM3S9B96 ЕМ2 Expansion Board Плата расширения Stellaris LM3S9B96 ЕМ2 Expaпsioп Board Дополнитеnьные наборы дnя проектирования беспроводных приnожений Чтобы дать вам возможность разрабатывать и макетировать беспроводные встраиваемые приложения) KOM пания Texas Instruments также создала ряд беспроводных наборов для проектирования. Любой из этих набо ров) соединённый с друrими компонентами посредством платы расширения Stellaris LM3S9B96 ЕМ2 Expansion Board) позволяет реализовать рабочий прототип беспроводной сети. Эти наборы для проектирования ориен тированы на маломощные беспроводные сети и используют единый протокол обмена. Набор Stеllаris Ф 2.4 GHz SimpliciTI ''? Wireless Kit (содержит oцe ночный модуль СС2500 и плату расширения DK LM3S9B96 ЕМ2) Набор Stеllаris Ф 13.56 MHz RFID Wireless Kit (содержит oцe ночный модуль TRF7960TB и плату расширения DK LM3S9B96 ЕМ2) Набор Stеllаris Ф 2.4 GHz ZigBee Wireless Kit (содержит oцe ночный модуль СС2520 и плату расширения DK LM3S9B96 ЕМ2) 
И.15. Беспроводные наборы Stellaris · S1 S И.1S. Беспроводные наборы Stellaris Беспроводные наборы Stellaris ускоряют вывод продукции на рынок Объединяя производительные и простые в применении микроконтроллеры семейства Stellaris на базе ядра ARM Cortex М3 с ведущими беспроводными решениями, беспроводные наборы Stellaris позволяют разработ чикам внедрять в свои устройства поддержку различных беспроводных технолоrий (RFID, Low Power RF и ZigBee). Каждый из этих наборов, будучи подключённым к отладочной плате DKLM3S9B96, содержит все проrраммные и аппаратные средства, необходимые для Toro, чтобы быстро приступить к разработке, а прило жение быстроrо старта, входящее в состав каждоrо набора, позволяет разработчикам менее чем за 10 мин соз дать работающую беспроводную сеть. Содержимое набора Stellaris 13.56 MHz RFID Wireless Kit (DK-EM2-7960R) . Плата расширения Stellaris DKLM3S9B96EM2 Expansion Board. . Модуль RFIDсчитывателя TRF7960TB. . Две бесконтактные CMapTKapTЫ стандарта ISOIIEC 14443А (MIFAREQOlK). . Дополнительные RFIDметки, поддерживаемые TRF7960TB и плата расширения Expansion Board. . Разнообразные примеры ПО, в том числе проrраммы для чтения RFIDKapT MIFARE lК и MIFARE 4К, дЛЯ одновременной работы с двумя картами, для управления считывателем через последова тельный порт с использованием командной строки. . Скоро появится набор библотек, документация и примеры прило жений стандарта ISO/IEC 14443А с поддержкой дополнительных протоколов ISO/IEC. Информация для заказа Ко Описание DKEM27960R Бесп ОБО НОЙ на60 Stellaris 13.56 MHz RFID Wireless Kit Содержимое набора Stellaris 2.4 GHz SimpliciTI™ Wireless Kit (DK-EM2-2500S) . Плата расширения Stellaris DKLM3S9B96EM2 Expansion Board. . Оценочный беспроводной модуль СС2500ЕМ. . Набор eZ430 RF2500. . Поддержка кроссплатформенноrо ПО, включая доступ к про шивкам для маломощных РЧ решений, предназначенных для ди  апазона менее 1 и до 2.4 rrц. . Набор библиотек, документация и пример приложения SimpliciTI N , поддерживающеrо простую сеть с тополоrией «звез да», а также соединения типа «точкаточка». Stellaris 2.4 GHz Sim liciТI'" Wireless Kit Содержимое набора Stellaris ZigBee Networking Kit (DK-EM2-2520Z) . Плата расширения Stellaris DKLM3S9B96EM2 Expansion Board. . Оценочный беспроводной модуль СС2520ЕМ. . Две платы для датчиков с батарейным питанием. . Два беспроводных оценочных модуля СС2530ЕМ дЛЯ установки на платы датчиков. . CC DEBUGGER дЛЯ опциональноrо перепроrраммирования MO дулей СС2530ЕМ. . Законченное решение для построения беспроводной системы стандарта ZigBee с использованием ПО ZStack тм 2.4. . Набор библиотек, документация и пример приложения координатора, поддерживающеrо два конечных устройства, объе динённых в сеть с тополоrией «звезда») которые передают инфор мацию о температуре и напряжении. Информация для заказа Ко Описание DKEM22520Z Бесп ОБО ной на60 
516 . Приложение и. Семейство микроконтроллеров Stellaris. И.1б. Роботизированные оценочные наборы Stellaris 8 Оценочная плата Stellaris Robotic Evaluation Board Оценочная плата Stellaris Robotic Evaluation Board (ЕУ ALBOT) представляет собой роботизированную плат форму на базе микроконтроллера Stel1aris LM3S9B92. На этой плате также установлены различные аналоrовые ком  поненты Texas Instruments для управления приводом, пи танием и осуществления коммуникационных функций. Чтобы начать использовать плату EVALBOAT, достаточно Bcero нескольких минут, требуемых для сборки набора (все необходимые инструменты входят в состав набора). При автономной работе питание платы осуществляется от трёх элементов АА (входят в набор). Плата автоматически пере ключается на питание от USB при подключении к ПК в Ka честве USВустройства или при отладке. Тестовые точки на плате позволяют наблюдать все основные сиrналы. Два 20KOHTaKTHЫX соединителя позволяют добавить функции беспроводной связи, используя стандартные оценочные беспроводные модули ТI (платы ЕМ). Дополнительные сиrналы микроконтроллера выведены на контактные пло щадки рядом с микроконтроллером. Для отладки и про rраммирования флэшпамяти используется встроенный интерфейс внутрисхемной отладки (IDI), которому для co единения с ПК требуется только USВкабель (входит в Ha бор). Особенности платы Ф Роботизированная оценочная плата. . Механические компоненты, устанавливаемые пользо вателем. Ф Микроконтроллер Stellaris LM3S9B92 с 256 Кбайт флэшпамяти, 96 Кбайт ОЗУ, USB OTG, Ethernet МАС+РНУ и 1 2 S. . Разъём для карты памяти MicroSD. . Аудиокодек формата I 2 s с динамиком. . Разъёмы USB Host и USB Device. · Еthеrnеtразъём RJ45. . Яркий ОLЕDдисплей с rолубой подсветкой размером 96х16 точек. Ф Встроенный интерфейс внутрисхемной отладки (ICDI). . Питание от батареек (3 элемента АА) или от шины USB. . Функции для роботизации: CJ два электромотора постоянноrо тока для передвиже ния платы; CJ оптические датчики определяют вращение колёс с точностью 450; CJ датчик обнаружения удара о препятствие. Информация для заказа Ко EKBUCOS3BNDL EKBUCOS3EVM EKBUCOS3BOOK Оценочная плата Stellaris Robotic Evaluation Board в комплекте с книrой «IIC/05-111: The Real-Time Kernel» (EKB-UC053-BNDL) в этот набор входят роботизированная оценочная пла та Stellaris Robotic Evaluation Board и книrа «C/OS 111: The RealTime Kernel» ж. Лабросса. В первой части книrи рассматриваются принципы работы ядра реальноrо Bpe мени на при мере ОС C/OS 111 разработки компании Micrium. Во второй части при водятся различные учеб ные проекты на базе рассмотренной ОС, использующие боrатые возможности оценочной платы ЕМ  ЕУ ALBOT. Среди учебных проектов имеются: . Вывод информации на экран платы EMEVALBOr. ДaH ная проrрамма циклически выводит на ОLЕDдисплей различные текстовые строки и предназначена для озна комления с базовой структурой ОС C/OS 111 при её ис пользовании на плате ЕМ  ЕУ ALBOT. . Использование аудиоподсистемы платы EMEVALBOr. Данная проrрамма воспроизводит wаvфайлы, записан ные во внутренней флэшпамяти микроконтроллера LM3S9B92. . Простое управление платой EMEVALBOr. Данная проrрамма позволяет независимо управлять обоими двиrателями при помощи пользовательских кнопок, останавливать двиrатели при срабатывании датчика столкновения и отслеживать посредством C/Probe состояние робота: состояние и скорость вращения двиrателей, состояние датчика столкновения и задей ствованные ресурсы ЦПУ. Книrа «IIC/05-111: The Real-Time Kernel» (Ekb-иС053-ВООК) В данной книrе рассматривается работа ядра реально ro времени на примере ОС C/OSIII компании Micrium и платы Stellaris ЕУМ  ЕУ ALBOT. Помимо ознакомления с основными концепциями и принципами работы ядер реальноrо времени, в книrе также содержатся примеры cOBMecTHoro использования C/Os 111 и оценочной пла ты EVMEVALBOT. Эта книrа предназначена для про фессиональных проrраммистов встраиваемых систем, консультантов, радиолюбителей и студентов, которые хотят разобраться, каким образом ядро реальноrо Bpe мени используется с современными мноrофункцио нальными микроконтроллерами. C/OSIII компании Micrium 
 ИIZ Набор референсдuзайна uнтеллектуаЛЬНО20 дuсплеЙНО20 модуля Stellaris. · 517  И.17. Набор референс-дизайна интеппектуапьноrо дис- плейноrо модупя Stellaris 8  одноппатный компьютер Набор референсдизайна интеллектуальноrо дисплейноrо модуля Stellaris  одноплатный компьютер (IDMSBC) представляет собой законченный пользовательский интерфейс на базе сенсорной панели с разрешением QVGA дЛЯ систем управления, автоматики, а также контрольноизмерительноrо оборудования и является первым эталонным проектом с мощным микроконтроллером LM3S9B92. Набор IDMSBC содержит USB и Еthеrnеtмодули, SDRAM объёмом 8 Мбайт, последовательную флэшпамять объёмом 1 Мбайт, встроенную флэшпамять объёмом 256 Кбайт и SRAM объёмом 96 Кбайт. Он позволяет упростить разработку проrраммноrо обеспечения для набора образцов проектирования с помощью набора библиотек StellarisWare с rрафической библиотекой и инструментами разработ ки устройств на базе АRМпроцессоров от партнёров ARM. SDRAM объёмом 8 Мбайт подключается к микрокон троллеру LM3S9B92 с помощью шины External Peripheral Interface (EPI). Модули Stellaris IDM  это первые дисплейные модули, в которых используются высокоэффективные и надёжные микроконтроллеры на базе процессора ARM CortexM3. Эти модули применяются в контроллерах доступа, системах безопасности, интеллектуальной бытовой технике, тонких клиентах и в приложениях промышленной автоматики. Особенности интеппектуапьноrо дисппейноrо модупя Stellaris ....... одноппатноrо компьютера . Яркий ЖКдисплей QVGA с сенсорным экраном: CI 262 тыс. цветов, 3.5дюймовый дисплей QVGA с раз решением 320х240 точек; CI подсветка на белом светодиоде с резистивной ceH сорной панелью. . Опции последовательных интерфейсов: CI USB 2.0 Host; CI 10/100Мбит/с Ethernet МАС и РНУ. . IМбит/с интерфейс CAN. . 12Синтерфейс для внешней периферии и датчики. . Последовательный порт UART с сиrналами TTL уровня. . Высокопроизводительный 80мrц микроконтроллер LM3S9B92: CI 32битное ядро ARM Cortex'" M3; CI 256Кбайт однотактная флэшпамять, 96Кбайт oд нотактная SRAM. . Универсальная память на печатной плате: CI 8Мбайт SDRAM, подсоединяемая по шине EPI; CI IМбайт последовательная флэшпамять, подсоеди няемая по шине SPI; CI разъём карты MicroSD; CI разъём USB Host для подсоединения внешних HaKO пителей. . Источник питания с широким диапазоном входноrо напряжения 12...40 В (ОС) с вспомоrательным 5B BЫ ходом. . 12Sмонокодек для высококачественноrо аудио с 0.8BT усилителем и внешним 8OM динамиком. . Блок винтовых зажимов для подсоединения питания, а также интерфейсов еС и CAN. . Компактная печатная плата размером 2х3 дюйма. . Лёrкая адаптация к приложению: CI включает все исходные коды, примеры приложений и файлы проекта; CI возможно проектирование на базе инструментов от КеН, IAR, Code Sourcery и Code Red Technologies (с по мощью оценочноrо набора Stellaris или отладчика си  стемы на базе процессоров ARM CortexM3); CI поддержка набора библиотек StellarisWare, включая rрафическую библиотеку и библиотеку драйверов периферии; CJ поставляется вместе с запроrраммированным в условиях производства иrровым демонстрацион ным приложением для быстроrо старта; CI системный Еthеrnеtзаrрузчик для обновления набо ра библиотек. Содержимоенаборареферен v дизаина интеппектуапьноrо дисппейноrо модупя Stellaris ....... одноппатноrо компьютера ИнтеллектуаЛЬНЬtй дисплейный модуль Stellaris  одноплатный компьютер (IDMSBC) предлаzается как полный набор референсдизайна (RDKIDMSBC) и содержит все необходимые компоненты для быстрой оценки IDMSBC, включая: . плату Stel1aris. IDMSBC; . отладочный адаптер MDLADA2 из 10KoHTaKTHoro разъёма в 20контактный разъём; . USB флэшнакопитель (128 Мбайт); . 5B источник питания с международным адаптером; . Еthеrnеtкабель; . 8OM динамик; . компактдиск с инструментами разработки, ДOKYMeH тацией и исходным кодом, включая руководство по быстрому старту, руководство пользователя, справоч ное руководство по проrраммному обеспечению, ДOKY ментацию на плату, спецификацию, электрическую схему и rерберфайлы. Интеллектуальный дисплейный модуль Stellaris  одноплатный компьютер Информация для заказа Коп Описание Набор референсдизайна RDKIDMSBC интеллектуальноrо дисплейноrо модуля Stellaris  одноплатноrо компьютера I (IDMSBC) 
518 · Приложение и. Семейство микроконтроллеров Stellaris. И.18. Набор референс-дизайна интеппектуапьноrо дисплейноrо модуля Stellaris 8 Набор референсдизайна интеллектуальноrо дисплейноrо модуля Stellaris (RDKIDM) представляет собой закончен ное решение для проектирования пользовательских rрафических интерфейсов на базе сенсорной панели с подключени ем по Ethernet. Набор содержит все необходимые аппаратные и проrраммные компоненты для разработки и интеrрации модуля интеллектуальноrо дисплея в таких приложениях, как системы промышленноrо управления и автоматики, а также контрольноизмерительное оборудование. Используя технолоrию электропитания PoweroverEthernet (РоЕ) или источник питания постоянноrо тока, набор для проектирования на базе модуля интеллектуальноrо дисплея позволяет создать простое решение на базе интеллектуальноrо терминала, который может задействовать один Еthеrnеtкабель ти па САТ5 дЛЯ питания и обмена данными по сети. Набор также имеет последовательный интерфейс для простой реали зации человекомашинноrо интерфейса на базе ceHcopHoro дисплея для встраиваемых управляющих устройств. Набор RDK IDM  первый проект на базе модуля дисплея, в котором при меняется высокоэффективный и надёжный микро контроллер на базе процессора ARM CortexM3, что позволяет использовать этот модуль в контроллерах доступа, систе мах безопасности, интеллектуальной бытовой технике и в приложениях промышленной автоматики. Особенности набора Содержимое набора Основу набора референсдизайна интеллектуальноrо дис- Интеллектуальный дисплейный модуль Stellaris плейноrо модуля Stellaris составляет высокоинтеrрированный представляет собой набор референсдизайна и набор 32-битный микроконтроллер LM3S6918 на базе процессора для проектирования (RDK IDM), а также отдельный ARM CortexM3 с модулем 10/100-Мбит/с Ethernet AC и PH. rотовый к работе модуль (модуль MDLIDM с техноло АRМ-архитектура обеспечивает доступ к самои обширно rией PoweroverEthernet или модуль MDLIDM28 в мире «экосистеме» инструментов разработки, приложении, с Еthеrnеtинтерфейсом). Референсдизайн и набор для методов обучения и поддержки, операционных систем и про- проектирования поставляется со всеми средствами, rpaMMHblx стеков протоколов. Разработка специализированно необходимыми для быстрой оценки и простой адапта ro проrраммноrо обеспечения для RDK-IDM облеrчается бла rодаря обширной rрафической библиотеке Stellaris Graphics ции модуля интеллектуальноrо дисплея к вашеу при Library и инструментам проектирования ARM от проверенных ложению. Он содерит следую..щие.. компоненты. . партнёров ARM по проrраммному обеспечению. · интеллектуальныи дисплеиныи модул Stellarls Особенности набора RDKIDM' (модуль MDL IDM на металлических стоиках); .. · яркий QVGA ЖКдисплей с сенсорной поверхностью: · 80мrц МИКРОКОНТРОЛ!lер LM3S9B92 с 256Кбаит CJ 16бит цвет, 2.8дюймовый дисплей QVGA с разре флэш-памятью, 96Кбаит SRAM, интеrрированным шением 240х320 точек; модулем Ethernet МАС+РНУ и интерфейсами USB CJ подсветка на белом светодиоде с резистивной сен- OTG и CAN; сорной панелью. . 24- В источник питания с международным адаптером; · Ethernet и последовательные интерфейсы: . убираемый Ethernet  кабель; CJ 10/100Мбит/с Ethernet с автоматическим распознаванием . адаптер отладки; MDII.DIX и светодиодным индикатором трафик/канал; . компактдиск с руководством по быстрому старту, CJ разъем обеспечивает сиrналы TXD и RXD; руководством пользователя, справочным руковод  CJ сиrналы уровня RS232... ством по проrраммному обеспечению, исходным · высокопроизводительныи 50-мrц микроконтроллер кодом спецификацией электрической схемой и LM3S6918 o встронной 256-Кбайт флэшпамятью и rербер-файлами. ' встроеннои 64 Кбаит SRAM; · rибкие интерфейсы и блок выводов: CJ разъём карты MicroSD; CJ релейный выход; CJ четыре входа дЛЯ АЦП на блоке выводов; · rибкие возможности подключения питания: CJ технолоrия PoweroverEthernet (по IEEE 802.заf); CJ rнездо для питания от источника 24 В (DC), выводы для подсоединения 5B питания (DC); · лёrкая адаптация к при ложен ию: CJ включает все исходные коды и файлы проекта; (] включает полные при меры приложений; Набор референсдизайна CJ проектирование на базе инструментов от КеН, IAR, интеллектуаЛЬНО20 Code Sourcery и Code Red Technologies; дисплеЙНО20 модуля Stellaris CJ поддержка rрафической библиотеки Stellaris Graphics Library и библиотеки драйверов периферии Stellaris Peripheral Driver Library. Информация дпя заказа Ко RDK-IDM MDLIDM MDLIDMB MDLIDM28 MDLIDM28B Интеллектуальный дисплейный модуль Stellaris 
И.19. Набор образца разработки на базе модуля uнтеллектуальноzо дисплея · 519 И.19. Набор референс-дизайна интеппектуапьноrо дисппейноrо модупя Stellaris 8 с 3.S-дюймовым зкраном Интеллектуальный дисплейный модуль с 3.5дюймовым экраном (MDLIDML35) представляет собой закончен ный rрафический интерфейс на базе ceHcopHoro QVGАдисплея для таких приложений, как системы промышленно ro управления и автоматики) а также контрольноизмерительное оборудование. Модуль MDLIDML35 обеспечива ет возможность обмена данными по последовательному) цифровому и аналоrовому интерфейсу для простой реали зации человекомашинноrо интерфейса на базе сенсорной панели во встраиваемых устройствах управления. Разра ботка проrраммноrо обеспечения дЛЯ RDKIDML35 упрощается блаrодаря обширной rрафической библиотеке и инструментам разработки АRМпроцессоров от партнёров ARM. Модули IDM  это первые дисплейные модули) в которых применяется высокоэффективный и надёжный микроконтроллер на базе процессора ARM CortexM3) по зволяющий использовать их в контроллерах доступа) системах безопасности) интеллектуальной бытовой технике и в устройствах промышленной автоматики. Особенности набора МDLIDМLЗ5 представляет собой пp02paMMиpye мый модуль со следующими особенностями: . яркий QVGA ЖКдисплей с сенсорной поверхностью: (] 262 тыс. цветов, 3.5дюймовый дисплей QVGA с разрешением 320х240 точек; (] подсветка на белом светодиоде с резистивной ceH сорной панелью; . последовательные интерфейсы: (] последовательный порт RS232 с сиrналами ypOB ня RS232; (] последовательный порт UART с ТТLуровнями сиrналов; . высокопроизводительный микроконтроллер LM3S1958 и большой объём памяти: (] 50мrц 32битный процессор ARM CortexM3; (] 256Кбайт основная флэшпамять, 64Кбайт SRAM; . разъём карты MicroSD; . напряжение питания 5 В) DС/DСпреобразователь, KO торый формирует напряжение 3.3 В для питания платы; . лёrкая адаптация к приложению: (] включает полный исходный код, примеры прило жений и файлы проекта; (] проектирование с помощью средств разработки IDML35 от КеН, IAR) Code Sourcery и Code Red Technologies (с помощью оценочноrо набора Stellaris или отладчика ARM CortexM3); (] поддержка rрафической библиотеки Stellaris Graphics Library и библиотеки драйверов перифе рии Stellaris Peripheral Driver Library. Интеллектуальный дисплейный модуль с 3.5 дюймовым экраном Информация для заказа Ко RDKIDML35 MDLIDML35 MDLIDML35B Содержимое набора Интеллектуальный дисплейный модуль Stellaris представляет собой набор референсдизайна и набор для проектирования (RDKIDML35), а также отдель ный rотовый к работе модуль (MDLIDML35). Референсдизайн и набор для проектирования пo ставляются со всем необходимым для быстрой oцeH ки и простой адаптации интеллектуаЛЬНО20 диc плеЙНО20 модуля к вашему приложению и содержат следующие компоненты: . интеллектуальный дисплейный модуль Stellaris с 3.5дюймовой сенсорной панелью QVGA (MDL IDML35) на металлических стойках; . последовательный кабель USB TTL дЛЯ питания платы и соединения с портом UARTO микрокон троллера LM3S1958; . адаптер JТАGотладки для соединения lOKoHTaKT Horo разъёма с мелким шаrом с 20KOHTaKTHЫM стандартным разъёмом; . 24 В источник питания с международным адапте ром; . компактдиск с руководством по быстрому старту, руководством пользователя, справочным PYKOBOД ством по проrраммному обеспечению) исходным кодом) спецификацией) электрической схемой и rерберфайлами. Интеллектуальный дисплейный модуль с З.5дюймовым экраном 
520 . Приложение и. Семейство микроконтроллеров Stellaris. И.20. Набор референс-дизайна Stellaris 8 для преобразо- вания последовательных протоколов в Ethernet Набор референсдизайна для преобразования последовательных протоколов в Ethernet (RDKS2E) представляет собой законченное и rOToBoe к реализации решение, которое обеспечивает обмен данными по Ethernet для любых устройств с последовательным интерфейсом. Набор содержит все необходимые аппаратные и проrраммные компо ненты для разработки и интеrрации вашеrо проекта по преобразованию последовательных протоколов в Ethernet в промышленных приложениях. Типичным применением RDKS2E является расширение возможностей действую щих систем, которые содержат последовательный порт для конфиrурирования или управления. Кроме Toro, новей шие компьютеры, особенно портативные компьютеры, не всеrда имеют последовательные порты, а связь оrраниче на длиной кабеля (обычно не более 10 м). Реализация решения Stellaris по преобразованию последовательных прото колов в Ethernet в устройствах с последовательными интерфейсами даёт множество преимуществ, включая OTCYT ствие необходимости внесения больших изменений в тополоrию платы или проrраммное обеспечение; возможность использования сетей, отличных от Ethernet; компактный формфактор и отсутствие оrраничений на максимальную длину кабеля при последовательном соединении. Особенности набора Набор RDKS2E  первое решение для преобразования последовательных протоколов в Ethernet, в котором ис пользуется высокоэффективный и надёжный микрокон троллер на базе процессора ARM CortexM3. Основу про екта преобразования последовательных протоколов в Ethernet составляет высокоинтеrрированный 50мrц 32битный микроконтроллер LM3S6432 с процессорным ядром ARM Cortex М3 и однотактной встроенной флэш  памятью большой ёмкости и SRAM, которых достаточно для эффективной обработки ceTeBoro трафика. Для MaK симальной экономии площади микроконтроллер Stellaris предлаrается в компактном корпусе BGA и содержит ин теrрированный модуль 10/100Мбит/с Ethernet МАС и РНУ. АRМархитектура обеспечивает доступ к самой ши рокой в мире «экосистеме» инструментов разработки, приложений, методов обучения и поддержки, операци онных систем и проrраммных стеков протоколов. Особенности модуля RDKS2E: · микроконтроллер Stellaris LM3S6432 на базе процессора ARM CortexM3 в компактном корпусе BGA размером 10хl0 мм, что позволяет уменьшить площадь платы; . 10/100Мбит/с порт Ethernet: CI автоматическая коррекция MDI/MDIX; CI светодиодный индикатор трафик/канал; . 2 порта UART с контролем потока RTS/CTS: CI UARTO имеет уровни RS232, приёмопередатчик pa ботает на скорости до 250 Кбит/с; CI UARTl имеет уровни CMOS/TTL, способен работать со скоростью 1.5 Мбит/с; · проrраммное обеспечение: CI IРконфиrурирование со статическим IРадресом или ОНСР; CI TelnetcepBep для доступа к последовательному порту; CI вебсервер для конфиrурирования модуля; CI ответчик на UDРзапросы для обнаружения устрой ства; CI Теlnеtклиент для расширителя последовательноrо порта на базе Ethernet; CI SSH cepBep для безопасноrо соединения; · модуль поддерживает напряжение питания 5 и 3.3 В; . множество вариантов монтажа, включая поставляе мый по запросу монтажный кронштейн; . порт JTAG дЛЯ проrраммирования в условиях произ водства. Информация дпя заказа Ко RDKS2E MDLS2E MDLS2EB Содержимое набора Модуль Stellaris для преобразования последователь ных протоколов в Ethernet представляет собой набор референсдизайна (RDKS2E) плюс отдельный rотовый к работе модуль (MDLS2E). Набор референсдизайна поставляется со всем необходимым для быстрой оценки и простой адаптации модуля MDLS2E к вашему прило жению и содержит следующие компоненты: . модуль Stellaris для преобразования последователь ных протоколов в Ethernet (MDLS2E); . плату адаптера RS232; . убираемый Еthеrnеtкабель; . последовательный кабель ОВ9; . USВкабель; . компактдиск с руководством по быстрому старту, py ководством пользователя, справочным руководством по проrраммному обеспечению, исходным кодом, спе цификацией, электрической схемой и rерберфайлами. Набор референсдuзайна Stellaris для преобразования последовательных протоколов в Etherпet Модуль Stellaris для преобразованuя последовательных протоколов в Etherпet 
И.21. Набор референсдизайна Stellaris* для управления шаzовым двuzателем . 521 И.21. Набор референс-дизайна Stellaris 8 для управления шаrовым двиrателем Набор референсдизайна Stellaris для управления шаrовым двиrателем (RDKStepper) содержит все необходимые аппа ратные и проrраммные компоненты для проектирования, модернизации и интеrрации современных устройств с шаrо вым двиrателем. Набор RDKStepper, блаrодаря вычислительной мощности и rибкости микроконтроллеров Stellaris и ис пользованию MOSFET и драйверов MOSFET компании Fairchild Semiconductor, позволяет создавать усовершенствован ные системы управления шаrовым двиrателем, оптимизированные по характеристикам, стоимости и rибкости. Шаrо вые двиrатели особенно подходят для применения в 2 и 3oceBЫX ЧПУ типа CNC, сортировочном и калибровочном оборудовании, специализированных принтерах и сканерах, а также в устройствах промышленной автоматики. Архитектура проrраммноrо обеспечения набора может быть использована в широком спектре приложений от ми кромощных устройств до сильноточноrо оборудования. Такая мощная и rибкая архитектура проrраммноrо обеспе чения, построенная на базе подпроrрамм обработки прерываний с приоритетом, работает эффективно в фоновом режиме, оставляя значительный резерв ресурсов для системноrо приложения или сетевых заданий. Особенности набора Набор RDKStepper содержит полнофункциональный микроконтроллер LM3S617, предназначенный для устройств управления приводом, силовой каскад, выпол ненный на основе микросхемы драйвера F AN73832 и MOSFET FDMS3672 компании Fairchild Semiconductor, шаrовый двиrатель NEMA23, управляющую проrрамму с rрафическим интерфейсом для Windows, а также сопут ствующие кабели, исходный код и документацию. Набор референсдизайна для управления шаrовым двиrателем позволяет использовать встроенные функции микрокон троллера Stellaris и вычислительную мощность процес copHoro ядра ARM CortexM3 для реализации импульс Horo (чопперноrо) управления без необходимости приме нять внешний контроллер шаrовоrо двиrателя или KOM паратор. rрафическая управляющая проrрамма позволя ет экспериментировать с различными параметрами при вода и фиксировать характеристики двиrателя. Особенности набора референсдизайна RDKStepper: . усовершенствованное импульсное (чопперное) управ ление биполярными шаrовыми двиrателями; . проrраммное импульсное (чопперное) управление ша rовыми двиrателями с высоким крутящим моментом при высокой скорости шаrа; . режимы быстроrо и медленноrо спада; . режимы полноrо шаrа, полушаrа, микрошаrа и волны; . высокая скорость шаrа (до 10000 шаrов/с); . проrраммируемый ток удержания; . виртуальный СОМпорт, интеrрированный в USB; . поддержка внешнеrо отладчика через стандартный 20контактный разъём от ARM; . простое подсоединение питания и двиrателя с помо щью подключаемой контактной колодки; . системный заrрузчик для обновления микропро rpaMMHoro обеспечения через последовательный порт. Содержимое набора Набор референсдизайна RDKStepper поставляется со всеми необходимыми компонентами для оценки cи стемы управления биполярным ша20вым дви2ателем, включая: . rлавную плату управления; . шаrовый двиrатель NEMA23; . 24B источник питания с международным адаптером; . USВкабель; . проrрамму управления с rрафическим интерфейсом для Windows на компактдиске; . компактдиск с руководством по быстрому старту, py ководством пользователя, справочным руководством по проrраммному обеспечению, исходным кодом, спе цификацией, электрической схемой и rерберфайлами. Набор референсдизайна Stellaris для управления ша20вым дви2ателем Скриншот окна nрО2раммы управления из набора референсдизайна RDKStepper для Windows Информация для заказа Ко Описание Набор референсдизайна Stellaris для п авления шаrовым виrателем Плата управления шаrовым виrателем, ин иви альная паковка MDLStepper В Плата управления шаrовым виrателем, r пповая паковка RDKStepper MDLStepper 
522 . Приложение И. Семейство микроконтроллеров Stellaris. И.22. Набор референс-дизайна Stellaris 8 для управления бесщёточиым двиrателем постоянноrо тока Набор референсдизайна Stellaris для управления бесщёточным двиrателем постоянноrо тока (RDKBLDC) с ин терфейсами Ethernet и CAN содержит все необходимые аппаратные и проrраммные компоненты для проектирова ния, модернизации и интеrрации приложения на базе бесщёточноrо двиrателя постоянноrо тока в промышленных сетях. Набор RDKBLDC позволяет использовать вычислительную мощность и rибкость микроконтроллеров Stellaris и силовые модули компании Fairchild Semiconductor для реализации сложных четырёхквадрантных алrо ритмов управления 3фазными бесщёточными двиrателями постоянноrо тока, рассчитанными на напряжение до 36 В. Бесщёточные двиrатели постоянноrо тока особенно хорошо подходят для применения в промышленной aBTO матике, робототехнике, в электрических инвалидных колясках и движущихся механизмах, насосах и вентиляцион ных системах, а также в компактных бытовых приборах. Особенности набора Набор RDKBLDC содержит полнофункциональный микроконтроллер Stellaris LM3S8971 с интерфейсами Ethernet и CAN, 3фазный бесщёточный двиrатель по стоянноrо тока, проrрамму управления с rрафическим интерфейсом для Windows, а также сопутствующие Ka бели, исходный код и документацию. Набор RDKBLDC использует встроенные функции управления приводом и коммуникационные возможности микроконтроллера Stellaris LM3S8971, а также вычислительную мощность процессорноrо ядра ARM CortexM3 для Toro, чтобы обеспечить оптимальные алrоритмы управления широ ким спектром бесщёточных двиrателей постоянноrо TO ка в разнообразных приложениях. Проrрамма управле ния с rрафическим интерфейсом позволяет подбирать различные параметры управления и изучать их влияние на характеристики двиrателя. Особенности набора RDKBLDC: . коммуникационные интерфейсы 10/100Мбит/с Ethernet и CAN; . усовершенствованные алrоритмы управления 3фаз ными бесщёточными двиrателями постоянноrо тока; . четырёхквадрантные алrоритмы работы для точноrо управления двиrателем; . режимы работы: с датчиком Холла, квадратурный и без датчика; . управление 3фазными бесщёточными двиrателями постоянноrо тока) рассчитанными на напряжение до 36 В и мощность до 500 Вт; . набор леrко адаптируется к приложению за счёт исхо дноrо кода и файлов проекта; . леrко расширяемое проrраммное обеспечение по управлению приводом с контролем прерываний; . резерв ресурсов в 30 MIPS дЛЯ системноrо проrрамм Horo обеспечения; . собранная на плате схема торможения; . вход инкрементноrо импульсноrо датчика положения; . кнопочный переключатель тестовых режимов; . светодиодные индикаторы для отображения режимов питания, функционирования и сбоя; . поставляемый на заказ управляемый вентилятор для принудительноrо воздушноrо охлаждения; . винтовые зажимы для всех кабелей питания и сиrна лов; . порт JT AG/SWD дЛЯ отладки проrрамм. Информация для заказа Ко RDKBLDC MDLBLDC MDLBLDC B Содержимое набора Набор RDKBLDC поставляется со всеми необходи мыми средствами для оценки систем управления бесщё точными дви2ателями nостОЯННО20 тока, включая: . rлавную плату управления; . 3фазный бесщёточный двиrатель постоянноrо тока; . 24B источник питания; . убираемый Еthеrnеtкабель; . адаптер отладки; . проrрамму управления с rрафическим интерфейсом для Windows на компакт диске; . компактдиск с руководством по быстрому старту, py ководством пользователя, справочным руководством по проrраммному обеспечению, исходным кодом, спе цификацией, электрической схемой и rерберфайлами. Набор референсдизайна Stellaris для управления бесщёточным дви2ателем nостОЯННО20 тока Вид nрО2раммы управления с 2рафическим интерфейсом для Windows из набора этаЛОННО20 nроекта RDKBLDC 
И.23. Набор образца разработки для управления щётОЧНblМ двиzателем постоянноzо тока · 523 И.23. Набор референс-дизайна Stellaris 8 для управления .. щеточным двиrатепем постоянноrо тока с интерфейсом CAN (RDK-BDC24) Набор референсдизайна Stellaris для управления щёточным двиrателем постоянноrо тока (RDKBDC24) с интер фейсом CAN позволяет управлять скоростью вращения 12B и 24B щёточных двиrателей постоянноrо тока с потре олением до 40 А и содержит новый управляющий вход, основанный на интерфейсе RS2З2, который может исполь зоваться в качестве преобразователя последовательноrо интерфейса в интерфейс CAN. Также модуль RDKBDC24 обеспечивает боrатый набор интерфейсов датчиков, имеет широкие коммуникационные и управляющие возможно сти. В частности, в модуле предусмотрены входы аналоrовоrо и импульсноrо датчика положения, реализованы BЫ сокопроизводительные интерфейсы CAN и порт RS2З2. Модуль использует высокооптимизированное проrрамм ное обеспечение и содержит мощный З2битный микроконтроллер Stellaris LМЗS2616, который обеспечивает плав ную и бесшумную работу двиrателя постоянноrо тока в широком диапазоне скоростей. На плате модуля MDL ВОС24 присутствуют такие высококачественные аналоrовые компоненты от Texas Instruments, как приёмопередатчик шины CAN SN65HVDI050, приёмопередатчик интерфейса RS2З2 МАХЗ221, DС/DСпреобразователь TPS54040, стабилизатор напряжения ТРS7З6ЗЗ и усилитель для резистивноrо датчика тока INАI9З. Этот модуль рассчитан на использование в самых разных потребительских и промышленных устройствах, включая системы промышленной автоматики, мобильные роботы, бытовую технику, насосные и вентиляционные системы, а также электрические инвалидные коляски и движущиеся механизмы. Особенности набора Набор MDLBDC поставляется как 20товый к работе nр02раммно адаптируемый модуль, обладающий следу ющими особенностями: . бесшумное управление щёточными двиrателями по стоянноrо тока (15 к[ц ШИМ); . три опции реrулирования скорости вращения: CJ стандартный в отрасли интерфейс RC сервопривода (ШИМ); CJ интерфейс CAN; CJ последовательный интерфейс RS2З2; . интерфейс CAN или RS2З2 дЛЯ управления с обрат ной связью, управления скоростью, положением или TOKOBoro управления; . обмен данными через интерфейс CAN: CJ возможность полноrо конфиrурирования опций MO дуля; CJ мониторинr тока, напряжения, скорости и друrих параметров в режиме реальноrо времени; CJ заrрузка микропроrраммноrо обеспечения через ин терфейсы RS2З2/САN; . последовательный обмен данными через интерфейс RS2З2: CJ подключение устройств с интерфейсом RS2З2 к ши не CAN; CJ прямое подключение к последовательному порту ПК или порту cRIO от National Instruments; . входы для концевых выключателей прямоrо/обратно ro хода; . возможности микропроrраммноrо обеспечения: CJ полностью конфиrурируемые параметры обратной связи; CJ мониторинr сиrналов от всех датчиков в режиме pe альноrо времени, включая потребляемый двиrате лем ток, положение ротора, скорость и состояние концевых выключателей; . светодиодный индикатор для отображения режимов работы, направления вращения и сбоев; . переключатель режимов работы двиrателя  TOpMO жение/движение по инерции; . вход импульсноrо датчика положения (QEI) и аналоrо ВЫЙ ВХОД; . цветные винтовые зажимы для подключения питания; . лёrкая адаптация к приложению с помощью инстру ментов Keil, IAR, Code Sourcery, Code Red Technologies или Texas Instruments (используя оценочный набор Stellaris или отладчик ARM СоrtехМЗ). Содержимое набора Набор Stellaris MDLBDC24 поставляется не только в виде отдеЛЬН020 20тов020 для nроизводства модуля, но и как законченный набор референсдизайна (RDKBDC24), созданный с помощью открытых инструментов. Этот набор имеет все необходимые компоненты для быстрой оценки и простой адаптации модуля MDLBDC24 для вa ше20 nриложения и включает в себя следующие элемен ты: . модуль управления двиrателем MDLBDC24; . щёточный двиrатель постоянноrо тока Mabuchi RS 555РНЗ255 (5000 об/мин, 12 В, ЗА); . источник питания с универсальным входом; . преобразователь последовательноrо интерфейса в ин терфейс CAN (ОВ9  RJI2); . два модульных кабеля 6P6C (длиной 1 и 7 футов); . терминатор шины CAN (120 Ом); . адаптер JТАGотладки для соединения 10KOHTaKTHO ro разъёма с мелким шаrом с 20KOHTaKTHЫM CTaHдapT ным разъёмом; . компактдиск с документацией, утилитой обновления микропроrраммноrо обеспечения LM Flash, rрафиче ской средой BOCCOMM дЛЯ управления и отслежи вания состояния двиrателя, исходным кодом, специ фикацией, электрической схемой и [ерберфайлами. Набор референсдизайна Stellaris для управления щёточ ным дви2ателем nостОЯНН020 тока с интерфейсом CAN Информация дпя заказа Ко Описание MDL Модуль Stellaris для управления щёточным BDC24 двиrателем постоянноrо тока с интерфейсом CAN RDKBDC24 ин иви альная паковка MDL Модуль Stellaris для управления щёточным BDC24 В двиrателем постоянноrо тока с интерфейсом CAN RDKBDC24, r пповая паковка Набор референсдизайна Stellaris для управления щёточным двиrателем постоянноrо тока с интерФейсом CAN включает мо ль MDLBDC24 RDK ВDС24 
524 · Приложение И. Семейство микроконтроллеров Stellaris. И.24. Набор референсдизайна Stellaris 8 для управления асинхронным зпектродвиrателем переменноrо тока Набор референсдизайна Stellaris для управления асинхронным электродвиrателем переменноrо тока (RDKACIM) содержит все необходимые аппаратные и проrраммные компоненты для разработки) модернизации и интеrрации современных приложений на базе асинхронных двиrателей переменноrо тока. Набор RDKACIM позволяет исполь зовать вычислительную мощность и rибкость микроконтроллеров Stellaris и силовые модули компании Fairchild Semiconductor для создания усовершенствованных систем на базе электродвиrателя переменноrо тока с реrулируе мой скоростью вращения) которые обеспечивают высокую производительность) низкую стоимость и rибкость. Асинхронные двиrатели переменноrо тока особенно хорошо подходят для применения в бытовой технике (холо дильниках) посудомоечных машинах) стиральных машинах и сушильных аппаратах)) системах управления отопле нием) вентиляцией и кондиционированием воздуха для жилых помещений и небольших предприятий) а также в приводах промышленных 3фазных электродвиrателей. Архитектура проrраммноrо обеспечения набора непосредственно масштабируема для применения в приложени ях мощностью менее 1 Л.с. до сотен кВт. Такая мощная и rибкая архитектура проrраммноrо обеспечения) построен ная на базе подпроrрамм обработки прерываний с приоритетом) работает эффективно в фоновом режиме) оставляя существенный запас ресурсов для системноrо приложения или сетевых заданий. Особенности набора Набор RDKACIM содержит полнофункциональный микро контроллер Stellaris LM3S818 дЛЯ устройств управления приво дом) силовой модуль FSBSI0CH60 от Fairchild Semiconductor) электродвиrатель переменноrо тока Selni для 3фазноrо обору дования) управляющую проrрамму с rрафическим интерфей сом для Windows) а также сопутствующие кабели) исходный код проrрамм) электрическую схему) спецификацию и ДOKY ментацию. Набор RDKACIM использует встроенные функции и вычислительную мощность микроконтроллера Stellaris для реализации современных энерrоэффективных алrоритмов управления) включая пространственно векторную модуляцию (SVM). Управляющая проrрамма с rрафическим интерфейсом позволяет экспериментировать с различными параметрами привода и фиксировать характеристики двиrателя. Особенности набора RDKACIM' · усовершенствованные алrоритмы управления 3фаз ными и однофазными асинхронными двиrателями пе peMeHHoro тока; · активная схема торможения; · активная схема управления бросками тока; · возможность управления внешним каскадом KoppeK ции коэффициента мощности; · возможность изменений линейноrо фильтра) KOHдeH саторов шины питания и JТАGинтерфейса; · содержит код для основных алrоритмов управления) в том числе для пространственновекторной модуля ции и контроля синусоиды; · точное измерение тока; · несколько изолированных входов управления) в том числе: CI виртуальный СОМпорт на базе интеrрированноrо порта USB; CI проrрамма под Windows для конфиrурирования) управления и мониторинrа; CI последовательный порт с лоrическими уровнями сиrналов; CI потенциометр реrулировки скорости и переключа тель режимов; CI мониторинr скорости вращения и положения через вход импульсноrо датчика положения/тахометра; CI электрически изолированный JТАGпорт для отлад ки проrраммноrо обеспечения; CI системный заrрузчик для обновления микропро rpaMMHoro обеспечения через последовательный порт. Информация для заказа Ко RDKACIM MDLACIM MDLACIMB Содержимое набора Набор RDKACIM поставляется со всеми необходимыми компонентами для оценки системы управления на базе acиH ХрОННО20 электродви2ателя nеремеННО20 тока, включая: · rлавную управляющую плату с установленным радиа тором; · электродвиrатель переменноrо тока для 3фазноrо дo машнеrо оборудования (0...20000 об/мин); · кабели питания; · USВкабель; · проrрамму управления с rрафическим интерфейсом для Windows на компактдиске; · компактдиск с руководством по быстрому старту) py ководством пользователя) справочным руководством по проrраммному обеспечению) исходным кодом) спе цификацией) электрической схемой и rерберфайлами; · системный заrрузчик для обновления микропро rpaMMHoro обеспечения через последовательный порт. Набор референсдизайна Stellaris для управления асинхронным электродви2ателем nеремеННО20 тока . ";:< ,.. ' ", С" .... , " " , , Вид nрО2раммы управления с 2рафическим интерфейсом для Windows из набора референсдизайна RDKACIM 
И.25. Общие сведения о встраиваемых процессорах ТI на базе технолоzии ARM · 525 И.25. Общие сведения о встраиваемых процессорах TI на базе технопоrии ARM Компания Т! предлаrает широкий спектр продукции на базе технолоrии ARM, которая предназначена для разнообразных приложений и обеспечивает оптимальную производительность, энерrопотребление и стои мость систем. Эти процессоры на базе технолоrии ARM представлены различными линейками продукции компании Т! (см. Табл. И.9). Более подробная информация приведена на сайте www.ti.com/arm. Применение устройств компании TI на базе технолоrии ARM АRМпроцессоры предлаrают широкий выбор функций и производительности, что позволяет создавать pe шения, которые наиболее точно соответствуют предъявляемым к ним требованиям. Области при.менения для этих устройств: . системы обработки данных: LI точки продаж предприятий розничной торrовли (РОSтерминалы); LI портативные компьютеры; . проводная связь: LI сетевые системы; LI широковещательное оборудование; . потребительская электроника: LI портативные аудио/видеоплееры; LI цифровые абонентские ТВ приставки; LI цифровые фотоаппараты; LI сетевые устройства; LI системы управления отоплением, вентиляцией и кондиционированием воздуха; LI иrровые устройства; LI планшетные компьютеры; . автомобильная электроника: LI информационноразвлекательные устройства; LI системы безопасности и управления; LI тормозная система и рулевое управление; LI rибридные автомобили и электромобили; . промышленные системы: LI медицинское оборудование; LI автоматика и приводы; LI измерительные системы; LI источники питания; LI дистанционный контроль; LI управление системами зданий; LI системы промышленной автоматики; LI испытательное и измерительное оборудование; LI человекомашинный интерфейс (ИМI). 
526 · Приложение и. Семейство микроконтроллеров Stellaris' Таблица Н.9. Продукция компании Т' на базе технопоrии АКМ* Процессор TI ипу Мfц Операционная система Основная пеDифеDИЯ Sitara'" АМ1705 ARM9'" 450 Linux, Windows СЕ. RTOS ес. SPI. UART. USB. MMC/SDIO. ЕМАС Sitara АМ1707 ARM9 450 Linux. Windows СЕ. RTOS ес, SPI. UART. USB MMC/SDIO. ЕМАС Sitara АМ1802 ARM9 300 Linux. Windows СЕ. RTOS ес. SPI. UART. USB. MMC/SDIO, ЕМАС Sitara АМ1806 ARM9 450 Linux, Windows СЕ, RTOS ес, SPI, UART, USB, MMC/SDIO Sitara АМ1808 ARM9 450 Linux, Windows СЕ, RTOS ес, SPI, UART, USB MMC/SDIO, ЕМАС, SATA Sitara АМ1810 ARM 375 Linux, Windows СЕ, RTOS I 2 C, SPI, UART, USB, MMC/SDIO, ЕМАС, SATA, PROFIBUS Sitara АМ3505 ARM Cortex'" A8 600 Linux, Windows СЕ, RTOS, I 2 C, SPI, UART, USB, MMC/SDIO, ЕМАС, CAN Android Sitara АМ3517 ARM CortexA8 600 Linux, Windows СЕ, RTOS, ес, SPI, UART, USB, MMC/SDIO, ЕМАС, CAN Android Sitara АМ3703 ARM CortexA8 1000 Linux, Windows СЕ, RTOS, I 2 C, SPI, UART, USB, MMC/SDIO Android Sitara АМ3715 ARM CortexA8 1000 Linux, Windows СЕ, RTOS, ес, SPI, UART, USB, MMC/SDIO Android Sitara АМ3892 ARM CortexA8 1500 Linux, Windows СЕ, RTOS PCIe, SATA. ЕМАС, UART. USB Sitara АМ3894 ARM CortexA8 1500 Linux, Windows СЕ, RTOS PCIe, SATA, Gie:abit ЕМАС, UART USB OMAPL137 ARM926 + С674х 300 Linux, Windows СЕ, MMC/SD, SDRAM/NAND, ЕМАС, UART, USB DSP VxWorks 2.0 HS OTG, USB 1.1 OMAP L138 ARM926 + С674х 300 Linux, Windows СЕ, mDDR/DDR2, SDRAM/NAND, SATA, uPP, DSP VxW orks ЕМАС, USB 2.0 HS OTG, USB 1.1 TMS320C6A8168 С674х+ ARM 1500 Linux, Windows СЕ, RTOS DDR2IDDR3, SRAM/Pseudo SRAM/NAND, CortexA8 NOR Flash, SD, SATA, uPP, ЕМАС, USB 2.0 HS TMS320C6A8167 С674х+ ARM 1500 Linux, Windows СЕ, RTOS DDR2/DDR3, SRAM/Pseudo SRAM/NAND, CortexA8 NOR Flash, SD, SATA, uPP, ЕМАС, USB 2.0 HS TMS320DM355 ARM926 135,216, Linux mDDR/DDR2, USB 2.0 H/OTG 270 TMS320DM335 ARM926 135,216 Linux mDDR/DDR2, USB 2.0 H/OTG TMS320DM357 ARM926 270 Linux ЕМАС, DDR2, JTAG. USB 2.0 OTG TMS320DM365 ARM926 216,270, Linux ЕМАС, mDDR/DDR2, HPI, rолосовой кодек, 300 USB 2.0 H/OTG TMS320DM6467 ARM926 + С64х 594/729, Linux, Windows СЕ ЕМАС, DDR2, USB 2.0, HPI, PCI, АТА DSP 297/365 TMS320DM6446 ARM926 + С64х 300/600 Linux, Windows СЕ ЕМАС, DDR2, USB 2.0, HPI, АТА, интерфейс DSP карт памяти TMS320DM6443 ARM926 + С64х 300/600 Linux, Windows СЕ ЕМАС, DDR2, USB 2.0, HPI, АТА, интерфейс DSP карт памяти TMS320DM6441 ARM926 + С64х 256/512 Linux, Windows СЕ ЕМАС, DDR2, USB 2.0, HPI, АТА, интерфейс DSP карт памяти FlexRay, CAN, буферированный АЦП, буфери TMS570LS2x ARM CortexR4F 160 AUTOSAR, различные рованный SPI, SCI/ LIN, Timer Coprocessor, встраиваемые RTOS функции самотестирования и контроля ЕСС дЛЯ критичных к безопасности приложений Stellaris 8 ARM CortexM3 20...50 Различные встраиваемые (МК) АЦП, SSI/SPI, UART, I 2 C, модуль LM3SxOOs RTOS управления двиrателями Stellaris ARM CortexM3 25...80 Различные встраиваемые (М К) АЦП, SSI/SPI, UART, ес, модуль LM3S1000s RTOS управления двиrателями, режим Hibernate Stel1aris ARM CortexM3 25...80 Различные встраиваемые (МК) CAN, АЦП, SSI/SPI, UART, I 2 C, модуль LM3S2000s RTOS управления двиrателями, режим Hibernate Stellaris Различные встраиваемые (МК) USB 2.0 FS D/H/OTG, АЦП, SSI/SPI, ARM CortexM3 50 UART, I 2 C, модуль управления двиrателями, LM3S3000s RTOS Iрежим Hibernate, StellarisWare 8 в ПЗУ Stellaris Различные встраиваемые (М К) USB 2.0 FS D/H/OTG, CAN, АЦП, SSIISPI, ARM CortexM3 50...80 UAR Т, I 2 C, модуль управления двиrателями, LM3S5000s RTOS Iрежим Hibernate, StellarisWare 8 в ПЗУ Stellaris Различные встраиваемые (МК) 10/100 Ethernet МАС+РНУ, АЦП, SSI/SPI, LM3S6000s ARM CortexM3 25...50 RTOS UART, I 2 C, модуль управления двиrателями, I режим Hibernate Stellaris Различные встраиваемые (МК) 10/100 Ethernet МАС+РНУ, CAN, АЦП, LM3S8000s ARM CortexM3 50 RTOS SSI/SPI, UART, I 2 C, модуль управления I двиrателями, режим Hibernate (МК) 10/100 Ethernet МАС+РНУ, USB 2.0 FS Stel1aris ARM Cortex М3 80...100 Различные встраиваемые D/H/OTG, CAN, АЦП, SSI/SPI, UART, ес, LM3S9000s RTOS модуль управления двиrателями, режим Hibernate, StellarisWare 8 в ПЗУ 
И.26. Высокопроизводительные контроллеры Stellaris ARM CortexM4F от Texas Iпstrumeпts · 527 И.26. Высокопроизводительные контроллеры Stellaris ARM Cortex..M4F от Texas Instruments Компания Texas Instruments представила новое поколение микроконтроллеров Stellaris на базе ARM CortexM4  LM4Fx. Микроконтроллеры выполнены по 65HM технолоrии, что позволяет достичь хорошеrо соотношения между такими параметрами, как высокая производительность, малое энер rопотребление и цена. Семейство Stellaris ARM CortexM4, получившее название Stellaris LM4F, по сути является расширением популярноrо семейства ARM CortexM3, включающее дополнительные DSРподобные инструкции, а также модуль операций с плава ющей точкой: процессор ARM CortexM4 поддерживает ши рокий набор одноцикловых команд умножения с накоплени ем (МАС), команды централизованноrо управления потоком данных (SIMD) и арифметические команды «С насыщением», а также имеет модуль обработки операций с плавающей точкой (FPU) с одинарной точностью. Основными областями применения семейства LM4F являются микроконтроллеры общеrо назначения, USВконтроллеры, контроллеры для промышленной автоматики и управления двиrателями. Для ускорения процесса разработки проrраммноrо обеспечения Texas Instruments предоставляет бесплат ное проrраммное обеспечение StellarisWare., поддерживающее все контроллеры семейства LM4F. StellarisWare представляет собой комплект API, который был специально разработан для контроллеров Stellaris, чтобы ми  нимизировать стоимость разработки проrраммноrо обеспечения и сократить время выхода на рынок. Боль шинство из АРIинтерфейсов встроено в ROM. Также стоит отметить, что всё проrраммное обеспечение Ha писано на языке С, что облеrчает процесс корректировки и написания собственноrо проrраммноrо кода. Основные характеристики nepBoro поколения LM4F . Ядро ARM CortexM4F с модулем обработки операций с плавающей точкой (FPU) с одинарной точностью. . До 256 Кбайт встроенной флэшпамяти и 32 Кбайт ОЗУ. . 2 Кбайт BCTpoeHHoro EEPROM. . До двух 12бит АЦП с 24 входными каналами. . До двух САNконтроллеров. . Три аналоrовых компаратора. . Опциональный интерфейс USB 2.0 с поддержкой режимов Device/Host/OTG. . Расширенные функции управления двиrателями при помощи использования до 16 ШИМконтроллеров и двух интерфейсов квадратурноrо энкодера. . Большой выбор последовательных интерфейсов: CJ до 8 модулей UART; CJ до 6 каналов 12C; CJ до 4 каналов SPI/SSI. . Режимы пониженноrо энерrопотребления, в том числе «спящий режим». . Корпуса 64LQFP, 100LQFP и 144LQFP. Основные преимущества . Новый 12бит АЦП с частотой выборки 1 Мвыб./с позволяет достичь точности :tl бит во всём диапа зоне температур. . Ядро ARM CortexM4F со встроенным FPU ускоря ет выполнение математических операций и упро щает процесс обработки цифровых сиrналов. . Первый микроконтроллер ARM CortexM, выпол ненный в 65HM технолоrическом процессе, обеспе чивает хорошее соотношение между высокой про изводительностью и малым энерrопотреблением: CJ время пробуждения менее 500 мкс; CJ ток В рабочем режиме менее 370 мкА/Мfц; CJ ток энерrопотребления в ждущем режиме  1.6 мкА. . Минимальное количество циклов перезаписи флэшпамяти  100000 циклов. . Широкий диапазон совместимой памяти и вариан тов корпусов позволяют сделать оптимальный BЫ бор устройства. . Обширный выбор периферии на кристалле OTKpЫ вает возможности применения в различных прило жениях, включая lDcKaHepbI, микропринтеры, цифровое питание, управление двиrателями, управление светодиодным табло, устройства про мышленной автоматики. 
528 · Приложение и. Семейство микроконтроллеров Stellaris. Быстрый старт с микроконтроппером Stellaris ARM Cortex-M4F Texas Instruments представляет линейку новых oцe ночных наборов для микроконтроллеров серии LM4F. Оценочный набор Stellaris 8 LM4F232 USB+CAN  это компактный и универсальный набор для демонстрации возможностей микроконтроллера Stellaris LM4F232, oCHoBaHHoro на ядре ARM8 Cortex'" M4F. Оценочный набор позволяет показать доступные в микроконтроллере LM4F232 функции, а именно: KOH троллер USB 2.0 в режимах OTG/Host/Device, CAN контроллер, аналоrовые функции и возможности низ Koro энерrопотребления. В комплект также входит множество примеров в ис ходном коде для быстроrо начала проrраммирования в Си  коде. Оценочный набор включает в себя следующие компоненты: · микроконтроллер Stellaris LM4F232HSQD с 2S6Кбайт внутренней флэшпамятью в корпусе 144LQFP; · 99 х 64 цветной ОLЕDдисплей, обеспечивающий функции интерфейса; · разъём USB MicroAB для макетирования USB применений; · слот для карт памяти microSD; · SMM винтовые клеммы для подключения внешних датчиков и друrих аналоrовых входов; · прецизионное опорное напряжение для точноrо аналоrо цифровоrо преобразования; · датчик температуры для измерения температуры; · 3осевой акселерометр для детектирования поло жения; · контрольные точки для всех линий ввода/вывода, что позволяет леrко анализировать сиrналы при отладке; 8 пять пользовательских/навиrационных кнопок (в том числе выбор/пробуждение) для ввода данных пользователем; · один пользовательский светодиод; · 10контактный JTAG, обеспечивающий CTaHдapT ный интерфейс для отладки. Информация дпя заказа Состав набора Отладочный набор включает всё необходимое для разработки и выполнения приложений на микрокон  троллере Stellaris: · оценочную плату Stellaris EKLM4F232; · внутрисхемный отладочный интерфейс, реализо ванный на плате; · набор кабелей: CJ кабель USB MiniB для отладки; CJ USB переходной кабель MicroABStdA; CJ кабель USB MicroBUSBA; CJ USB флэшнакопитель; · литиевую батарею зy CR2032; · СDдиск, содержащий: CJ полную документацию; CJ StellarisWare 8 библиотеку периферийных драйве ров и при меры исходноrо кода; · пакет разработчика Stellaris Firmware с при мерами исходных кодов; · приложения для быстроrо старта с исходными KO дам и; · Windows приложения для быстроrо старта; · ознакомительную версию среды разработки  од  ну из следующеrо списка: CJ Keil'" RealView. Microcontroller Development Kit (MDKARM); CJ IAR Embedded Workbench 8 development tools; CJ CodeSourcery tools development tools; CJ Code Red Technologies Tools; CJ Texas Instruments' Code Composer Studio'" IDE. КОД Описание EKKLM4F232 Оценочный набор Stellaris LM4F232 для КеН RealView MDKARM (с оrраничением проrраммноrо кода 32 Кбайт) EKILM4F232 Оценочный набор Stellaris LM4F232 для IAR Systems Embedded Workbench 8 (с оrраничением проrраммноrо кода 32 Кбайт) EKC LM4F232 Оценочный набор Stellaris LM4F232 для CodeSourcery tools (с оrраничением по времени использования  30 дней) EKTLM4F232 Оценочный набор Stellaris LM4F232 дЛЯ Code Red Technologies Tools (с оrраничением по времени использования  90 дней) EKSLM4F232 Оценочный набор Stellaris LM4F232 дЛЯ Code Composer Studio'" IDE (код ПРивязан к плате) 
СПИСОК ЛИТЕРАТУРЬI 1. CortexM3 Technical Reference Manual (TRM): может быть заrружен с сайта компании ARM по адресу http://i nfocen ter. arт. coт/help/topic/coт. arт. doc. ddi033 7g/i ndex. h tт 1. 2. ARMv7M Architecture Application Level Reference Manual: может быть заrружен с сайта компании ARM по адресу www.arт. coт/products/CPUs/ ARM Cortex М3  У7. htтl. 3. CoreSight Technology System Design Guide: может быть заrружен с сайта компании ARM по адресу http://infocenter.arт.coт/help/topic/coт. arт.doc.dgiOO 12bIindex. htтl. 4. АМБА Specification: может быть заrружен с сайта компании ARM по адресу www.arт. coт/products/solutions/ AMBA Spec. htтl. s. AAPCS Procedure СаН Standard for the ARM Architecture: может быть заrружен с сайта компании ARM по адресу http://i nfocen ter. а rт. со т/help/top ic/co т . arт. doc. ihi 0042c/index. h tт 1. 6. RVCT 4.0 Compilation Tools Compiler User Guide: может быть заrружен с сайта компании ARM по адресу http://i п focen ter. arт. со т/help/topic/coт. arт. doc. dui 0205i/index. htтl. 7. ARM Application Note 179: CortexM3 Embedded Software Development: может быть заrружен с сайта компании ARM по адресу http://infocenter.arт.coт/help/topic/coт.arт.doc. daiO 179bIindex. htтl. 8. RVCT 4.0 Compilation Tools Compiler Reference Guide: может быть заrружен с сайта компании ARM по адресу http://infocenter.arт. coт/help/topic/coт.arт. doc.dui0348bIindex. htтl. 
ПРЕДМЕТНЫЙ УКАЭАТЕnЬ А AAPCS (стандарт) 178, 226 взаимодействие ассемблерноrо кода и Си  проrраммы 190 выравнивание стека на rраницу двойноrо слова 226 ACR (Auxiliary Control Register). СМ. Реrистр управления, дополнительный AFSR (Auxiliary Fault Status Register) 144, 449, 455 АНВ (Advanced Highperformance Bus) 95, 116, 164, 230 AHBAP 118, 269, 290 и режим BE8 112, 113 и режим BE32 112 мост AHBAPB 118, 123 сиrнал ошибки, причины 139 AIRCR (Application Interrupt and Reset Control Register) 131, 144, 264, 279, 445 АМВА (Advanced Microcontroller Bus Architecture) 116, 267 АР (Access Port). СМ. Порт доступа АРВ (Advanced Peripheral Bus) 96, 116, 120, 267 APBAP 269 APSR (Application Program Status Register) 41, 305,385,386 изменение при выполнении команд 71 и команда MSR 42,69 и традиционные команды Thumb 58 результат знаковоrо насыщения 83 флаrи для условных переходов 76 АТВ (Advanced Trace Bus) 119, 269, 280, 281 А ТВ funnel 269, 281 в Background region. СМ. Модуль защиты па мяти (MPU), «фоновая» область BASEPRI 23, 26, 43, 155 BE8. СМ. Порядок расположения байтов, обратный с неизменным расположе нием байтов BE32. СМ. Порядок расположения байтов, обратный с неизменным расположе нием слов BFAR (Bus Fault Address Register) 139, 449, 456 BFSR (Bиs Fault Status Register) 139, 172, 448, 461,462 Big Endian. СМ. Порядок расположения бай тов, обратный Bit Band. СМ. CortexM3, побитовый доступ Bus Fault. СМ. Отказ шины BusMatrix 118, 122 с CFSR (Configurable Fault Status Register) 455 CMSIS (Cortex Microcontroller Software Interface Standard) 82, 111, 183, 206 встроенные функции 154, 185, 187, 478 выrоды 189 и названия реrистров модуля MPU 241 области стандартизации 185 перенос существующих приложений 360 пример использования 188 структура 185 функции доступа к ядру 473 CONTROL 23, 44 CoreSight (архитектура) 32, 280 общие сведения 266 CortexA8 13, 15 CortexMO 304, 478 CortexM3 атрибуты памяти 96 возможности отладки 266 интерфейсы трассировки 269 интерфейсы шин 27,119 карта памяти 26, 93, 98 команда точки останова 276 команды 33,70,71,72,73,74,85 команды барьерной синхронизации 81 конвейер 114 контроллер NVIC 25 конфиrурация по умолчанию 98 межпроцессорный обмен 260 набор команд 375 обращения к невыровненным данным 107 отказы проrраммы. СМ. Отказ проrраммы отказы системы управления памятью. СМ. Отказ системы управления памятью отказы шины. СМ. Отказ шины отличия от CortexMO 304 пересылка данных 66 побитовый доступ 99 в проrраммах на Си 106 и данные разной разрядности 106 и семафоры 201 преимущества 99 поддержка вложенных прерываний 167 поддержка отладки 32 подключение порта доступа шины АНВ 290 
Предметный указатель · 531 порядок расположения байтов 111 преимущества 9,28,33,303 прерывания и исключения 30, 47 привилеrированный уровень доступа 24 приложения 18 различия между ревизиями 298 реrистр связи (LR) 40 реrистры 22, 37, 41 режимы отладки 271 режимы работы 24,45,311 сброс, виды и сиrналы 124 система трассировки 280 системный таймер. СМ. SYSTICK системы отладки 270 спящие режимы 31,35,255,302 стековые операции 49 сценарий компоновщика 468 счётчик команд 40 таблица векторов в CS3 328 типы исключений и их разрешение 438 тяжёлые отказы. СМ. Тяжёлый отказ указатель стека 37 уровни приоритета исключений 128 функции отладки 267 «цепочечная» обработка прерываний 168 Cortex Microcontroller Software Interface Standard. СМ. CMSIS CortexR4 13, 15 CS3 328, 329 CYCCNT. См. Модуль просмотра и трасси ровки данных (DWT), CYCCNT D DAP (Debug Access Port). СМ. Порт доступа к средствам отладки Data abort 138 DCode (шина) 28, 120, 299 DCRDR (Debug Core Register Data Register) 277,278,452 DCRSR (Debug Core Register Selector Register) 277,278,452 DEMCR (Debug Exception and Monitor Control Register) 273, 274, 453 DFSR (Debug Fault Status Register) 277, 279, 449,463 DHCSR (Debug Halting Control and Status Register) 272, 273, 451, 452 DP (Debиg Port). СМ. Порт отладки DWT (Data Watch and Trace unit). СМ. Mo дуль просмотра и трассировки дaH ных Е EPSR (Execution Program Status Register) 41, 171,305 ЕТМ (Embedded Trace Macrocell). СМ. BCTpO енная макроячейка трассировки EXCRETURN. СМ. Исключение, значение возврата F FAULTMASK 23, 26, 43, 154, 233 РРВ (Flash Patch and Breakpoint Unit). СМ. Модуль коррекции флэшпамяти и за дания точки останова н Hard Fault. СМ. Тяжёлый отказ HFSR (Hard Fault Status Register) 143, 449, 463 1 ICode (шина) 28, 120, 299 Inlinеассемблер 183, 222, 315, 332 Intrinsic. СМ. Встроенные функции Intrinsiсфункции. СМ. Встроенные функ ции IPSR (Interrupt Program Status Register) 41, 165,166,188,229 IRQ. СМ. Запрос прерывания IT (IFTHEN) 80, 171, 425 команды Thumb2 86 язык ассемблера 80 ITM (Instrumentation Trace Macrocell). СМ. Макроячейка инструментальной Tpac сировки J JTAGDP (JTAG Debug Port). СМ. Порт OT ладки JTAG L LabVIEW 361 виртуальный инструмент 362, 364, 365, 367,373 возможности 372 области применения 362 перенос на друrие процессоры ARM 373 разработка приложения 364 учебный проект 366 Literal pool 290 Little Endian. СМ. Порядок расположения байтов, прямой Lockup. СМ. Блокировка LR (link register). СМ. Реrистр связи LR (Link Register). СМ. Реrистр связи М MemManage Fault. СМ. Отказ системы управления памятью MMFAR (Memory Management Fault Address Register) 141, 449, 456 MMFSR (Memory Management Fault Status Register) 140, 172, 448, 460, 461 MPU (Memory Protection Unit). СМ. Модуль защиты памяти 
532 · Предметный указатель MSP (Main Stack Pointer). СМ. Указатель CTe ка, основной MSTKERR (Memory Management Stacking Error). СМ. Отказ системы управления памятью, ошибка заrрузки в стек MUNSTKERR (Memory Management Unstacking Error). СМ. Отказ системы управления памятью, ошибка извлече ния из стека N NMI (Nonmaskable Interrupt). СМ. Немаски руемое прерывание Nonbase Thread Enable 227,446 NVIC (Nested Vectored Interrupt Controller). СМ. Контроллер прерыва ний р РС (Program Counter). СМ. Счётчик команд (РС) PendSV. СМ. Исключения, PendSV РРБ (Private Peripheral Бus). СМ. Шина соб ственных периферийных устройств АНБ 95 АРБ 96 Prefetch abort 138 PRIMASK 23,26,43, 154,200 PSP (Process Stack Pointer). СМ. Указатель стека, процесса Q Q (флаr) 76, 83, 418 R RI3/SP. СМ. Указатель стека, R13 Retargeting. СМ. Перенаправление вывода ROM Table. СМ. Таблица ПЗУ RXEV 121,255,260 s Saturation. СМ. Насыщение SCS (System Control Space). СМ. Контроллер прерываний (NVIC), пространство управления системой SerialWire 267, 268 SleepOnExit 257 SP/RI3. СМ. Указатель стека, R13 Stacking error. СМ. Отказ системы управле ния памятью, ошибка заrрузки в стек; СМ. Отказ шины, ошибка за rрузки в стек STIR (Software Trigger Interrupt Register) 149, 161, 453 STKERR (Stacking Error). СМ. Отказ шины, ошибка заrрузки в стек Subregion. СМ. Модуль защиты памяти (MPU), подобласть SVC (команда и исключение) 144, 216, 229, 233 в приложениях 216 для вывода информации 217 и команда SWI 145 и Сипроrраммы 220 обработчик 227 SWDP (SerialWire Debug Port). СМ. Порт OT ладки Serial  Wire SWI (команда) 145, 314 SW]DP (SerialWire/JTAG Debug Port). СМ. Порт отладки Serial  Wire/]T AG System Control Space (SCS) 45 SYSTICK переключение контекста 146 реrистры 162 таймер 117,161,252,304 Т Tailchaining interrupt. СМ. CortexM3, «цe почечная»обработкапрерываний Timestamp. СМ. Инструментальная макроя чейка трассировки (ITM), временные отметки TPIU (Trace Port Interface Unit). СМ. Модуль интерфейса порта трассировки ТХЕУ 121, 260 u UAL (Unified Assembler Language). СМ. Уни фицированный язык ассемблера (UAL) UFSR (Usage Fault Status Register) 142, 448, 462,463 Unstacking. СМ. Быrрузка из стека UNSTKERR (Unstacking Error). СМ. Отказ шины, ошибка извлечения из стека Untacking error. СМ. Отказ системы управле ния памятью, ошибка извлечения из стека; СМ. Отказ шины, ошибка из влечения из стека Usage Fault. СМ. Отказ проrраммы v Vector catch 273 Virtual Instrument (VI). СМ. LabVIEW, вирту альный инструмент VTOR (Vector Table Offset Register) 134, 306, 444 w WIC (Wakeup Interrupt Controller). СМ. KOH троллер «пробуждающих» прерыва ний х xPSR 23,42,226,314 
Предметный указатель · 5ЗЗ А Атрибуты доступа к памяти 96 Б Барьерная синхронизация 81 Блокировка 231,457 в Вектор сброса 54 Возврат из прерывания 166, 310, 314 Встроенная макроячейка трассировки (ЕТМ) 32,94,118,269,281,285 Встроенные функции 478 CMSIS. См. CMSIS, встроенные функции компиляторы 182 Встроенный ассемблер 183, 220, 315, 457 Выборка вектора. См. Таблица векторов, BЫ борка вектора Выравнивание стека 226, 300, 304 r rруппировка приоритетов 130, 132, 133, 153 3 Задержка обработки прерываний 26, 34, 171, 230 Запрос прерывания 30, 149, 210 и Извлечение из стека возврат из прерывания 166 и отказ шины 138 Инструментальная макроячейка трассиров ки (ITM) 119 аппаратная трассировка 285 временные отметки 285 проrраммная трассировка 284 Исключение вектор 166 выход из исключения 166, 169 значение возврата 166, 169, 173 обновление реrистров 166 обработка 167, 168, 172 обработчик исключения 166,169 сохранение контекста 164, 439 типы исключений 438 Исключения PendSV 144 и команда SVC 144 переключение контекста 148 SVCall 144 SYSTICK 161, 354 вектор 134 ВЫХОД 136 значение возврата 224 и прерывания 30, 47 и режимы работы ARM7TDMI 311 исключения отказов 138 назначение приоритетов 206 обработка 30,49,143,226 обработчик 353 обработчик исключения 24, 45, 103, 134, 210 реrистры конфиrурации 156 таблица векторов 49, 134 типы исключений 48, 126 уровни приоритета 128 к Карта памяти 26, 81, 93, 98, 119, 180, 234, 309,351 Конвейер 114, 315 Контроллер прерываний 149 возможности отладки 278 и ядро ЦПУ 117 обращение к реrистрам 208 разрешение и запрещение прерываний 208 реrистр SCR 256, 445 реrистры 440 реrистры модуля SYSTICK 252 реrистры состояния отказов 138 таблица ПЗУ 291 Контроллер прерываний (NVIC) возможности 25 пространство управления системой (SCS) 96, 149 реrистры SYSTICK 149 Контроллер «пробуждающих» прерываний (WIC) 32, 117, 258, 302 М Макроячейка инструментальной трассиров ки (ITM) 33, 94, 283 интерфейс АТВ 121 Младшие реrистры 37 Модуль защиты памяти (MPU) 11, 15,28,98, 118, 140, 234, 311 настройка 241 подобласть 238,248 реrистры 235 «фоновая» область 235, 248 Модуль интерфейса порта трассировки (TPIU) 32,94,119,269,280,286 Модуль коррекции флэшпамяти и задания точки останова (РРВ) 33, 94, 119, 277, 280,288 Модуль просмотра и трассировки данных (DWT) 33, 94, 119, 281 CYCCNT 281 и модуль ЕТМ 286 и модуль ITM 285 Монитор отладки, исключение 32, 271, 276 Монопольный доступ 109 и семафоры 198 
534 . Предметный указатель н Набор команд 33, 70, 71, 72, 73, 74, 85, 375 Насыщение команды 82, 83 операция 82 Невыровненные пересылки 107 и шина DCode 120 Немаскируемое прерывание (NMI) 34, 48 двойной отказ 231 и FIQ 312 о Операции заrрузки/сохранения 99, 171,315, 461,462 Отказ данных (data abort) 127, 138 Отказ предвыборки (prefetch abort) 127, 138 Отказ проrраммы 141, 156, 173 реrистр состояния. СМ. UFSR (Usage Fault Status Register) Отказ системы управления памятью 140, 156 ошибка заrрузки в стек 172,460,461 ошибка извлечения из стека 172,460,461 реrистр адреса. СМ. MMFAR (Memory Management Fault Address Register) реrистр состояния. СМ. MMFSR (Memory Management Fault Status Register) Отказ шины 138,156 ошибка заrрузки в стек 138, 172 ошибка извлечения из стека 138, 172 реrистр адреса. СМ. BFAR (Bus Fault Address Register) реrистр состояния. СМ. BFSR (Bus Fault Status Register) «точный» и «неточный» 139 п Переключение контекста 146 в простых ОС 225 пример 148 Перенаправление вывода 330,341,343 Пересылка данных 66 Перехват вектора прерывания 273 Переход со ссылкой 75 табличный 90, 202 Пользовательский режим 149,227 Порт доступа 268 Порт доступа к средствам отладки (DAP) 32, 118, 120, 267, 268 Порт отладки (DP) 32, 268 Порт отладки JTAG (JTAGDP) 32 Порт отладки SerialWire/JTAG (SWJDP) 32, 118, 300 Порт отладки SerialWire (SWDP) 32 Порядок расположения байтов 111 обратный 112 с неизменным расположением байтов (CortexM3) 112 с неизменным расположением слов (ARM7) 112, 310 прямой 111 Привилеrированный режим 85, 149, 200, 227 Приоритет rруппы 130, 133 Пространство управления системой. СМ. System Control Space (SCS) Профилирование (модуль DWT) 281 Пул констант 290 р Реrистр маскирования прерываний BASEPRI 43 FAULTMASK 43 PRIMASK 43 Реrистр связи (LR) 169 R14 23, 40 значение 456 команды перехода со ссылкой 75 обновление 166, 169 сохранение 76 сохранение в стеке 164, 165 Реrистр состояния выполнения. СМ. EPSR (Execution Program Status Register) Реrистр состояния прерывания. СМ. IPSR (Interrupt Program Status Register) Реrистр состояния приложения. СМ. APSR (Application Program Status Register) Реrистр специальноrо назначения 23,41,85 APSR. СМ. APSR (Application Program Status Register) BASEPRI 23, 26, 43, 155 CONTROL 23, 44 EPSR. СМ. EPSR (Execution Program Status Register) FAULTMASK 23, 26, 43, 154, 233 IPSR. СМ. IPSR (Interrupt Program Status Register) PRIMASK 23, 26, 43, 154, 200 использование с командами MRS и MSR 85 Реrистр управления. СМ. Реrистр специаль Horo назначения, CONTROL Реrистр управления, дополнительный 301, 303 Реrистр управления прерываниями и сбро сом. СМ. AIRCR (Application Interrupt and Reset Control Register) Реrистр управления системой. СМ. Контрол лер прерываний, реrистр SCR Реrистры младшие 37 старшие 37 Реrистры отладки DCRDR (Debug Core Register Data Register) 277,278,452 DCRSR (Debug Core Register Selector Register) 277, 278, 452 
Предметный указатель · 535 DEMCR (Debug Exception and Monitor Control Register) 273, 274, 453 DFSR (Debug Fault Status Register) 277, 279, 449 DHCSR (Debug Halting Control and Status Register) 272, 273, 451, 452 Реrистры состояния проrраммы 41,164 APSR. СМ. APSR (Application Program Status Register) EPSR. СМ. EPSR (Execution Program Status Register) IPSR. СМ. IPSR (Interrupt Program Status Register) PSR 23,42,226,314 битовые поля 42 флаrи 76 с Сброс вектор 54,322 как метод восстановления после отказов 144 ручной сброс системы 264 сиrналы 124 управление 279 Семафоры использование побитовоrо доступа 201 операции монопольноrо доступа 109, 198, 314 Системный таймер. СМ. SYSTICK Спящие режимы. СМ. CortexM3, спящие pe жимы Старшие реrистры 37 Субприоритет 130 Сценарий компоновщика 468 Сценарий линкера. СМ. Сценарий компо новщика Счётчик команд (РС) R15 23, 40 значение 315 обновление 166 сохранение в стеке 456 т Таблица векторов 49, 213, 331 выборка вектора 138, 166, 172, 230 и исключения 134 модификация 353 настройка и разрешение прерываний 205 отличия от традиционных процессоров ARM 313 перемещение таблицы 213 реrистр смещения таблицы. СМ. VTOR (Vector ТаЫе Offset Register) ремаппинr 310 Таблица ПЗУ 119, 291 Табличный переход 90, 202 и обработчик SVCall 217 Точка останова 33, 276, 287 и функция Flash Patch 33, 119, 288 установка/снятие 349 Трассировка аппаратная. СМ. Инструментальная Ma кроячейка трассировки (ITM), аппа  ратная трассировка проrраммная. СМ. Инструментальная Ma кроячейка трассировки (ITM), про rраммная трассировка Тяжёлый отказ предотвращение блокировки 232 реrистр состояния. СМ. HFSR (Hard Fault Status Register) уровень приоритета 128 у Указатель стека 226, 229 R13 (SP) 23, 37 двухстековая модель 52 команды MRS и MSR 54 обновление 166 операции со стеком 49 основной (MSP) 23,38,40,52,53,164,204 процесса(РSР) 23,38,40,53,164 Унифицированный язык ассемблера (UAL) 58 Условное выполнение. СМ. IT (IFTHEN) ц Цикл сброса 54 ш Шина АНБ. СМ. АНБ (Advanced High performance Бus) АРБ. СМ. АРБ (Advanced Peripheral Бus) АТБ. СМ. АТБ (Advanced Trace Бus) РРБ. СМ. РРБ (Private Peripheral Бus) Шина собственных периферийных устройств (РРБ) 28 внешняя шина РРБ 120 
Джозеф Ю Ядро CortexM3 компании ARM Полное руководство rлавный редактор В. М. Халuкеев Ответственный редактор Т. Е. Брод Верстальщик А. ю. Анненков Подписано в печать 15.03.2012. Формат 70хl00/16. Бумаrа офсетная. rарнитура «Minion Pro». Печать офсетная. Объем 34,5 п. л. Усл. п. л. 44,7 Тираж 1000 экз. Код CortexM3. Заказ NQ M355. Издательский дом «ДодэкаХХI» ОКП 95 3000 105318 Москва, а/я 70 Тел.lфакс: (495) 3660456, 3652695 EmaH: red@dodeca.ru Отпечатано в полном соответствии с качеством предоставленноrо электронноrо ориrиналмакета в типоrpафии филиала ОАО «ТАТМЕДИА» «ПИК «ИделПресс». 420066, r. Казань, ул. Декабристов, 2. E таН: idelpress@mail.ru