Академический Документы
Профессиональный Документы
Культура Документы
по семейству
процессоров Cortex-M
Эта страница, намеренно
оставленная незаполненный
Руководство разработчика
по семейству
процессоров Cortex-M
Второй выпуск
Trevor Martin
Никакая часть этой публикации не может быть воспроизведена или передана в любой форме или каким-либо образом,
электронная или механическая, включая фотокопирование, запись, или любую систему хранения информации и
поисковую систему, без разрешения в письменной форме от издателя. Детали о том, как искать разрешение,
дополнительную информацию о политиках полномочий Издателя и наших расположениях с организациями, такими
как Центр по проверке авторских прав и Агентство по Лицензированию Авторского права, могут быть найдены в
нашем веб-сайте: www.elsevier.com/permissions.
Эта книга и отдельные вклады, содержавшиеся в нем, защищены под авторским правом Издателем (кроме того, как
может быть отмечен здесь).
Уведомления
Знание и лучшая практика в этом поле постоянно изменяются. Поскольку новое исследование и опыт расширяют наше
понимание, изменения в методах исследования, профессиональных методах, или лечение может стать необходимым.
Практики и исследователи должны всегда полагаться на свой собственный опыт и знания в оценке и
использовании любой информации, методов, составных объектов или экспериментов, описанных здесь. В
использовании такой информации или методов они должны помнить свою собственную безопасность и
безопасность других, включая стороны, за которые они несут профессиональную ответственность.
К полному объему закона, ни Издатель, ни авторы, участники или редакторы, принимают любую ответственность
за любую травму и/или повреждение людям или свойству как ответственность за качество выпускаемой
продукции, небрежность или иначе, или от любого использования или операции любых методов, продуктов,
инструкций или идей, содержавшихся в материале здесь.
Данные каталогизации в публикации Британской библиотеки
Запись каталога для этой книги доступна из Британской библиотеки.
ISBN: 978-0-08-100629-0
vii
Содержание
viii
Когда эта книга была сначала опубликована в 2013, ARM питал тихий оборот
во встроенной промышленности. Во время запуска второго выпуска ARM является
ясно архитектурой победы с более чем 3 000 Коры ARM основанные на процессоре
микроконтроллеры на рынке и непараллельном росте.
xvii
Предисловие
xviii
Javier Orensanz
Предисловие
ARM сначала представил семейство процессоров Cortex-M в 2004. С тех пор
процессор Cortex-M получил широкое принятие как хорошо масштабируемый
процессор общего назначения для маленьких микроконтроллеров. Во время записи
существует хорошо более чем 3 000 стандартных устройств, которые показывают
процессор Cortex-M. Они доступны от многих ведущих полупроводниковых
поставщиков, и темп разработки не показывает знака замедления. Семейство
процессоров Cortex-M теперь установило себя как промышленный стандарт. Как
таковой знание того, как использовать его, становится необходимым навыком для
профессиональных разработчиков. Эта книга предназначается, поскольку и введение
в процессор Cortex-M и руководство по методам раньше разрабатывали прикладное
программное обеспечение для работы ее. Книга записана как учебное руководство, и
главы предназначаются, чтобы работаться через в порядке. Каждая глава содержит
много примеров, которые представляют ключевые принципы, обрисованные в общих
чертах в этой книге с помощью минимального объема кода. Каждый пример
разработан, чтобы быть созданным с пробной версией Комплекта разработчика
Микроконтроллера для ARM. Эти примеры разработаны для выполнения в средстве
моделирования, таким образом, можно использовать большинство рук на примеры в
этой книге без потребности в любых дополнительных аппаратных средствах.
Глава 11 "Test Driven Development": В этой главе мы смотрим на то, как использовать
среду тестирования разработчика под названием Единица с Основанным на Cortex-M
микроконтроллером.
xxi
Эта страница, намеренно
оставленная незаполненный
CHPTER1
Введение в Cortex-M
Семейство процессоров
Так как первый выпуск этой книги был опубликован в 2013, число Кремниевых
Поставщиков, обеспечивающих Основанные на Cortex-M устройства, почти удвоилось, и
число вариантов микроконтроллера - теперь хорошо более чем 3 000 и продолжает
увеличиваться. Десятилетие назад я был знаком с основными характеристиками всех
основных используемых микроконтроллеров Cortex-M. Сегодня я изо всех сил пытаюсь не
отставать от диапазона доступных устройств, могла быть старость, конечно, но Вы
получаете изображение. В этой книге мы собираемся узнать о самом процессоре Cortex-M
и также методах программного обеспечения, требуемых разработать эффективный и
эффективный код приложения. Эта книга расположена как учебное руководство и лучше
работать через него глава главой. Каждая глава содержит много рук на примеры, и Вы
будете учиться намного больше путем фактического выполнения примеров.
Профили коры
В 2004 ARM представил свое новое семейство Коры процессоров. Семейство
процессоров Коры подразделено на три различных профиля. Каждый профиль
оптимизирован для различных сегментов приложений встроенных систем (Рис. 1.1).
Рисунок 1.1
Семейство процессоров Коры имеет три Приложения профилей, Реальное время и
Микроконтроллер.
Руководство разработчика по семейству процессоров Cortex-M.
DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00001-3 1
© 2016 Elsevier Ltd. Все права защищены.
2 Главы 1
Рисунок 1.2
Профиль Cortex-M имеет пять различных вариантов с общей моделью
программистов.
Кора-M3
Сегодня, Кора-M3 наиболее широко используется из всех процессоров Cortex-M. Это
частично, потому что это было доступно не только в течение самого долгого
промежутка времени, но также и это отвечает требованиям для микроконтроллера
общего назначения. Это обычно означает, что имеет хороший баланс между высокой
производительностью, низкой потребляемой мощностью и низкой стоимостью (Рис.
1.3).
4 Главы 1
Рисунок 1.3
Кора-M3 была первым доступным устройством Cortex-M. Это - полный процессор
для микроконтроллера общего назначения.
Рисунок 1.4
Кора-M3 ЦП имеет трехэтапный конвейер с предсказанием ветвлений.
Рисунок 1.5
Кора-M3 ЦП может выполнить большинство инструкций в единственном цикле. Это
достигается конвейером, выполняющим одну инструкцию, декодируя
следующую, и выбирающую одну треть.
Введение в семейство процессоров Cortex-M 5
Рисунок 1.6
Архитектура отладки Cortex-M независима от ЦП и содержит до трех единиц
трассировки в реальном времени в дополнение к блоку
управления выполнения.
Рисунок 1.7
Более ранний ARM ЦП имел две системы команд ARM (32 бита) и Ползунок (16
битов). Процессоры Cortex-M имеют систему команд под названием Ползунок 2,
который является смешением 16-разрядных и 32-разрядных инструкций.
Рисунок 1.8
Кора-M3 и Ползунок M4 2 системы команд достигают более высоких уровней
производительности или, чем Ползунок или, чем система команд
ARM, работающая на ARM7.
Рисунок 1.9
Ползунок 2 системы команд Коры-M3 и-M4 достигает той же плотности кода как
Ползунок ARM7 (16 битов) система команд.
10 Глав 1
Все процессоры Cortex-M используют Ползунок 2 системы команд (Рис. 1.10). Кора-
M0 использует подмножество всего 56 инструкций, и Кора-M4 добавляет DSP,
единственную инструкцию несколько данных (SIMD) и инструкции с плавающей
точкой.
Рисунок 1.10
Ползунок 2 масштаба системы команд из 56 инструкций относительно Коры-M0,-
M01 до 169 инструкций относительно Коры-M4.
Кора-M0
Кора-M0 была представлена спустя несколько лет после того, как Кора-M3 была
выпущена и была во всеобщем употреблении. Кора-M0 является намного меньшим
процессором, чем Кора-M3 и может быть всего 12 логическими элементами K в
минимальной конфигурации. Кора-M0 обычно разрабатывается в микроконтроллеры,
которые предназначаются, чтобы быть очень недорогими устройствами и/или
предназначаются для операции низкой мощности. Однако важная вещь состоит в том,
что, после того как Вы понимаете Кору-M3, у Вас не будет проблемы с помощью
Коры-M0; различия главным образом очевидны для высокоуровневых языков (Рис.
1.11).
Введение в семейство процессоров Cortex-M 11
Рисунок 1.11
Кора-M0 является уменьшенной версией Коры-M3, все еще сохраняя ту же модель программистов.
Рисунок 1.12
Кора-M0 разработана для поддержки дежурных режимов низкой мощности. По
сравнению с 8-разрядным или 16-разрядным MCU это может остаться в режиме
ожидания в течение намного более длительного времени, потому что это должно
выполнить меньше инструкций, чем 8-/16-bit устройство для достижения того же
результата.
Как Кора-M3, Кора-M0 также имеет функцию WIC. В то время как WIC связан с
процессором Cortex-M0, он может быть помещен в другой домен питания в
микроконтроллере (Рис. 1.13).
Рисунок 1.13
Процессор Cortex-M разработан для перехода к режимам низкой мощности. WIC
может быть помещен в отдельный домен питания.
Кора-M01
Процессор Cortex-M01 является вторым поколением сверхнизкое питание ядро
Cortex-M. Это имеет полную совместимость системы команд с Корой-M0,
разрешающей Вам использовать тот же компилятор и отладчики. Как Вы могли бы
ожидать, Кора-M01 имеет некоторые важные улучшения по Коре-M0 (Рис. 1.14).
14 Глав 1
Рисунок 1.14
Кора-M01 полностью совместима с Корой-M0. Это имеет больше расширенных
функций, больше вычислительной мощности и более низкой
потребляемой мощности.
Рисунок 1.16
Порт I/O позволяет выборку в течение одного цикла к GPIO и
периферийным регистрам.
Кора-M01 также имеет улучшенную архитектуру отладки по сравнению с Корой-M0.
Поскольку мы будем видеть в Главе 7 “Отладку с CoreSight”, это поддерживает тот же
доступ в режиме реального времени к периферийным регистрам и SRAM как Кора-M3
и Кора-M4. Кроме того, Кора-M01 имеет новую функцию отладки, названную “Микро
Буфером трассировки” (MTB) (Рис. 1.17). MTB
16 Глав 1
Рисунок 1.17
Микро Буфер трассировки может быть настроен для записи выполняемых инструкций в
раздел пользователя SRAM. Это может быть считано и отображено как
трассировка инструкции в отладчике ПК.
Кора-M4
В то время как Кора-M0 может считаться Корой-M3 минус некоторые функции, Кора-
M4 является расширенной версией Коры-M3 (Рис. 1.18). Дополнительные функции на
Коре-M4 фокусируются на поддержке алгоритмов DSP. Типичные алгоритмы
являются преобразованиями, такими как быстрое преобразование Фурье (FFT),
цифровые фильтры, такие как конечная импульсная характеристика (FIR) фильтрует, и
алгоритмы управления, такие как контур управления Пропорционального внутреннего
дифференциала (PID). С ее функциями DSP Кора-M4 создала новое поколение
основанных на ARM устройств, которые могут быть названы контроллерами
цифрового сигнала (DSC). Эти устройства позволяют Вам разрабатывать устройства,
которые комбинируют функции типа микроконтроллера с обработкой сигналов в
реальном времени. В Главе 8 “Практический DSP для Коры-M4 и Коры-M7” мы
посмотрим на расширения DSP Коры-M4 более подробно и также как создать
программное обеспечение, которое комбинирует обработку сигналов в реальном
времени с типичным событийно-ориентированным кодом микроконтроллера.
Рисунок 1.18
Кора-M4 полностью совместима с Корой-M3, но представляет аппаратный
сопроцессор для операций с плавающей точкой и
дополнительные инструкции по DSP.
Операция Инструкция
16 316 5 32 SMULBB, SMULBT, SMULTB, SMULTT
16 316 1 32 5 32 SMLABB, SMLABT, SMLATB, SMLATT
16 316 1 64 5 64 SMLALBB, SMLALBT, SMLALTB, SMLALTT
16 332 5 32 SMULWB, SMULWT
(16 3 32) 1 32 5 32 SMLAWB, SMLAWT
(16 3 16) 6 (16 3 16) 532 SMUAD, SMUADX, SMUSD, SMUSDX
(16 3 16) 6 (16 3 16) 1 32 5 32 SMLAD, SMLADX, SMLSD, SMLSDX
(16 3 16) 6 (16 3 16) 1 64 5 64 SMLALD, SMLALDX, SMLSLD, SMLSLDX
32 3 32 5 32 MUL
32 6 (32 3 32) 532 MLA, MLS
32 3 32 5 64 SMULL, UMULL
(32 3 32) 1 64 564 SMLAL, UMLAL
(32 3 32) 1 32 132 564 UMAAL
32 6 (32 3 32) 532 (верхний) SMMLA, SMMLAR, SMMLS, SMMLSR
(32 3 32) 5 32 (верхний) SMMUL, SMMULR
18 Глав 1
Инструкции по DSP
Кора-M4 имеет ряд инструкций SIMD, нацеленных на поддержку алгоритмов DSP.
Эти инструкции позволяют много параллельных арифметических операций в
единственном цикле процессора (Рис. 1.19).
Рисунок 1.19
Инструкции SIMD могут выполнить несколько вычислений в единственном
цикле.
Рисунок 1.20
MP3 декодирует сравнительный тест.
Кора-M7
Во время записи последнего процессора Cortex-M, который будет выпущен ARM,
Кора-M7. Кора-M7 является самым высоким в настоящее время доступным
процессором Cortex-M7 производительности. Это - на самом деле что-то вроде
преуменьшения. Числа сравнительного теста для Коры-M7 по сравнению с Корой-M4
показывают ниже. Обратите внимание на то, что эти числа показывают на МГц
частоты ЦП. А также значительно превзойдя Кору-M4 по характеристикам Кора-M7
может работать при очень верхних частотах. Короче говоря это оставляет Кору-M4 в
пыли. Однако Кора-M7 все еще поддерживает модель программиста Cortex-M
поэтому при использовании более раннего процессора Cortex-M, перемещающегося в
Кору-M7, не основная проблема (Рис. 1.21).
20 Глав 1
Рисунок 1.21
Кора-M4 по сравнению со сравнительным тестом Коры-M7.
Рисунок 1.22
Процессор коры-M7.
Введение в семейство процессоров Cortex-M 21
Заключение
Эта книга действительно затрагивает две темы. Введение в аппаратные средства
процессора Cortex-M и также во введении в разработку программного обеспечения
для Основанных на Cortex-M микроконтроллеров. С введением процессора Cortex-M у
нас теперь есть недорогая аппаратная платформа, которая способна к поддержке более
сложной разработки программного обеспечения и в прошлое десятилетие видела
принятие RTOSs, и библиотеки промежуточного программного обеспечения должны
были поддерживать более сложные периферийные устройства, найденные на
устройствах Cortex-M. Таким образом вместе с пониманием функций низкого уровня
процессоров Cortex-M мы также должны использовать более сложные методы
проектирования (Рис. 1.23).
22 Главы 1
Рисунок 1.23
Производительность и питание фигурируют для семейства
процессоров Cortex-M.
CHPTER2
Разработка программного
обеспечения для
Семейство Cortex-M
Введение
Одно из больших преимуществ использования процессора Cortex-M - то, что оно
имеет широкую и растущую поддержку средства разработки диапазона. Существуют
наборы инструментальных средств, доступные максимум на уровне нулевых
нескольких тысяч долларов стоимости в зависимости от глубины Ваших карманов и
типа приложения, которое Вы разрабатываете. Сегодня существует пять основных
наборов инструментальных средств, которые используются для разработки Cortex-M
(Таблица 2.1).
Рисунок 2.1
Установка Ядра MDK-ARM содержит IDE, компилятор и отладчик.
Поддержка устройства и промежуточного программного
обеспечения добавляется через программные пакеты.
Программные пакеты
MDK-ARM установлен как базовый набор инструментальных средств. Это состоит из
IDE µVision, компилятора и отладчика плюс утилита, названная установщиком
пакета. Базовый набор инструментальных средств не содержит поддержки
определенных микроконтроллеров Cortex-M. Поддержка определенного семейства
микроконтроллеров Cortex-M установлена через систему программного пакета.
Установщик пакета позволяет Вам выбирать и устанавливать поддержку семейства
микроконтроллеров. После того, как выбранный,
“Пакет Семейства Устройств” будет загружен с веб-сайта Репозитория Пакета и
установлен в набор инструментальных средств. Эта система программного пакета
может также использоваться для распределения библиотек программного
обеспечения и других компонентов программного обеспечения. Мы посмотрим на
то, как сделать компонент программного обеспечения для повторного использования
кода в Главе 12 "Software Components".
Учебные упражнения
Существует несколько основных причин для использования MDK-ARM как среда
разработки для этой книги. Во-первых, это включает ARM “C” компилятор, который
является промышленным ссылочным компилятором для процессоров ARM. Во-
вторых, это включает средство моделирования программного обеспечения который
модели каждый из процессоров Cortex-M и периферийных устройств для диапазона
Основанных на Cortex-M микроконтроллеров. Это позволяет Вам выполнять
большинство учебных примеров в этой книге без потребности в аппаратном
отладчике или оценочной плате. Средство моделирования является очень хорошим
путем к
Разработка программного обеспечения для семейства Cortex-M 25
изучите, как каждый процессор Cortex-M работает, поскольку можно получить так же
очень подробную отладочную информацию от средства моделирования как от
аппаратного отладчика. MDK-ARM также включает первый RTOS для поддержки
спецификации CMSIS-RTOS. Мы будем видеть больше из этого в Главе 9 “CMSIS-
RTOS”, но это - в основном универсальный API для Cortex-M RTOS. В то время как
мы можем использовать средство моделирования для экспериментирования с
различными процессорами Cortex-M, там прибывает точка, когда Вы захотите
выполнить свой код некоторых реальных аппаратных средств. Теперь существует
много очень недорогих модулей, которые включают аппаратные средства отладчика.
Приложение предоставляет URL веб-сайтам, где эти платы могут быть куплены. В
Главе 6 “Процессор Коры-M7”, мы посмотрим на Кору-M7, и практические примеры
будут выполнены на плате исследования STM32F7. Это - недорогая оценочная плата и
широко доступно от большинства поставщиков каталога электроники (Рис. 2.2).
Рисунок 2.2
Недорогие модули Cortex-M включают плату Исследования ST32F7. Мы будем
использовать это управление по Коре-M7 и аппаратному
осуществлению отладки.
Установка
Для практических упражнений в этой книге мы должны установить MDK-ARM
облегченный набор инструментальных средств и “пакеты” Поддержки Семейства
Устройств для микроконтроллеров, которые мы будем использовать и учебный пакет
в качестве примера.
26 Глав 2
Рисунок 2.3
Используйте установщик пакета для загрузки файлов поддержки для семейства
STM32F1 микроконтроллеров.
Разработка программного обеспечения для семейства Cortex-M 27
Проект Blinky
В этом примере мы собираемся разработать простой проект под названием Blinky.
Код в этом проекте разработан для чтения напряжения с помощью ADC
микроконтроллера. Значение, полученное из ADC, затем отображено как
гистограмма на маленьком жидкокристаллическом дисплее (Рис. 2.4).
Жидкокристаллический дисплей
Микро
Напряжение на
ADC1 channel1
8 светодиодов на GPIO B
Рисунок 2.4
Аппаратные средства проекта Blinky состоят из аналогового источника
напряжения, внешнего жидкокристаллического
дисплея и банка светодиодов.
Рисунок 2.5
Закройте любой открытый проект.
Запустите новый проект путем выбора проекта Project\new µVision (Рис. 2.6).
Рисунок 2.6
Создайте новый проект и сохраните его в Первый Каталог проекта.
30 Глав 2
Рисунок 2.7
Выберите STM32F103RB из базы данных устройства.
После того как Вы выбрали каталог проекта и сохранили название проекта, новое
диалоговое окно с базой данных устройства будет запущено. Здесь, мы должны
выбрать микроконтроллер, который мы собираемся использовать для этого проекта.
Переместитесь по базе данных устройства и выберите Микроэлектронику ST, “Ряд
STM32F103” и затем STM32F103RB и нажмите "OK". Это настроит проект для этого
устройства; это включает установку корректных параметров компилятора, файла
сценария компоновщика, имитационной модели, соединения отладчика и алгоритмов
программирования Flash.
При выборе STM32F103RB нажать "OK".
Теперь, IDE отобразит “Среду выполнения” (RTE) менеджер. RTE позволяет Вам
выбирать компоненты программного обеспечения, которые были установлены через
систему пакета и добавляют их к нашему проекту. Это позволяет Вам создавать
сложные программные платформы очень быстро. Для справки на любом из
компонентов программного обеспечения нажмите на синюю ссылку в столбце
описания (Рис. 2.8).
Разработка программного обеспечения для семейства Cortex-M 31
Рисунок 2.8
Менеджер по Среде выполнения позволяет Вам добавлять компоненты
программного обеспечения к своему проекту быстро
создать разработку “платформа”.
Рисунок 2.9
Выберите компоненты “Ядра” и “Запуска”.
32 Главы 2
Рисунок 2.10
Компоненты поддержки платы требуют, чтобы субкомпоненты работали. Пока это не
разрешено, “sel”. Столбец будет окрашен в Оранжевый (Темно-Серый
в печатных версиях).
Окно вывода проверки теперь показывает нам, что компоненты поддержки платы
требуют некоторых дополнительных субкомпонентов (Рис. 2.11).
Рисунок 2.11
Функции светодиодного индикатора требуют, чтобы драйвер GPIO был
добавлен к проекту.
Разработка программного обеспечения для семейства Cortex-M 33
Для добавления в драйвере GPIO, можно или открыть раздел Device RTE и вручную
добавить в драйвере GPIO или просто нажать кнопку твердости RTE, и все
зависимости компонента будут разрешены автоматически (Рис. 2.12).
Рисунок 2.12
Выберите файл поддержки GPIO вручную или нажмите кнопку твердости для
добавления необходимых компонентов
автоматически.
Рисунок 2.13
Первоначальный проект с выбранными компонентами
программного обеспечения.
Рисунок 2.14
Конфигурационные файлы могут быть просмотрены как текст или как
мастера конфигурации.
34 Главы 2
Рисунок 2.15
Мастер конфигурации позволяет Вам просматривать и изменять #defines в заголовочном
или исходном файле.
Рисунок 2.16
Справка набора инструментальных средств.
Разработка программного обеспечения для семейства Cortex-M 35
Рисунок 2.17
Справка компонента программного обеспечения.
Рисунок 2.18
Добавьте существующий файл к исходной группе проекта.
36 Глав 2
Это откроет диалоговое окно “Add files to Group”. В диалоговом окне добавьте файл
проекта Blinky.c (Рис. 2.19).
Рисунок 2.19
Добавьте Blinky.c.
Рисунок 2.20
Завершенный проект.
Разработка программного обеспечения для семейства Cortex-M 37
Рисунок 2.21
Разработайте проект.
Это скомпилирует каждый из “.c” модулей в свою очередь и затем соединит их для
создания заключительной прикладной программы. Окно вывода показывает
результат процесса сборки и сообщает о любых ошибках или предупреждениях
(Рис. 2.22).
Рисунок 2.22
О заключительном размере программы сообщают в Окне вывода
Сборки.
Раздел Описание
Код Размер исполняемого изображения
Данные RO Размер кодовых констант во Флэш-памяти
Размер инициализированной переменной
Данные RW в SRAM
Размер на неинициализированных
Данные ZI переменных в SRAM
Если об ошибках или предупреждениях сообщат в окне сборки, нажимающем на них,
то возьмет Вас к строке кода в окне редактора.
38 Глав 2
Рисунок 2.23
Откройте глобальные опции проекта.
Это может быть сделано в меню проектов путем щелчка правой кнопкой по названию
проекта и выбора “Опций для Цели” или путем выбора той же опции в меню проектов из
основной панели инструментов (Рис. 2.24).
Рисунок 2.24
Целевое меню определяет карту распределения памяти проекта.
Рисунок 2.25
Выберите средство моделирования и имитационную модель
STM32F103RB.
Рисунок 2.26
Откройте файловый менеджер для выбора сценария
моделирования.
40 Глав 2
Рисунок 2.27
Добавьте сценарий моделирования.
Рисунок 2.28
Запустите отладчик.
Рисунок 2.29
Представление отладки.
Рисунок 2.30
Окно Register.
Рисунок 2.31
Окно Disassembly.
Поскольку его имя подразумевает, окно Disassembly покажет Вам список ассемблеров
низкого уровня, чередованный с высокоуровневым "C" листингом кода. Одна из
больших достопримечательностей семейства Cortex-M - то, что весь Ваш код проекта
может быть написан на высокоуровневом языке, таком как “C\C11”. Вы никогда или
очень редко не должны писать ассемблерные подпрограммы низкого уровня. Однако
полезно смочь “прочитать” ассемблерный код низкого уровня для наблюдения то, что
делает компилятор. Окно дизассемблирования показывает абсолютный адрес текущей
команды, затем, это показывает Код операции, это - или 16-разрядная инструкция или
32-разрядная инструкция. Необработанный OP
Разработка программного обеспечения для семейства Cortex-M 43
Рисунок 2.32
Окно Editor.
Окно исходного кода имеет подобное расположение окно дизассемблирования. Это окно
просто отображает высокоуровневый "C" исходный код. Текущее местоположение
счетчика команд показывает желтая стрелка в левом поле. Blue Arrow показывает
местоположение курсора. Как окно дизассемблирования, темно-серые блоки указывают на
местоположение исполняемых строк кода. Исходное окно позволяет Вам иметь много
открытых модулей проекта. Каждый исходный модуль может быть достигнут путем
нажатия на вкладку наверху окна.
Рядом с командным окном группа окон часов. Эти окна позволяют Вам
просматривать локальные переменные, глобальные переменные и необработанную
память (Рис. 2.34).
Рисунок 2.34
Переменное окно часов.
Рисунок 2.35
Панель инструментов Debugger.
Рисунок 2.36
Точка останова отображена как красная точка (Рядом со строкой
53).
Рисунок 2.37
Установите точку останова на основном цикле с условием продолжения. Если Вы
добираетесь здесь, код инициализации работал успешно.
Рисунок 2.38
Панель инструментов одноэтапные опции.
Используйте одноэтапные команды, установите точку останова и запустите
средство моделирования, работающее в полной скорости. Если Вы теряете то,
что продолжается, выйдите, отладчик выбором
отлаживают/начинают/останавливают отладчик и затем перезапускают снова.
46 Глав 2
Рисунок 2.39
Добавьте ADC_DbgValue для наблюдения 1.
Рисунок 2.41
Открытие анализатора логики.
Рисунок 2.42
Анализатор логики.
Рисунок 2.43
Периферийное окно GPIO B.
Рисунок 2.44
Открытие периферийного устройства ADC просматривает
окно.
Разработка программного обеспечения для семейства Cortex-M 49
Рисунок 2.45
Периферийное окно ADC.
Рисунок 2.46
Окно консоли UART.
Рисунок 2.47
Включение инструкции Трассировки.
Рисунок 2.48
Трассировка инструкции.
Рисунок 2.49
Выбор анализатора производительности.
Рисунок 2.50
Окно Performance Analyzer.
Рисунок 2.51
Окно Code Coverage.
Конфигурация проекта
Теперь, когда Вы знакомы с основными характеристиками отладчика, мы можем
посмотреть более подробно на то, как код проекта создается.
Сначала выйдите из отладчика путем выбора сеанса отладки Debug\Start\Stop (Рис.
2.52).
Рисунок 2.52
Выйдите из отладчика.
Рисунок 2.53
Опции для Целевого диалогового окна.
Рисунок 2.54
Меню Target определяет карту распределения памяти проекта.
Чем более сложная карта распределения памяти выше разделила внутренний Flash на
два блока и определила, тем более низкий блок Flash как регион по умолчанию для
кода и постоянных данных. Ничто не будет помещено в верхний блок, если Вы явно
не скажете компоновщику делать это. Точно так же SRAM был разделен на два
региона, и верхний регион не использован, если Вы явно не говорите компоновщику
использовать его. Когда компоновщик разрабатывает проект, он ищет маркировку
кода “СБРОСА”. Компоновщик затем помещает код сброса в базе в регионе кода,
определяемом как регион Запуска. Первоначальный код Запуска запишет все
внутренние SRAM для обнуления, если Вы не отметите поле NoInit для данного
региона SRAM. Затем SRAM оставят с его значениями мусора запуска. Это может
быть полезно, если Вы хотите допускать мягкую перезагрузку, где некоторые
системные данные сохраняются.
54 Главы 2
Рисунок 2.55
Открытие локальных опций проекта.
Рисунок 2.56
Выбор регионов памяти для модуля. Это переопределяет глобальные
настройки.
Рисунок 2.57
Кристалл (Xtal) частота только используется средством
моделирования.
MDK-ARM Keil идет с двумя наборами библиотеки ANSI (Рис. 2.58). Первой является
стандартная библиотека, которая идет с компилятором ARM. Это полностью совместимо с
текущим ANSI, стандартным, и как таковым имеет большое место кода для использования
микроконтроллера. Вторая библиотека установила, Keil MicroLIB, эта библиотека была
записана в более ранний стандарт ANSI, стандарт C99. Эта версия стандарта ANSI больше
соответствует потребностям пользователей микроконтроллера (Таблица 2.5).
Рисунок 2.58
Выбор библиотеки MicroLIB.
Путем выбора MicroLIB Вы сохраните по крайней мере 50% стихов места кода
библиотеки ANSI библиотеки компилятора ARM. Так попытайтесь использовать
MicroLIB по мере возможности. Однако это имеет некоторые ограничения прежде
всего, это не поддерживает все функции в standardlib и вычислениях плавающей точки
двойной точности. В большом количестве приложений можно жить с этим.
56 Глав 2
Рисунок 2.59
Оптимизация перекрестного модуля включает многопроходный процесс компиляции
для лучшей генерации кода.
общая сумма ресурсов памяти выделила, местоположение стека, и также если этому
включают местоположение памяти "кучи" (Рис. 2.62).
Рисунок 2.62
Список символов файла карты компоновщика.
Второй раздел дает Вам обзор ресурсов памяти, требуемых каждым модулем и
библиотекой в проекте вместе с деталями полного требования к памяти.
Использование памяти изображений разломано на размер кода. Размер данных кода
является объемом энергонезависимой памяти, используемой для хранения значений
инициализации, которые будут загружены в переменные RAM на запуске. В простых
проектах эти данные инициализации сохранены как простая таблица ROM, которая
записана в корректные местоположения RAM кодом запуска. Однако в проектах с
большим объемом инициализируемых данных, компилятор будет переключать
стратегии и использовать алгоритм сжатия для уменьшения размера данных
инициализации.
Разработка программного обеспечения для семейства Cortex-M 59
Рисунок 2.63
Список разделов файлов карты компоновщика.
Следующая вкладка является вкладкой User. Это позволяет Вам добавлять внешние
утилиты к процессу сборки. Меню позволяет Вам выполнять утилиту к пред - или
постобрабатывать файлы в проекте.
Утилита может также быть выполнена, прежде чем каждый модуль компилируется.
Дополнительно, можно также запустить отладчик, после того как процесс сборки
закончился (Рис. 2.64).
60 Глав 2
Рисунок 2.64
Пользовательское диалоговое окно.
Рисунок 2.65
Отсчитайте поля могут иметь три состояния.
Разработка программного обеспечения для семейства Cortex-M 61
Самая важная опция в этом меню является управлением оптимизацией (Рис. 2.66). Во
время разработки и отладки Вас должен оставить уровень оптимизации в нуле. Затем
сгенерированные кодированные карты непосредственно к высокоуровневому "C"
исходному коду и легко отладить. Поскольку Вы увеличиваете уровень оптимизации,
компилятор будет использовать все более агрессивные методы для оптимизации кода.
На высоком уровне оптимизации, сгенерированном коде
больше карты тесно к коду первоисточника, который затем делает использование
отладчика очень трудным. Например, когда Вы одноэтапный код, его выполнение
больше не будет следовать за ожидаемым путем через исходный код. Установка
точки останова может также быть бессистемной, поскольку сгенерированный код не
может существовать на той же строке как исходный код. По умолчанию компилятор
генерирует наименьшее изображение. Если необходимо получить максимальную
производительность, можно выбрать опцию “Optimize for Time”. Затем стратегия
компилятора будет изменена для генерации самого быстрого исполняемого файла
код (Рис. 2.67).
Рисунок 2.66
Локальные опции модуля.
62 Главы 2
Рисунок 2.67
Диалоговое окно C\C11.
Меню компилятора также позволяет Вам вводить любой #defines, который Вы хотите
передать исходному модулю, когда это компилируется. При структурировании
проекта по нескольким каталогам, можно также добавить локальный, включают пути
к каталогам с заголовочными файлами проекта. Текстовое поле Misc Controls
позволяет Вам добавлять любые переключатели компилятора, которые
непосредственно не поддерживаются в главном меню. Наконец, полная строка
управления компилятором отображена, это включает опции CPU, проект включает
пути и пути к библиотеке и сделать файлы зависимости.
Разработка программного обеспечения для семейства Cortex-M 63
Рисунок 2.68
Ассемблерное диалоговое окно.
64 Главы 2
Рисунок 2.69
Диалоговое окно Компоновщика.
Рисунок 2.70
Используя пользовательский точечный файл.
Рисунок 2.71
Выбор аппаратных средств отлаживает интерфейс.
Рисунок 2.72
Установка алгоритма программирования Flash от диалогового окна Настроек
Утилит.
Теперь откройте меню утилит (Рис. 2.72).
Когда проект будет создан, меню Utilities отметят поле “Use Debug Driver”. Это
вынудит программиста Flash использовать тот же аппаратный интерфейс, выбранный
в меню Debug. Однако меню Utilities позволяет Вам выбирать инструмент для
программирования Флэш-памяти микроконтроллера. Это может быть другим
интерфейсом отладки или внешним инструментом, таким как инструмент Silicon
Vendor Bootloader.
Наиболее распространенные проблемы программирования Flash упоминаются ниже
(Рис. 2.73).
Рисунок 2.73
Цель обновления должна быть выбрана для автоматического программирования Flash, когда
отладчик запускается.
68 Глав 2
Одна точка, которую стоит отметить в меню Utilities, является “Целью обновления
перед Отладкой” поля галочки.
Рисунок 2.74
Вручную загрузка программы отображает к Flash.
Рисунок 2.75
Программная ошибка Flash.
Рисунок 2.76
Ошибка проверки Flash.
Выберите отмену для закрытия обоих из этих диалоговых окон, не внося изменений.
Запустите отладчик.
Заключение
К концу этой главы необходимо смочь установить основной проект Cortex-M, создать
код и смочь отладить его в средстве моделирования или на подходящем аппаратном
модуле. В следующей главе мы начнем смотреть на семейство Cortex-M процессоров
более подробно и затем продолжать смотреть на некоторые практические проблемы,
вовлеченные в разработку программного обеспечения для работы их.
Эта страница, намеренно
оставленная незаполненный
CHPTER3
Архитектура Cortex-M
Введение
В этой главе мы более внимательно рассмотрим в архитектуре процессора Cortex-
M. Объем этой главы сконцентрируется на процессоре Cortex-M3. После того как у
нас есть твердое понимание Коры-M3, мы посмотрим на основные отличия в Коре-
M0, Коре-M01 и Коре-M4. Существуют некоторые значительные дополнения в
процессоре Cortex-M7, и мы посмотрим на них в Главе 6 “Процессор Cortex-M7”.
Через главу существует много упражнений. Они дадут Вам более глубокое
понимание каждой темы и могут использоваться в качестве ссылки при разработке
собственного кода.
Рисунок 3.1
ARM7 и ЦП ARM9 имели отдельные 32-разрядные и 16-разрядные
системы команд. Процессор Cortex-M имеет единственную систему команд,
которая является смешением 16-и 32-разрядный
инструкции.
Рисунок 3.2
Регистры ЦП Cortex-M состоят из 16 регистров данных, регистра состояния
программы и четырех специальных функциональных регистров. R13 R15 используется
в качестве указателя вершины стека, регистра ссылки и счетчика команд. R13 является
окруженным валом регистром, который позволяет ЦП Cortex-M работать с двойными
стеками.
Рисунок 3.3
Регистр состояния Программы содержит несколько групп флагов ЦП. Они включают
коды условий (NZCVQ), биты состояния Прерывания инструкции Continuable (ICI),
Если флаг Then и текущее число исключения.
Рисунок 3.4
Регистр состояния Программы имеет три регистра псевдонима, которые обеспечивают доступ
к определенным подобластям или Регистру состояния Программы. Следовательно, родовое
название для регистра состояния программы является xPSR.
В нормальной прикладной программе Ваш код не сделает явный доступ к xPSR или
любому из его регистров псевдонима. Любое использование xPSR будет сделано
сгенерированным кодом компилятора. Как программист у Вас должна быть
осведомленность о xPSR и флагах, содержавшихся в нем.
SUB R8, R6, № 240 Выполняет вычитание и не обновляет НИЖНИЕ ИНДЕКСЫ флагов кода условия
R8, R6, № 240 Выполняет вычитание и обновляет флаги кода условия
Рисунок 3.5
Нормальная переменная будет трансформация для обнуления, когда она поразит
свое максимальное значение. Это очень опасно в алгоритме управления. ЦП Cortex-
M поддерживает насыщаемые инструкции по математике, которые упорно
продолжают их максимальные и минимальные значения.
В то время как это - проблема для большинства приложений, это особенно серьезно
для приложений, таких как важные приложения безопасности и блок управления
приводом. Cortex-M3/M4 и насыщаемые инструкции по математике M7
предотвращают этот вид “списка вокруг”. При использовании влажных инструкций по
математике если переменная достигнет своего максимального или минимального
значения, то она будет придерживаться (насыщают) в том значении. После того как
переменная насыщала бит Q, будет установлен. Q укусил, “липкий” бит и должен
быть очищен кодом приложения. Стандартные инструкции по математике не
используются компилятором “C” по умолчанию. Если Вы хотите использовать
влажные инструкции по математике, необходимо получить доступ к ним при помощи
компилятора intrinsics или CMSIS-базовых функций.
Если (Y 55 0x12C)
{I11;
} еще
{я —;}
IT VS//, ЕСЛИ ЗАТЕМ условное выражение блока на первой инструкции ADD SUBVS R3,
R2, R4
Так, наш “C”, ЕСЛИ оператор THEN ELSE может быть скомпилирован в четыре
инструкции.
Во-первых, условные блоки кода не могут быть вложены, обычно компилятор будет
заботиться об этом правиле. Во-вторых, Вы не можете использовать Оператор
перехода для вскакивания в условный блок кода. Если Вы действительно сделаете
эту ошибку, то компилятор предупредит Вас и не сгенерирует такой недопустимый
код.
Следующий бит в PSR является T, или Ползунок укусил. Это - бит прежней версии от
более раннего ARM ЦП и установлено на один при очистке этого бита он вызовет
исключение отказа. В предыдущих центральных процессорах T укусил,
использовался, чтобы указать, что Ползунок 16-разрядная система команд работал.
Это включено в PSR Cortex-M, чтобы поддержать совместимость с более ранними
центральными процессорами ARM и позволить 16-разрядному коду Ползунка
прежней версии выполняться на процессорах Cortex-M. Поле Final в PSR является
числовым полем Исключения. Единица Прерывания Вложенного вектора Коры
может поддерживать до 256 источников исключения. Когда исключение
обрабатывается, число исключения хранится здесь. Поскольку мы будем видеть
позже, что это поле не используется кодом приложения при обработке прерывания,
хотя это может быть полезная ссылка при отладке.
Упражнение 3.1 Влажная математика и условное выполнение
В этом осуществлении мы будем использовать простую программу, чтобы
исследовать регистры ЦП и использовать влажные инструкции по математике. Мы
также восстановим проект использовать условное выполнение.
Архитектура Cortex-M 79
}}
Рисунок 3.6
Поскольку мы копируем целое число в символ, символьное значение будет
трансформация, после того как ее максимальное значение достигнуто.
Рисунок 3.7
Используя инструкции по насыщенности, переменная cal “насыщает” на
выбранной разрядной границе.
Рисунок 3.8
То, когда переменная насыщает, Q укусил в xPSR, будет
установлено.
Рисунок 3.9
Точки останова на строках 19 и 22.
Сбросьте программу и затем выполните код, пока первая точка останова не будет
достигнута.
Откройте окно Disassembly и исследуйте код, сгенерированный на контроль битов Q.
если
(xPSR&Q_FLAG)
{MOV r0, r1
LDR r0, [r0, #0x00] TST
r0, #0x8000000 BEQ
0x080003E0
20: range22;
82 Главы 3
} еще {
LDR r0, [ПК, #44]; @0x08000400
LDR r0, [r0, #0x00]
SUB r0, r0, #0x01
LDR r1, [ПК, #36]; @0x08000400
STR r0, [r1, #0x00]
B 0x080003E8
заблокированный 5 1;
}
MOV r0, #0x01
LDR r1, [ПК, #32]; @0x08000408
STR r0, [r1, #0x00]
Рисунок 3.10
Значение состояний противостоит в первой точке останова.
Рисунок 3.11
Значение состояний противостоит во второй точке останова.
Рисунок 3.12
Измените уровень оптимизации, и также “выбор оптимизирует для
скорости”.
Рисунок 3.13
Цикл значит первую и вторую точку останова.
84 Главы 3
Рисунок 3.14
ЕСЛИ ЗАТЕМ инструкции, следовавшие условными инструкциями.
Код поразит точку останова даже при том, что точка останова в операторе IF,
который больше не должен выполняться. Это просто, потому что условные
инструкции всегда выполняются.
Рисунок 3.15
Карта распределения памяти Cortex-M имеет стандартный шаблон, который разделяет
диапазон адресов на 4 ГБ на определенные регионы памяти. Этот шаблон памяти
характерен для всех устройств Cortex-M.
Рисунок 3.16
В то время как процессор Cortex-M имеет много внутренних шин, они чрезвычайно
невидимы для разработчика программного обеспечения. Память
появляется как плоские 4 ГБ адресного пространства.
Буфер записи
Кора-M3 и Кора-M4 содержат однократный буфер записи данных. Это позволяет ЦП
превращать запись в буфер записи и продолжаться на следующую инструкцию, в то
время как буфер записи завершает запись к реальному SRAM. Это старается не
останавливать процессор, в то время как он ожидает записи для завершения. Если
буфер записи полон, ЦП вынужден ожидать, пока он не закончил свою текущую
запись. В то время как это обычно - прозрачный процесс к коду приложения,
существуют некоторые случаи, где необходимо ожидать, пока запись не закончилась
перед продолжающимся выполнением программы. Например, если мы включаем
внешнюю шину на микроконтроллере, необходимо ожидать, пока буфер записи не
закончил писать в периферийный регистр, и шина включена прежде, чем попытаться
получить доступ к памяти, расположенной на внешней шине. Процессор Cortex-M
предоставляет некоторые инструкции по барьеру памяти справиться с этими
ситуациями.
Инструкция Описание
Гарантирует, что все доступы памяти закончены, прежде чем новый доступ к
DMB памяти сделан
Гарантирует, что все доступы памяти закончены, прежде чем следующая
DSB инструкция выполняется
Гарантирует, что все предыдущие инструкции завершаются, прежде чем
ISB следующая инструкция
выполняемый. Это также сбрасывает конвейер ЦП
Системный блок управления
В дополнение к регистрам ЦП процессоры Cortex-M имеют группу конфигурации с
отображенной памятью и регистров состояния, расположенных около верхней части
карты распределения памяти, запускающейся в 0xE000 E008.
88 Глав 3
Рисунок 3.17
В отличие от этого, ранее ARM7 и центральных процессоров ARM9, процессор Cortex
может сделать невыровненные доступы памяти. Это позволяет компилятору и
компоновщику лучше всего использовать устройство SRAM.
Побитовая обработка
В маленькой встроенной системе часто необходимо установить и очистить отдельные
биты в SRAM и периферийных регистрах. При помощи стандартных инструкций по
обращению мы можем установить и очистить отдельные биты при помощи языка “C”
поразрядно И и ИЛИ команды, в то время как это работает хорошо, процессоры
Cortex-M предоставляют более эффективный метод побитовой обработки.
Рисунок 3.18
Разрядное соединение является техникой, которая позволяет первому 1 МБ
региона SRAM и первому 1 МБ периферийного региона
быть обращенным битом.
90 Глав 3
Рисунок 3.19
Каждый бит в реальной памяти отображается на адресе слова в памяти
псевдонима.
Это означает, что каждый бит реального SRAM или периферийного регистра
отображается на адресе слова в разрядном регионе псевдонима полосы и путем
записи 1 с и 0s к адресу слова псевдонима, мы можем установить и очистить
местоположение бита реальной памяти. Точно так же, если мы пишем слово в
местоположение реальной памяти, мы можем считать разрядный адрес псевдонима
полосы для проверки текущего состояния немного в том слове. Для использования
разрядного соединения просто необходимо вычислить адрес слова в разрядном
регионе полосы, который отображается на местоположение бита в реальной памяти,
которую Вы хотите изменить. Затем создайте указатель на адрес слова в разрядном
регионе полосы. После того как это сделано, можно управлять реальной разрядной
ячейкой памяти путем чтения и записи в регион псевдонима через указатель.
Вычисление для адреса слова в разрядном регионе псевдонима полосы следующие:
Разрядное слово полосы обращается к основе полосы на 5 битов 1 (байтовое
смещение 3 32) 1 (разрядный номер 3 4)
Рисунок 3.20
Позвольте профилю синхронизации показать время выполнения на
строку кода.
Таймер SysTick
Все процессоры Cortex-M содержат стандартный таймер. Это называют таймером
SysTick и является 24-разрядным таймером обратного отсчета с автоперезагрузкой
(Рис. 3.21). После того, как запущенный, таймер SysTick будет обратный отсчет от
своего начального значения, после того как он достигает нуля, он повысит
прерывание, и новое значение количества будет загружено из регистра
перезагрузки. Основная цель этого таймера состоит в том, чтобы генерировать
периодическое прерывание для операционной системы реального времени (RTOS)
или другого управляемого событиями программного обеспечения. Если Вы не
выполняете RTOS, можно также использовать его в качестве простого
периферийного устройства таймера.
Рисунок 3.21
Таймер SysTick является 24-разрядным таймером обратного отсчета с
автоперезагрузкой. Это обычно используется для
обеспечения периодического прерывания для
планировщика RTOS.
Источник часов по умолчанию для таймера SysTick является тактовой частотой ЦП
Cortex-M. Может быть возможно переключиться на другой источник часов, но это
будет варьироваться в зависимости от фактического микроконтроллера, который Вы
используете. В то время как таймер SysTick характерен для всех процессоров Cortex-
M, его регистры занимают те же ячейки памяти в Cortex-M3/-M4 и-M7. В Коре-M0 и
Коре-M01, регистры SysTick расположены в системном блоке управления и имеют
различные символьные имена для предотвращения беспорядка. Строка прерывания
по таймеру SysTick и все периферийные строки микроконтроллера подключены к
Контроллеру прерываний вложенного вектора (NVIC).
94 Главы 3
Рабочие режимы
В то время как ЦП Cortex-M выполняет фон (код непрерывания), ЦП находится в
рабочем режиме, названном режимом потока. Когда прерывание будет повышено,
NVIC заставит процессор переходить к соответствующей процедуре обработки
прерывания (ISR). Когда это происходит, изменения ЦП в новом рабочем режиме,
названном режимом обработчика. В простых приложениях без ОС можно
использовать конфигурацию по умолчанию процессора Cortex-M из сброса и нет
никакого главного функционального различия в этих рабочих режимах, и они могут
быть проигнорированы. Процессоры Cortex-M могут быть настроены с более сложной
операционной моделью, которая представляет операционные различия между
потоком и режимом обработчика, и мы посмотрим на это в Главе 5 “Функции
Передовой архитектуры”.
Архитектура Cortex-M 95
Рисунок 3.22
Когда прерывание или исключение произойдут, ЦП автоматически продвинет
стековый фрейм. Это состоит из xPSR, ПК, LR, R12 и регистрирует R0 R3. В конце
прерывания или исключения, автоматически не сложен стековый фрейм.
значение будет автоматически загружено в R13 как часть сброса ЦП. Таблица
векторов прерываний затем имеет местоположения адреса каждые 4 байта, растущие
вверх через адресное пространство. Таблица векторов содержит адрес ISR для
каждого из возможных источников прерывания в микроконтроллере. Таблица
векторов для каждого микроконтроллера стала предопределенная частью кода
запуска, как мы будем видеть в следующей главе. Маркировка для каждого ISR
хранится в каждом местоположении вектора прерывания. Для создания ISR, просто
необходимо объявить пустоту “C” функция с помощью того же имени в качестве
маркировки вектора прерывания.
СБРОС ОБЛАСТИ, ДАННЫЕ,
ТОЛЬКО ДЛЯ ЧТЕНИЯ
ЭКСПОРТИРУЙТЕ __ Векторы
__ Векторы DCD __ initial_sp ; Вершина стека
DCD Reset_Handler ; Обработчик сброса
; Внешние прерывания
DCD WWDG_IRQHandler ; Сторожевой таймер окна
; PVD через Строку EXTI
DCD PVD_IRQHandler обнаруживают
DCD TAMPER_IRQHandler ; Трамбовка
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
Так, для создания стандартной программы “C” для обработки прерывания от час
реального времени мы создаем функцию “C”, названную следующим образом:
освободите RTC_IRQHandler (пусто) {
. . .. . ..
}
Рисунок 3.23
SysTick прерывают расположение проекта.
В частности, отметьте значение указателя вершины стека (R13) регистр ссылки (R14)
и PSR.
Установите точку останова в процедуре прерывания и запустите код, выполняющий
(Рис. 3.25).
Рисунок 3.25
Набор точки останова на записи в прерывание.
Когда код совершает нападки, точка останова снова исследуют окно Register (Рис.
3.26).
Рисунок 3.26
Регистр ссылки (R14) теперь содержит код возврата, который вынуждает ЦП
возвратиться из прерывания в конце служебной функции
прерывания.
Рисунок 3.27
Просмотрите стековый фрейм в окне памяти.
Рисунок 3.28
Периферийное окно NVIC и регистр xPSR просматривают, оба показывают таймер
SysTick активным прерыванием.
Рисунок 3.29
Точки останова на точках входа и выхода ISR.
Теперь откройте окно дизассемблирования и просмотрите инструкцию по
возврату (Рис. 3.30).
102 Главы 3
Рисунок 3.30
Возврат из прерывания является нормальной командой перехода.
Рисунок 3.31
Первые 4 байта памяти содержат начальное значение стека. Таблица векторов начинает с
0x00000004. Первые 10 векторов для процессора Cortex, в то время как остаток для
пользовательских периферийных устройств.
Первое местоположение в таблице векторов является обработчиком Сброса. Когда
процессор Cortex-M будет сброшен, адрес, сохраненный здесь, будет загружен в
счетчик команд Cortex-M
Архитектура Cortex-M 103
Отказ использования
Неопределенная инструкция
Недопустимый адрес возврата из прерывания
Невыровненный доступ к памяти с помощью загрузки и многоадресных команд
хранилища
a
Разделитесь на нуль
a
Невыровненный доступ к памяти
a
Эта опция должна быть активирована в системном блоке управления настраиваемый регистр
использования отказа.
Отказ шины
Отказ шины повышен, когда ошибка обнаруживается на матрице шины AHB (больше
о матрице шины в Главе 5 “Функции Передовой архитектуры”). Потенциальные
причины этого отказа следующим образом (Таблица 3.8).
Таблица 3.8: Возможные причины исключения отказа шины
Серьезный отказ
Серьезный отказ может быть повышен двумя способами. Во-первых, если ошибка
шины происходит, когда таблица векторов читается. Во-вторых, исключение
серьезного отказа также достигнуто через эскалацию отказа. Это означает что, если
использование, диспетчер памяти или исключения отказа шины будут отключены,
или если сервис исключения не будет иметь достаточного приоритетного уровня, то
отказ возрастет к серьезному отказу.
Приоритет и вытеснение
NVIC содержит группу приоритетных регистров с 8-разрядным полем для каждого
источника прерывания. В его конфигурации по умолчанию лучшие 7 битов
приоритетного регистра позволяют Вам определять
Архитектура Cortex-M 105
уровень вытеснения. Чем ниже уровень вытеснения, тем более важный прерывание.
Так, если прерывание будет подаваться, и второе прерывание повышено с более
низким уровнем вытеснения, то состояние текущего прерывания будет сохранено, и
процессор будет служить новому прерыванию. Когда это будет закончено, процессор
продолжит служить исходному прерыванию, если более высокое приоритетное
прерывание не ожидает (Рис. 3.32).
Рисунок 3.32
Каждый периферийный приоритетный регистр состоит из настраиваемого поля вытеснения
и подприоритетного поля.
Рисунок 3.33
Каждый приоритетный регистр 8 битов шириной. Однако кремниевый производитель не
может реализовать все приоритетные биты. Реализованные биты всегда
расширяются от MSB к LSB.
Группы и подгруппа
После сброса процессора первые 7 битов приоритетных регистров определяют
уровень вытеснения, и LSB определяет подприоритетный уровень. Это разделение
между группой вытеснения и приоритетной подгруппой может быть изменено путем
записи в поле “NVIC priority group” в “Регистре” Управления Прерыванием и Сбросом
приложения. Этот регистр позволяет нам изменять размер поля группы вытеснения и
приоритетной подгруппы. На сбросе, этот регистр значения по умолчанию к
приоритетному нулю группы (Таблица 3.10).
Рисунок 3.34
Приоритетный регистр с четырьмя активными битами и приоритетной группой 5.
Это уступает четыре, вытесняют уровни и четыре
приоритетных уровня.
Рисунок 3.35
Исключения процессора Cortex-M и возможные приоритетные
уровни.
Модель исключения
Когда NVIC служит единственному прерыванию, существует задержка 12 циклов,
пока мы не достигаем ISR и еще 10 циклов в конце ISR до резюме процессора
Cortex-M
108 Глав 3
Рисунок 3.36
Когда исключение повышено, стековый фрейм продвинут параллельно с адресом
ISR, выбираемым от таблицы векторов. На Коре-M3 и Коре-M4 это всегда - 12
циклов. На Коре-M0 требуется 16 циклов. Кора-M01 берет 15 циклов.
В более сложных системах может быть много активных источников прерывания все
требование служиться эффективно как возможные. NVIC был разработан со многой
оптимизацией для обеспечения быстрой обработки прерываний в такой в большой
степени загруженной системе. Вся оптимизация обработки прерываний, описанная ниже,
является неотъемлемой частью NVIC, и как таковой выполняются автоматически NVIC и
не требуют никакой конфигурации кодом приложения.
Рисунок 3.38
Если процессор Cortex-M войдет и ISR, и более высокое приоритетное прерывание
повышено, то NVIC автоматически переключится для обслуживания
первоочередного прерывания. Это только произойдет, если начальное прерывание
будет в своих первых 12 циклах.
Рисунок 3.39
Если прерывание будет повышено, в то время как находится в его выходе из 12
циклов, процессор будет “перематывать” стек и служить новому
прерыванию с минимальной задержкой 6 циклов.
Мы также добавили три переменные: ФОН, ADC и SYSTICK. Они будут установлены
на логический, когда регион соответствия кода выполнится, и обнулите в других
случаях. Это позволяет нам отслеживать казнь каждого региона кода с помощью
Анализатора логики отладчика.
освободите ADC_IRQHandler (пусто) {
интервал i;
ФОН 5 0;
SYSTICK 5 0;
для (я 5 0; я, 0x1000; i11) {
ADC 5 1;
}
ADC1-.SR и 5 B (1, 1); /* очищают прерывание EOC */
ADC 5 0;
}
ФОН 5 0; ADC 5 0;
ADC1-.CR2 | 5 (1UL, 22); для (я 5
0; я, 0x1000; i11) {
SYSTICK 5 1;
}
SYSTICK 5 0;
}
112 Глав 3
Рисунок 3.40
Прерывание SysTick выполняется (логика высоко) затем, прерывание ADC является
объединенным в цепочку хвостом и будет работать,
когда SysTick заканчивается.
Рисунок 3.41
Хвост ADC объединяет SysTick в цепочку и работает многократно, потому что
флаг состояния ADC не был очищен.
После того, как первое прерывание ADC было повышено, флаг состояния прерывания не
был очищен, и линия прерывания ADC к NVIC остается утверждаемой. Это вызывает
непрерывные прерывания ADC к
Архитектура Cortex-M 113
Рисунок 3.42
После того, как сброшено микроконтроллер с четырьмя реализованными приоритетными
битами будет иметь 16 уровней вытеснения.
ADC теперь имеет самое высокое на значение emption поэтому, как только его
прерывание повышено, это вытеснит прерывание SysTick. Когда это завершится,
прерывание SysTick возобновится и завершится прежде, чем возвратиться к
фоновому коду.
Регистр AIRC не может быть записан в свободно. Это защищено полем ключа,
которое должно быть запрограммировано со значением 0x5FA, прежде чем запись
будет успешна.
работайте временно 5 SCB-.AIRCR;
работайте временно и 5 B (SCB_AIRCR_VECTKEY_Msk |
SCB_AIRCR_PRIGROUP_Msk); работайте временно 5 (временный файл |
(uint32_t) 0x5FA, 16) | (0x05, 8)); временный файл SCB-.AIRCR 5;
Рисунок 3.44
PRI Group установлена определить 2-разрядное поле вытеснения и 2-
разрядное приоритетное поле.
Рисунок 3.46
Установка регистра Базового приоритета отключает прерывание ADC.
Поддержка загрузчика
В то время как таблица векторов прерываний расположена в начале памяти, когда
процессор Cortex-M сбрасывается, возможно переместить таблицу векторов к другому
местоположению в памяти. Поскольку программное обеспечение, встроенное в
маленькие микроконтроллеры, становится более сложным существует
увеличивающаяся потребность разработать системы с постоянной программой
начальной загрузки, которая может проверить целостность кода главного приложения,
прежде чем это будет работать и проверка на обновление программы, которое может
быть поставлено различными последовательными интерфейсами (например, Ethernet,
USB, UART) или SD / мультимедийную карту (Рис. 3.47).
116 Глав 3
Рисунок 3.47
Программа начальной загрузки может быть помещена в первый сектор во Флэш-
памяти. Это проверит, существует ли обновление кода приложения прежде, чем
запустить программу главного приложения.
После того как загрузчик выполнил свои проверки и, при необходимости обновил
прикладную программу, это перейдет счетчик команд к запуску кода приложения,
который начнет работать. Для работы правильно код приложения требует, чтобы
таблица векторов была отображена на начальном адресе кода приложения (Рис.
3.48).
Рисунок 3.48
Когда код приложения начинает работать, он должен переместить таблицу
векторов к запуску кода приложения путем программирования регистра
Смещения таблицы векторов NVIC.
Таблица векторов может быть перемещена путем записи в регистр в системном блоке
управления, названном “регистром” Смещения Таблицы векторов. Этот регистр
позволяет Вам перемещать таблицу векторов к любой 128-байтовой границе в карте
памяти процессора Коры.
Рисунок 3.49
Загрузчик и проект Blinky в многопроектной рабочей области.
Рисунок 3.50
Выберите проект и щелчок правой кнопкой для создания этого
активным проектом.
Теперь нажмите на папку проекта Blinky и откройте опции для вкладки Target\Target
(Рис. 3.51).
Рисунок 3.51
Проекту Blinky нужно было сместить его код к 0x2000 начальному адресу.
118 Глав 3
Это содержит #define для регистра смещения Таблицы векторов. Обычно, это - нуль,
но если мы установим это на 0x2000, то таблица векторов будет ре, отображенным
для соответствия нашему коду приложения, когда это начнет работать.
Разработайте проект Blinky.
Разверните проект загрузчика и установите его как активный проект (Рис. 3.52).
Рисунок 3.52
Выберите загрузчик как активный проект.
Открытый main_boot.c
}}
Разработайте проект.
Рисунок 3.53
Сценарий отладки используется для загрузки символов проекта приложения. Это
позволяет Вам отлаживать загрузчик и код приложения
одновременно.
Запустите отладчик.
Рисунок 3.54
Первые 8 байтов образа прикладного объекта содержат начальный адрес
указателя вершины стека и адрес обработчика
сброса.
Рисунок 3.55
Установите точку останова на основном () в проекте Blinky.
Выполните код
Рисунок 3.57
Установите точку останова в начале обработчика прерываний SysTick.
Выполните код.
Когда таймер SysTick повысит, его прерывание, адрес обработчика будет выбран от
таблицы векторов Blinky а не адреса по умолчанию в начале памяти, и корректный
обработчик SysTick будет выполняться. Теперь программа Blinky работает счастливо в
ее адресе смещения. При необходимости в коде приложения для вызова, загрузчик
затем установил шаблон в памяти и вызывает сброс в рамках кода приложения путем
записи в “Системный регистр” Управления Прерыванием и Сбросом Приложения
Блока управления.
Shared_memory 5 USER_UPDATE_COMMAND
NVIC_SystemReset ();
То, когда загрузчик перезапускает часть своих проверок запуска, должно будет
протестировать shared_memory местоположение и если это установлено, выполняет
необходимый код.
Управление питанием
В то время как Кора-M0 и Кора-M01 специально предназначены для операции
низкой мощности, Кора-M3 и Кора-M4 все еще имеют удивительно низкую
потребляемую мощность. В то время как потребление фактической мощности будет
зависеть от производственного процесса, используемого Кремниевым Поставщиком,
числа ниже дают признак ожидаемой потребляемой мощности (Таблица 3.12).
Рисунок 3.58
wakesup контроллер является небольшой площадью логических элементов, которые не требуют
источника часов. WIC может быть расположен на другом домене питания к процессору Cortex-
M. Это позволяет всем часам процессора быть остановленными. Диапазон доступных режимов
питания определяется кремниевым производителем.
Когда процессор Cortex-M ввел режим ожидания низкой мощности, он может быть
разбужен периферийным устройством микроконтроллера повышение прерывания к
NVIC. Однако NVIC нужны часы для работы, поэтому если все часы останавливаются,
нам нужен другой аппаратный блок, чтобы сказать Блоку управления питанием (PMU)
микроконтроллера восстанавливать часы, прежде чем NVIC сможет ответить.
Процессоры Cortex-M могут быть оснащены дополнительной единицей, названной
контроллером прерываний пробуждения (WIC). Обнаружение прерывания
дескрипторов WIC, когда все часы останавливаются и позволяют всему процессору
Cortex переходить к режимам низкой мощности. Контроллер пробуждения состоит из
минимального количества логических элементов и не нуждается в системных часах.
Контроллер пробуждения может быть помещен в другой домен питания к основному
процессору Cortex-M. Это позволяет производителям микроконтроллеров
разрабатывать устройство, которое может иметь режимы низкой мощности, где
большая часть микросхемы выключена при поддержании ключевых периферийных
устройств для пробуждения процессора.
Архитектура Cortex-M 123
Рисунок 3.59
Системный регистр управления содержит биты конфигурации низкой мощности
процессора Cortex-M.
Процессор Cortex-M имеет два внешних сигнала сна, которые подключены к системе
управления питанием, разработанной производителем. По умолчанию сигнал СНА
активируется, когда WFI или инструкции WFE выполняются. Если SLEEPDEEP
укусил, установлен, второй сигнал сна, SLEEPDEEP активируется, когда процессор
Cortex-M вводит режим ожидания. Два сигнала сна используются производителем
микроконтроллеров для обеспечения более широкой схемы управления питанием
микроконтроллера. Установка SLEEPONEXIT укусила, вынудит микроконтроллер
ввести свой режим ожидания, когда это достигло конца прерывания. Это позволяет
Вам разрабатывать систему, которая просыпается в ответ на прерывание, выполняет
необходимый код и затем автоматически возвратится ко сну. В такой системе никакое
управление стеком не требуется (кроме случая вытесненных прерываний) во время
последовательности записи/выхода прерывания, и никакой фоновый код не будет
выполнен. Инструкция WFE помещает процессор Cortex-M в свой режим ожидания, и
процессор может быть
124 Главы 3
Рисунок 3.60
Две инструкции по записи низкой мощности помещают процессор Cortex в его режим
низкой мощности. Оба режима используют прерывание ввода-вывода для пробуждения
процессора, но их поведение пробуждения отличается.
Рисунок 3.61
В нашем простом проекте фоновый код только выполняется __ wfi () инструкция,
вынуждающая ЦП ввести состояние сна.
Здесь, мы видим, что фоновый код выполняется __ wfi () инструкция и затем засыпает,
пока прерывание не повышено. Когда прерывания завершились, мы возвращаемся к
фоновому коду, который сразу поместит процессор в его режим низкой мощности.
Выйдите из отладчика и измените код для соответствия строкам ниже:
SCB-.SCR 5 0x2;
СПИТЕ 5 1; ФОН 5
0; __ wfi (); в то
время как (1) {
Добавьте код для установки бита два из системного регистра управления. Это
устанавливает флаг Sleep On Exit, который вызывает процессор в режим низкой
мощности, когда он завершает прерывание. Сократите
126 Глав 3
Рисунок 3.62
После того как сну на выходе включили, мы больше не выполняем код в
фоновом режиме (код непрерывания).
Здесь, мы видим, что прерывания работают, но после того, как код инициализации
работал, фоновый цикл никогда не выполняет так фон, и переменные сна никогда не
обновляются. В отладчике Вы также сможете видеть от монитора покрытия, что
основное () цикл с условием продолжения никогда не выполняется. Эта функция
позволяет процессору просыпаться, выполнять некоторый критический код и затем
спать с абсолютным минимумом наверху.
Перемещение от коры-M3
В этой главе мы сконцентрировались на изучении процессора Cortex-M3. Теперь,
когда Вы знакомы с тем, как Кора-M3 работает, мы можем исследовать различия
между Корой-M3 и другими вариантами Cortex-M. Поскольку мы будем видеть, что
это главным образом архитектурные различия и если можно использовать Кору-M3,
можно легко переместиться до Коры-M4 или вниз к Коре-M0 (1) - базирующийся
микроконтроллер. Все больше кремниевые производители делают семейство
микроконтроллеров, были варианты, имеют ту же схему контактов пакета, и
периферийная покупка может быть выбрана с процессором Cortex-M0 или Cortex-M3,
разрешающим Вам беспрепятственно переключить устройства, обменивающие
производительность по сравнению со стоимостью.
Архитектура Cortex-M 127
Кора-M4
Кора-M4 наиболее легко описана как Кора-M3 с дополнительным FPU и
инструкциями по DSP. Мы посмотрим на эти функции в Главе 8 “Практический DSP
для Коры-M4 и Коры-M7”, но здесь мы возьмем тур по основным отличиям между
Корой-M3 и Корой-M4. Кора-M4 предлагает ту же вычислительную мощность 1.25
DMIPS/MHz как Кора-M3, но имеет намного большую математическую возможность.
Это поставляется тремя способами. Аппаратные средства, в которых FPU может
выполнить вычисления с плавающей точкой немного как 1 цикл по сравнению с
сотнями циклов то же вычисление, взяли бы Кору-M3. Для целочисленных
вычислений Кора-M4 имеет более высокую производительность MAC, который
изменяет к лучшему Кору-M3 MAC, чтобы позволить единственным вычислениям
цикла быть выполненными на 32-разрядных широких количествах, которые приводят
к 64-разрядному результату. Наконец, Кора-M4 добавляет группу SIMD
“Единственная Инструкция Несколько Данных” (SIMD) инструкции, которые могут
выполнить несколько целочисленных вычислений в единственном цикле. В то время
как Кора-M4 имеет большее количество логического элемента, чем Кора-M3, FPU
содержит больше логических элементов, чем весь процессор Cortex-M0 (Таблица
3.14).
Функция Комментарии
Сопроцессор
для операций с
плавающей
точкой См., что глава 7 “Отлаживает с CoreSight”
DSP SIMD
инструкции
Поле GE в xPSR
Расширенное Кора-M4 расширяет целочисленный MAC для поддержки
целое число единственного цикла
выполнение 32-разрядных умножается который урожай 64-
Единица MAC разрядный результат
Кора-M0
Кора-M0 является уменьшенной версией Коры-M3; это предназначается для
микроконтроллеров недорогой и низкой мощности. Кора-M0 имеет вычислительную
мощность 0.84 DMIPS/MHz. В то время как Кора-M0 может работать в высоких
тактовых частотах, она часто разрабатывается в недорогие устройства с простыми
системами памяти. Следовательно, типичный микроконтроллер Коры-M0 работает с
частотой ЦП 50 DMIPS/MHz, однако, ее низкая потребляемая мощность делает его
идеальным для приложений низкой мощности. В то время как это по существу имеет
модель того же программиста как Кора-M3, существуют некоторые ограничения, и
они получены в итоге ниже (Таблицы 3.15).
128 Глав 3
Функция Комментарии
Те же настройки канала связи как Кора-M3, но никакое
Трехэтапный конвейер спекулятивное ответвление
целевая выборка
Инструкция и данные используют тот же вход шины, который
Шинный интерфейс Von Newman может иметь более медленное
производительность по сравнению с Гарвардской
архитектурой M3/M4
Никакое условное выражение, Условные переходы всегда используются, которые вызывают
ЕСЛИ ЗАТЕМ блоки конвейерный сброс
Никакие влажные инструкции по
математике
Таймер SYSTICK является Однако до сих пор каждый микроконтроллер Коры-M0 имеет
дополнительным приспособленный
Никакая единица защиты памяти MPU охвачен в Главе 5 “Функции Передовой архитектуры”
Ограниченное количество каналов прерывания по сравнению с
32 канала NVIC Cortex-M3/
M4, однако, на практике это не реальное ограничение и Кора-M0
предназначается для небольших устройств с ограниченным
количеством периферийных устройств
Четыре программируемых Приоритетный уровень регистрируется, только реализовал 2
приоритетных уровня бита (четыре уровня), и
нет никакой приоритетной установки группы
Исключение серьезного отказа Никакой отказ использования, отказ управления памятью или
только исключение отказа шины
векторы
Та же детерминированная обработка прерываний как M3, но
16 задержек прерывания цикла с четырьмя
больше цикла наверху
Ограниченный фиксированными четырьмя уровни
Никакая приоритетная группа вытеснения
Никакой регистр BASEPRI
Никакой регистр FAULTMASK
Кора-M0 имеет меньше функций отладки по сравнению с Корой
Уменьшенные функции отладки -
M3/M4, см. Главу 8 “Практический DSP для Коры-M4 и Коры -
M7” для получения дополнительной информации
Никакие инструкции по
эксклюзивному доступу Инструкции по эксклюзивному доступу охвачены в Главе 5
“Функции передовой архитектуры”
Никакой обратный разрядный
порядок продвижения количества
нулевые инструкции
Сокращенное количество
регистров в Посмотрите ниже
системный блок управления
Таблица векторов не может быть
перемещена NVIC не включает регистр смещения таблицы векторов
Весь код выполняется на Кора-M0 не поддерживает непривилегированный рабочий
привилегированном уровне режим
Кора-M01
Кора-M01 является расширенной версией Коры-M0. Как таковой это имеет более
низкие числа потребляемой мощности, объединенные с большей вычислительной
мощностью. Кора-M01 также приносит MPU и возможность отладки в реальном
времени к очень низкопроизводительным устройствам. Кора-M01 также представляет
быстрый порт I/O, который ускоряет доступ к периферийным регистрам обычно
порты GPIO, чтобы позволить быстро переключаться контактов порта. Поскольку мы
будем видеть в Главе 7 “Отладку с CoreSight”, система отладки оснащена новой
единицей трассировки, названной микро буфером трассировки (MTB), который
позволяет Вам получать историю выполненного кода с недорогим средством
разработки (Таблица 3.17).
Функция Комментарии
Кора-M01 является кодом, совместимым с Корой-M0, и
Код, совместимый с обеспечивает
более высокая производительность с более низкой потребляемой
Кора-M0 мощностью
Это сокращает количество доступов Flash и следовательно
Двухэтапный конвейер потребляемой мощности
Порт I/O обеспечивает выборку в течение одного цикла к GPIO и
Порт I/O периферийным регистрам
Таблица векторов может Это поддерживает более сложные разработки программного
быть перемещена обеспечения. Обычно Загрузчик
и отдельное приложение
Поддерживает 16- Это позволяет устройствам, показывающим Кору-M01
разрядную Флэш-память использовать недорогую память
доступы
Код может выполниться в
привилегированном Кора-M01 имеет те же рабочие режимы как Cortex-M3/M4
и непривилегированные
уровни
Единица защиты памяти Кора-M01 имеет подобный MPU к Cortex-M3/M4
Это - единица трассировки “снимка”, к которой может получить
Микро буфер трассировки доступ недорогая отладка
единицы
130 Глав 3
Заключение
В этой главе мы покрыли основные характеристики семейства процессоров Cortex-M.
Для разработки успешно с Основанным на Cortex-M устройством необходимо будет
быть абсолютно знакомы со всеми темами, затронутыми в этой главе и Главе 2
“Разработка программного обеспечения для семейства Cortex-M”. Теперь, когда у нас
есть основное понимание процессора Cortex-M, мы посмотрим на более
усовершенствованные функции процессора плюс диапазон методов и технологий
разработки программного обеспечения.
CHPTER4
Программное обеспечение
микроконтроллера коры
Интерфейсный стандарт
Введение
Широко распространенное внедрение процессора Cortex-M в микроконтроллеры
общего назначения привело к двум возрастающим тенденциям в промышленности
электроники. В первую очередь, тот же процессор доступен из широкого спектра
поставщиков каждый с их собственным семейством микроконтроллеров. В
большинстве в корпусе каждый поставщик создает семейство микроконтроллеров,
которые охватывают диапазон требований для разработчиков встроенных систем.
Это быстрое увеличение количества устройств означает, что как разработчик можно
выбрать подходящий микроконтроллер из нескольких тысяч устройств все еще с
помощью тех же инструментов и навыков независимо от кремниевого поставщика.
Этот взрывной рост в Основанных на Cortex-M микроконтроллерах сделал
процессор Cortex-M фактическим промышленным стандартом для 32-разрядных
микроконтроллеров и в настоящее время нет никаких настоящих претендентов (Рис.
4.1).
Рисунок 4.1
CMSIS-совместимым инструментам разработки программного обеспечения и
стопкам промежуточного программного
обеспечения позволяют нести логотип CMSIS.
Рисунок 4.2
Основанные на коре микроконтроллеры могут иметь много сложных периферийных
устройств на однокристальной схеме. Чтобы заставить их работать, необходимо
будет использовать некоторую форму стороннего кода. CMSIS предназначается,
чтобы позволить стекам из других источников интегрироваться вместе легко.
Спецификации CMSIS
Основная цель CMSIS состоит в том, чтобы улучшить мобильность программного
обеспечения и возможность многократного использования через различные
микроконтроллеры и наборы инструментальных средств. Это позволяет
программному обеспечению из других источников интегрироваться
беспрепятственно вместе. После того, как изученный CMSIS помогает ускорить
разработку программного обеспечения с помощью стандартизированных функций
программного обеспечения.
В этой точке стоит согласиться точно, каков CMSIS. CMSIS состоит из семи
взаимосвязанных спецификаций, которые поддерживают разработку кода через все
Основанные на Cortex-M микроконтроллеры. Эти семь спецификаций следующим
образом; CMSIS-ядро, CMSIS-RTOS, CMSIS-DSP, CMSIS-драйвер, CMSIS-пакет,
CMSIS-SVD и CMSIS-DAP (Рис. 4.3).
Рисунок 4.3
CMSIS состоит из нескольких отдельные спецификации (ЯДРО, DSP, RTOS, SVD,
ДРАЙВЕР, DAP и ПАКЕТ), которые делают исходный код более портативным
между инструментами и устройствами.
Это также стоит быть ясным, каков CMSIS не. CMSIS не является сложным уровнем
абстракции, который вынуждает Вас пользоваться сложной и большой библиотекой.
Скорее CMSIS-базовая спецификация берет очень небольшое количество ресурсов
приблизительно 1 К кода и всего 4 байта RAM и просто стандартизирует способ,
которым Вы получаете доступ к регистрам процессора и микроконтроллера Cortex-
M. Кроме того, CMSIS действительно не влияет на способ, которым Вы
разрабатываете код или вынуждаете Вас принять конкретную методологию. Это
просто служит основой, которая помогает Вам интегрировать сторонний код и код
повторного использования будущих проектов. Каждая из спецификаций CMSIS не
то, что сложный и может быть изучен легко.
134 Главы 4
Рисунок 4.4
К документации CMSIS получают доступ через ссылку описания в менеджере по
Среде выполнения.
CMSIS-ядро
Базовая спецификация обеспечивает минимальный набор функций и макросов
для доступа к ключевым регистрам процессора Cortex-M. Базовая
спецификация также определяет функцию к
настройте осцилляторы микроконтроллера и синхронизируйте дерево в коде запуска,
таким образом, устройство готово к употреблению, когда Вы достигаете основной ().
Базовая спецификация также стандартизирует соглашение о присвоении имен для
периферийных регистров устройства. CMSIS-базовая спецификация также включает
поддержку Трассировки Инструментария во время сеансов отладки.
CMSIS-RTOS
Спецификация CMSIS-RTOS обеспечивает стандартный API для Операционной
системы реального времени. Это - в действительности ряд функций обертки, которые
переводят API CMSIS-RTOS в API определенного RTOS, который Вы используете.
Мы посмотрим на использование RTOS в целом и API CMSIS-RTOS в Главе 9
“CMSIS-RTOS”. Keil RTX RTOS был первым RTOS, который будет поддерживать API
CMSIS-RTOS, и он был выпущен как ссылочная реализация с открытым исходным
кодом. RTX может быть скомпилирован с Keil/ARM, GCC и IAR
Стандарт программного интерфейса микроконтроллера коры 135
CMSIS-DSP
Поскольку мы видели в Главе 3 “Архитектуру Cortex-M” Кора-M4, “Контроллер
Цифрового сигнала” со многими улучшениями для поддержки алгоритмов DSP.
Разработка оперативной системы DSP лучше всего описана как “нетривиальное время
передачи” и может быть довольно пугающей для всех кроме самых простых систем.
Чтобы помочь простым смертным включать алгоритмы DSP в Cortex-M4/M7 и
проекты Коры-M3, CMSIS включает библиотеку DSP, которая обеспечивает более чем
60 из обычно используемых математических функций DSP. Эти функции
оптимизированы для работы Коры-M4 и Коры-M7, но могут также быть
скомпилированы для работы Коры-M3. Мы взглянем на пользование этой
библиотекой в Главе 8 “Практический DSP для Коры-M4 и Коры-M7”.
CMSIS-драйвер
Спецификация CMSIS-драйвера определяет стандартный API для диапазона
периферийных устройств, которые характерны для большинства семейств
микроконтроллеров. Это включает периферийные устройства, такие как USART,
SPI, и I2C, а также более сложные периферийные устройства, такие как Ethernet
MAC и USB.
CMSIS-драйверы предназначаются для обеспечения стандартной цели для
библиотек промежуточного программного обеспечения. Например, это позволило
бы стороннему разработчику создавать библиотеку USB, которая использовала
драйвер CMSIS-USB. Такая библиотека могла затем быть развернута на любом
устройстве, которое имеет драйвер CMSIS-USB. Это значительно ускоряет
поддержку новых устройств и разрешает библиотеку
разработчики для концентрации на добавлении опций к их продуктам вместо того,
чтобы постоянно иметь необходимость потратить поддержку разработки времени
новых устройств.
CMSIS-SVD и DAP
Одна из ключевых проблем для поставщиков инструментов должна смочь оказать
поддержку отладки для новых устройств, как только они выпущены. Одной из
основных областей, которые должны быть настроены в отладчике, являются окна
“Peripheral View”, которые показывают разработчику текущее состояние
периферийных устройств микроконтроллера. С ростом и в числе поставщиков Cortex-
M и также в возрастающем числе и сложности периферийных устройств на
микросхеме для любого данного поставщика инструментов становится почти
невозможно поддержать поддержку всех возможных микроконтроллеров. Для
преодоления этого препятствия, спецификация CMSIS-SVD определяет “Системный
файл” Описания Средства просмотра. Этот файл обеспечивается и сохраняется
кремниевым поставщиком и содержит полное описание периферийных регистров
микроконтроллера в формате XML. Этот файл затем импортируется средством
разработки, которое использует его для автоматического построения периферийных
окон отладки для микроконтроллера. Этот подход позволяет полной поддержке для
отладочных средств быть доступной, как только новые микроконтроллеры выпущены.
136 Глав 4
Рисунок 4.5
CMSIS-DAP допускает совместимость между различными поставщиками — отладчики
программного и аппаратного обеспечения.
CMSIS-пакет
Спецификации CMSIS-ядра и Драйвера могут использоваться для разработки
допускающих повторное использование компонентов программного обеспечения,
которые являются портативными через семейства устройств. Спецификация CMSIS-
пакета определяет метод связывания всех элементов компонента (программные файлы,
примеры, справочные файлы, шаблоны) в программный пакет. Такой Пакет может быть
загружен и установлен в Ваш набор инструментальных средств. Пакет также содержит
информацию о зависимостях от компонента программного обеспечения, то есть, другие
файлы, которые должны присутствовать, когда компонент используется. Это позволяет
Вам быстро интегрировать программное обеспечение из многих источников для создания
платформы, на которой можно разработать код приложения. Поскольку сложность
микроконтроллеров Cortex-M когда-либо увеличивается, это - очень важная технология
для повышения производительности и надежности кода разработчика.
Основы CMSIS
CMSIS-базовая спецификация обеспечивает стандартный набор низкоуровневых
функций, макросов и периферийных определений регистра, которые позволяют
Ваш код приложения легко доступу
Стандарт программного интерфейса микроконтроллера коры 137
Кодирование правил
В то время как CMSIS важен для обеспечения стандартизированного программного
интерфейса для всех микроконтроллеров Cortex-M, это также интересно для
встроенных разработчиков, потому что это основано на непротиворечивом множестве
“C” кодирующие правила под названием MISRA-C. При применении эти правила
кодирования генерируют четкий однозначный код “C”, и этот подход стоит изучить,
поскольку он воплощает многие лучшие практики, которые должны быть приняты
при записи исходного кода “C” для собственного прикладного программного
обеспечения.
MISRA-C
MISRA-C кодирование стандарта сохраняется и публикуется MIRA. MIRA, обозначает
“Агентство по Исследованию Автомобильной промышленности”, расположен около
Регби в Англии и ответственен за многие промышленные стандарты, используемые
британской автомобильной промышленностью. В 1998 его подразделение
программного обеспечения выпустило первую версию его правил кодирования,
официально названных “инструкции MISRA для использования C в электронике
механизма” (Рис. 4.6).
Рисунок 4.6
Исходный код CMSIS был разработан с помощью MISRA-C в качестве
стандарта кодирования.
Исходная спецификация MISRA-C содержала 127 правил, которые попытались,
предотвращают общие ошибки кодирования и разрешают серые области ANSI C
спецификация при применении к встроенным системам. Хотя первоначально
предназначено для автомобильной промышленности, MISRA-C встретил признание в
более широком сообществе встроенных систем. В 2004 исправленное издание MISRA-C
138 Глав 4
{
/*. . .. . ..*/
Где возможный правила MISRA-C были разработаны так, чтобы они могли быть
статически проверены или вручную или специальным инструментом. Стандарт
MISRA-C не является открытым стандартом и публикуется в газете и электронной
форме на веб-сайте MIRA. Полное изложение того, как получить Стандарт MISRA,
доступно в Приложении A.
CMSIS-базовая структура
CMSIS-базовые функции могут быть включены в Ваш проект посредством
добавления трех файлов. Они включают код запуска по умолчанию со стандартной
таблицей векторов CMSIS.
140 Глав 4
Рисунок 4.7
CMSIS-базовый стандарт состоит из запуска устройства, система C код и заголовок
устройства. Заголовок устройства определяет периферийные регистры устройства и
получения по запросу в заголовочных файлах CMSIS. Заголовочные файлы CMSIS
содержат все CMSIS-базовые функции.
Код запуска
Код запуска обеспечивает вектор сброса, начальное значение указателя вершины стека
и символ для каждого из векторов прерывания.
__ Векторы DCD __ initial_sp ; Вершина стека
DCD Reset_Handler ; Обработчик сброса
DCD NMI_Handler ; Обработчик NMI
; Обработчик серьезных
DCD HardFault_Handler отказов
; Обработчик ошибок
DCD MemManage_Handler MPU
Системный код
Обработчик сброса называет SystemInit () функцией, которая расположена в CMSIS
system_, устройство.. c файл. Этот код поставляется кремниевым производителем,
и он предоставляет весь необходимый код для конфигурирования
микроконтроллера после того, как он оставляет вектор сброса. Обычно это
включает установку внутренних цепей фазовой синхронизации, настраивая
часы микроконтроллера древовидная и внутренняя структура шины, включая
внешнюю шину при необходимости. Конфигурацией функций инициализации
управляет ряд #defines расположенный
в начале модуля. Это позволяет Вам настраивать базовую конфигурацию
системные периферийные устройства микроконтроллера. Начиная с SystemInit ()
выполняется функция, когда листы микроконтроллера сбросят системные
периферийные устройства микроконтроллера, и процессор Cortex-M будет в
полностью настроенном состоянии, когда программа достигает основной (). В
прошлом этот системный код инициализации - что-то, что необходимо было бы
записать или запереть от примера кода. На новом микроконтроллере это было бы
работой нескольких дней, таким образом, SystemInit () функция действительно
сохраняет Вас много времени и усилия. SystemInit () функция также устанавливает
глобальную переменную CMSIS SystemCoreClock на частоту ЦП. Эта переменная
может затем использоваться кодом приложения в качестве ссылочного значения при
конфигурировании периферийных устройств микроконтроллера. В дополнение к
SystemInit () функция системный файл CMSIS содержит дополнительную функцию
для обновления переменной SystemCoreClock, если частота тактовой частоты ЦП
изменяется на лету. Функциональный SystemCoreClockUpdate (); пустая функция,
которая должна быть вызвана, если частота тактовой частоты ЦП изменяется. Эта
функция адаптируется в соответствии с каждым микроконтроллером и оценит
регистры дерева часов, чтобы вычислить новую рабочую частоту ЦП и заменить
переменную SystemCoreClock соответственно.
__ IO uint32_t PUPDR; /*!, порт GPIO регистр pull-up/pull-down, Смещение адреса: 0x0C */
__ IO uint32_t IDR; /*!, регистр входных данных порта GPIO, Смещение адреса: 0x10 */
__ IO uint32_t ODR; /*!, регистр данных выхода порта GPIO, Смещение адреса: 0x14 */
__ IO uint16_t BSRRL; /*!, набор битов порта GPIO / сбросил низкий регистр, Смещение адреса: 0x18 */
__ IO uint16_t BSRRH; /*!, набор битов порта GPIO / сбросил высокий регистр, Смещение адреса: 0x1A */
__ IO uint32_t LCKR; /*!, регистр блокировки конфигурации порта GPIO, Смещение адреса: 0x1C */
__ IO uint32_t AFR[2]; /*!, GPIO чередуют функциональные регистры, Смещение адреса: 0x24-0x28 */
} GPIO_TypeDef;
Затем символы регистра для каждого порта GPIO могут быть объявлены.
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
Прерывания и исключения
Управление регистрами NVIC может быть сделано функциями, обеспеченными в
группе исключения и прерывании. Эти функции позволяют Вам устанавливать канал
прерывания NVIC и управлять его приоритетом, а также опрашивать регистры NVIC
в течение времени выполнения (Таблица 4.5).
Эта функция настраивает значение обратного отсчета таймера SysTick и включает его
прерывание, таким образом, исключение будет повышено, когда его количество
достигнет нуля. Начиная с systemInit () функция
146 Глав 4
Теперь, когда у нас есть два источника прерывания, мы можем использовать другое
прерывание CMSIS и функции исключения для управления приоритетными
уровнями. Количество приоритетных уровней будет зависеть от того, сколько
приоритетных битов было реализовано кремниевым производителем. Для всех
процессоров Cortex-M мы можем использовать простую “плоскую” систему
приоритетов, где нуль является самым высоким приоритетом. Приоритетный
уровень установлен:
NVIC_SetPriority (IRQn_Type IRQn, uint32_t приоритет);
его полем VECTKEY. Для обновления этого регистра, необходимо записать “0x5FA” в
поле VECTKEY. SetPriorityGrouping () функция предоставляет весь необходимый код,
чтобы сделать это.
Хотя оба блока кода достигают того же самого, версия CMSIS намного быстрее для
записи более читаемый и намного менее подверженный кодированию ошибок.
Разработайте оба проекта и сравните размер произведенного кода.
__ set_PRIMASK (пусто); __
set_FAULTMASK (пусто); __
разрешать-IRQ __
enable_Fault-irq __
set_BASEPRI ()
В то время как все эти функции включают и отключают источники прерывания, они
все имеют немного отличающиеся эффекты. __ set_PRIMASK () функция и функции
enable_IRQ/Disable_IRQ имеют тот же эффект, в котором они устанавливают и
очищаются, PRIMASK укусил, который включает и отключает все источники
прерывания кроме Обработчика Серьезных отказов и Немаскируемого прерывания. __
set_FAULTMASK () функция может использоваться для отключения всех прерываний
кроме Немаскируемого прерывания. Мы будем видеть позже, как это может быть
полезно, когда мы хотим обойти единицу Защиты памяти. Наконец __ set_BASEPRI ()
функция устанавливает минимальный активный приоритетный уровень для
пользовательских прерываний ввода-вывода. Когда регистр Базового приоритета
установлен на ненулевой уровень и прерывание на том же приоритетном уровне или
ниже будет отключен.
(Длительн
ый)
150 Глав 4
Рисунок 4.8
Результаты intrinsics операций.
CMSIS-SIMD Intrinsics
Следующая группа CMSIS intrinsics обеспечивает прямой доступ к инструкциям
Коры-M4 и Коры-M7 SIMD.
Трассировка инструментария
Заключение
Хорошее понимание каждой спецификации CMSIS является ключевым для
эффективной разработки приложений для любого Основанного на Cortex-M
микроконтроллера. В этой главе мы представили каждую спецификацию CMSIS и
бросили подробный взгляд на CMSIS-базовую спецификацию. Мы посмотрим на
остающиеся спецификации CMSIS через остальную часть этой книги.
Эта страница, намеренно
оставленная незаполненный
CHPTER5
Введение
В последних нескольких главах мы покрыли большую часть того, что необходимо
знать для разработки с Основанным на Cortex-M микроконтроллером. В этой главе мы
посмотрим на некоторые из большего количества расширенных функций процессора
Cortex-M. Все функции, обсужденные в этой главе, включены в Кору-M01,-M3,-M4,
и-M7. В этой главе мы посмотрим на различные рабочие режимы, встроенные в
каждый из процессоров Cortex-M и некоторых дополнительных инструкций, которые
разработаны для поддержки использования операционной системы реального времени
(RTOS). Мы также взглянем на дополнительную Единицу защиты памяти (MPU),
которая может быть приспособлена к Коре-M01,-M3,-M4, и-M7 и как это может
разделить карту распределения памяти. Это обеспечивает управляемый доступ к
различным регионам памяти в зависимости от рабочего режима процессора. Для
закругления главы мы взглянем на шинный интерфейс между процессором Cortex-M и
системой микроконтроллера.
Рисунок 5.1
Каждый процессор Cortex-M имеет два режима выполнения, Обработчик (прерывание)
и Поток (фон). Возможно настроить эти режимы для назначения полномочий и
непривилегированный доступ к регионам памяти. Также возможно настроить рабочий
режим с двумя стеками.
Рисунок 5.2
Регистр управления является регистром ЦП, к которому могут только получить доступ
MRS и инструкции MSR. Это содержит два бита, которые настраивают уровень
полномочий режима Thread и активацию указателя стека процесса.
Указатель Стека процесса является окруженным валом указателем вершины стека R13,
который используется кодом, работающим в режиме Thread. Когда процессор Cortex-M
отвечает на исключение, он переходит к режиму Handler. Это вызывает ЦП к указателям
стека коммутаторов. Это означает, что режим Handler будет использовать Основной
указатель вершины стека (MSP), в то время как режим Thread использует Указатель
Стека процесса (Рис. 5.3).
Рисунок 5.3
В сбросе R13 является основным указателем вершины стека и автоматически
загружается начальным значением стека. Регистр контроля ЦП может
использоваться для включения окруженного валом регистра R13 секунды. Это
Стек процесса, который используется в режиме Thread. Код приложения должен
загрузить начальное значение стека в этот регистр.
158 Глав 5
Так, если необходимо вручную установить начальное значение Стека процесса, каково
это должно быть? Нет простого способа ответить на это, но компилятор производит
файл отчета, который детализирует статическое дерево вызова для проекта. Этот файл
создается каждый раз, когда проект разрабатывают и называют, название проекта..
htm. Файл отчета включает значение для максимального использования стека и дерево
вызова для самой долгой цепочки вызовов.
Рисунок 5.4
Размер стека, выделенный основному указателю вершины стека (MSP),
определяется в коде запуска и может быть настроен через
мастер конфигурации.
Рисунок 5.5
Процессор Cortex-M находится в режиме Thread/privileged с помощью основного
стека. PSP не инициализируется.
Рисунок 5.6
Теперь процессор находится в режиме Thread/privileged, но использует Указатель
Стека процесса, который был инициализирован со стековым
пространством 200-х байтов.
Рисунок 5.8
Во время исключения процессор переходит к режиму Обработчика /
привилегированному режиму.
Вызов контролера
После того, как настроенный, этот более усовершенствованный рабочий режим
обеспечивает раздел между кодом исключения/прерывания, работающим в режиме
Handler и кодом фонового приложения, работающим в режиме Thread. Каждый
рабочий режим может иметь свой собственный регион кода, регион RAM и стек. Это
предоставляет полный доступ кода обработчика прерываний к микросхеме без риска,
что это может быть повреждено кодом приложения. Однако в какой-то момент код
приложения должен будет получить доступ к функциям процессора Cortex-M,
которые только доступны в режиме Handler с его полным привилегированным
доступом. Чтобы позволить этому происходить, Ползунок, 2 системы команд имеют
инструкцию, названную вызовом контролера (SVC). Когда эта инструкция
выполняется, она повышает исключение супервизора, которое перемещает процессор
от выполнения кода приложения в режиме потока / непривилегированном режиме к
стандартной программе исключения в режиме обработчика / привилегированном
режиме. SVC имеет свое собственное расположение в таблице векторов и ведет себя
как любое другое исключение (Рис. 5.9).
162 Главы 5
Рисунок 5.9
Вызов контролера (SVC) позволяет выполнению перемещаться от
непривилегированного режима Thread до привилегированного режима Handler и
получать полный неограниченный доступ к процессору Cortex. Инструкция SVC
используется вызовами API RTOS.
Рисунок 5.10
Неиспользованная часть инструкции SVC может быть закодирована порядковым числом.
На записи в обработчик SVC это число может быть считано для определения, какой
SVC функционирует для выполнения.
Рисунок 5.11
Инструкции SVC поддерживаются путем добавления дополнительного модуля
SVC.c. Этот модуль предоставляет код для “декодирования”
инструкции SVC 1 порядковое.
}
освободите test_t (пусто)
{отделение res 5 (res,
10); модификация res 5
(res, 3);
Рисунок 5.12
До инструкции SVC процессор работает в режиме Thread.
Рисунок 5.13
После того как инструкция SVC была выполнена, provesor будет работать в режиме
Handler.
Первый раздел кода SVC_Handler удается, какой стек используется и затем читает,
значение счетчика команд экономило на стеке. Значение счетчика команд является
обратным адресом, таким образом, инструкция по загрузке вычитает 2 для получения
адреса инструкции SVC.
166 Глав 5
После того как функция SVC была выполнена, она возвратится назад к обработчику
исключений SVC для чистки прежде, чем возвратиться к фоновому коду в режиме
обработчика.
Исключение PEND_SV
Кора-M01,-M3,-M4, и-M7 имеют дополнительное исключение процессора,
названное исключением PENDSV. Исключение PENDSV было добавлено к
процессору Cortex-M, прежде всего, для поддержки RTOS. Мы более тщательно
изучим то, как RTOS использует исключение PENDSV в Главе 9 “CMSIS-RTOS”,
но на данный момент мы посмотрим на то, как это работает. Исключение PENDSV
может считаться каналом прерывания NVIC, который подключен к регистру
процессора, а не периферийному устройству микроконтроллера. Исключение
PENDSV может быть повышено прикладным программным обеспечением,
пишущим в регистр PENDSV, исключение PENDSV затем обработано таким же
образом как любое другое исключение.
Функции передовой архитектуры 167
Пример Pend_SV
В этом примере мы исследуем, как использовать прерывание вызова системной
службы PENDSV.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Выберите вкладку Example и Копию “исключение EX 5.3 PENDSV”
Разработайте проект и запустите отладчик.
Рисунок 5.14
Выполните код до systemCode () функция.
Рисунок 5.16
Выполните Do_System_Code () стандартная программа.
Рисунок 5.17
Теперь исключение SVC работает в ADC и ожидании исключений PENDSV.
Теперь SVC работает в ADC и вызове системной службы PENDSV в незаконченном
состоянии.
Одноэтапный из Вызова Системной службы, пока Вы не вводите следующее
прерывание.
Рисунок 5.18
Теперь прерывание ADC активно, когда это закончится, стандартная программа
PENDSV будет подаваться, и стандартная программа
системного кода возобновится.
Межпроцессорные события
Процессоры Cortex-M разработаны так, чтобы было возможно создать
многопроцессорные устройства. Пример состоял бы в том, чтобы иметь Кору-M4 и
Кору-M0 в том же микроконтроллере. Кора-M0 будет обычно управлять
пользовательскими периферийными устройствами, в то время как Кора-M4 выполняет
интенсивные части кода приложения. С другой стороны, существуют устройства,
которые имеют Cortex-A9, который может запустить Linux и управлять сложным
пользовательским интерфейсом; на той же микросхеме существует две Коры-M4,
которые управляют кодом в реальном времени. Они более сложная система на
структурах кристалла требуют методов сигнального действия между различными
процессорами. Процессоры Cortex-M могут быть объединены в цепочку вместе
сигналом внешнего события. Сигнал события установлен при помощи инструкции по
событию набора. Эта инструкция может быть добавлена к Вашему коду C с помощью
__ SEV () внутренний обеспеченный CMSIS-базовой спецификацией. Когда __ SEV ()
инструкция будет дана, это разбудит целевой процессор, если это перешло к режиму
низкой мощности с помощью __ WFE () инструкция. Если целевой процессор будет
работать, то фиксатор события будет установлен так, чтобы, когда целевой процессор
выполняется __ WFE () инструкция, это сбросило фиксатор события и продолжало
бежать, не переходя к режиму низкой мощности.
Эксклюзивный доступ
Одной из основных характеристик RTOS является поддержка многозадачности. Как
мы будем видеть в следующей главе, это позволяет Вам разрабатывать свой код как
независимые потоки, которые концептуально работают параллельно на процессоре
Cortex-M. Поскольку Ваш код разрабатывает, потоки программы должны будут часто
получать доступ к общим ресурсам быть им SRAM или периферийные устройства.
RTOS обеспечивает механизмы, названные семафорами и взаимными исключениями,
которые используются для управления доступом к периферийным устройствам и
объектам общей памяти (Рис. 5.19).
170 Глав 5
Рисунок 5.19
В многопроцессорной системе или среде мультипотока необходимо управлять
доступом к совместно используемым ресурсам или ошибкам
такой, как считано, прежде чем запись сможет произойти.
Рисунок 5.20
Загрузка и хранит эксклюзивные инструкции, может использоваться для управления
доступом к обращению за помощью памяти. Они разработаны для работы
с единственными и многопроцессорными устройствами.
Второй блок кода делает точно то же самое кроме между эксклюзивной загрузкой и
эксклюзивным хранилищем, которым называют функциональную блокировку потока.
Это - стандартная программа SVC, которая перейдет к режиму обработчика и
переходу к стандартной программе SVC0.
освободите __ svc (0) thread_lock (пусто);
освободите __ SVC_0 (пусто) {
__ LDREXB (&lock_bit);
}
Рисунок 5.22
MPU позволяет Вам определять восемь регионов, каждого с восемью
подобластями по карте памяти процессора. Каждый регион может предоставить
различные права доступа своему диапазону адресов. Также возможно установить
привилегированный доступ значения по умолчанию по целой карте распределения
памяти и затем создать “дыры” с различными правами доступа.
Таким образом, возможно создать сложные шаблоны защиты по пространству адреса
памяти. Это позволяет Вам разрабатывать режим защиты, который помогает создать
устойчивую операционную среду, но также и дает Вам достаточно веревки для
зависания себя.
Функции передовой архитектуры 175
Конфигурирование MPU
MPU настроен через группу регистров с отображенной памятью, расположенных в
системном блоке процессора Cortex-M. К этим регистрам можно только получить
доступ, когда процессор Cortex работает в привилегированном режиме (Рис. 5.23).
Рисунок 5.23
Каждый регион MPU настроен через регион, базовый адрес и регистры атрибута. После
того как каждый регион настроен, регистр управления делает регионы MPU
активными.
Рисунок 5.24
Регистр управления позволяет Вам включать глобальный привилегированный регион
(PRIVDEFENA). Разрешать бит используется для создания настроенных регионов
MPU активными, и HFMIENA используется для включения регионов, когда Серьезный
отказ, NMI или исключения FAULTMASK активны.
Остающиеся регистры используются для конфигурирования восьми регионов MPU.
Для конфигурирования данного региона (0 7) сначала выбирают регион путем записи
его номера региона в регистр числа региона. После того как регион был выбран, он
может затем быть настроен базовым адресом и
176 Глав 5
Рисунок 5.25
Регион адреса Индексного регистра позволяет Вам устанавливать начальный адрес
региона MPU. Значения адреса, которые могут быть записаны, будут зависеть от
установки размера в регистре Атрибута и Размера. Если допустимый установлен на 1,
то набор номера региона в поле региона используется; иначе номер региона в
регистре региона используется.
Рисунок 5.26
Регистр Атрибута и Размера позволяет Вам определять размер региона MPU от 32
байтов до 4 ГБ. Это также настраивает атрибуты памяти и опции
управления доступом.
Поле размера определяет размер адреса региона защиты памяти в байтах. Размер
региона вычисляется с помощью формулы:
Это дает нам минимальный размер, запускающийся на уровне всего 32 байтов. Как
отмечено выше, выбранный размер также определяет диапазон возможных базовых
адресов. Затем, возможно установить атрибуты региона и права доступа. Как
процессор Cortex-M, MPU разработан для поддержки многопроцессорных систем.
Следовательно, возможно определить регионы, как совместно используемые
Функции передовой архитектуры 177
Однажды размер, атрибуты и права доступа определяются, разрешать бит может быть
установлен сделать регион активным. Когда каждый из необходимых регионов был
определен, MPU может быть активирован путем установки глобального, включают
бит в Регистре управления. Когда MPU активен, и код приложения делает доступ,
который нарушает полномочия региона, исключение MPU будет повышено. После
того как Вы вводите исключение MPU, существует несколько регистров, которые
предоставляют информацию, чтобы помочь диагностировать проблему. Первый байт
Настраиваемого регистра Состояния отказа, расположенного в системном блоке
управления, называют регистром Состояния отказа Диспетчера памяти (Рис. 5.27).
178 Глав 5
Рисунок 5.27
Регистр состояния отказа MPU является подразделом настраиваемого регистра
состояния отказа в системном блоке управления. Это содержит флаги ошибки,
которые установлены, когда исключение MPU происходит. Цель каждого флага
показывают в Таблице 5.4.
Флаг Описание
Флаг состояния нарушения прав доступа
IACCVIOL инструкции
DACCVIOL Флаг состояния нарушения доступа к данным
MUNSTKERR Отказ диспетчера памяти на неукладке
MSTKERR Отказ диспетчера памяти на укладке
Диспетчер памяти FPU ленивая ошибочная Кора-M4
MLSPERR укладки только
(см. главу 5: “Усовершенствованные архитектурные
функции”)
MMARVALID Допустимый адрес отказа диспетчера памяти
Рисунок 5.28
Карта распределения памяти проекта Blinky может быть разделена на
шесть регионов.
Теперь откройте меню Options for Target/Target. Здесь, мы можем создать регионы
памяти для соответствия предложенному шаблону защиты MPU (Рис. 5.29).
180 Глав 5
Рисунок 5.29
Целевая карта распределения памяти определяет два региона 0-0x3FFF памяти кода и
0x4000 0x7FFF. Более низкий регион будет использоваться в качестве региона по
умолчанию для содержания кода приложения и будет получен доступ процессором в
непривилегированном режиме. Верхний регион будет использоваться для содержания
прерывания и служебных программ исключения и будет получен доступ процессором
в привилегированном режиме. Точно так же существует два региона RAM 0x10000000,
и 0x100008000 будет содержать данные, используемые непривилегированным кодом и
системными стопками, в то время как верхний регион 0x0207C000 — будет
использоваться для содержания данных, используемых привилегированным кодом. В
этом примере мы не собираемся устанавливать привилегированный регион фона,
таким образом, мы должны отобразить регионы MPU для периферийных устройств.
Все периферийные устройства кроме GPIO находятся в одном непрерывном блоке от
0x40000000, в то время как регистры GPIO находятся в 0x000002C9. К периферийным
устройствам получит доступ процессор, в то время как это находится и в
привилегированных и в непривилегированных режимах
(Рис. 5.30).
Рисунок 5.30
Используйте опции присвоения локальной памяти настроить регионы
памяти, используемые кодом прерывания.
Для подготовки кода мы должны вызвать код обработчика прерываний в регионы,
которые будут предоставлены привилегированный доступ. В этом примере весь код,
который будет работать в режиме Handler, был помещен в один модуль. В локальных
опциях для этого модуля мы можем выбрать код
Функции передовой архитектуры 181
Рисунок 5.31
Окна Peripheral отладчика обеспечивают подробное представление
настроенного MPU.
Рисунок 5.32
Когда исключение MPU произойдет, код векторизует к MemManager_Handler по
умолчанию в коде запуска.
Функции передовой архитектуры 183
Вопрос теперь, что вызвало исключение MPU? Мы можем узнать это путем
рассмотрения отказа диспетчера памяти и регистра состояния (Рис. 5.33).
Откройте окно Peripherals/Core Peripherals/Fault Reports.
Рисунок 5.33
Отладчик также обеспечивает сжатое представление всех регистров
отказа.
Выделите название проекта в окне проекта и двойном щелчке. Это откроет файл
карты. Теперь используйте Редактировать/Находить диалоговое окно для поиска
файла карты адрес 0x2007C008 (Рис. 5.34).
Рисунок 5.34
Можно просмотреть компоновщика файл MAP путем двойного щелчка по корневому
узлу проекта в окне Project. Затем переройте этот файл для нахождения
символа расположенным в 0x2007C008.
Это показывает, что переменная clock_1s в 0x2007C008 и что это объявляется в irq.c.
Рисунок 5.35
Теперь clock_1s переменная расположена в SRAM, к которому можно получить
доступ и привилегированным и
непривилегированным кодом.
Подобласти MPU
Как мы видели, MPU имеет максимум восьми регионов, которые могут быть
индивидуально настроены с размером местоположения и типом доступа. Любой
регион, который настроен с размером 256 байтов или больше будет содержать
восемь одинаково подобласти пространства. Когда регион настроен, каждая из
подобластей включена и имеет атрибуты региона по умолчанию и настройки
доступа. Возможно отключить подобласть путем установки бита подобласти
соответствия в поле SRD регистра атрибута и размера MPU. Когда подобласть
отключена, “дыра” создается в регионе, эта “дыра” наследовала атрибуты и право
доступа любого перекрытого региона. Если не будет никакого перекрытого региона,
то глобальная привилегированная фоновая область памяти будет использоваться.
Если фоновая область памяти не будет включена затем, то никакие права доступа не
предоставят, и исключение MPU будет повышено, если доступ будет сделан к
адресу в подобласти “дырой” (Рис. 5.36).
Рисунок 5.36
Каждый регион имеет восемь подобластей. Если подобласть отключена, она
наследовала права доступа от перекрытого региона или
глобальной фоновой области памяти.
Функции передовой архитектуры 185
Если у нас будет два перекрытых региона, то регион с самым большим количеством
региона будет иметь приоритет. В случае выше, непривилегированный регион
перекрывается привилегированным регионом. Перекрытый раздел даст доступу
полномочия. Если подобласть будет отключена в регионе 1, то права доступа в
регионе 0 будут наследованы и предоставят непривилегированный доступ к
диапазону подобласти адресов.
Ограничения MPU
При разработке прикладного программного обеспечения для использования MPU
необходимо понять, что MPU только контролирует действие процессора Cortex-M.
Многие, если вообще, Кора, основанные на M микроконтроллеры имеют другие
периферийные устройства, такие как единицы DMA, которые способны к
автономному доступу к памяти и периферийным регистрам. Этими единицами
являются дополнительные “Устройства управления шиной”, которые выносят
решение с процессором Cortex-M для получения доступа к ресурсам
микроконтроллера. Если такая единица сделает доступ к запрещенному региону
памяти, то она не инициирует исключение MPU. Это важно для запоминания,
поскольку процессор Cortex-M имеет структуру шины, которая разработана для
поддержки нескольких независимых устройств “Устройства управления шиной”.
Рисунок 5.37
Первое поколение основанных на ARM микроконтроллеров имело систему
внутренней шины на основе усовершенствованной высокоскоростной шины и
усовершенствованной периферийной шины. Поскольку несколько устройств
управления шиной (ЦП, DMA) были представлены, арбитражная фаза шины должна
была быть завершена, прежде чем передача могла быть сделана через шину.
186 Глав 5
Заключение
Если Вы намереваетесь написать код без операционной системы затем, объем
информации в этой главе может быть проигнорирован. Однако эти функции
критически важны, если Вы хотите использовать больше платформы перспективной
разработки, такой как RTOS, поскольку мы будем видеть в Главе 9 “CMSIS-RTOS”,
В то время как процессоры Cortex-M просты в использовании, они действительно
включают функции для поддержки безопасности, критических, и приложений
защиты, а также многоядерных систем.
Эта страница, намеренно
оставленная незаполненный
CHPTER6
Процессор коры-M7
В первых нескольких главах этой книги мы посмотрели на Кору-M0,-M01,-M3,
и процессоры-M4. Затем мы собираемся исследовать последний процессор Cortex-M,-
M7. Кора-M7 в настоящее время является самым высоким процессором Cortex-M
выполнения. Это сохраняет модель того же программиста как другие члены семейства
так все, что мы изучили, до сих пор может быть применен к Коре-M7. Однако его
внутренняя архитектура имеет некоторые радикальные различия к более ранним
процессорам Cortex-M, которые существенно улучшают его производительность.
Кора-M7 также имеет более сложную систему памяти, которую мы должны понять и
управлять (Рис. 6.1).
Рисунок 6.1
Кора-M7 имеет более сложную структуру шины и структуру памяти, но она сохраняет
Cortex-M
модель
программиста.
Руководство разработчика по семейству процессоров
Cortex-M.
DOI: http://dx.doi.org/10.1016/B978-0-08-100629-0.00006-2 189
© 2016 Elsevier Ltd. Все права защищены.
190 Глав 6
Суперскалярная архитектура
Кора-M7 имеет суперскалярную архитектуру и расширенный конвейер. Это означает,
что может к “двойной проблеме” инструкции, и при определенных условиях эти две
инструкции могут быть обработаны параллельно (Рис. 6.2).
Рисунок 6.2
Кора-M7 имеет шестиэтапный двойной конвейер проблемы. ЦП имеет несколько
обработок “каналы”, которые позволяют различным группам
инструкций быть обработанными параллельно.
Предсказание ветвлений
Производительность Коры-M7 далее улучшена путем добавления кэша ответвления к
единице предсказания ветвлений (Рис. 6.3). Это - специализированный блок кэш-
памяти с 64 записями каждый 64 бита шириной. Во время выполнения во время
выполнения Целевой кэш адреса ответвления (BTAC) обеспечит корректный адрес
ответвления. Если правильно предсказано BTAC позволяет ответвлениям цикла быть
обработанными в единственном цикле. Команды перехода могут также быть
обработаны параллельно с другой двойной данной инструкцией, далее
минимизирующей ответвление наверху. Это - критическая функция, поскольку она
позволяет микроконтроллеру общего назначения близко подходить к соответствию
производительности цикла выделенного устройства DSP.
Рисунок 6.3
BTAC гарантирует, что команды перехода являются единственным циклом.
Это значительно уменьшает любые издержки в
программных циклах.
Упражнение 6.1 Простой цикл
В этом осуществлении мы собираемся использовать некоторые реальные
аппаратные средства в форме платы Исследования STM32F7 и платы
Исследования STM32F4 вместо средства моделирования программного
обеспечения.
192 Главы 6
Рисунок 6.4
Эти два проекта открыты в многопроектной рабочей области.
Рисунок 6.5
Разработайте оба проекта с командой Batch Build.
Рисунок 6.6
Выберите M7 как активный проект.
Процессор 193 коры-M7
Рисунок 6.7
Читайте цикл значат M7.
Рисунок 6.8
Читайте цикл значат-M4.
Структура шины
Кора-M7 также имеет более сложную структуру шины, чем более ранние процессоры
Cortex-M, все еще поддерживая линейную карту распределения памяти. Кора-M7
имеет шинный интерфейс AXI-M,
194 Главы 6
Рисунок 6.9
Кора-M7 представляет много новых шинных интерфейсов.
Рисунок 6.10
Типичная конфигурация шинного интерфейса для микроконтроллера
Коры-M7.
В этом примере шина AXI-M подключена к матрице шины AHB через мост. Однако
AHB соединяют шиной, только подключает входы шины AXI-M к системной памяти
микроконтроллера. Периферийные шины шины AHB подключены назад к Коре-M7
через порты AHBP. Каждая из единиц DMA может действовать как устройства
управления шиной и иметь доступ ко всей системной памяти и периферийным
устройствам и может использовать Ведомую шину ADB для доступа к Инструкции и
Данным TCM. Хотя шина AHBS показывается как направляемый через Кору-M7, эта
шина будет бодрствовать, если процессор Cortex-M7 будет помещен в режим низкой
мощности. Это позволяет другим устройствам управления шиной получить доступ к
TCM, даже когда Кора-M7 полностью затекает.
Иерархия памяти
Более сложная структура шины Коры-M7 поддерживает карту распределения памяти,
которая содержит иерархию регионов памяти, которую должен понять и управлять
разработчик (Рис. 6.11).
196 Глав 6
Рисунок 6.11
Кора-M7 имеет иерархию памяти различных уровней производительности.
Во-первых Кора-M7 имеет два блока TCM — один для данных и один для
инструкций. Инструкция-TCM и Данные-TCM подключены к процессору через 64-
разрядную шину и являются памятью состояния с нулевым временем ожидания.
Инструкция-TCM и Данные-TCM могут быть до 16 K (Рис. 6.12).
Рисунок 6.12
TCMs являются памятями состояния с нулевым временем ожидания, с
которыми соединяют интерфейсом
непосредственно к ЦП через
специализированные 64-разрядные шины.
Рисунок 6.13
Проект имеет два модуля цикла, которым определили местоположение их кода
в ITCM и Флэш-памяти AXI.
В этом проекте у нас есть два набора функций цикла, которые накапливают
значения, сохраненные в тысяче массивов элемента. По умолчанию проект
поместит код во флэш-память, которая расположена на шине AXI-M в 0x8000000
(Рис. 6.14).
Рисунок 6.14
Расположение памяти с дополнительным регионом (RAM1), созданный для
покрытия ITCM.
198 Глав 6
Рисунок 6.15
Модуль локальные опции используется для отображения данных кода/константы в
регион RAM1. Код, расположенный в регион RAM I-TCM, будет автоматически
загружен из Flash в I-TCM кодом запуска.
Блоки кэш-памяти
За пределами TCMs весь код программы и данные будут сохранены в системной памяти.
Это будет микроконтроллером внутренний Flash и SRAM. Микроконтроллер может
также иметь интерфейс внешней шины для доступа к дополнительной RAM и памяти
ROM. Как мы видели с Корой-M3 и-M4, необходимо обеспечить некоторую форму
“Акселератора Флэш-памяти” для освобождения инструкций от флэш-памяти до ЦП для
поддержания обработки в полной тактовой частоте ЦП. Кора-M7 является оба более
высоким процессором производительности и разработана для выполнения в более
высоких тактовых частотах, и эта форма ускорения памяти больше не является
полностью эффективной. Для соблюдения и его кода и требований пропускной
способности Кора-M7
может быть реализован и с Кэшами Данных и с Инструкции (Рис. 6.16).
Рисунок 6.16
I-кэш и D-кэш привыкли к кэш-памяти, расположенной на шине AXI-M.
200 Глав 6
Операция кэша
Как TCMs, Кэши Инструкции и Данных являются блоками памяти, внутренней к
процессору Cortex-M7, которые способны к тому, чтобы быть полученным
доступ с состояниями с нулевым временем ожидания. Кэш Инструкции может
составить до 64 Кбит в размере, и Кэш Данных может составить до 16 Кбит
(Рис. 6.17).
Рисунок 6.17
Кэш состоит из строки данных, которая отображается на физической памяти через Тег. Биты
C определяют политику кэша, в то время как V и биты D используются для отслеживания
состояние данных.
Рисунок 6.18
Строка кэша зеркально отражается к ячейкам памяти через пространство
физической памяти.
Рисунок 6.19
Во время выполнения данные будут загружены в кэш. Это может также быть
выселено, если к зеркальному местоположению
кэша получают доступ.
Рисунок 6.20
Для повышения эффективности кэша кэш, я расположен как много параллельных
страниц. Это обеспечивает несколько местоположений для
хранения кэшированных данных.
Кэш инструкции
Кэшем Инструкции управляет небольшая группа функций, обеспеченных CMSIS-
базовой спецификацией. Функции обеспечиваются, чтобы включить и отключить
Кэш Инструкции. Существует также функция для лишения законной силы
содержимого кэша. Когда Кэш Инструкции делается недействительным, все
допустимые биты очищены, эффективно освободив кэш любых загруженных
инструкций. В то время как выполнение продолжается, выборки к адресу команды
начнут перезагружать кэш (Таблица 6.1).
После того, как сброшено оба из кэшей отключены. Для корректного запуска Кэша
Инструкции, необходимо сначала делать недействительным его содержание прежде,
чем включить его. После того, как включенный это самосправляется, и в большинстве
приложений не потребует дальнейшего внимания от кода приложения.
Это добавляет новый блок кода к последнему примеру. Здесь мы включаем Кэш
Инструкции и повторно выполняем функции цикла AXI для наблюдения изменения
в синхронизации.
Откройте окна/окно отладки представления / последовательные окна/окно отладки.
Выполните код и наблюдайте различие во время выполнения по сравнению с
исходным примером.
Синхронизация Цикла меры в Flash AXI с I-кэшем Включила
синхронизацию цикла AXI с I-кэшем и DTCM RAM 5 62395
Синхронизация цикла AXI с I-кэшем и SDRAM 5 76300
204 Главы 6
Кэш данных
Кэш Данных также расположен на шине AXI-M для кэширования любых системных
доступов RAM. В то время как это ускоряет доступ к данным программы, это может
представить неожиданные побочные эффекты из-за проблем когерентности данных
между системной памятью и Кэшем Данных. Кэш Данных является в
действительности затенением системная память так, чтобы переменная программы
могла жить в двух местах в кэше и в памяти SRAM. Это было бы прекрасно, если бы
ЦП был единственным устройством управления шиной в системе. В типичном
микроконтроллере Коры-M7 может быть несколько других устройств управления
шиной в форме периферийных единиц DMA или даже другие процессоры Cortex-M. В
такой много основной системе кэш может теперь представить проблему
когерентности данных (Рис. 6.21).
Рисунок 6.21
D-кэш может представить проблемы когерентности данных. Системная память может
быть обновлена другими устройствами управления шиной. D-кэш может
“скрыть” эти изменения от ЦП.
Так как наши данные могут теперь быть сохранены, несколько местоположений в
иерархии памяти (регистр ЦП, Кэш Данных, микроконтроллер SRAM), чем более
медленная системная память может содержать историческую ценность, которая
отличается от текущих данных, расположенных в Кэше Данных, единица DMA будет
только иметь доступ к системной памяти, так будет использовать, тем более старая
историческая ценность, а не текущее значение, сохраненное в кэше, Кроме того,
обновление DMA микроконтроллера SRAM, может быть замаскирована от ЦП
устаревшим значением, сохраненным в кэше данных. Это означает, что Кэш Данных,
действительно требует большего количества управления, чем Кэш Инструкции. В
CMSIS-базовой спецификации существует восемь функций Управления кэшем
Данных
(Таблица 6.2).
Процессор 205 коры-M7
Как с Кэшем Инструкции, Кэш Данных отключен, после того, как сброшено и
должен сначала делаться недействительным, прежде чем он будет включен.
CMSIS-базовый кэш включает функции, выполняют аннулирование прежде, чем
включить любой кэш.
Барьеры памяти
В Главе 5 “Функции Передовой архитектуры” мы видели, что ползунок Cortex-M 2
системы команд содержит группу инструкций по барьеру памяти. Инструкции по
барьеру памяти используются для поддержания данных и когерентности инструкции в
микроконтроллере Cortex-M. Эти инструкции редко используются в большинстве
проектов Cortex-M и когда они - это, главным образом для безопасного
программирования. Однако при работе с Кэшами Инструкции и Данных Коры-M7 они
используются, чтобы гарантировать, что операции кэша закончились прежде, чем
позволить ЦП продолжать обрабатывать. CMSIS-базовые функции кэша включают
необходимые инструкции по барьеру памяти гарантировать, что все операции кэша
завершились, когда функция возвращается.
__ STATIC_INLINE освобождают SCB_EnableICache (пусто)
{
#if (__ ICACHE_PRESENT 55 1U)
__ DSB ();
206 Глав 6
__ ISB ();
SCB-.ICIALLU 5 0UL;/* делают недействительным I-кэш */SCB-.CCR | 5
(uint32_t) SCB_CCR_IC_Msk;/* включают I-кэш */__ DSB ();
__ ISB ();
#endif
}
Это добавляет новый блок кода к последнему примеру. Здесь мы включаем Кэш
Инструкции и повторно выполняем функции цикла AXI для наблюдения изменения
в синхронизации.
Откройте окна/окно отладки представления / последовательные окна/окно отладки.
Политика кэша
Политика кэша для различных регионов памяти в микроконтроллере может быть
определена через регионы MPU с битами конфигурации кэша в MPU “Атрибут и
Размер” регистр (Рис. 6.22; Таблица 6.3).
Рисунок 6.22
MPU “Атрибут и Размер” регистр.
Остающиеся значения TEX там для поддержки более сложных систем памяти,
которые могут иметь второй внешний кэш (L2).
После того как ячейка памяти была загружена в кэш, который мы можем
определить, когда системная RAM будет обновлена. Существует две возможных
записи “политик обновления через” и “записывают обратно”.
Рисунок 6.23
Запишите через политику кэша.
Запись назад политика вызовет записи к кэш-памяти только, и данные будут только
записаны в системную память, когда данные кэша будут выселены или кэш, чистая
инструкция дается. Это максимизирует производительность кэша для записей данных
за счет когерентности кэш-памяти (Рис. 6.24).
Рисунок 6.24
Политика кэша с обратной записью.
Выключите кэш
Самая простая вещь сделать, выключают Кэш Данных. В то время как это удалит
любую проблему когерентности, она уменьшит производительность Коры-M7.
Однако это может быть полезная опция в начале проекта для упрощения системы.
Это подобно первой опции кроме, мы можем программировать регион MPU для
предотвращения данных, кэширующихся на регионе системной памяти. Мы можем
затем определить местоположение данных, которые характерны для Коры-M7 и
других устройств управления шиной в этот регион. Так как весь доступ будет к
системной памяти не будет никаких проблем когерентности, но доступы к этому
региону памяти с Corex-M7 будут в их самом низком.
Если политика кэша для региона будет установлена записать через системную
память, то будет всегда обновляться. Таким образом, это - более ограниченная
опция, где код приложения пишет в память, совместно использованную
устройствами управления шиной.
В этом осуществлении MPU настраивает Кэш Данных для покрытия первых 128 Кбит
внешнего SDRAM, который заполняется с двумя массивами данных. Код приложения
заполняет массив некоторыми заказанными данными и пишет нуль в секунду. Затем
единица DMA (устройство управления шиной) используется для копирования данных
из первого массива во второе. Наконец мы тестируем на когерентность данных между
содержанием двух массивов. Мы можем использовать эту простую программу для
наблюдения эффекта различных параметров кэширования. Код MPU содержится в
единственном исходном файле и заголовочном файле, таким образом, он может быть
снова использован в других проектах.
Откройте установщик пакета.
Выберите Советы:: разработчики ведут учебное руководство.
Вновь откройте последнее осуществление “Исключая 6.5 Кэшами Данных”.
Прокомментируйте строку 90, таким образом, Кэш Данных не включен.
Разработайте проект.
Запустите отладчик.
Откройте окна/отладку представления / последовательные окна/отладку printf окно.
Выполните код.
Во время этого первого показа Кэш Данных отключен, чтобы дать нам базовую
линию для различных конфигураций кэша. Циклы, взятые для каждой операции,
следующие:
-. Циклы ЦП потратили для инициализации массивов: 5 217-.CPU
циклов потратили ре, инициализирующее исходный массив 1065-
.CPU циклы, потраченные на Передачу DMA: 11985
-. Циклы ЦП потратили для сравнения: 13912 было
0 различных чисел
Рисунок 6.25
Параметры конфигурации MPU.
Восстановите код.
Запустите отладчик и выполните код.
-. Циклы ЦП потратили для инициализации массивов: 5 184-.CPU
цикла потратили ре, инициализирующее исходный массив 1064-
.CPU циклы, потраченные на Передачу DMA: 11985
-. Циклы ЦП потратили для сравнения: 13910 было
0 различных чисел
Рисунок 6.26
Установите регион D-кэша, чтобы быть нес обеспечением
совместного доступа.
212 Глав 6
Открытый mpu.h.
Изменитесь Bufferable к Да Записывают обратно.
Расширение Типа изменения Чтения Уровня 1 и Записи Выделяет (Рис. 6.27).
Рисунок 6.27
Установите политику D-кэша быть, “Записывают обратно” и “Чтение, и
Запись Выделяют”.
На этот раз код перестал работать, потому что значения данных массива сохранены
в Кэше Данных. Правильные значения не копируются DMA. Также, так как мы
выбрали чтение, и Запись Выделяют, array_sdram2 [] загружается в Кэш Данных,
когда это инициализируется. Это означает, что DMA обновляет SDRAM, но Кора-
M7 будет только видеть старые значения, сохраненные в кэше.
Процессор 213 коры-M7
На этот раз код работает правильно, потому что мы поддержали когерентность между
Кэшем Данных и SDRAM.
Рисунок 6.28
CMSIS-Core получает функцию типа FPU.
Функциональная безопасность
Много секторов дизайна требуют соответствия некоторой форме стандарта
безопасности. Некоторые очевидные секторы являются Медицинскими,
Автомобильными, и Космос. Все больше другие секторы, такие как Управление
производственным процессом, Робототехника и Бытовая электроника все требуют
соответствия к стандартам безопасности. Как показывает опыт, процессы
проектирования, требуемые для функциональной безопасности сегодня, приняты
основными разработчиками завтра. Разработка проекта функциональной безопасности
намного больше, чем пишет и тестирует код полностью. Базовое кремниевое
устройство должно быть продуктом одинаково строгого процесса разработки с
доступной документацией для резервного копирования этого. Микроконтроллер
должен также включить функции (коды с коррекцией ошибок на шинных
интерфейсах, созданных в самопроверке), которые позволяют программному
обеспечению проверять это, процессор работает правильно и смочь обнаружить и
исправить отказы. IEC 61508-3 системы уровня (SIL3) будет часто состоять из
сдвоенных процессоров, работающих или на шаге блокировки или с расположением
супервизора и приложением. Это позволяет системе обнаруживать и справляться с
отказами процессора.
Документация безопасности
Чтобы позволить кремниевым поставщикам разработать новый микроконтроллер,
который подходит для использования безопасности, ARM также предоставляет
обширную документацию в форме пакета безопасности (Таблица 6.8).
Документ Описание
Руководство Руководство по безопасности, описывающее подробно
по отказ процессора
безопасности
обнаружение и функции управления и информация о
аспекты интеграции в реализациях устройства Silicon
Partner
Руководство
FMEA Виды отказа и Анализ Эффектов с качественным анализом
из видов отказа в логике процессора, последствиях отказа
на
поведение процессора и пример количественных
аппаратных средств
метрики
Отчет, ясно дающий понять, как инженеры Silicon Partner
Разработка должны
интерфейсный
отчет управляйте результатами ARM и что ожидать от них
216 Глав 6
Средства разработки
Существует много наборов инструментальных средств, которые были
сертифицированы для использования безопасности. Это главным образом относится
к компилятору и компоновщику. Компилятор ARM, используемый в MDK-ARM,
сертифицирован следующим образом (Таблица 6.9):
Заключение
В этой главе мы видели, что Кора-M7 сохраняет модель программиста Cortex-M
разрешение нас для легкого перехода к этому новому процессору. Однако это
действительно требует времени для понимания большого увеличения
производительности по Коре-M4. Это станет более отмеченным, Кремниевые
Поставщики перемещают меньшие технологии процесса и достигают еще более
высоких тактовых частот. Кора-M7 является также первым процессором Cortex-M с
полным комплектом документации безопасности, которая позволяет кремниевым
поставщикам разрабатывать устройства, подходящие для важных приложений
безопасности.
CHPTER7
Отладка с CoreSight
Введение
Возвращаясь к рассвету современных времен, средства разработки микроконтроллера
были довольно примитивны. Код приложения был записан в ассемблере и протестирован
на версии стираемой программируемой постоянной памяти (EPROM) целевого
микроконтроллера. Каждый EPROM должен был быть стерт ультрафиолетовым светом,
прежде чем он мог быть повторно запрограммирован для следующего тестового прогона
(Рис. 7.1).
Рисунок 7.1
Электрически стираемая программируемая постоянная память была
предшественником сегодняшней Флэш-
памяти.
Для помощи отладке код был “оснащен” путем добавления дополнительных строк
кода, чтобы записать отладочную информацию из UART или переключить контакт
ввода-вывода. Программы отладчика монитора были разработаны для работы
целевого микроконтроллера и выполнения управления кода приложения. В то время
как отладчики монитора были большим шагом вперед, они использовали ресурсы на
микроконтроллере и любой ошибке, которая, вероятно, откажет, код приложения
также разрушит программу мониторинга только в точке, Вам был нужен он (Рис. 7.2).
Рисунок 7.2
Внутрисхемный эмулятор обеспечивает ненавязчивую отладку в реальном времени для
более старых встроенных микроконтроллеров.
Рисунок 7.3
Сегодня аппаратные средства отладки низкой стоимости доступны для
программирования всех устройств Cortex-M.
JTAG позволяет Вам запускать и останавливать выполнение ЦП. Это также позволяет
Вам читать и писать в ячейки памяти и вставлять инструкции в ЦП. Это позволяет
разработчику отладчика останавливать ЦП, сохранять состояние процессора,
выполнять серию команд отладки и затем восстанавливать состояние ЦП и
выполнение перезапуска прикладной программы. В то время как этот процесс
очевиден для пользователя, это означает, что программа отладчика ПК выполнила
управление ЦП (сброс, работала, останов, и установила точку останова) и доступ к
памяти (чтение-запись пользователю
Отладка с CoreSight 219
Рисунок 7.5
Эти два отладочных соединителя требуют минимального количества контактов
процессора для аппаратной отладки.
Рисунок 7.6
Кроме того, для выполнения управления Коры-M3 и Коры-M4 основная система
отладки включает две единицы трассировки. Трассировка
данных и трассировка инструментария.
Аппаратная конфигурация
При разработке собственного аппаратного и программного обеспечения внешний
адаптер отладки подключен к макетной плате через 10-контактный сокет отладки
CoreSight. Адаптер отладки в свою очередь подключен к ПК через USB-кабель (Рис.
7.7).
Рисунок 7.7
Типичная оценочная плата обеспечивает коннектор JTAG/CoreSight. Оценочная плата
должна также иметь свой собственный источник питания. Часто это
обеспечивается через гнездо USB.
Важно отметить здесь, что макетная плата также имеет свой собственный источник
питания. Адаптер отладки снизит некоторый ток в макетную плату, достаточно
чтобы включить светодиоды на плате и дать появление, что аппаратные средства
работают. Однако недостаточно тока обеспечивается, чтобы позволить плате
работать надежно; всегда удостоверяйтесь, что макетная плата приводится в
действие ее обычным источником питания (Рис. 7.8).
Рисунок 7.8
Плата Исследования STM32F7xx.
Отладка с CoreSight 223
Рисунок 7.9
Вкладка Debug позволяет, Вы для конфигурирования отладчика для аппаратных
средств отлаживаете и выбираете адаптер
отладки.
Рисунок 7.10
Файл сценария отладчика позволяет Вам настраивать отладочные регистры CoreSight.
Здесь, мы можем заморозить таймеры и управлять поведением
отладчика во время выключения питания.
Рисунок 7.11
Установочное меню драйвера первоначально покажет Вам, что адаптер отладки
подключен и работа. Успешно чтение coreID доказывает, что
микроконтроллер работает.
Это откроет окно конфигурации адаптера отладки. Две основных области в этом
диалоговом окне показывают состояние соединения адаптера отладки к ПК и к
микроконтроллеру. Область USB адаптера отладки показывает что порядковый номер
адаптера отладки и версия микропрограммного обеспечения. Это также позволяет
Вам выбирать, с каким стилем отладки соединяют интерфейсом для использования
при соединении с микроконтроллером. Для микроконтроллеров Cortex-M необходимо
обычно всегда использовать SW, но JTAG также доступен, должен Вы нуждаться в
нем. Поле галочки SWJ позволяет отладчику выбирать стиль интерфейса отладки
динамично.
Рисунок 7.13
Вкладка Trace используется, чтобы настроить Инструкцию, данные и единицы
трассировки инструментария и также включить счетчики
производительности.
Рисунок 7.14
Алгоритм программирования для внутренней Флэш-памяти
микроконтроллера.
Это диалоговое окно позволяет Вам устанавливать алгоритм Загрузки Flash для Флэш-
памяти микроконтроллера. Это будет обычно настраиваться автоматически, когда
проект будет определен. Это меню позволяет Вам обновлять или добавлять алгоритмы
для поддержки дополнительной внешней параллельной или последовательной Флэш-
памяти.
После того, как настроенный, можно запустить отладчик как нормальный, и он будет
подключен к аппаратным средствам вместо имитационной модели. Это позволяет Вам
осуществлять код реальных аппаратных средств через тот же интерфейс отладчика,
который мы использовали для средства моделирования. С данными трассировка часов
включила, Вы видите текущее состояние своих переменных в часах и окнах памяти, не
имея необходимость останавливать код приложения. Также возможно добавить
глобальные переменные к Анализатору логики для трассировки значений переменной
со временем. Это может быть невероятно полезно при работе с данными реального
времени (Рис. 7.15).
228 Глав 7
Рисунок 7.15
Трассировка Исключения и Счетчики события обеспечивают полезные
метрики выполнения кода.
Рисунок 7.16
Счетчики события являются руководством по тому, как эффективно процессор
Cortex-M работает в микроконтроллере.
Ограничения отладки
Когда отладчик ПК подключен к реальным аппаратным средствам, существуют некоторые
ограничения по сравнению со средством моделирования. Во-первых, Вы ограничены
количеством аппаратных точек останова, обеспеченных кремниевым производителем и
будет максимум восьми точек останова. Это не обычно ограничение, но когда Вы
пытаетесь разыскать ошибку или тестовый код, легко закончиться. Основные единицы
трассировки не обеспечивают трассировочной информации инструкции или информации
синхронизации. Это означает, что покрытие кода и аналитические функции
производительности отключены.
Трассировка инструментария
В дополнение к трассировке часов данных основная структура отладки на Коре-M3 и
Коре-M4 включает вторую единицу трассировки, названную ITM. Можно думать о
ITM как о последовательном порте, который подключен к отладчику. Можно затем
добавить код к приложению, которое пишет пользовательские сообщения отладки в
ITM, которые затем отображены в отладчике. Путем оснащения кода этот путь можно
отправить сложную отладочную информацию в отладчик. Это может использоваться,
чтобы помочь определить местоположение неясных ошибок, но это также особенно
полезно для тестирования программного обеспечения.
ITM на самом деле немного более сложен в этом, он имеет 32 отдельных канала. В
настоящее время канал 31 используется RTOS (Операционная система реального
времени) ядро для отправки сообщений в отладчик для ядра осведомленные окна
отладки. Канал 0 является каналом пользователя, который может использоваться
Вашим кодом приложения для отправки printf () сообщения стиля к консоли в
отладчике.
Для включения ITM Базовые Часы должны быть установлены на корректную частоту,
как обсуждено в последнем осуществлении, и Трассировке нужно включить (Рис.
7.18).
Рисунок 7.18
ITM имеет 32 канала. В настоящее время канал 31 и 0 используется для
представления события RTOS и пользовательского
канала отладки ITM.
В меню портов стимула ITM порт 31 будет включен по умолчанию. Для включения
порта приложения, мы должны включить порт 0. Мы хотим смочь использовать
Приложение форма ITM привилегированный и непривилегированный режим так
Привилегированный Порт 7.. 0 должен быть неконтролируем.
Рисунок 7.20
Обновленный проект с ITM поддерживает для STDIO в retarget_IO.c.
Это добавляет “retarget_io.c” файл к проекту. Этот файл содержит функции драйвера
STDIO низкого уровня, которые читают и пишут отдельный символ в ITM (Рис. 7.20).
Откройте Blinky.c.
Добавьте, что stdio.h к списку включают файлы.
#include "RTE_Components.h"
#include, stdio.h.
Запустите отладчик.
Откройте view\serial windows\Debug (printf) средство просмотра.
Выполните код.
Рисунок 7.21
Сообщение отладки, отправленное от кода приложения до окна консоли
отладки.
Отладка с CoreSight 233
Отслеживание отказов
Если Вы прибыли в обработчик серьезных отказов, сначала проверьте “регистр”
Состояния Серьезного отказа. Это скажет Вам при достижении серьезного отказа,
должного давать сбой эскалация или ошибка чтения таблицы векторов. Если
существует эскалация отказа, затем проверьте “Управление Обработчиком систем и”
регистр состояния для наблюдения, который другое исключение отказа активно.
Следующая остановка
Отладка с CoreSight 235
Когда исключение отказа процессора будет вводиться, стековый фрейм будет обычно
продвигаться на стек. В некоторых случаях стековый фрейм не будет допустим, и это
будет обозначено флагами в “Настраиваемом Состоянии отказа” регистр. Когда кадр
допустимого стека будет продвинут, он будет содержать адрес ПК инструкции,
которая генерировала отказ. Путем декодирования стекового фрейма можно получить
этот адрес и определить местоположение проблемной инструкции. Системный блок
управления обеспечивает память и адресный регистр отказа шины, который в
зависимости от причины ошибки может содержать адрес инструкции, которая вызвала
исключение ошибки.
энергозависимый uint32_t
op1; международное
основное (пустота)
{
международный op2 5 0x1234, op3 5 0;
SCB-.CCR 5 0x0000010;//Включают, делятся на нулевой отказ использования
op1 5 op2/op3;//выполняют деление нулем для генерации исключения использования
Рисунок 7.22
Установите точку останова на операторе деления.
Рисунок 7.23
Проверьте, что Деление Нулевым прерыванием включено при помощи
“Конфигурации системы и Управления”
периферийное представление.
Отладка с CoreSight 237
Рисунок 7.24
Исключение ошибки заставит Вас поражать обработчик серьезных отказов, если
другие исключения отказа не были включены.
Рисунок 7.25
Если отказ происходит, можно просмотреть обзор регистров диагностики отказа
в периферийном окне сообщений о
неисправностях.
238 Глав 7
Это окно показывает, что серьезный отказ был вызван другим исключением отказа.
Кроме того, деление нулевым флагом было установлено в регистре состояния отказа
использования.
Рисунок 7.26
Используйте окно Register, считайте текущий адрес, сохраненный в указателе
вершины стека. Затем используйте Окно памяти для чтения
значения ПК, сохраненного в стековом фрейме.
Рисунок 7.27
Значение ПК, сохраненное в стековом фрейме, приводит нас к инструкции SDIV, которая вызвала
исключение ошибки.
Рисунок 7.28
Стандартная программа исключения отказа использования может
использоваться для чтения значения ПК из стека.
Рисунок 7.30
Единица трассировки ETM обеспечивает все функции отладчика стандартного
оборудования плюс трассировка
инструкции.
Рисунок 7.31
Единица трассировки “Потоковой передачи” способна к записи каждой инструкции
непосредственно на жесткий диск ПК. Размер буфера трассировки только
ограничен размером Вашего жесткого диска.
Рисунок 7.32
Файл сценария отладки используется для включения дополнительных четырех
контактов трассировки инструкции, когда
отладчик запускается.
Рисунок 7.33
Выберите адаптер отладки, который способен к собиранию данных от
ETM.
Рисунок 7.34
Порт Trace может теперь быть настроен для доступа к
ETM.
Отладка с CoreSight 243
Когда инструмент ULINK Pro Trace подключен, у Вас есть опция включить
трассировку ETM. Неограниченная опция трассировки позволяет Вам передавать
потоком каждую инструкцию, выполняемую в файл на Вашем жестком диске ПК.
Буфер трассировки затем только ограничен размером жесткого диска ПК. Это
позволяет проследить выполняемые инструкции в течение многих дней при
необходимости, да дни.
Нажмите "OK" для выхода назад редактору µVision.
Запустите отладчик.
Теперь отладчик имеет дополнительное окно трассировки инструкции (Рис. 7.35).
Рисунок 7.35
Окно трассировки отладчика может теперь отобразить все инструкции,
выполняемые процессором Cortex-M (передающий
трассировку потоком).
Рисунок 7.37
Анализатор производительности показывает кумулятивное время выполнения
для каждой функции.
CMSIS-DAP
Рисунок 7.38
Спецификация CMSIS-DAP разработана для поддержки совместимости между
другими аппаратными средствами отладчика и
программным обеспечением отладчика.
Рисунок 7.39
Модуль MBED является первым для поддержки спецификации CMSIS-
DAP.
Рисунок 7.40
Драйвер CMSIS-DAP должен быть выбран в меню отладчика.
Кора-M01 MTB
В то время как ETM доступен для Коры-M3 и Коры-M4, никакая форма трассировки
инструкции не в настоящее время доступна для Коры-M0. Однако Кора-M01 имеет
простую форму буфера трассировки инструкции, названного MTB. MTB использует
регион внутреннего SRAM, который является
246 Глав 7
Рисунок 7.41
Выберите адаптер отладки CMSIS-DAP и Микро файл сценария Буфера
трассировки.
Рисунок 7.42
Файл сценария раньше настраивал Микро Буфер трассировки.
Рисунок 7.43
Необходимо сместить пользовательскую RAM от региона, используемого
Микро Буфером трассировки.
Рисунок 7.44
Содержание Микро Буфера трассировки загружено на ПК и отображено в окне Trace
отладчика.
Рисунок 7.45
ARM создал репозиторий “системных файлов” описания средства просмотра. Это
позволяет поставщикам инструментов иметь поддержку новых
устройств, поскольку они выпущены.
Рисунок 7.46
Веб-сайт CMSIS имеет каналы общего доступа к текущим спецификациям CMSIS
и репозиторию CMSIS-SVD.
Рисунок 7.47
Выберите файлы STM32F103 SVD.
Рисунок 7.48
Файлы SVD состоят из XML-описания периферийных регистров
микроконтроллера.
После того как периферийные детали были определены, описание каждого регистра в
периферийном устройстве добавляется. Это состоит из имени регистра и описания
его смещения от периферийного базового адреса наряду с его размером в битах, типе
доступа и значении сброса (Рис. 7.50).
Рисунок 7.50
Описание SVD периферийного битового поля регистра.
Также возможно определить битовые поля в регистре. Это позволяет окну отладки
разворачивать представление регистра и отображать содержание битового поля (Рис.
7.51).
Рисунок 7.51
Получающееся периферийное представление.
Рисунок 7.52
Сделайте редактирование к описанию SVD.
Рисунок 7.53
Загрузите файл швейцарского франка в меню Target проекта.
Рисунок 7.54
Модификации теперь видимы в отладчике.
Введение
С точки зрения разработчика Кора-M4 и Кора-M7 являются версиями процессора
Cortex-M, которые имеют дополнительные функции для поддержки Обработки
цифровых сигналов (DSP). Ключевые улучшения по Коре-M3 являются добавлением
“Единственной Инструкции Несколько Данных” или инструкций SIMD, улучшенный
Умножается, Накапливают (MAC) единицу для целочисленной математики и
дополнительное добавление аппаратных средств “Сопроцессор для операций с
плавающей точкой” (FPU). В случае Коры-M4 это - одинарная точность FPU, в то
время как Кора-M7 имеет опцию или одинарной или двойной точности FPU. Эти
улучшения дают Коре-M4 способность выполнить алгоритмы DSP на достаточно
высоко уровнях производительности для конкуренции с выделенными 16-разрядными
процессорами DSP. Как мы видели в Главе 6 "Cortex-M7", процессор Cortex-M7 имеет
более усовершенствованный конвейер и блок кэш-памяти ответвления. Обе из этих
функций существенно улучшают его возможность DSP. В этой главе мы посмотрим
на использование Cortex-M4/M7 для обработки сигналов реального мира (Рис. 8.1).
Рисунок 8.1
Кора-M4 и Кора-M7 расширяют Кору-M3 с помощью добавления инструкций по DSP и
быстрых возможностей математики. Это создает микроконтроллер, способный к
поддержке алгоритмов DSP в реальном времени, контроллера цифрового сигнала.
Рисунок 8.2
FPU 32-разрядные скалярные регистры может также быть просмотрен как 64-
разрядные регистры двойного слова. Это поддерживает
очень эффективный кастинг между типами C.
Рисунок 8.3
FPU описан как сопроцессор в документации регистра. В действительности это
очень сильно связано с основным конвейером инструкции.
Регистры FPU
В дополнение к скалярным регистрам FPU имеет блок регистров управления и
состояния (Таблица 8.2).
Зарегистрироваться Описание
Управление доступом
сопроцессора Управляет уровнем доступа полномочия к FPU
Управление контекстом с
плавающей точкой Настраивает укладку и ленивые опции укладки
Адрес контекста с плавающей Содержит адрес безлюдного стекового пространства
точкой FPU
Управление состоянием по Содержит коды условий FPU и параметры конфигурации
умолчанию с плавающей точкой FPU
Управление состоянием с Содержит значения управления состоянием по
плавающей точкой умолчанию
Регистр FPSCR содержит три группы битов. Лучшие четыре бита содержат флаги кода
условия N, Z, C, и V, которые соответствуют флагам кода условия в xPSR. Эти флаги
установлены и очищены подобным образом результатами операций с плавающей
точкой. Следующие группы битов содержат параметры конфигурации для FPU. Эти
биты позволяют Вам изменять операцию FPU из стандарта IEEE 754. Если у Вас нет
веской причины сделать это, рекомендуется оставить их в покое. Заключительная
группа битов является флагами состояния для исключений FPU. Если FPU встретится
с ошибкой во время выполнения, то исключение будет повышено и
258 Глав 8
Кора-M7 FPU
Микроконтроллеры с помощью Коры-M7 могут быть разработаны без FPU или
могут быть оснащены единицей одинарной или двойной точности. CMSIS-базовая
спецификация была расширена с помощью функции для создания отчетов о
конфигурации процессора Cortex-M7.
uint32_t SBC_GetFPUType (пусто)
0 5 никаких FPU
1 5 одинарных точностей
2 5 двойной точности
Включение FPU
Когда Кора-M4 или Кора-M7 оставляют вектор сброса, FPU отключен. FPU включен
путем установки сопроцессора 10 и 11 битов в регистре CPARC. Необходимо
использовать инструкцию по барьеру данных гарантировать, что запись сделана,
прежде чем код продолжается. Команда барьера инструкции также используется,
чтобы гарантировать, что конвейер сбрасывается, прежде чем код продолжается.
SCB-.CPACR | 5 ((3UL, 10*2) | (3UL, 11*2));//Набор CP10 и Полный доступ CP11
__ DSB (); //барьер Данных
__ ISB (); //барьер Инструкции
Исключения и FPU
Когда FPU будет включен, расширенный стековый фрейм будет продвинут, когда
исключение повышено. В дополнение к стандартному стековому фрейму процессор
Cortex-M также продвигает первые 16 регистров скаляра FPU и FPSCR. Это
расширяет стековый фрейм с 32 до 100 байтов. Очевидно продвигая этот объем
данных на стек, каждое прерывание значительно увеличило бы задержку прерывания.
Сохранять 12 задержек прерывания цикла, Cortex-M
Практический DSP для коры-M4 и коры-M7 259
Использование FPU
После того как Вы включили FPU, компилятор начнет использовать аппаратные
вычисления плавающей точки вместо библиотек программного обеспечения.
Исключением является инструкция по квадратному корню sqrt (), который является
частью math.h библиотеки. При включении FPU компилятор ARM предоставляет
внутреннюю инструкцию использовать инструкцию по квадратному корню FPU.
плавайте __ sqrtf (пустите в ход x);
Код в основном цикле является смесью операций математики для осуществления FPU.
#include, math.h.
пускают в ход a, b, c,
d, e; интервал f, g 5
100;
Рисунок 8.4
Аппаратная поддержка плавающей точки включена в опциях Project Target.
Рисунок 8.5
Этот проект в качестве примера использует моделирование процессора
Corex-M4.
Рисунок 8.6
Отметьте размер кода проектом с помощью аппаратных средств
FPU.
Запустите отладчик.
Рисунок 8.7
CMSIS-ядро SystemInit () функция включит FPU на запуске.
262 Главы 8
Откройте main.c модуль и выполните код к основному в то время как () цикл (Рис.
8.8).
Рисунок 8.8
Используйте локальные параметры отладчика для выполнения к
основному () в то время как (1) цикл.
Рисунок 8.9
Окно Disassembler покажет Вам вызовы аппаратным средствам FPU.
Рисунок 8.10
Окно Register позволяет Вам просматривать регистры FPU.
Рисунок 8.11
Выполните вычисления с плавающей точкой. Отметьте количество циклов, взятых для
каждой операции.
Рисунок 8.13
Восстановите проект и сравните размер кода в исходном проекте.
Инструкция Описание
Считайте
CLZ начальные нули
Обратные
ВЕРСИЯ, REV16, REVSH и RBIT инструкции
Пригодное поле
BFI вставляет
Ясное битовое
BFC поле
Аппаратные
UDIV и SDIV средства делятся
Знак и нуль
SXT и UXT расширяются
Кора-M4 и система команд M7 включают новую группу инструкций, которые могут
выполнить несколько арифметических вычислений в единственном цикле.
Инструкции SIMD позволяют данным на 8 битов или на 16 битов, упакованным в два
32-разрядных слова управляться на параллельно. Так, например,
266 Глав 8
Рисунок 8.14
Инструкции SIMD поддерживают несколько арифметических операций в
единственном цикле. Данные операнда должны быть
упакованы в 32-разрядные слова.
Инструкции SIMD имеют дополнительное поле в регистре xPSR. “Больше, чем или
Равное” поле (GE) содержит 4 бита, которые соответствуют 4 байтам в операнде
результата инструкции SIMD. Если байтом операнда результата будет GE для
обнуления затем флага GE соответствия, то будет установлен (Рис. 8.15).
Рисунок 8.15
Кора-M4 xPSR регистр имеет дополнительное большее, чем или равное поле.
Каждый из четырех битов GE обновляется, когда инструкция
SIMD выполняется.
Инструкции SIMD можно рассмотреть как три отличных группы: Добавьте и вычтите
операции, умножьте операции и инструкции по поддержке. Добавление и вычитает
операции, может быть выполнен на 8-или 16-разрядные и неподписанные количества
со знаком. И неподписанная инструкция по сокращению вдвое со знаком также
предоставлена; эта инструкция добавляет или вычитает 8 или 16-разрядные
количества и затем половины результат как показано в Таблице 8.5.
Рисунок 8.16
Группа инструкции SIMD включает инструкции по поддержке упаковать 32-разрядные
слова 8-и 16-разрядные количества.
Когда инструкция SIMD будет выполняться, она установит или очистит биты xPSR
GE в зависимости от значений в получающихся байтах или полусловах.
Дополнительный выбор (SEL) инструкция обеспечивается для доступа к этим
битам. Инструкция SEL используется для выбора байтов, или полуслова от двух
входных операндов в зависимости от условия GE отмечает (Таблица 8.10).
Практический DSP для коры-M4 и коры-M7 269
Рисунок 8.17
Документация CMSIS-DSP для __ SMLAD () внутренний.
Рисунок 8.18
Набор устанавливает контрольные точки по обе стороны от кода
SIMD.
Рисунок 8.19
Отметьте количество цикла запуска.
Выполните код, пока он не поразит вторую точку останова. Посмотрите, сколько
циклов использовалось для выполнения инструкции SIMD (Рис. 8.20).
Практический DSP для коры-M4 и коры-M7 271
Рисунок 8.20
Отметьте заключительное количество цикла.
Рисунок 8.21
Теперь установите точку останова после стандартной программы
копии массива.
Рисунок 8.22
Отметьте заключительное количество цикла.
Рисунок 8.23
Фильтр FIR является фильтром усреднения со своими характеристиками,
определенными серией коэффициентов, относился к
каждому образцу в серии “касаний”.
Рисунок 8.24
Математическое выражение для фильтра FIR.
международное основное
(пустота) {
ель (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
fir_block (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
fir_unrolling (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
fir_SIMD (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
fir_SuperUnrolling (data_in, data_out, коэффициент, &index, FILTERLEN, BLOCKSIZE);
{
международн
ый образец;
интервал k;
сумма q31_t;
если (stateIndex, 0)
{
stateIndex 5 filtLen-1;
}
}
[демонстрационные] 5 сумм;
}
*stateIndexPtr 5 stateIndex;
}
если (stateIndex, 0)
274 Главы 8
{
stateIndex 5 filtLen-1;
}
}
Рисунок 8.25
Обработка данных в кольцевом буфере требует, чтобы Кора-M4 проверила на конец
буфера на каждом повторении. Это увеличивает время
выполнения.
Рисунок 8.26
Установите точку останова в начале внутреннего цикла.
Рисунок 8.27
Обработка блока увеличивает размер буфера, но увеличивает
эффективность внутреннего цикла обработки.
Рисунок 8.28
С обработкой блока буфер фиксированного размера обрабатывается без
потребности проверить на конец буфера.
Внутренний цикл затем выполняет вычисления фильтра для каждого образца блока
путем скольжения окна фильтра, один элемент направо для каждого проходит через
цикл. Таким образом, внутренний цикл теперь становится
для (k 5 0; k, filtLen; k11)
{
суммируйте 1 5 coeffs [k] * состояние [stateIndex];
stateIndex11;
Рисунок 8.29
После того как блок данных был обработан, внешний цикл смещает образцы один блок
налево и добавляет новый блок данных.
}
Теперь шаг в третью функцию феркина.
{
sum0 5 sum1 5 sum2 5 sum3 5 0;
statePtr 5 stateBasePtr; coeffPtr 5 (q31_t
*) (S-.coeffs); x0 5 * (q31_t *)
(statePtr11);
x1 5 * (q31_t *) (statePtr11); я 5
numTaps.. 2;
сделать
{
c0 5 * (coeffPtr11);
x2 5 * (q31_t *) (statePtr11);
x3 5 * (q31_t *) (statePtr11); sum0 5
__ SMLALD (x0, c0, sum0); sum1 5 __
SMLALD (x1, c0, sum1); sum2 5 __
SMLALD (x2, c0, sum2); sum3 5 __
SMLALD (x3, c0, sum3); c0 5 *
(coeffPtr11);
x0 5 * (q31_t *) (statePtr11);
x1 5 * (q31_t *) (statePtr11); sum0 5 __
SMLALD (x0, c0, sum0); sum1 5 __
SMLALD (x1, c0, sum1); sum2 5 __
SMLALD (x2, c0, sum2); sum3 5 __
SMLALD (x3, c0, sum3);
}, в то время как (-i);
*pDst11 5 (q15_t) (sum0.. 15); *pDst11
5 (q15_t) (sum1.. 15); *pDst11 5 (q15_t)
(sum2.. 15); *pDst11 5 (q15_t) (sum3..
15);
Библиотека CMSIS-DSP
В то время как возможно кодировать все Ваши собственные функции DSP, это может
быть трудоемким и требует большого зависящего от домена знания. Чтобы помочь
добавить общие функции DSP к Вашему приложению, ARM опубликовал библиотеку
61 общей функции DSP, которые составляют CMSIS-DSP (Стандартная Обработка
цифровых сигналов Программного интерфейса Микроконтроллера Коры)
спецификация. Каждая из этих функций оптимизирована для Cortex-M4/M7, но может
также быть скомпилирована для работы Коры-M3 и даже на Коре-M0. Библиотека
CMSIS-DSP является бесплатной загрузкой и лицензируется для использования в
любом коммерческом или некоммерческом проекте. Библиотека CMSIS-DSP также
включена как часть установки MDK-ARM и просто должна быть добавлена к Вашему
проекту путем выбора CMSIS:: опция DSP в менеджере по Среде выполнения (RTE).
Установка включает предварительно созданную библиотеку для каждого из
процессоров Cortex-M и всего исходного кода.
Рисунок 8.31
Документация CMSIS-DSP, к которой получают доступ путем нажимания на
ссылку описания, доступную в окне Manage Run-Time
Environment.
Рисунок 8.32
Контур управления PID состоит из пропорциональных, интеграла и производных
блоков управления.
Рисунок 8.33
Проект PID в качестве примера настроен с DSP, добавленным как компонент
программного обеспечения CMSIS.
Проект предназначен для Коры-M4 с FPU. Это включает запуск CMSIS и системные
файлы для Коры-M4 и функций CMSIS-DSP как предварительно скомпилированная
библиотека. Библиотека CMSIS-DSP расположена в c:\CMSIS\lib with subdirectories for
the ARM compiler and GCC versions of the library (Fig. 8.34).
Рисунок 8.34
Библиотека CMSIS-DSP добавляется к проекту как компонент программного
обеспечения в RTE.
282 Главы 8
Рисунок 8.35
FPU включен в настройках Project Target.
Рисунок 8.36
FPU должен быть включен кодом запуска.
время 1 5 1;
для (я 5 0; я, 100000; i11);
}}
Рисунок 8.37
Анализатор логики неоценим для визуализации сигналов в реальном
времени.
Рисунок 8.38
Типичная система DSP состоит из аналогового демонстрационного этапа,
микроконтроллера с алгоритмом DSP и вывода DAC. В этой главе, мы программное
обеспечение микроконтроллера в изоляции от аппаратного дизайна.
Рисунок 8.39
Аналоговые данные могут быть обработаны как единственные образцы с
минимальной задержкой или как блок образцов для
максимальной эффективности обработки.
работайте каждый раз, когда преобразование ADC сделано, который может вызвать
проблемы с другими первоочередными процедурами прерывания. Альтернатива
потоковой обработке является обработкой блока. Здесь, много результатов ADC
хранятся в буфере, обычно приблизительно 32 образца, и затем этот буфер
обрабатывается алгоритмом DSP как блок данных. Это понижает количество раз,
которое должен выполнить алгоритм DSP. Как мы видели в осуществлении
оптимизации, существует много методов, которые могут повысить эффективность
алгоритма при обработке блока данных. Блок, обрабатывающий также, интегрирует
хорошо с микроконтроллером единицу DMA и RTOS. На оборотной стороне
обработка блока представляет больше задержки сигнала и требует большего
количества Флэш-памяти, чем потоковая обработка. Для большинства приложений
обработка блока должна быть предпочтительным маршрутом.
/* Назовите FIR init функцией для инициализации структуры экземпляра. */arm_fir_init_f32 (&S,
NUM_TAPS, (float32_t *) &firCoeffs32[0], &firStateF32[0],
blockSize);
для (я 50; я, numBlocks; i11)
{
arm_fir_f32 (&S, inputF32 1 (я * blockSize), outputF32 1 (я * blockSize), blockSize);
}
snr 5 arm_snr_f32 (&refOutput[0], &testOutput[0], TEST_LENGTH_SAMPLES); если (SNR,
SNR_THRESHOLD_F32)
{
состояние 5
ARM_MATH_TEST_FAILURE;} еще {
состояние 5 ARM_MATH_SUCCESS;
}
Код сначала создает экземпляр фильтра FIR с 29 касаниями. Размер блока обработки
составляет 32 байта. Массив состояния FIR также создается для содержания значений
рабочего состояния для каждого касания. Размер этого массива вычисляется как
“размер блока 1 количество касаний 2 1”. После того как фильтр был
инициализирован, мы можем передать его демонстрационным данным в 32-байтовых
блоках и хранить получающиеся обработанные данные в выходном массиве.
Фильтрованный результат финала затем по сравнению с предрасчетным результатом.
Разработайте проект и запустите отладчик.
Шаг через проект исследовать код.
Поиск функции CMSIS-DSP используется в документации справки.
Установите точку останова в конце проекта (Рис. 8.41).
288 Глав 8
Рисунок 8.41
Установите точку останова на финале в то время как () цикл.
Рисунок 8.42
Используйте состояния окон регистра в противоречии с монитором количество
выполняемых циклов.
Рисунок 8.44
Гистограммы показывают сравнение между Корой-M3 и Корой-M4 для общих
алгоритмов DSP.
Как пример реального мира можно выбирать данные с помощью 12-разрядного ADC,
который дает вывод от 1 0xFFF. В этом случае мы должны были бы масштабировать
результат ADC, чтобы быть между 11 и 21 и затем преобразовать в число Q.
Q31_t ADC_FixedPoint;
временный файл
плавающий;
Точно так же после того, как функция DSP работала, необходимо преобразовать
назад в значение с плавающей точкой перед использованием результата. Здесь, мы
преобразовываем от результата Q31 до 10-разрядного целочисленного значения до
вывода значения к периферийному устройству DAC.
arm_q31_to_float (&temp, &DAC_Float, 1); DAC_DATA_REGISTER 5
(((uint32_t) ((DAC_Float))) и 0x03FF);
Рисунок 8.45
Проект настроен для Коры-M4. Данные сигнала включены в arm_fft_bin_data.c файл.
Проект FFT использует тот же шаблон в качестве примера PID с добавлением файла
данных, который содержит массив демонстрационных данных. Эти данные являются
сигналом на 10 кГц плюс случайный “белый шум”.
int32_t, основной (пустота) {arm_status
состояние;
arm_cfft_radix4_instance_q31 S; q31_t
maxValue;
состояние 5 ARM_MATH_SUCCESS;
/* Преобразуйте значения с плавающей точкой формат */arm_float_to_q31
фиксированной точки Q31 (testInput_f32_10khz, testInput_q31_10khz, 2048);/*
Инициализируют модуль CFFT/CIFFT */
{
состояние 5 ARM_MATH_TEST_FAILURE;
}
Заключение
В этой главе мы посмотрели на расширения DSP, включенные в Cortex-M4/M7 и как
лучше всего использовать эти функции в реальном приложении. Библиотека CMSIS-
DSP обеспечивает много общих функций DSP, которые были оптимизированы для
Cortex-M4/M7. В Главе 10 “Методы RTOS”, мы посмотрим на то, как интегрировать
непрерывную обработку DSP в реальном времени и управляемый событиями код
микроконтроллера в тот же проект.
CHPTER9
Программный интерфейс
микроконтроллера коры
Стандартная операционная система
реального времени
Введение
Эта глава является введением в использование маленькой операционной системы
реального времени (RTOS) места на микроконтроллере Cortex-M. Поскольку мы видели в
Главе 4 “Стандарт программного интерфейса микроконтроллера коры (CMSIS)”,
определяет стандартный API для Cortex-M RTOS. Если Вы привыкли писать процедурный
код “C” маленького 8-/16-bit микроконтроллеры, можно сомневаться о потребности в
такой операционной системе. Если Вы не знакомы с использованием RTOS в режиме
реального времени встроенные системы, необходимо прочитать эту главу прежде, чем
отвергнуть идею. Использование RTOS представляет более сложный подход дизайна, по
сути способствуя структурированной разработке кода, которая осуществляется
интерфейсом прикладного программирования (API) RTOS.
Компромисс для этого - то, что RTOS имеет дополнительные требования к памяти и
увеличенную задержку прерывания. Как правило, Keil RTX RTOS будет требовать
500 байтов RAM и 5k байтов кода, но помнить, что часть кода RTOS копировалась
бы в Вашей программе так или иначе. У нас теперь есть поколение маленьких
недорогих микроконтроллеров, которые имеют достаточно памяти на микросхеме и
вычислительной мощности для поддержки использования RTOS. Разработка
использующий этот подход поэтому намного более доступна.
В этой главе мы сначала посмотрим на установку вводного проекта RTOS для
основанного на Cortex-M микроконтроллера. Затем, мы пройдем каждый из
примитивов RTOS и как они влияют на дизайн нашего кода приложения. Наконец,
когда у нас есть ясное понимание функций RTOS, мы более тщательно изучим
параметры конфигурации RTOS. Если Вы привыкли программировать
микроконтроллер, не используя RTOS, который является чистым металлом, там
две ключевых вещи состоят в том, чтобы понять, поскольку Вы работаете через этот
учебный Параллелизм и синхронизацию. В следующих разделах мы сфокусируемся
на создании и управлении потоками. Ключевое понятие здесь состоит в том, чтобы
рассмотреть их работающий как параллельные параллельные объекты. В разделе
“Inter-Thread Communication” мы посмотрим на то, как связаться между потоками. В
этом разделе ключевое понятие является синхронизацией параллельных потоков.
Рисунок 9.1
Ядро RTOS содержит планировщик, который выполняет код программы как задачи.
Коммуникация между задачами выполняется объектами RTOS, такими как события,
семафоры, взаимные исключения и почтовые ящики.
Дополнительные сервисы RTOS включают тайм-менеджмент и управление
памятью и прерывают поддержку.
Потоки
Стандартные блоки типичной программы “C” являются функциями, которые мы
вызываем для выполнения конкретной процедуры и которые затем возвращаются к
функции вызова. В CMSIS-RTOS основная единица выполнения является “потоком”.
Поток очень похож на процедуру “C”, но имеет некоторые очень принципиальные
различия.
неподписанная международная процедура (пусто) освобождает поток (пусто)
{ {
в то время как (1)
. . .. . . {
. . .. . .
возвратитесь (ch); }
} }
Рисунок 9.2
Каждый поток имеет свой собственный стек для того, чтобы сохранить его данные
во время контекстного переключения. Блок управления потока
используется ядром для управления активным потоком.
Блок управления Потока (Рис. 9.2) содержит информацию о состоянии потока. Часть
этой информации является своим состоянием выполнения. В данной системе только
один поток может работать и все, что другие будут временно отстранены, но готовы
выполнить. RTOS имеет различные методы коммуникации межпотока (сигналы,
семафоры, сообщения). Здесь, поток может быть приостановлен для ожидания, чтобы
быть сообщенным другим потоком или прерыванием, прежде чем это возобновит свое
состояние готовности, после чего это может быть помещено в состояние выполнения
планировщиком RTOS (Таблица 9.1).
Запуск RTOS
Для создания простой программы RTOS, мы объявляем каждый поток, как
стандарт “C” функционирует и также объявляет идентификационную переменную
потока для каждой функции.
освободите thread1
(пусто); освободите
thread2 (пусто);
osThreadId thrdID1, thrdID2;
Рисунок 9.3
Потоки равного приоритета будут запланированы циклическим способом.
Высокоприоритетные задачи вытеснят низкоприоритетные задачи и
введут состояние выполнения “по требованию”.
Упражнение 9.1 первый проект CMSIS-RTOS
Этот проект возьмет Вас через шаги, необходимые, чтобы создать и отладить CMSIS-
RTOS-based проект. Мы создадим этот проект с нуля — справочный пример включен
как пример 9.1 в пакете в качестве примера.
Запустите µVision и избранный Проект - Новый Проект µVision (Рис. 9.4).
298 Глав 9
Рисунок 9.4
Создайте новый проект.
Рисунок 9.5
Выберите микроконтроллер.
Рисунок 9.6
Добавьте RTOS.
Рисунок 9.7
Элементы столбца Sel. становятся оранжевыми (светло-серый в печатной
версии). RTOS требует, чтобы другие компоненты
были добавлены.
Рисунок 9.8
Поле проверки перечисляет недостающие компоненты.
Рисунок 9.9
Нажатие кнопки твердости добавляет недостающие компоненты, и столбец Sel.
становится зеленым (светло-серый в печатной
версии).
Рисунок 9.10
Настроенная платформа проекта.
Рисунок 9.11
Выбор мастера конфигурации.
Рисунок 9.12
Параметры конфигурации RTX.
Теперь, когда у нас есть базовая платформа для нашего проекта на месте, мы можем
добавить некоторый пользовательский исходный код, который запустит RTOS и
создаст рабочий поток (Рис. 9.13).
Рисунок 9.13
Добавление исходного модуля.
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 303
Сделать этот щелчок правой кнопкой папка “Source Group 1” и выбор, “Добавляют
новый объект к Source Group 1”.
Рисунок 9.14
Выбор шаблона CMSIS-RTOS.
Рисунок 9.15
Проект с основным и код потока.
304 Главы 9
Рисунок 9.16
Конфигурирование средства моделирования.
Нажмите ОК для закрытия опций для
целевого меню. Запустите отладчик (Ctrl 1
F5).
Это выполнит код до основного.
Откройте Debug - поддержку ОС - система и распараллельте средство просмотра (рис.
9.17).
Рисунок 9.17
Средство просмотра Системы и Потока RTOS.
306 Глав 9
Рисунок 9.18
Рабочие потоки.
Создание потоков
После того как RTOS работает, существует много системных вызовов, которые
используются, чтобы управлять активными потоками. По умолчанию основное ()
функция автоматически создается как первое выполнение потока. В первом примере
мы использовали его для создания дополнительного потока, затем позволяют ему
завершиться путем пробежки закрывающей фигурной скобки. Однако, если мы хотим,
мы можем продолжить использовать основной в качестве потока самостоятельно.
Если мы хотим управлять основной как поток, мы должны получить его
идентификатор потока. Первая функция RTOS, которую мы должны поэтому вызвать,
является osThreadGetId (), который возвращает Идентификационный номер потока в
настоящее время рабочего потока. Это затем хранится в его идентификационном
дескрипторе. Когда мы хотим обратиться к этому потоку в будущих вызовах ОС, мы
используем этот дескриптор, а не имя функции потока.
osThreadId main_id;//создают дескриптор потока, пустой
основной (пустота)
{
/* Прочитайте идентификатор потока основного
*/main_id 5 osThreadGetId потока ();
в то время как (1)
{
. . .. . .. . .
}
}
вместо того, чтобы позволять ему убежать конец закрывающей фигурной скобки.
Кроме того, мы можем добавить некоторое время (1) цикл как показано выше и
продолжить использовать основной в нашем приложении.
Это создает поток и запускает его выполнение. Также возможно передать параметр
потоку, когда это запускается.
uint32_t startupParameter 5 0x23;
thread1_id 5 osThreadCreate (osThread (thread1), startupParameter);
Когда каждый поток создается, ему также присваивают его собственный стек для того,
чтобы хранить данные во время контекстного переключения. Это не должно быть
перепутано с собственной стопкой процессора Cortex; это - действительно блок памяти,
которая выделяется потоку. Размер стека по умолчанию определяется в
конфигурационном файле RTOS (мы будем видеть это позже), и этот объем памяти будет
выделен каждому потоку, если мы не переопределим его для выделения
пользовательского размера. Размер стека по умолчанию будет присвоен потоку, если
значение размера стека в структуре определения потока будет обнулено. При
необходимости потоку можно дать дополнительные ресурсы памяти путем определения
большего размера стека в структуре потока.
Однако при выделении большего размера стека потоку затем, дополнительная память
должна быть выделена в конфигурационном файле RTOS; снова мы будем видеть это
позже.
Упражнение 9.2 Создание и управление потоками
В этом проекте мы будем создавать и управлять некоторыми дополнительными
потоками. Каждый из созданных потоков переключит контакт GPIO на порте GPIO
B для моделирования высвечивания светодиода. Мы можем затем просмотреть это
действие в средстве моделирования.
308 Глав 9
Рисунок 9.19
Выбор платы поддерживает компоненты.
Рисунок 9.20
Рабочие Потоки.
Рисунок 9.21
Средство просмотра события показывает историю переключения
потока.
Наши два светодиодных потока каждый переключают контакт порта GPIO. Оставьте
выполнение кода и наблюдайте, что контакты переключаются в течение нескольких
секунд.
LED_On (1);
задержка
(500);
LED_Off (1);
задержка
(500);
}}
А также создавая потоки, для потока также возможно удалить себя или другой активный
поток от RTOS. Снова мы используем идентификатор потока, а не имя функции потока.
Рисунок 9.24
Монитор покрытия показывает то, что код выполнил путем окраски граничного
зеленого (темно-серым в печатной версии).
Хотя эта ошибка может казаться очевидной в этом примере, этот вид ошибки очень
распространен, когда разработчики сначала начинают использовать RTOS.
Несколько экземпляров
Одна из интересных возможностей RTOS - то, что можно создать несколько рабочих
экземпляров того же основного кода потока. Так, например, Вы могли записать поток
для управления
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 313
UART и затем создает два рабочих экземпляра того же кода потока. Здесь каждый
экземпляр кода UART мог управлять различным UART.
Сначала мы создаем структуру потока и определяем номер экземпляров потока к два:
osThreadDef (thread1, osPriorityNormal, 2, 0);
Запустите выполнение кода и откройте задачи RTX и системное окно (Рис. 9.25).
Рисунок 9.25
Несколько экземпляров выполнения потока
Рисунок 9.26
Окно часов ориентировано на многопотоковое
исполнение.
Тайм-менеджмент
А также выполняя Ваш код приложения как потоки, RTOS также предоставляет
некоторые услуги синхронизации, к которым можно получить доступ через
системные вызовы RTOS.
Задержка
Самой основной из этих услуг по синхронизации является простая функция задержки
таймера. Это - простой способ обеспечить задержки синхронизации в рамках Вашего
приложения. Хотя размер ядра RTOS заключается в кавычки как 5k байты, функции,
такие как циклы задержки и простые циклы планирования часто являются частью
non-RTOS приложения и использовали бы байты кода так или иначе, таким образом,
издержки RTOS могут быть меньше, чем это сразу появляется.
освободите osDelay (uint32_t
миллисекунда)
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 315
Рисунок 9.27
В течение их времени жизни распараллеливает перемещение через многие
состояния. Здесь рабочий поток заблокирован вызовом osDelay, таким образом, он
вводит состояние ожидания. Когда задержка истекает, она перемещается в готовый.
Планировщик поместит его в состояние выполнения. Если его интервал истечет, то он
попятится к готовому.
Ожидание события
В дополнение к чистой задержке возможно заставить поток остановить и ввести
состояние ожидания, пока поток не инициирован другим событием RTOS. События
RTOS могут быть сигналом, сообщением или почтовым событием. osWait () вызову
API также определили период тайм-аута в миллисекундах, который позволяет
потоку просыпаться и продолжать выполнение, если никакое событие не имеет
место.
osStatus osWait (uint32_t миллисекунда)
LED_On (1);
osDelay (500);
LED_Off (1);
osDelay (500);
}}
Рисунок 9.28
Используя osDelay () позволяет потоку блокироваться, когда это
неактивно.
Виртуальные таймеры
API CMSIS-RTOS может использоваться для определения любого количества
виртуальных таймеров, которые действуют, как считают в обратном порядке
таймеры. Когда они истекут, они выполнят пользовательскую функцию обратного
вызова для выполнения a
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 317
определенное действие. Каждый таймер может быть настроен как выстрел того или
повторный таймер. Виртуальный таймер создается первым определением структуры
таймера.
osTimerDef (timer0, led_function);
Это создает таймер и определяет его как периодический таймер или единственный
таймер выстрела (osTimerOnce). Заключительный параметр передает аргумент
вызову, назад функционируют, когда таймер истекает.
osTimerStart (timer0_handle, 0x100);
Таймер может затем быть запущен в любой точке в потоке, который запускает
таймер, функция вызывает таймер своим дескриптором и определяет период
количества в миллисекундах.
Рисунок 9.29
Конфигурирование виртуальных таймеров.
В конфигурации системы раздел удостоверяется, что поле User Timers отмечается.
Если этот поток не будет создан, то таймеры не будут работать.
Разработайте проект и запустите отладчик.
Выполните код и наблюдайте действие контактов GPIOB в периферийном окне
(Рис. 9.30).
Рисунок 9.30
Пользовательские таймеры переключают дополнительные
светодиодные контакты.
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 319
Рисунок 9.31
Пользовательские таймеры создают дополнительный
osTimerThread.
Задержки подмиллисекунды
В то время как различные функции времени CMSIS-RTOS имеют разрешение 1
миллисекунды, возможно создать задержки с разрешением в микросекундах с
помощью необработанного количества SysTick. Эта форма задержки не делает
deschedule задача, но это просто останавливает свое выполнение в течение
желаемого периода. Для создания задержки, мы можем сначала получить
количество SysTick.
галочка int32_t, delayPeriod;
отметьте 5 osKernelSysTick (); //добираются, запускают значение системной галочки Ядра
Неактивный демон
Заключительная услуга таймера, предоставленная RTOS, не является действительно
таймером, но это - вероятно, лучшее место для обсуждения этого. Если во время
нашей программы RTOS у нас не будет выполнения потока и никакого потока,
готового работать (например, они все ожидают на функциях задержки), затем, то
RTOS будет использовать запасное время выполнения для вызова “Неактивного
Демона”, который снова расположен в файле RTX_Conf_CM.c. Этот неактивный код
является в действительности низкоприоритетным потоком в RTOS, который только
работает, когда ничто иное не готово.
320 Глав 9
Рисунок 9.32
Неактивный поток является хорошим руководством по загрузке
ЦП.
Рисунок 9.33
Анализатор производительности показывает, что большая часть времени
выполнения тратится в неактивном цикле.
Рисунок 9.34
__ wfe () внутренние остановы ЦП, когда это вводит неактивный цикл.
Сохранение циклов и энергии во время
выполнения.
Коммуникация межпотока
До сих пор мы видели, как код приложения может быть определен как независимые
потоки и как мы можем получить доступ к услугам синхронизации, предоставленным
RTOS. В реальном приложении мы должны смочь связаться между потоками для
подавания полезной заявки. С этой целью типичный RTOS поддерживает несколько
различных коммуникационных объектов, которые могут использоваться для
соединения потоков для формирования значимой программы. API CMSIS-RTOS
поддерживает связь межпотока с сигналами, семафорами, взаимными исключениями,
почтовыми ящиками и очередями сообщений. В первом разделе ключевое понятие
было параллелизмом. В этом разделе ключевое понятие синхронизирует действие
нескольких потоков.
Сигналы
CMSIS-RTOS Keil RTX поддерживает до 16 сигнальных флагов для каждого потока. Эти
сигналы хранятся в блоке управления потока. Возможно остановить выполнение потока,
пока конкретный сигнальный флаг или группа сигнальных флагов не установлены другим
потоком в системе (Рис. 9.35).
Рисунок 9.35
Каждый поток имеет 16 сигнальных флагов. Поток может быть помещен в состояние
ожидания, пока шаблон флагов не установлен другим потоком. Когда это произойдет,
это будет возвращаться к состоянию готовности и ожидать, чтобы быть
запланированным ядром.
LED_On (2);
osSignalSet (T_led_ID1,0x01); osDelay
(500);
LED_Off (2);
osSignalSet (T_led_ID1,0x01); osDelay
(500); }}
Семафоры
Как сигналы, семафоры являются методом синхронизирующегося действия между
двумя или больше потоками. Помещенный просто, семафор является контейнером,
который содержит много маркеров. Поскольку поток выполняется, он достигнет
вызова RTOS для получения семафорного маркера. Если семафор будет содержать
один или несколько маркеров, то поток продолжит выполняться, и количество
маркеров в семафоре будет постепенно уменьшено одним. Если в настоящее время
не будет никаких маркеров в семафоре, то поток будет помещен в состояние
ожидания, пока маркер не станет доступным. В любой точке в ее выполнении поток
может добавить маркер к семафору, заставляющему ее маркерное количество
увеличить одним (Рис. 9.36).
Рисунок 9.36
Семафоры помогают управлять доступом к ресурсам программы. Прежде чем поток
может получить доступ к ресурсу, он должен получить маркер. Если ни один не
доступен, это ожидает. Когда это закончено с ресурсом, это должно возвратить
маркер.
Схема выше иллюстрирует использование семафора для синхронизации двух потоков.
Во-первых, семафор должен быть создан и инициализирован с начальным маркерным
количеством. В этом случае семафор инициализируется с единственным маркером.
Оба потока выполнят и достигнут точки в их
326 Глав 9
Между тем выполняющийся поток может выпустить маркер назад к семафору. Когда это
произойдет, поток ожидания получит маркер и оставит состояние ожидания для состояния
готовности. Однажды в состоянии готовности планировщик поместит поток в состояние
выполнения так, чтобы выполнение потока могло продолжиться. В то время как семафоры
имеют простой набор вызовов ОС, они могут быть одним из более трудных объектов ОС
полностью понять. В этом разделе мы сначала посмотрим на то, как добавить семафоры к
программе RTOS и затем продолжить смотреть на самые полезные семафорные
приложения.
Для использования семафора в CMSIS-RTOS, необходимо сначала объявить
семафорный контейнер:
osSemaphoreId sem1;
osSemaphoreDef (sem1);
Важно понять, что семафорные маркеры могут также быть созданы и уничтожены
как выполненные потоки. Так, например, можно инициализировать семафор с
нулевыми маркерами и затем использовать один поток для создания маркеров в
семафор, в то время как другой поток удаляет их. Это позволяет Вам разрабатывать
потоки как потребительские потоки и производителя.
Рисунок 9.37
Точка останова на семафорном выпуске звонит в led_Thread2.
Использование семафоров
Хотя семафоры имеют простой набор вызовов ОС, у них есть широкий спектр
синхронизирующихся приложений. Это делает их, возможно, самым сложным
объектом RTOS понять. В этом разделе мы посмотрим на наиболее общее
использование семафоров. Они взяты из “Небольшой Книги Семафоров” Allen B.
Downey. Эта книга может быть свободно загружена с URL, данного в библиографии в
конце этой книги.
Передача сигналов
Синхронизация выполнения двух потоков является самым простым использованием
семафора:
osSemaphoreId sem1;
osSemaphoreDef (sem1);
освободите thread1 (пусто)
{
sem1 5 osSemaphoreCreate (osSemaphore (sem1), 0); в то
время как (1)
{
FuncA ();
osSemaphoreRelease (sem1)
}
}
освободите task2 (пусто)
{
в то время как (1)
{
osSemaphoreWait (sem1, osWaitForever)
FuncB ();
}
}
В этом случае семафор используется, чтобы гарантировать, что код в FuncA ()
выполнен перед кодом в FuncB ().
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 329
Мультиплексирование
Мультиплексирование используется для ограничения количества потоков, которые
могут получить доступ к критическому разделу кода. Например, это могло быть
стандартной программой, что ресурсы памяти доступов и могут только поддерживать
ограниченное количество вызовов.
мультиплексирование
osSemaphoreId; osSemaphoreDef
(мультиплексирование);
освободите thread1 (пусто)
{
мультиплексируйте 5osSemaphoreCreate (osSemaphore (мультиплексирование),
FIVE_TOKENS); в то время как (1) {
Рандеву
Более обобщенная форма семафорной передачи сигналов является рандеву.
Рандеву гарантирует, чтобы два потока достигли определенного момента
выполнения. Ни один не может продолжить, пока оба не достигли точки рандеву.
osSemaphoreId arrived1, arrived2;
osSemaphoreDef (arrived1);
osSemaphoreDef (arrived2);
освободите thread1 (пусто) {
Arrived1 5osSemaphoreCreate (osSemaphore (arrived1), ZERO_TOKENS); Arrived2
5osSemaphoreCreate (osSemaphore (arrived2), ZERO_TOKENS); в то время как (1) {
FuncA1 ();
osSemaphoreRelease (Arrived1);
osSemaphoreWait (Arrived2, osWaitForever);
FuncA2 ();
}}
освободите thread2 (пусто)
{в то время как (1) {
FuncB1 (); os_sem_send
(Arrived2);
os_sem_wait (Arrived1, osWaitForever); FuncB2 ();
}}
В вышеупомянутом случае эти два семафора гарантируют, что оба потока будут
рандеву и затем продолжать выполнять FuncA2 () и FuncB2 ().
Турникет барьера
Хотя рандеву очень полезно для синхронизации выполнения кода, это только работает
на два потока. Барьер является более обобщенной формой рандеву, которое работает
для синхронизации нескольких потоков.
количество osSemaphoreId, барьер;
osSemaphoreDef (счетчик);
osSemaphoreDef (барьер);
неподписанное международное
количество;
освободите thread1 (пусто)
{
количество 5 osSemaphoreCreate (osSemaphore (количество), ONE_TOKEN);
барьер 5 osSemaphoreCreate (osSemaphore (барьер), ZERO_TOKENS); в то время как
(1) {
critical_Function ();
}}
Семафорные протесты
Семафоры являются чрезвычайно полезной функцией любого RTOS. Однако
семафоры могут неправильно использоваться. Необходимо всегда помнить, что
количество маркеров в семафоре не фиксируется. Во время времени выполнения
семафора программы маркеры могут быть созданы и уничтожены. Иногда это полезно,
но если Ваш код зависит от наличия постоянного числа маркеров
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 333
Взаимное исключение
Взаимное исключение обозначает “Взаимное исключение”. В действительности
взаимное исключение является специализированной версией семафора. Как семафор,
взаимное исключение является контейнером для маркеров. Различие - то, что
взаимное исключение может только содержать один маркер, который не может быть
создан или уничтожен. Принципиальное использование взаимного исключения
должно управлять доступом к ресурсу микросхемы, такому как периферийное
устройство. Поэтому взаимоисключающий маркер является двоичным и ограничен.
Кроме этого это действительно работает таким же образом семафором. В первую
очередь, мы должны объявить взаимоисключающий контейнер и инициализировать
взаимное исключение:
osMutexId uart_mutex;
osMutexDef (uart_mutex);
После того, как объявленный взаимным исключением должен быть создан в потоке.
uart_mutex 5 osMutexCreate (osMutex (uart_mutex));
Этот проект объявляет два потока который оба блока записи символов к UART.
Первоначально, взаимное исключение комментируется.
освободите uart_Thread1 (пустая константа
*аргумент) {uint32_t i;
для (;;) {
//osMutexWait (uart_mutex, osWaitForever); для (я 5 0; я,
10; i11) SendChar ('1'); SendChar ('\n');
334 Главы 9
SendChar ('\r');//osMutexRelease
(uart_mutex);
}}
В каждом потоке код распечатывает число потока. В конце каждого блока символов
это затем печатает символы возврата каретки и символы новой строки.
Создайте код и запустите отладчик.
Откройте окно консоли UART1 с View\Serial Windows\UART # 1 (Рис. 9.39).
Рисунок 9.39
Откройте окно консоли UART.
Рисунок 9.40
Мисс заказала последовательный вывод.
Рисунок 9.41
Порядок восстановлен при помощи взаимного
исключения.
Взаимоисключающие протесты
Очевидно необходимо заботиться для возврата взаимоисключающего маркера, когда
Вы будете закончены с ресурсом микросхемы, или Вы будете эффективно
препятствовать тому, чтобы любой другой поток получил доступ к нему. Необходимо
также быть чрезвычайно осторожны относительно использования osThreadTerminate
() запрос к функциям, которые управляют взаимоисключающим маркером. Keil RTX
разработан, чтобы быть маленьким местом RTOS так, чтобы он мог работать даже на
очень маленьких микроконтроллерах Cortex-M. Следовательно, нет никакой
безопасности удаления потока. Это означает, что при удалении потока, который
управляет взаимоисключающим маркером, Вы уничтожите взаимоисключающий
маркер и предотвратите дальнейший доступ к защищенному периферийному
устройству.
Обмен данными
До сих пор все способы связи межпотока только использовались для инициирования
выполнения потоков; они не поддерживают обмен данными программы между потоками.
Очевидно, в реальной программе мы должны будем переместить данные между потоками.
Это могло быть сделано путем чтения и записи в глобально заявленные переменные. В
чем-либо кроме очень простой программы, пытаясь гарантировать данные
336 Глав 9
Рисунок 9.42
Очередь сообщений действует как буфер FIFO между потоками.
Вторая форма передачи данных является почтовой очередью. Это очень похоже на
очередь сообщений за исключением того, что она передает блоки данных, а не
единственное целое число (Рис. 9.43).
Рисунок 9.43
Почтовая очередь может передать блоки структурированных данных
между потоками.
Рисунок 9.44
Системное представление уровня основанного на RTOS проекта состоит из
объектов потока, соединенных потоками данных в форме
очередей сообщений и почтовых очередей.
Очередь сообщений
Для установки очереди сообщений, мы сначала должны выделить ресурсы памяти.
osMessageQId Q_LED;
osMessageQDef (Q_LED, 16_Message_Slots, неподписанный интервал);
сигналы int32_t}
значение
После того как очередь сообщений была создана, мы можем поместить данные в
очередь от одного потока.
osMessagePut (Q_LED, 0x0, osWaitForever);
338 Глав 9
Рисунок 9.45
Установите точку останова на потоке получения.
Пул памяти
В то время как возможно отправить простые значения данных в очередь сообщений,
также возможно отправить указатель на более сложный объект. CMSIS-RTOS
поддерживает динамическое выделение памяти в форме пула памяти. Здесь мы
можем объявить структуру, которая комбинирует много элементов данных.
структура
определения типа
{uint8_t LED0;
uint8_t LED1;
uint8_t LED2;
uint8_t LED3;
} memory_block_t;
После того как данные в блоке памяти использовались, блок должен быть выпущен
назад к пулу памяти для повторного использования.
osPoolFree (led_pool, полученный);
340 Глав 9
Рисунок 9.46
Набор устанавливает контрольные точки на отправке и получении
потоков.
Почтовая очередь
В то время как пулы памяти могут использоваться в качестве буферов данных в
потоке, CMSIS-RTOS также реализует почтовую очередь, которая является
комбинацией пула памяти и очереди сообщений. Почтовая очередь использует пул
памяти для создания отформатированных блоков памяти и передает указатели на эти
блоки в очереди сообщений. Это позволяет данным оставаться в выделенном блоке
памяти, в то время как мы только перемещаем указатель между различными
потоками. Простая почтовая очередь API делает это легким установить и
использовать. Сначала мы должны объявить структуру для почтового слота,
подобного тому, который мы использовали для пула памяти.
структура
определения типа
{uint8_t LED0;
uint8_t LED1;
uint8_t LED2;
uint8_t LED3;
} mail_format;
После того как почтовый слот был выделен, он может быть заполнен с данными и
затем отправлен на почтовую очередь.
LEDtx-.LED0 5 led0 [индекс];
LEDtx-.LED1 5 led1 [индекс];
LEDtx-.LED2 5 led2 [индекс];
LEDtx-.LED3 5 led3 [индекс];
osMailPut (mail_box, LEDtx);
uint8_t LED2;
uint8_t LED3;}
mail_format;
osMailQDef (mail_box, 16, mail_format); osMailQId
mail_box;
международное
основное
(пустота)
{LED_Init ();
mail_box 5 osMailCreate (osMailQ (mail_box), ПУСТОЙ УКАЗАТЕЛЬ);
Рисунок 9.47
Набор устанавливает контрольные точки на отправке и получении
потоков.
Конфигурация
До сих пор мы посмотрели на API CMSIS-RTOS. Это включает функции управления
потоком, тайм-менеджмент и коммуникацию межпотока. Теперь, когда у нас есть
четкое представление о точно, к чему ядро RTOS способно, мы можем бросить более
подробный взгляд на
344 Главы 9
Рисунок 9.48
RTX настроен с помощью одного центрального конфигурационного
файла.
Определение потока
В этом разделе мы определяем основные ресурсы, которые будут требоваться
потоками CMSIS-RTOS. Для каждого потока мы выделяем определенное стековое
пространство (в вышеупомянутом примере, это - 200 байтов.) Мы также определяем
максимальное количество параллельного выполнения потоков. Таким образом сумма
RAM, требуемой для вышеупомянутого примера, может легко быть вычислена как 200
3 6 или 1 200 байтов. Если некоторым нашим потокам нужно большее стековое
пространство, то больший стек может быть выделен, когда задача создается. Кроме
того, общий пользовательский размер стека должен быть выделен в
конфигурационном файле наряду с общим количеством потоков с пользовательским
размером стека. Снова, требование RAM легко вычисляется.
Поддержка отладки ядра
Во время разработки CMSIS-RTOS может захватить переполнения стека. Когда эта
опция будет включена, переполнение стекового пространства потока заставит ядро
RTOS вызывать os_error функцию
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 345
случай OS_ERROR_FIFO_OVF:
/* Переполнение буфера Очереди FIFO ISR
обнаруживается. повреждение */;
случай OS_ERROR_MBX_OVF:
/* Переполнение почтового ящика
обнаруживается. повреждение */;
}
для (;;);
}
Рисунок 9.49
Создание водяных знаков стопки потока позволяет отладчику вычислять
максимальное использование памяти для
каждого потока.
Раздел определения потока также позволяет нам выбирать, работают ли потоки в
привилегированном или непривилегированном режиме. Это принимает значение
по умолчанию к привилегированному для большинства приложений, это в порядке.
Если Вы запишете безопасность, то приложение критической или высокой
безопасности, затем выбирающее непривилегированный, защитит регистры
процессора Cortex-M от случайного или злонамеренного доступа.
346 Глав 9
Конфигурация интервала
Заключительный параметр конфигурации позволяет Вам включать круговое
планирование и определять период интервала. Это является кратным уровню галочки
таймера так в вышеупомянутом примере, который каждый поток выполнит для пяти
галочек или 5 миллисекунд, прежде чем он передаст выполнение другому потоку того
же приоритета, который готов работать. Если никакой поток того же приоритета не
будет готов работать, то он продолжит выполнение. Опции конфигурации системы
также позволяют Вам включать и настраивать виртуальный поток таймера. Если Вы
собираетесь использовать виртуальные таймеры, эта опция должна быть настроена,
или таймеры не будут работать. Затем наконец, если Вы собираетесь инициировать
поток от флагов события использования процедуры прерывания затем, возможно
определить очередь FIFO для инициированных сигналов. Это буферизует триггеры
сигнала в случае пакетов действия прерывания.
Планирование опций
CMSIS-RTOS позволяет Вам создавать приложение с тремя различными опциями
планирования ядра. Это циклическое планирование, упреждающее планирование
и кооперативная многозадачность. Сводка этих опций следующие:
Стандартная Операционная система реального времени программного
интерфейса микроконтроллера коры 347
Упреждающее планирование
Рисунок 9.50
В приоритетном RTOS каждый поток имеет различный приоритетный уровень и
будет работать, пока он не вытесняется или достиг
блокирующегося вызова ОС.
Циклическое планирование
Кооперативная многозадачность
Рисунок 9.52
В совместном RTOS будет работать каждый поток, пока он не будет достигать
блокирующегося вызова ОС или будет
использовать osThreadYield () вызов.
Рисунок 9.53
Добавьте сценарий к отладчику. Это загрузит символы RTX, когда отладчик запустится.
Лицензия RTX
CMSIS-RTOS Keil RTX предоставляют в соответствии с тремя пунктами лицензию
BSD и можно использовать свободно бесплатно для коммерческих и
некоммерческих проектов. RTX также скомпилирует использование инструментов
IAR и GCC. Для получения дополнительной информации используйте URL ниже:
https://www.keil.com/demo/eval/rtx.htm
350 Глав 9
Заключение
В этой главе мы проложили себе путь через API CMSIS-RTOS и представили
некоторые ключевые понятия, связанные с использованием RTOS. Единственный
реальный способ изучить, как разработать с RTOS, состоит в том, чтобы на самом деле
использовать один в реальном проекте. В следующей главе мы посмотрим на
некоторые доказанные методы, которые могут использоваться при разработке
использования работы RTOS микроконтроллера Cortex-M.
CHPTER10
Методы RTOS
Введение
В этой главе мы просмотрим некоторые методы, которые могут использоваться при
разработке с операционной системой реального времени (RTOS). Каждый из этих
методов использовался в реальном проекте, таким образом, они проверены на
практике. Во-первых, мы посмотрим на то, как разработать систему, которая
интегрирует потоки RTOS и стандартные программы прерывания ввода-вывода. Мы
также посмотрим на то, как добавить управление питанием и сторожевую поддержку
многопоточному проекту RTOS. Затем, мы будем видеть, как разработать систему,
которая поддерживает обработку в режиме реального времени текущих данных, но
также может ответить на событийно-ориентированные задачи, такие как
пользовательский интерфейс. Наконец, мы будем видеть, как мы можем использовать
интерфейс прикладного программирования (API) RTOS для расширения поддержки
отладки приложения путем добавления диапазона сообщений диагностики.
RTOS и прерывания
В последней главе мы видели, что наш код приложения может выполниться в потоках
RTOS. Однако в реальной системе, у нас также будет много Процедур обработки
прерывания (ISRs), который будет инициирован событиями в периферийных
устройствах микроконтроллера. RTOS не влияет на необработанную задержку
прерывания, и можно обслужить прерывание точно таким же образом, Вы были бы в
non-RTOS-based системе. Однако, поскольку мы видели планировщик, и любые
вызовы API RTOS также генерируют исключения процессора Cortex-M (Рис. 10.1).
Рисунок 10.1
RTOS генерирует SysTick и исключения SVC. Они должны быть интегрированы с
пользовательскими прерываниями ввода-вывода для создания
успешной системы.
Рисунок 10.2
Исключение SysTick выполняет минимальный объем кода RTOS для поддержания его функций
в реальном времени. Это затем устанавливает ОЖИДАТЬ исключение и выходы. Это
позволяет любым прерываниям ввода-вывода выполняться сопровождаемый ОЖИДАТЬ
исключением. ОЖИДАТЬ исключение выполнит остаток от кода RTOS.
способ достигнуть этого состоит в том, чтобы переместить код ISR и поместить его в
специализированный первоочередной поток, поток обслуживания. Поток
обслуживания будет разработан для нахождения в заблокированном состоянии, как
только он начинает позволять потокам приложения работать. Когда прерывание
ввода-вывода произойдет, мы введем ISR как нормальный, а скорее, чем процесс
прерывание, ISR будет использовать объект RTOS (сигнал, семафор очереди
сообщений и т.д.) для пробуждения заблокированного потока обслуживания. Любой
из объектов межпроцессорной связи RTOS может использоваться для соединения ISR
с потоком, который может, в свою очередь, обслужить прерывание ввода-вывода. Код
потока обслуживания затем обработает прерывание и затем вернется к
заблокированному состоянию. Этот метод сводит код ISR к минимуму и позволяет
планировщику RTOS решать, какой поток должен работать. Оборотная сторона
является увеличенным временем контекстного переключения, требуемым
запланировать поток обслуживания. Однако для многих приложений это не настоящая
проблема. При необходимости в абсолютной минимальной задержке прерывания для
ключевых периферийных устройств все еще возможно обслужить это прерывание со
специализированным ISR.
Рисунок 10.3
В RTOS код прерывания выполняется как потоки. Обработчики прерываний
сигнализируют о задачах, когда прерывание происходит. Приоритетный уровень
задачи определяет, какая задача планируется ядром.
LED_Init ();
init_ADC ();
T_led_ID1 5 osThreadCreate (osThread (led_Thread1), ПУСТОЙ
УКАЗАТЕЛЬ); T_led_ID2 5 osThreadCreate (osThread (led_Thread2),
ПУСТОЙ УКАЗАТЕЛЬ); T_adc_ID 5 osThreadCreate (osThread
(adc_Thread), ПУСТОЙ УКАЗАТЕЛЬ);
Рисунок 10.5
Точка останова на “запускается преобразования ADC”.
И в adc_Thread () (Рис. 10.6)
Рисунок 10.6
Точка останова в потоке ADC.
Рисунок 10.7
Точка останова в прерывании ADC.
Выполните код.
Рисунок 10.8
Выполнение потока установлено на непривилегированный
режим.
В проекте мы добавили новый файл под названием SVC_Table.s (Рис. 10.9). Этот файл
доступен как “Пользовательский Шаблон Кода” (Пользователь CMSIS-RTOS SVC) от,
“Добавьте Новый Объект” диалоговое окно:
Рисунок 10.9
Добавьте пользовательский файл шаблона SVC.
Откройте файл
SVC_Tables.c.
Методы RTOS 357
В этом файле мы должны добавить имя импорта и запись в таблице для каждого __
функция SVC, которую мы собираемся использовать. Добавьте __ прорезывания
зубов SVC_1 как показано выше.
Преобразуйте init_ADC () функция к исключению служебного вызова как показано
ниже.
освободите __ svc (1) init_ADC
(пусто); освободите __ SVC_1 (пусто)
{
Рисунок 10.10
Процессор находится в непривилегированном состоянии с помощью
стека процесса.
Управление питанием
Одно из преимуществ разработки с RTOS - то, что мы можем полагать, что каждый из
потоков приложения работает параллельно. Это позволяет нам разрабатывать
независимые потоки кода, который каждый может выполнить специализированную
задачу и передать вместе для создания требуемого приложения. Этот уровень
абстракции предоставляет много преимуществ, поскольку проекты становятся более
сложными. Однако добавление кода управления питанием к этой многопоточной
среде может казаться пугающим сначала, потому что должны гарантировать, что
каждый поток готов ввести состояние низкой мощности.
Рисунок 10.12
В каждом потоке необходимо определить блокирующуюся точку. В блокирующейся точке
поток закончил свою текущую задачу и ожидает следующего события, чтобы
продолжить обрабатывать.
Если мы создаем все наши системные потоки как это, мы можем определить, когда
все потоки ожидают на своих ключевых точках блокирования. Затем приложение
действительно неактивно, и мы можем поместить его в более глубокое состояние
низкой мощности.
Каждый поток имеет один “поток, выполняющий” бит и один “поток, ожидающий”
бит. Затем, мы должны записать некоторые простые функции, которые будут
управлять этими битами. Когда поток просыпается для запуска выполнения его кода,
мы должны установить выполняющий поток бит. Поскольку несколько потоков
будут получать доступ к powerFlags переменной, она должна быть защищена
взаимным исключением.
освободите taskIsRunning (uint16_t задача)
{osMutexWait (PowerMutex, osWaitForever);
powertFlags | 5 задач; osMutexRelease (PowerMutex);
Когда другая часть системы собирается инициировать поток, в этом случае путем
отправки сообщения мы можем установить потоки, ожидающие бит. Это
гарантирует, чтобы мы избежали любых проблем с планировщиком.
освободите taskIsPending (uint16_t задача) {osMutexWait
(PowerMutex, osWaitForever);
powerFlags | 5 (задача, NUM_THREADS);//Поставившая Задача, Ожидающая
бит osMutexRelease (PowerMutex);
}
Сторожевое управление
Мы можем также использовать флаги управления питанием для решения другой
проблемы. В этом случае мы хотим включить аппаратный сторожевой таймер на
микроконтроллере. Было бы возможно снова наполнить сторожевой таймер в
каждом потоке. Однако, поскольку мы постоянно переключаемся
между потоками вероятно, что сторожевой счетчик был бы снова наполнен
несколькими различными потоками, и мы будем не мочь обнаружить, если данный
поток перестал работать. Для лучше использования сторожевой таймер мы должны
добавить отдельный системный поток, который используется для контроля потока
незаконченные биты. Системный монитор периодически работает как
пользовательский таймер. Каждый раз, когда это работает, это проверит поток
незаконченные биты. Если незаконченный бит установлен затем, переменная счетчика
соответствия увеличена. Если порог превышен затем, система по ошибке, сторожевой
таймер не будет снова наполнен, и аппаратный сброс будет вызван.
освободите taskMonitor (пусто)
{uint8_t stalledTaskError 5 0;
для (цикл 5 PEND_START_BIT, индекс 5 0; цикл, PEND_END_BIT; цикл, 51, index11) {если
(powerFlags &loop)) {
watchdogCounters [индекс] 11; если (WatchdogCounters
[индекс].MAX_TASK_STALL_COUNT) {
taskIsStalled 5 TRUE;
Методы RTOS 363
}}}
если (stalledTaskError 55 0)
{patWatchdog ();
}}
taskWatchdogCounters[taskNumber-1] 5 0;
osMutexRelease (PowerMutex);
}
Интеграция ISRs
В случае прерывания, которое будет будить процессор и сигнализировать, чтобы
поток продолжил обрабатывать, мы можем использовать флаги питания в качестве
средства обеспечения тайм-аута, который позволяет микроконтроллеру возвращаться
ко сну. Например, если микроконтроллер будет в режиме низкой мощности,
ожидающем данных, которые будут отправлены в UART. Затем некоторые случайные
помехи могут разбудить процессор, который будет затем ожидать полного пакета
сообщений, который будет отправлен. В этой ситуации мы можем представить флаг
питания для ISR UART, который установлен в ISR и очищен только, когда полное
сообщение было получено. В сторожевой стандартной программе мы можем
увеличить счетчик, если пороговое значение достигнуто затем вместо того, чтобы
сбросить микроконтроллер, мы просто должны очистить флаг выполнения ISR, чтобы
позволить процессору отступать ко сну. В то время как функции питания ISR по
существу выполняют ту же задачу, как питание потока функционирует, мы должны
обеспечить выделенные функции, которые не получают доступ к взаимному
исключению, поскольку взаимное исключение не может быть получено стандартной
программой ISR того же или более низкого приоритета.
освободите IsrTaskIsPending (uint16_t задача)
{powerFlags | 5 (задача, 8);
}
освободите IsrIsInactive (uint16_t задача) {powerFlags
и 5 B (задача); resetCurrentTaskWatchdogCounter
(задача);
Теперь, если все другие потоки будут в заблокированном состоянии, то все флаги
управления питанием будут ясны, и микроконтроллер введет свое состояние низкой
мощности.
Рисунок 10.14
Шоу анализатора производительности, что эта простая программа проводит
большую часть своего времени в неактивной
опустошительной энергии потока.
Рисунок 10.15
Теперь процессор вводит сон в неактивный поток, который минимизирует
использование энергии во время выполнения.
После того, как код работал в течение нескольких секунд, нажимают кнопку Min/Max
Auto и нажимают уменьшение кнопки, пока Вы не получаете представление, подобное
Рис. 10.16.
Рисунок 10.16
Анализатор логики может использоваться для показа записи в режимы
ожидания.
Рисунок 10.17
Потоки приложения и сторожевой таймер контролируют поток.
Рисунок 10.18
Сторожевой таймер противостоит для каждого потока.
Барьер запуска
Если Вы запускаете работу с нового микроконтроллера или собираетесь начать
добавлять код низкой мощности, это - хорошая практика для добавления “барьера
запуска” для кода. На ранних стадиях развития при конфигурировании системных
периферийных устройств возможно случайно поместить микроконтроллер в
возмущенное состояние, где это становится трудным или невозможным соединиться
через отладку CoreSight. Кроме того, возможно добавить код, который помещает
микросхему в неработоспособное состояние питания, которое снова лишает
возможности соединять отладчик. Если это происходит, Вы больше не можете
стирать Flash и программировать память. Если у Вас только есть ограниченное
предоставление макетных плат, это может быть смущающей проблемой! “Барьер
запуска” является просто небольшой функцией, которая только позволит коду
продолжаться, если определенный шаблон будет в определенном месте Оперативной
памяти.
энергозависимый uint32_t debuggerAttached __ приписывает __ ((в (0x2000FFFC)));
освободите startupBarrier (пусто)
{
если (debuggerAttached! 5 0x55555555) {__
BKPT (0);
}
}
Эта функция вызвана на самой первой строке system_init () перед любым кодом,
который может нарушить процессор Cortex-M, был назван. Если мы создадим
программу с таким “барьером запуска” и загрузим его во Флэш-память, то он запустит
выполнение и затем станет захваченным в барьерной функции. Это гарантирует, что
мы можем стереть и повторно программировать Флэш-память. Для заканчивания
“барьера запуска” мы можем добавить файл сценария к отладчику, который
программирует шаблон барьера в RAM (Рис. 10.19).
Рисунок 10.19
Добавьте сценарий барьера запуска как файл инициализации
отладчика.
370 Глав 10
Рисунок 10.20
Простая система DSP может использовать двойной буфер для получения
потока данных.
В то время как буфер Ping заполнен данными из ADC, алгоритм DSP обрабатывает
данные, хранившие в буфере Вони. После того как ADC достигает конца буфера
Ping, он начнет хранить данные в буфер Вони, и новые данные в буфере Ping могут
быть обработаны. Подобная структура Пинг-понга может использоваться для
буферизации выходных данных к DAC (Рис. 10.21).
Методы RTOS 371
Рисунок 10.21
Двойной буфер вызывает минимальную задержку сигнала, но требует, чтобы
алгоритм DSP часто работал. Это мешает поддерживать производительность в
реальном времени, когда другие программные процедуры должны быть
выполнены.
Рисунок 10.22
Обработка блока с помощью почтовых очередей RTOS увеличивает задержку
сигнала, но обеспечивает надежную интеграцию потока DSP в
сложное приложение.
После того как это сделано, почтовый ящик готов отправить данные между
потоками или ISR и потоками. Код ниже показывает обработчик ADC,
регистрирующий 32 преобразования в почтовый слот и затем отправляющий его на
стандартную программу DSP.
освободите ADC_IRQHandler (пусто) {
статический ADC_RESULT *mptr; //объявляют почтовый
слот
указатель
статический неподписанный символьный индекс 5 0;
если (индекс 55 0) {
mptr 5 _alloc_box (mpool_ADC);
mptr 5 (ADC_RESULT*) osMailAlloc (MsgBox, osWaitForever); //выделяют новое
почтовый слот
}
mptr-.dataBuffer [индекс] 5 (плавание) ((LPC_ADC-.ADGDR.. 4) и 0xFFF);//помещают данные ADC в
почтовый слот
index11;
если (индекс 55 BLOCK_SIZE) {
индекс 5 0;
osMailPut (MsgBox, mptr); //, когда почтовый слот
полный отправляют
}}
В основном потоке DSP код приложения ожидает блоков данных для прибытия в
очередь сообщений от ADC. Когда они прибывают, каждый обрабатывается и
результаты, помещенные в подобную очередь сообщений, которая будет питаться в
DAC.
374 Главы 10
В примере кода второй поток используется для чтения, DAC передают и пишут
обработанные данные в выходной регистр DAC.
освободите DAC_task (пусто) {
неподписанный интервал i;
ADC_RESULT *DACrptr;
в то время как (1) {
evt 5 osMailGet (MsgBox, osWaitForever); //Ожидают почтового слота
обработанные данные
если (evt.status 55 osEventMail) DACrptr 5 (ADC_RESULT*) evt.value.p;
для (я 5 0; я, (BLOCK_SIZE); i11) {
osSignalWait (0x01, osWaitForever); //синхронизируются с
Частота дискретизации ADC
LPC_DAC-.DACR 5 (неподписанный интервал) DACrptr-.dataBuffer [я], 4;//пишут обработанные данные
оцените регистру DAC
}
osMailFree (MsgBox, DACrptr); //освобождают почтовый слот
}}
osSignalWait () вызов RTX вызывает задачу DAC остановиться до другого потока, или
ISR устанавливает свои флаги события на шаблон 0x0001. Это - простой метод
инициирования между потоком, который может использоваться для синхронизации
вывода DAC с частотой дискретизации ADC. Теперь, если мы добавляем строку
osSignalSet (tsk_DAC, 0x01);//устанавливает флаг события в задаче DAC.
к ISR ADC это инициирует поток DAC каждый раз, когда ADC делает
преобразование. Задача DAC проснется каждый раз, когда ее флаг события
инициирован, и запишите выходное значение в DAC. Этот простой метод
синхронизирует входные и выходные потоки данных.
Методы RTOS 375
Балансировка загрузки
Приложение имеет две очереди сообщений, один от ISR ADC до потока DSP и другого
от потока DSP до потока DAC. Если мы хотим создать сложную систему, говорят с
GUI и стеком TCP/IP, то мы должны признать, что во время критических периодов
поток DSP будет вытеснен другими потоками, работающими на системе. При условии,
что поток DSP может работать, прежде чем очередь сообщений DAC высыхает, затем
мы не поставим под угрозу данные реального времени. Для преодоления этого мы
можем использовать очереди сообщений для обеспечения необходимой буферизации
для поддерживания системы в рабочем состоянии в течение этих пользующихся
высоким спросом периодов. Все, что мы должны сделать, чтобы гарантировать, что
это происходит, добавляют много сообщений к очереди сообщений DAC, прежде чем
мы запустим выполнение потока DAC. Это представит дополнительную задержку, но
всегда будут доступные данные для DAC. Также возможно использовать значение
тайм-аута в osMessageGet () функция. Здесь, мы можем установить значение тайм-аута
для действия как сторожевой таймер.
Теперь, мы будем знать максимальный период, в который поток DAC должен считать
данные с очереди сообщений. Мы можем установить период тайм-аута, чтобы быть
тремя четвертями этого периода. Если сообщение не прибыло затем, мы можем
повысить приоритет потока DSP. Это заставит поток DSP вытеснять рабочий поток и
процесс и отложенные пакеты данных. Они будут затем отправлены на потоке DAC.
После того как DAC имеет данные для обработки, это может понизить приоритет
потока DSP продолжить обрабатывать как нормальное. Таким образом, мы можем
гарантировать поток данных реального времени в системе с пакетами действия в
других потоках.
Рисунок 10.23
БИХ-фильтр является фильтром обратной связи, который намного быстрее, чем
фильтр Конечной импульсной характеристики (FIR), но может
быть нестабильным, если неправильно разработано.
Рисунок 10.24
Проект DSP в реальном времени.
Когда проект запускается, он также загружает файл сценария, который создает ряд
функций моделирования. Во время моделирования к этим функциям можно
получить доступ через кнопки, созданные в диалоговом окне панели инструментов
(Рис. 10.25).
Выберите view\toolbox
Рисунок 10.25
Кнопки панели инструментов создаются файлом сценария.
Рисунок 10.26
Окно анализатора логики.
Анализатор логики должен иметь определенный AIN2 и AOUT двух сигналов каждый
с диапазоном 0 3.3 В. Это не переменные программы, но виртуальные регистры
моделирования, которые представляют контакт аналогового входа и выходной контакт
DAC (Рис. 10.27).
Рисунок 10.27
Вход смешал синусоидальную волну, и вывод фильтровал форму
сигнала.
Рисунок 10.28
Функция SigMod содержит функцию обработки DSP.
Рисунок 10.29
Обработка первого пакета образцов представляет задержку между входной и
выходной формой сигнала.
Рисунок 10.30
Сокращение пакетного размера пакета данных уменьшает задержку, но увеличивает время
выполнения алгоритма DSP.
Рисунок 10.31
Создание низкоприоритетного диагностического потока позволяет потокам
приложения отправлять ошибку и информационные сообщения. Диагностический
поток может записать их в отладчик через ITM и / или зарегистрировать их к
энергонезависимой памяти.
Рисунок 10.32
Добавьте диагностическую платформу.
Методы RTOS 383
параметр uint32_t;}
mail_format;
Рисунок 10.33
Диагностические параметры конфигурации платформы.
#include “diagnostic.h”
международное основное
(пустота)
{
tid_mainThread 5 osThreadGetId ();
LED_Initialize (); Init_diagnosticThread ();
Рисунок 10.34
Сообщения диагностики показывают переполнение почтовой
очереди.
После того, как код работал приблизительно за 40 мс, почтовая очередь приложения
перестанет работать, и сообщение об ошибке будет отображено.
Выйдите из отладчика.
Строка некомментария 27 в main_app.c.
Восстановите код.
Выполните код и наблюдайте вывод в Средстве просмотра Отладки (Рис. 10.35).
Методы RTOS 385
Рисунок 10.35
Информационные сообщения из исправленного кода.
Заключение
Одна из главных причин, сделанных разработчиками для того, чтобы не принимать
использование RTOS, - то, что оно представляет слишком много служебное с точки
зрения времени обработки для маленького микроконтроллера. Это больше не
складывает, примерно каждое Основанное на Cortex-M устройство способно к
поддержке RTOS и должно использоваться для всех кроме самых простых проектов.
Используемый правильно преимущества использования RTOS явно перевешивают
отрицательные стороны. После того как Вы инвестировали время в изучение, как
использовать RTOS, Вы не захотите возвращаться к проектам без операционной
системы.
Эта страница, намеренно
оставленная незаполненный
CHPTER11
Введение
В этом разделе мы собираемся посмотреть на новую технику под названием
“Разработка через тестирование” (TDD) для разработки кода. Когда я говорю новый, я
действительно имею в виду в новинку для разработчиков встроенной системы. TDD
был установлен в других областях вычислений приблизительно с 2003. Традиционно
большинство разработчиков встроенных систем будет склонно писать относительно
небольшой объем кода, компилировать его и затем тестировать его на аппаратных
средствах с помощью отладчика. Любое формальное тестирование затем сделано
отдельной командой, после того как вся кодовая база была записана.
Поблочное тестирование затем было бы длинной фазой тестирования, отладило бы и
зафиксировало бы, пока заключительный производственный код не считают
пригодным быть выпущенным. TDD не является заменой для формальной фазы
поблочного тестирования, но представляет тестирование как инструмент, который
является частью процесса разработки кода. Помещенный просто, TDD требует,
чтобы Вы добавили тесты для каждой функции, которую Вы пишете, но
кардинально Вы пишете, что тесты сначала затем пишут код приложения, чтобы
пройти тесты. Сначала это кажется излишне трудоемким и сложным, однако, TDD
действительно обладает многими очень положительными преимуществами.
Программное обеспечение имеет два аспекта, первое и самое очевидное, оно должно
выполнить необходимую функциональность. Второе является более тонким,
программное обеспечение должно также быть хорошо создано и выразительное так,
чтобы оно могло сохраняться за время жизни проекта и идеально снова
использоваться в будущих проектах. После того как мы написали код, чтобы быть
функционально корректными, он может затем быть пересмотрен для становления
публикуемым производственным кодом. С TDD, после того как код является
функционально правильным, у нас будет ряд проходящих тестов. Мы можем теперь
линзовый телескоп код и проходить очень быструю компиляцию и цикл испытаний,
чтобы гарантировать, что мы не представили ошибок. TDD может сохранить
огромное количество времени во время этого этапа разработки кода.
Среда тестирования
Автоматизация тестирования
затем дайте нам цикл разработки менее чем 30 секунд. В следующих двух
примерах мы посмотрим на установку и автоматизацию платформы TDD с
простым проектом.
Рисунок 11.1
Платы установщика пакета и вкладки в качестве примера.
Выберите MCB1700.
Выберите вкладку в качестве примера и Копию “Среда тестирования Разработчика
Единицы”.
Это скопирует проект в Ваш выбранный каталог разработки.
Рисунок 11.3
Первоначальный проект с кодом под тестом в lookup.c.
Lookup.c содержит скелет функции, вызванной checkTick (). Эта функция передается
целочисленное значение, она должна затем просканировать массив, чтобы видеть,
находится ли это значение в массиве. Если существует совпадающее значение, оно
возвращает местоположение того значения в массиве. Если нет никакого
совпадающего значения в нуле массива, возвращается.
392 Главы 11
Рисунок 11.4
sel столбец будет окрашен в оранжевый (светло-серый в печатной версии), если
субкомпонент будет требоваться.
Рисунок 11.5
Выберите ITM, чтобы быть каналом STDIO.
Рисунок 11.6
Для аппаратной отладки необходимо позволить Единице Трассировки ITM
получить результаты испытаний.
Рисунок 11.7
Справьтесь проекты позволяет Вам определять папки проекта и версии
сборки.
В настоящее время у нас есть единственная версия сборки проекта, который создает
код приложения. Используя окно проекта мы можем определить различные версии
сборки и дополнительные папки проекта (Рис. 11.8).
Рисунок 11.8
Мы можем определить тест целевые и дополнительные папки
проекта.
В “Groups” раздел добавляет, что две новых группы “Разработка” и “Тест” затем
нажимают хорошо для возврата к IDE (Рис. 11.9).
Разработка через тестирование 395
Рисунок 11.9
Переключитесь на сборку приложения с помощью выпадающей панели
инструментов.
Рисунок 11.10
Откройте локальные опции для тестовой папки группы.
Рисунок 11.11
Снимите флажок с опциями сборки удалить эту папку из
сборки.
396 Глав 11
Выберите щелчок правой кнопкой группы приложений и откройте опции для сборки
“Приложения” группы.
Снимите флажок с опциями “Always Build” и “Include in Target Build” и нажмите ОК.
Теперь то, когда мы выбираем “Тестовую Цель” код приложения, будет удалено, и
тестовые компоненты будут активны в проекте (Рис. 11.12).
Рисунок 11.12
“Знаки Стоп” на папках проекта указывают, что папка не является частью Целевой
сборки.
Любой код, который находится в папке Development, будет включен в оба проекта.
Добавление тестов
Выберите папку Test, щелкните правой кнопкой и выберите, “Добавьте Новый Объект
к Тесту Группы”
(Рис. 11.14).
Рисунок 11.14
Пользовательский код обрабатывает по шаблону для Тестовой
обвязки Единицы.
Рисунок 11.15
Проект с добавленной Тестовой обвязкой.
После того как Единица начинает работать, она начнет выполнять любые тесты,
которые были определены. Они объявляются как тестовые сценарии, которые затем
собраны в тестовые группы. Мы можем создать эту иерархию тестов путем изменения
runAllTests () и TEST_GROUP_RUNNER () функции.
В runAlltest () функция переименовывают тестовую группу к поиску.
398 Глав 11
Откройте TestGroup.c.
В этом файле мы можем определить группу тестов для нашей функции lookup.c.
Этот файл определяет тестовое название группы и обеспечивает установку, и
разъедините функции, которые работают прежде и за тестами. TEST_SETUP ()
функционируют выполнения однажды каждый тест в тестовой группе
и используется для подготовки аппаратных средств приложения к тестовым
сценариям. Слеза вниз функционирует, используется для возврата проекта состоянию
по умолчанию так, чтобы любые другие тестовые группы могли работать.
Заключительная функция является нашим тестовым сценарием, который позволяет
нам создавать массив тестов для нашей новой функции.
TEST_GROUP (поиск);
TEST_SETUP (поиск)
{
}
TEST_TEAR_DOWN (поиск)
{
}
Рисунок 11.16
О провальном тесте сообщают в окне консоли ITM.
Рисунок 11.17
Вкладка User позволяет Вам запускать отладчик, как только сборка
закончена.
Теперь после сборки код будет загружен в цель, и отладчик будет запущен.
Затем выберите опции для target\debug меню и добавьте файл сценария test_go.ini,
который расположен в, проект. каталог \RTE\utilities как файл инициализации
средства моделирования.
(Рис. 11.18).
Рисунок 11.18
Добавьте сценарий автоматизации как файл инициализации
средства моделирования.
Разработка через тестирование 401
Затем снимите флажок “Run to main ()”. Или это остановит сценарий, работающий
правильно.
Теперь этот скрипт будет запущен, как только отладчик запускается.
ясное покрытие
СИЛЬНО УДАРЬТЕ
..testResults.txt g,
остановитесь
Файл сценария запускает выполнение кода, как только отладчик запускается. Код
будет работать, пока он не достиг функции остановки. Все результаты испытаний
распечатаны к консоли ITM и также зарегистрированы в файл на жестком диске ПК. В
конце тестов информация покрытия кода для testgroup.c модуля также сохранена к
файлу журнала. Информация о покрытии кода доказывает, что все тесты были
выполнены. Вы могли также добавить информацию о покрытии для модулей под
тестом.
Так как мы только создаем и загружаем среду тестирования, и наш новый код
является очень быстрым циклом разработки. В крупном проекте это может быть
средством сохранения достижения.
Рисунок 11.19
После того как правильный код добавляется, у нас есть
проходящие тесты.
402 Главы 11
}
}
Рисунок 11.20
Основанный на RTOS проект состоит из объектов потока с четко определенными
вводами и выводами. Поток является превосходной целью
для тестирования.
Разработка через тестирование 403
Наши потоки приложения состоят из потока Tx, который пишет значения в очередь
сообщений, поток Rx, который читает значения из очереди сообщений и пишет их в
банк светодиодов. Когда все светодиоды были включены, поток Tx сигнализирует о
потоке Сброса, который выключает все светодиоды (Рис. 11.21).
Рисунок 11.21
Тестовый поток может использовать API RTOS для управления потоками приложения.
Здесь мы можем завершить поток и применить тестовые сценарии к остающемуся
потоку с помощью почтовой очереди и сигнальных флагов.
}
Разработайте проект и позвольте ему пробежать ссылку компиляции и
испытательный шлейф (Рис. 11.22).
Разработка через тестирование 405
Рисунок 11.22
Теперь исходный и новый тестовый прогон RTOS и передача.
Когда код приложения будет создан, эта функция будет скомпилирована как
нормальная. Однако во время тестирования мы можем объявить “ложную”
функцию с тем же прототипом функции минус __ слабая прагма. Компоновщик
будет затем “перегружать” исходную функцию со слабым объявлением и
использовать “ложную” версию в ее месте.
int8_t mockSerialData [] 5 "Привет Мир";
символ receiveCharacter (ARM_DRIVER_USART *USARTdrv)
{
int8_t val, количество 5 0;
val 5 mockSerialData[count11];
если (считают .sizeof (mockSerialdata)), количество 5 0;
возвратите val;
}
Тестирование прерываний
Рисунок 11.23
Проект является установкой для работы со средой
тестирования.
Открытый testGroup.c.
закончитесь 5
результатов.. 4;
LED_SetOut (результат);
}
Рисунок 11.24
Тестовые сценарии выполняются с ложными перегруженными
функциями.
Заключение
Надо надеяться, это было полезной главой. Если Вы плохо знакомы с TDD, он должен
дать Вам некоторую пищу для размышления. Единственный реальный способ
получить реальный смысл того, как использовать TDD в реальном дизайне, состоит в
том, чтобы на самом деле сделать это. Первоначально Вы пойдете медленнее,
поскольку необходимо создать опыт в том, как создать подходящие тесты. После того
как Вы создали некоторое полезное тестирование “шаблоны”, Вы начнете делать
более быстрые успехи. С практикой и степенью дисциплины Вы начнете видеть
некоторую реальную выгоду путем принятия подхода TDD к разработке кода.
Эта страница, намеренно
оставленная незаполненный
CHPTER12
Компоненты программного
обеспечения
Введение
За прошлые 25 лет фокус средств разработки встроенных систем видел перемещение
от встроенного микропрограммного обеспечения приложения, записанного полностью
в ассемблере к введению компиляторов для “C” и языков “C11”. Это сопровождалось
все больше сложными средами разработки и отладчиками. Сегодня с появлением
навсегда сложных микроконтроллеров, проект может потребовать, чтобы несколько
программного обеспечения “стеки” управляли периферийными устройствами, такими
как USB-устройство и Хост, Ethernet, Мультимедийная карта и жидкокристаллический
дисплей. Написание необходимого кода для любого из этих периферийных устройств
является проектом самостоятельно. Следовательно, это становится фактом жизни, что
необходимо будет использовать сторонний код в проекте, быть им открытый
исходный код, библиотека Silicon Vendor или коммерческая библиотека. Кроме того,
необходимо будет смочь интегрировать несколько из этих библиотек, возможно из
других источников, в единственный проект и заставить их всех работать счастливо
вместе (Рис. 12.1).
Рисунок 12.1
За прошлый век четверти основанные на микроконтроллере системы переместились от
введения высокоуровневых языков к введению высокоуровневых компонентов
программного обеспечения.
Драйвер CMSIS
Спецификация Драйвера CMSIS определяет универсальный периферийный интерфейс
драйвера. Это создает абстракцию из аппаратных средств микроконтроллера. Любой код,
который написан с помощью Драйвера CMSIS, может быть снова использован на любом
микроконтроллере Cortex-M, который имеет соответствие Драйвер CMSIS (Рис. 12.2).
Рисунок 12.2
Драйвер CMSIS и CMSIS RTOS позволяют Вам создавать компонент программного
обеспечения, который может быть снова использован
через различные аппаратные платформы.
Это имеет много преимуществ в этом, после того как Вы знакомы с Драйвером CMSIS
API, можно снова использовать то знание через многие микроконтроллеры и проекты.
Можно также переместить код между различными микроконтроллерами и даже
различными наборами инструментальных средств. Оборотная сторона то, что,
поскольку Вы используете универсальный интерфейс, который должен смочь работать
над любым микроконтроллером.
Это означает, что функции, предлагаемые Драйвером CMSIS API, ограничены.
Поскольку Драйвер CMSIS может быть реализован как обертка по Кремниевой
периферийной библиотеке Поставщика, коду
Компоненты программного обеспечения 413
Рисунок 12.3
Драйвер CMSIS обеспечивает стандартный API для диапазона
периферийных устройств, характерных для
многих микроконтроллеров.
Функция Описание
получите Версию () Возвращает версию драйвера
Возвращает поддерживаемые возможности
получите Возможности () драйвера
Возвращает текущее периферийное
getStatus () состояние
Начальная установка драйвера и регистры
инициализируйте () обратный вызов драйвера
Возвратите периферийное устройство его
деинициализация () состоянию сброса
Позвольте/запретите периферийное
powerControl () состояние электропитания
Настраивает периферийные устройства
управление () операционные параметры
Пользователь определяет обратный вызов для
signalEvent обработки периферийных событий
Периферийные функции передачи Дополнительный набор функций для
данных отправляют () управления
получите () передача данных
Рисунок 12.5
Сделайте “Драйвер USART NXP” активный проект.
Выберите проект NXP. Щелкните правой кнопкой и выберите “Набор как Активный
проект”.
Рисунок 12.7
Настройте контакты USART в файле RTE_Device.h.
Для доступа к Драйверу CMSIS API мы можем затем добавить заголовочный файл
драйвера USART к нашему исходному коду. Драйвер CMSIS оказывает поддержку
для каждого периферийного устройства данного типа, доступного на выбранном
микроконтроллере. Каждый экземпляр драйвера определяется структурой доступа,
которая содержит определение Драйвера CMSIS API для данного периферийного
устройства.
ARM_DRIVER_USART Driver_USART3 5 {
USARTx_GetVersion,
USART3_GetCapabilities,
USART3_Initialize,
USART3_Uninitialize,
USART3_PowerControl,
USART3_Send,
Компоненты программного обеспечения 417
USART3_Receive,
USART3_Transfer,
USART3_GetTxCount,
USART3_GetRxCount,
USART3_Control,
USART3_GetStatus,
USART3_SetModemControl,
USART3_GetModemStatus
};
{
случай
ARM_USART_EVENT_RECEIVE_COMPLETE:
случай ARM_USART_EVENT_SEND_COMPLETE:
osSignalSet (tid_Thread, 0x01);
повреждение;
Когда USART успешно отправит или получает некоторые данные, обратный вызов
будет инициирован, и мы можем отправить сигнал RTOS в один из наших потоков
приложения для указания на событие.
ARM_USART_DATA_BITS_8 |
ARM_USART_PARITY_NONE |
ARM_USART_STOP_BITS_1 |
ARM_USART_FLOW_CONTROL_NONE, 9600);
Проверка драйвера
Спецификация Драйвера CMSIS является открытой спецификацией, которую любой
может загрузить и использовать для реализации их собственного драйвера. Идеально
Кремниевый Поставщик обеспечит ряд Драйверов CMSIS для их микроконтроллера
как часть Пакета Семейства Устройств. Везде, куда код Драйвера CMSIS прибывает
из, это - все еще посторонний сторонний код, который добавляется к Вашему проекту,
и как таковой может содержать его собственные ошибки. Прежде чем мы будем
доверять этому коду и встраивать его в наше приложение, мы должны выполнить
некоторые начальные тесты, чтобы проверить, что он работает правильно. К счастью,
существует простой способ сделать это в форме Пакета Проверки Драйвера CMSIS.
Поскольку его имя подразумевает, Пакет Проверки разработан, чтобы протестировать
возможности каждого Драйвера CMSIS и произвести отчет о результатах.
Упражнение 12.2 Проверка драйвера
Рисунок 12.8
Выберите и установите пакет Проверки Драйвера CMSIS.
Рисунок 12.9
Включите драйверы, которые Вы хотите протестировать в менеджере
RTE и RTE_Device.h.
Рисунок 12.10
Установите ITM, чтобы быть каналом STDIO.
В RTE выберите проверку Драйвера CMSIS и включите Платформу, I2C, SPI и опции
USART (Рис. 12.11).
Рисунок 12.11
В менеджере RTE выберите среду тестирования и драйверы для
тестирования.
Рисунок 12.12
Проекту теперь добавили платформу проверки.
422 Главы 12
Рисунок 12.13
DV_Config.h позволяет Вам настраивать тестовую конфигурацию
Драйвера CMSIS.
Затем откройте раздел тестовых сценариев для каждого драйвера и включите некоторые
тестовые сценарии (Рис. 12.14).
Рисунок 12.14
Каждый Драйвер CMSIS имеет диапазон предопределенных
тестов.
Компоненты программного обеспечения 423
Разработайте проект.
Запустите отладчик и выполните код.
Рисунок 12.15
Результаты испытаний производятся к окну консоли ITM. Локальные опции
позволяют Вам сохранять результаты в файл.
Рисунок 12.16
Результаты испытаний могут быть произведены как простой текст
или XML.
424 Главы 12
Этот проект использует Драйвер CMSIS USART для получения данных из внешней
единицы GPS. Единица GPS, используемая в этом примере, является “модулем” GPS
Ublox NEO-6M. Это - недорогой модуль, который широко доступен (Рис. 12.17).
Рисунок 12.17
UBLOX NEO-6M является недорогим модулем GPS, который может быть
подключен к микроконтроллеру через USART.
Рисунок 12.18
GPS-приемник будет обычно производить предложение текста ASCII с помощью
протокола NMEA 0183.
Рисунок 12.19
Проект компонента GPS имеет тестовые сборки и приложение.
Код GPS был написан так, чтобы это был автономный модуль, который отделяется от
любых других частей приложения. Это помогает протестировать и также легкий к
повторному использованию
(Рис. 12.20).
Переключитесь на цель приложения.
Разработайте проект.
Запустите средство моделирования.
Откройте окно Symbol и добавьте gpsData к окну часов.
Откройте View\Toolbox.
Рисунок 12.20
Функции в сценариях моделирования могут быть инициированы
используемым, определяют кнопки.
Рисунок 12.21
Система Пакета CMSIS может использоваться для установки компонентов
программного обеспечения в набор инструментальных средств. Это может быть
поддержкой конкретного семейства микроконтроллеров, другое использование
должно установить вспомогательные библиотеки платы или промежуточное
программное обеспечение. В доме программные пакеты могут также быть созданы
для многократного использования кода.
Рисунок 12.22
От перемещения проекта GPS в каталог Pack.
Файл Описание
Пакетный файл
Gen_pack.bat поколения пакета
PackChk.exe Упакуйте программу
проверки синтаксиса
Pack.xsd Упакуйте XML-схему
Шаблон описания
Vendor.pack.pdsc пакета
Компоненты программного обеспечения 429
Файл Описание
gpsThread.c Исходный код компонента
gps.h Заголовочный файл API
Конфигурационный файл
Gps_config.h библиотеки
gpsUserThread.c Шаблон User компонента
Каталог “файлов” содержит все файлы, которые будут включены в наш пакет.
Мы можем создать любую структуру каталогов, мы хотим расположить файлы пакета
(Рис. 12.24).
Рисунок 12.24
Структура каталогов Компонента в качестве примера.
Рисунок 12.25
Содержание пакета описано .pdsc файлом в основном каталоге пакета.
Рисунок 12.26
Файл описания программного пакета является XML-файлом. Это имеет много
контейнеров, которые могут использоваться для описания
содержания программного пакета.
supportContact.tmartin@hitex.co.uk,/supportContact.
! - дополнительный файл лицензии-.
, лицензия.
432 Главы 12
License\License.txt
, / лицензия.
, выпуски.
, версия выпуска 5 "1.0.0".
Первоначальная версия с драйвером
GPS
, / выпуск., /
выпуски.
, ключевые слова.
! - ключевые слова для индексации-., ключевое слово
insert_keyword_for_search_engines, / ключевое слово.
, / ключевые слова.
, таксономия.
, описание Cclass 5 "Компонентов". Библиотеки драйвера для общих аппаратных компонентов, / описание.
, / таксономия.
Теперь, мы можем начать настраивать файл описания пакета для описания наших
компонентов программного обеспечения. RTE имеет много стандартных категорий,
что мы можем добавить наши компоненты также. Однако наш компонент GPS
действительно не вписывается ни в какую существующую категорию. В языке
описания пакета существует раздел таксономии, который позволяет нам расширять
диапазон категорий компонента. Здесь, мы создаем раздел “Components” в RTE
(Рис. 12.27).
Рисунок 12.27
Тег таксономии создает новую категорию в менеджере по Среде выполнения.
После того как пакет установлен, новая категория будет видима, когда менеджер
RTE будет открыт.
, / компонент., /
компоненты.
434 Главы 12
Категория Описание
Документ Документация
Заголовочный файл используется в компоненте. Наборы включать путь к
Заголовок файлу
Включать Наборы включать путь к файлу
Библиотека Файл библиотеки
Объект Объектный файл, который может быть добавлен к приложению
Источник Запуск - система - и другой C/C11, ассемблер, и т.д. исходные файлы
Источник C C исходный файл
Источник Cpp Исходный файл C11
Источник
ASM Исходный файл блока
Сценарий
компоновщик Файл сценария компоновщика, который может быть выбран наборами
а инструментальных средств
Инструмент командной строки, который может быть настроен для пред - или
Утилита постобрабатывающий во время
процесс сборки
Файлы типа изображения отмечены для специальной обработки в
Изображение Изображение Файловой системы
встроенный в приложение. Эта категория требует attr, устанавливаемого
обрабатывать по шаблону
Другое Другие типы файлов, не охваченные в списке выше
Атрибут Описание
Файл является конфигурационным файлом компонента. Это ожидается та
конфигурация единственная конфигурация
опции изменяются. Файлом управляют как часть компонента как определенное для
проекта
файл обычно скопирован в раздел компонента проекта
Файл используется в качестве шаблонного файла исходного кода. Это, как ожидают,
шаблон будет отредактировано и расширено
разработчик программного обеспечения. Файл может быть скопирован в
пользовательский раздел проекта
В каждом из наших компонентов заголовочному файлу дали конфигурацию атрибута.
Это означает, что, когда мы используем менеджера RTE для добавления компонента
к нашему проекту, копия заголовочного файла будет скопирована в каталог проекта,
таким образом, мы сможем отредактировать его. Исходный файл не был дан и
атрибут, таким образом, он будет сохранен как файл только для чтения в репозитории
пакета в наборе инструментальных средств. Когда компонент будет выбран, путь
будет установлен для включения исходного файла. Это означает, что при
использовании системы управления версиями, необходимо будет включать весь
Компоненты программного обеспечения 435
Начальный пакет может быть сгенерирован путем открытия окна командной строки
в каталоге разработки и затем выполнения “gen_pack” пакетного файла. Это
проанализирует файл описания пакета и проверку по сравнению с содержанием
каталогов компонента программного обеспечения. Если не будет никаких ошибок,
то файл пакета будет создан. Этот файл пакета является файлом сжатия каталогов
компонента программного обеспечения и файлами плюс файл описания пакета (Рис.
12.28).
Рисунок 12.28
gen_pack пакетный файл проверяет, что файлы пакета против файла описания
пакета затем генерируют заключительный файл
пакета.
После того как это было сгенерировано, мы можем установить наш компонент GPS
путем двойного щелчка по файлу пакета (Рис. 12.29).
Рисунок 12.29
Файл пакета может быть установлен локально путем двойного щелчка по файлу
пакета или путем выбора файла/импорта в
установщике пакета.
Теперь, мы можем открыть менеджер RTE и видеть новый раздел модулей с
компонентом GPS. Если мы выберем компонент GPS, то его файлы будут
добавлены к проекту (Рис. 12.30).
436 Глав 12
Рисунок 12.30
После того как пакет установлен, компонент GPS доступен, чтобы быть добавленным к
новому проекту.
В то время как это полезно на этом уровне, это - просто “симпатичный” способ
добавить файлы к Вашему проекту. Для создания нашего компонента более
интеллектуальным мы можем начать добавлять некоторые условия, которые
предусматривают, требует ли компонент GPS, чтобы какие-либо другие компоненты
работали в рамках проекта.
, условия.
, идентификатор условия 5 "USART".
, потребуйте Cclass 5 "Cgroup 5 "USART"" Драйвера CMSIS/.,
потребуйте Cclass 5 "CMSIS" Cgroup 5 "ЯДРО"/., потребуйте
Cclass 5 "CMSIS" Cgroup 5 "RTOS"/., / условие.
, / условия.
Когда выбор GPS (Sel). поле отмечается, это повернет оранжевое значение, что это
требует субкомпонента, и окно проверки говорит нам, что мы должны включать RTOS
и Драйвер CMSIS:: USART в нашем проекте. Теперь нажмите кнопку Resolve, и RTOS
будет выбран. Существует несколько опций для драйвера CMSIS USART, таким
образом, мы должны вручную выбрать подходящий драйвер (Рис. 12.32).
Рисунок 12.32
Выберите доступный Драйвер CMSIS USART.
После того как мы выбрали все необходимые компоненты, все активные элементы в
Выборе (Sel). столбец будет окрашен в зеленый. Теперь, мы можем нажать "OK", и
законченный выбор компонента будет добавлен к нашему проекту.
, выпуски.
, версия выпуска 5 "1.0.0".
Первоначальная версия с драйвером
GPS
, / выпуск., /
выпуски.
Рисунок 12.33
Запись описания является теперь гиперссылкой к документации компонента.
Рисунок 12.34
Код шаблона доступен в, “Добавьте Новый Объект” диалоговое
окно.
, атрибуты.
, Cclass 5 "CMSIS" Cgroup 5 компонента "ЯДРО"/.,
"устройство" Cclass 5 Cgroup 5 компонента "Запуск"/.
, / атрибуты., /
пример.
Рисунок 12.35
Примеры компонента доступны через установщик пакета.
Мастер конфигурации
После того как файлы компонента были добавлены к проекту, мы должны будем
сначала настроить любые параметры конфигурации. В типичном компоненте
параметры конфигурации будут группироваться как ряд #defines в заголовочном
файле. Сделать компонент более интуитивным для использования его возможно
добавить некоторые аннотации в рамках комментариев, которые позволяют
заголовочному файлу просматриваться как мастер конфигурации. Затем выборы,
сделанные в мастере конфигурации, изменят связанный #define. Таблица 12.9
предоставляет обзор доступных тегов.
440 Глав 12
Во-первых, мы должны включить этот файл как файл мастера конфигурации. Это
сделано путем добавления следующего комментария в первых 100 строках
заголовочного файла.
//, используйте мастер конфигурации в контекстном меню...
Этот тег должен сопровождаться #define. Это определяет, будет изменен к 1, если
выбор будет отмечен. Этот раздел должен быть закрыт:
,/e.
//,/h.
Рисунок 12.36
Теги мастера конфигурации помещаются в комментарии. Редактор может затем
просмотреть исходный код как мастер
конфигурации.
Используя тег рамки выделения, мы можем теперь создать опции выбора для
последовательных интерфейсов USART.
// , o. Выберите периферийное устройство USART
// , 1 5. USART 1
// , 2 5. USART 2
// , 3 5. USART 3
// , 4 5. USART 4 #define
GPS_USART_PERIF 3
// , o. Выберите скорость в бодах USART
// , 2400 5. 2400
// , 4300 5. 4300
// , 9600 5. 9600
// , 34000 5. 34 000 #define
GPS_USART_BAUD 9600
Рисунок 12.37
Мастер конфигурации с подсказкой.
Компоненты программного обеспечения 443
Заключение
В этой главе мы посмотрели на важный шаг вперед для основанных на
микроконтроллере встроенных систем. Вместе, Драйвер CMSIS и Пакет CMSIS
впервые обеспечивают стандартизированный API для общих периферийных
устройств и средства создания и распределения компонентов программного
обеспечения. Во время записи ARM только что опубликовал плагин пакета для
Eclipse IDE. Это также сделает систему пакета доступной для многих других наборов
инструментальных средств и инструментов с открытым исходным кодом. Поскольку
система пакета становится доступной в нескольких средствах разработки, она
поощрит принятие стандарта Пакета CMSIS как способ совместно использовать и
распределить компоненты программного обеспечения Cortex-M.
CHPTER13
ARMv8-M
Введение
Как мы видели во введении, текущие процессоры Cortex-M основаны на ARMv6-M
(Cortex-M0/M01) и ARMv7-M (Cortex-M3/M4/M7) архитектура. К концу 2015 ARM
объявил о следующем поколении процессоров Cortex-M, которые являются на основе
новый архитектурный стандартный ARMv8-M. Архитектура ARMv8-M является 32-
разрядной архитектурой на основе существующего ARMv6-M и архитектурой ARMv7-
M и наследовала большинство функций существующей модели программиста Cortex-
M. Это позволяет большей части кода приложения быть легко портированной на
новую архитектуру с минимальными изменениями. В то время как ARMv8-M является
последним дизайном процессора от ARM, он не делает ARMv7-M или устройства
ARMv6-M устаревшими. Они будут вокруг в течение долгого времени все же, но
ARMv8-M прокладывает путь к хорошо масштабируемым, экономически
эффективным семействам микроконтроллера и представляет аппаратную модель
обеспечения безопасности, которая является основой для безопасных подключенных
устройств (Рис. 13.1).
Рисунок 13.1
Архитектура ARMv8-M состоит из двух Магистралей профилей и Базовой линии,
которые походят на существующий ARMv7-M и архитектуру
ARMv6-M.
TrustZone
С ARMv6-M или ARMv7-M-based устройством совершенно возможно разработать
безопасную программную архитектуру. Однако ARMv8-M обеспечивает поддержку
оборудования для защищенной зоны в форме TrustZone. TrustZone является
установленной технологией на процессорах Cortex-A, и с ARMv8-M это будет
доступно микроконтроллерам Cortex-M впервые. TrustZone является рядом
аппаратных расширений, который позволяет Вам создавать границу между
Безопасным и Незащищенным ресурсом с минимумом кода приложения. TrustZone
оказывает незначительное влияние на производительность процессора ARMv8-M,
этого всего средства, простой эффективный код, который легче разработать,
отлаживает и проверяет (Рис. 13.2).
Рисунок 13.2
TrustZone создает защищенную зону в системе микроконтроллера.
Рисунок 13.4
Незащищенный код может назвать Безопасный код, но он должен ввести Безопасное
состояние с помощью инструкции SG.
Для Безопасного кода также возможно назвать Незащищенный код. Когда это
происходит, обратный адрес Безопасного состояния хранится на стеке Secure и
специальном коде, FNC_RETURN хранится в регистре Ссылки. Когда
Незащищенная функция закончится, она перейдет на регистре Ссылки. Эта команда
перехода будет видеть, что FNC_RETURN кодирует, это инициировало неукладку
истинного обратного адреса от стека Secure и возврата к Безопасной функции (Рис.
13.5).
Рисунок 13.5
Безопасный код может назвать Незащищенный код. Его обратный адрес скрыт от
Незащищенного кода.
450 Глав 13
Рисунок 13.6
Модель обеспечения безопасности реализует три зоны. Безопасный, Незащищенный, и
Незащищенный вызываемый.
Рисунок 13.7
Регистровый файл ЦП расширяется с помощью Безопасных и Незащищенных
указателей вершины стека и регистров управления. Предельные
регистры стека обеспечиваются для каждого из четырех стеков.
Прерывания и исключения
Рисунок 13.8
Прерывания могут быть настроены как Безопасные или Незащищенные и могут
быть поданы независимо от текущего состояния
процессора.
Рисунок 13.9
В Безопасном состоянии все ресурсы процессора доступны. Искаженные адреса
обеспечиваются для периферийных устройств
процессора Non-Secure.
Компилятор
Отладчик
Как отмечено выше, спецификация CMSIS должна будет быть обновлена, чтобы
поддерживать новые функции, представленные архитектурой ARMv8-M. Как уже
отмечалось выше, API CMSIS-RTOS потребует стандартного API, который позволяет
разработчикам включать Безопасные и Незащищенные потоки в рамках приложения.
Это также позволит поставщикам программного обеспечения разрабатывать
основанные на RTOS компоненты программного обеспечения, которые будут работать
в Безопасном состоянии. CMSIS-ядро должно будет также быть обновлено для
поддержки дополнительных регистров процессора ATMv8-M. Библиотека CMSIS-DSP
должна будет также быть оптимизирована для использования в своих интересах
процессора ARMv8-M.
Заключение
Архитектура ARMv8-M является большим количеством эволюции, чем оборот. Это
предоставляет легкую миграцию следующему поколению микроконтроллеров Cortex-
M. Введение TrustZone в профиль Cortex-M обеспечивает простую в использовании
модель обеспечения безопасности, которая жизненно важна, поскольку устройства
становятся более подключенными, и Интернет Вещей начинает становиться
действительностью.
Эта страница, намеренно
оставленная незаполненный
Приложение
Контактная информация
Я надеюсь, что Вы любили работать через эту книгу и нашли это полезным. Если у
Вас есть какие-либо вопросы или комментарии, свяжитесь со мной на адресе
электронной почты ниже:
tmartin@hitex.co.uk
Дополнительная информация и обновления публикуются на моем блоге в:
www.while-1.co.uk
Приложения
Это приложение перечисляет некоторые дальнейшие ресурсы, которые стоит
исследовать, после того как Вы работали через эту книгу.
Atollic www.atollic.com
Rowley www.rowley.co.uk
457
458
Приложений
Mbed mbed.org
Встроенные
художники www.embeddedartists.com/
Книги
Программирование
Процессор Cortex-M
Стандарты
Таблица A.8: Кодирование
стандартов
Спецификация
CMSIS http://www.arm.com/products/processors/cortex-m/cortex-microcontroller -
software-interface-standard.php
MISRA C www.misra.org.uk
Барристер,
кодирующий www.barrgroup.com/
стандарт
Обработка цифровых
сигналов
Таблица A.9: книги Обработки цифровых сигналов
(DSP)
Обработка цифровых сигналов: практическое руководство для инженеров и ученых ISBN-
10: 075067444X
Stephen Smith
Понимание обработки цифровых
сигналов ISBN-10: 0137027419
Richard G Лион
460
Приложений
Кремниевые поставщики
Существует теперь более чем 3 500 Основанных на Cortex-M микроконтроллеров, и
список все еще растет. Ссылка ниже является базой данных устройств,
поддерживаемых MDK-ARM. Это - актуальный список всех основных устройств и
является хорошим местом для запуска при выборе устройства. База данных Cortex-M-
device.
Таблица A.11: кремниевые поставщики
Обучение
Следующие компании обеспечивают руки на учебные курсы встроенных систем:
Таблица A.12: обучение
P
ОЖИДАЙТЕ
прерывание, 352
исключения Pend_SV,
166
466
Индексов
инструкции, 75
Упреждающее Q определение на Cortex-M, 293
основанное на чисел, 289 разработка для отладки, 381
приоритете DSP фиксированной точки с, 382 разработка в течение
планирование, 289 290 реального времени, 370 375
297 Прямых доступов к памяти
Упреждающее R (DMA)
планирование, 347 Методы операционной единицы, 380 381
PRIMASK, 73 74, 107 системы реального обработок прерываний,
регистр, 156 157 времени (RTOS), 5, 11, 352 354
Приоритет и вытеснение, 104 24, 169, 351, 454 осуществление, 354
105 Приоритетных группы и балансировка 355 Процедуры
подгруппа загрузки, 375 методов обработки прерывания
значения, 106 буферизации (ISRs),
PRIVDEFENABLE двойной или кольцевой интеграция, 363
укусили, 175 значений по буфер, 370 371 364
умолчанию Полномочия Очередь сообщений FIFO, и прерывания, 351 352
Включают 371 374 CMSIS-RTOS, 134 135 коммуникация Межпотока,
(PRIVDEFENA), 175f 323 ядра, 294f
режим Privileged, 6 7, 156, 160f, несколько экземпляров,
162 163 312 313 питания и
Указатель стека процесса (PSP), сторожевой таймер
42, 88 89, 156 157 ProcessBuffer осуществление
() функция, 329 Регистров управления, 364 368
состояния программы (PSR), управления питанием,
42, 358 первых шагов, 358
74 75, 268 360 стратегий, 360 362
приложений PSR (APSR), Осуществление
74 выполнения PSR реального
(EPSR), 74 результата времени RTX,
битового поля GE, 268 375 380
прерываний PSR (IPSR), осуществление
74 диагностики во
Модель программиста, 72 74 время выполнения,
Проекта создают цели, 382 384 семафора,
конфигурирование, 332 333
393 396 запуск, 296 297
Конфигурация проекта, для барьеров запуска, 369
семейства Cortex-M, 52 370 пользовательских
65 функций супервизора,
Алгоритм управления 355 356
Пропорционального осуществлений,
интегрального 356 357
дифференциала (PID), сторожевое
280 управление, 362
Защищенная архитектура системы 363
памяти (PMSAv8), 446 Компьютер с сокращенной
системой команд, 4 Архитектуры
Q сокращенной системы команд
Q укусил и (RISC), 71
насыщаемые приоритетный
математические Циклический
алгоритм
планирование, 348 осуществление, 330
Основанного на циклическом S 331 циклического
алгоритме планирования, упреждающего
Руководство по безопасности,
347 348 планирования, 348
215 т
RTX, 24, 134 135 основанное на циклическом
Влажные математические алгоритме
Лицензии RTX, в инструкции, 75 и условное
349 раз RTX планирование, 347 348
выполнение,
осуществление, 375 380 Лицензия RTX, 349
78 84
Исходный код RTX, в 348 осуществления, Исходный код RTX, 348
349 Раз управление 78 84 349 опций планирования,
приоритетами, 107 Точечный файл, 64 346 348 передач сигналов,
Диагностики во время 328
Планирование опций, 346 348 осуществление, 326 328
выполнения Безопасных и Незащищенных
осуществление, 382 384 прерываний системная конфигурация
Среды выполнения (RTE), таймера, 346 определений
и исключения, 452
потока, 344
433 434 инструкции по Защищенному
менеджера, шлюзу (SG),
30 лет 449
Безопасный код запуска, 453
обработчика исключений
SecureFault, 452 Единицы
атрибуции безопасности (SAU),
450
Исключение SecurityFault,
451 Семафор, 325 326
барьер (осуществление),
332 турникета барьера, 331
332 протест, 332 333
конфигурации, 343 344
кооперативной
многозадачности, 348
поддержка отладки ядра, 344
345 почтовых очереди, 341
342
почтовый ящик
осуществление, 342
343 пула памяти, 339
очередей сообщений,
337 338
осуществлен
ие, 338
мультиплексир
ования, 329
осуществление,
329 330 взаимных
исключений, 333
обмен данными, 335
336 осуществлений,
333 335
взаимоисключающих
протеста, 335
упреждающее
планирование, 347
рандеву, 330
Индекс
467
наборы инструментальных Разработка через тестирование
конфигурация интервала, 346 средств, 23, 23 т (TDD),
использование семафоров, 328 учебные упражнения, 24 25 387, 425
Средство моделирования добавление тестовых
SemMultiplex, 329 программного обеспечения, 24 25 сценариев, 397 399
Последовательный провод (SWO), добавление среды
220 Окно исходного кода, 43 тестирования единицы,
__ set_BASEPRI () функция, 149 Специальные регистры, 72 74 391 393
__ set_FAULTMASK () функция, SRAM, 7 8, 53 автоматизация цикла TDD,
Конфигурация стека
149 (осуществление), 399 402
конфигурирование сборки
__ set_PRIMASK () функция, 149 158 161 проекта
Кремниевая библиотека Vendor, Плата исследования STM32F7,
411 25f, цели, 393 396
отделение низкоуровневых
Сценарий моделирования, 46 65, 222f, 223 функций,
Единственная инструкция
несколько данных Потоковая обработка, 285, 285f 405 406
(SIMD), 10 Задержки подмиллисекунды, 319 цикл разработки, 389
CMSIS intrinsics, 151 152 Поле Subregion Disable (SRD), осуществление, 390 402
установка платформы
Кора-M4 и DSP коры-M7 184 единицы,
и, 265 268 Вычтите и добавьте с обменом 390
автоматизация тестирования,
инструкции, 265 268 (SAX), 266 267 389 390
осуществление, 269 271 Вызов контролера (SVC), 161 163, среда тестирования, 389
16-разрядная система команд тестирование прерываний, 406
Ползунка, 8, 71 162f 407
Поле Size, 176 осуществление, 163 166 пример, 407 408
тестирование потоков RTOS,
Режим ожидания, 122 инструкция, 351 352 402 404
Сигнал SLEEPDEEP, 358 SVC_DEAD, 166 пример, 404 407
Компоненты программного Инструкция по Тестовой цели
обеспечения, 411 Код SVC_Handler, 165 166 (TT), 450
Драйвер CMSIS, 412 419 Опция SYSRESET, 226 TEST_SETUP () функция, 398
API, 413 414 Раздел System Configuration, Небольшая книга семафоров,
Осуществление USART, 414
419 318 328
Системный блок управления Распараллельте блок управления,
проверка, 419 423 (SCB), 296
мастер конфигурации, 439 443 87 89, 88 т Определение потока, 344
осуществление, 440 443 отладьте поддержку, 233 234 Блокировка потока, 172
Системный регистр управления
развертывание, 443 (SCR), Режим потока, 94, 155 156,
разработка, 424 426 123 160 163
Компонент GPS Управление обработчиком систем
(осуществление), и состояние, Потоки, 295 296, 332, 348
424 426 88 т создание, 306 307, 311 312
Приоритет обработчика систем,
программный пакет 88 т управление, 307 310
Системная конфигурация
создание, 427 439, 429f таймера, 346 Ползунок 2, 8, 11, 72, 72f, 86 87,
Системное описание средства
структура, 427 428 просмотра (SVD) 161, 265
утилиты, 428 439 файл, 135 Система команд DSP, 265
Разработка программного Переменная SystemCoreClock,
обеспечения, для Коры - 141, система команд, 8
M 145 146 Ползунок укусил, 78
Семейство, 23 SystemCoreClockUpdate (), 141 Система команд ползунка, 71, 72f
проект blinky, 28 52 SystemInit () функция, 141 Сильно связанная память (TCM),
окно дизассемблирования, 42
43 Количество SysTick, 319 190, 193, 196 199, 196f
окно регистра, 42 Функция Systick, 145 т Задержка, для RTOS, 314 315
Прерывание Systick
создание первой программы (осуществление), ожидание события, 315
(осуществление), 27 28 97 102, 112 Тайм-менеджмент
аппаратная отладка, 65 69 Таймер Systick, 5, 93, 145 146, осуществление, 315 316
Тайм-менеджмент, для RTOS,
установка, 25 27 346, 352 314
Микроконтроллер Keil Конфигурация интервала, 346
комплект разработчика, 23
24 T TrustZone, 448 453
Объединение в цепочку хвоста,
конфигурация проекта, 52 65 NVIC, 108 109 прерывания и исключения,
Определяя задачу для набора
программные пакеты, 24 инструментов VX для ARM, 23 т 451 453
468
Индексов