LinTai: качественные китайские корпуса и каркасы
РадиоЛоцман - Все об электронике

«Железо» для начинающих

Derrick Klotz, Freescale, Канада

Когда заставляешь работать свою первую программу для микроконтроллера (МК), испытываешь удивительное воодушевление. Это может быть простое мигание светодиодами, но ты всегда узнаешь что-то новое, начиная понимать, как все работает. Когда я добился этого в первый раз, то расценил как приглашение в игру. Я всегда считал и продолжаю считать, что работа с МК приносит удовольствие. Это особенно справедливо при непосредственном управлении регистрами внутренней периферии МК, известном также, как «программирование голого железа» (bare metal).

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Я испытал большое удовольствие, обучаясь ассемблеру из книг по МК. Да-да, я сказал именно «удовольствие». При изучении программ по аппаратным руководствам, у тебя развивается понимание, как именно из «0» и «1» организуются машинные коды и операнды. Ты можешь почувствовать, как счетчик команд проходит по памяти, как указатель стека контролирует адрес возврата из подпрограмм и функций обработчиков прерываний. Это создает отчетливое представление о том, как твой код выполняется «железом» машины – аппаратурой. Но так ты не узнаешь ничего об архитектуре программ. Мне этот опыт дался многолетней практикой.

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

Для программирования я использую интегрированную среду разработки CodeWarrior IDE, большим поклонником которой был еще до приобретения Freescale компании разработчика Metrowerks. Она продолжает мне нравиться и в текущем воплощении Eclipse. Существует несколько других IDE, которые я использую по случаю для обеспечения программной поддержки некоторых наших клиентов. Но когда я пишу свой собственный код для демонстрации характеристик МК, то пользуюсь CodeWarrior IDE.

Мне нравится также инструмент Processor Expert Software в составе CodeWarrior IDE, создающий шаблон программы, который помогает быстрее запустить МК. Он тоже генерирует хорошо документированный программный код для инициализации и управления периферией. Я часто сравниваю код, сгенерированный Processor Expert Software с информацией из справочников и спецификаций на МК. Это помогает понять, как управлять периферией микросхемы и неизменно ускоряет процесс обучения. Чтение технической документации становится менее утомительным.
Программирование на аппаратном уровне не означает, что вы должны писать на языке ассемблера. Это означает, что вы должны понимать язык ассемблера. Вам понадобится дезассемблирвание исходного кода на языке Си. Это в точности покажет, как работает компилятор. Ведь не обязательно то, что он делает, соответствует тому, чего вы от него хотели добиться. Это важный урок, никогда не путайте желаемый и действительный результат компиляции.

Также вам нужно разбираться в технической документации на МК – в распределении памяти, регистрах, периферии и т.д. Это может напугать, ведь по мере сокращения геометрических размеров кремниевых схем руководства становятся все больше, а МК все сложнее. И это тоже часть веселой игры с микроконтроллером. Как и документация, программа должна быть написана в виде небольших легко анализируемых блоков. Только так можно развить четкое представление об управлении аппаратной периферией МК. Откусывайте от слона по одному байту (гм!) за раз.

Базовый шаблон

Давайте начнем с начала. Существует простой и широко используемый шаблон запуска МК после подачи питания. С несколькими незначительными отличиями это основополагающая структура, поверх которой компиляторы языка Си и разработчики операционных систем реального времени строят свои программные комплексы. Этот шаблон использует и Processor Expert Software. На Рисунке 1 показана общая структура программы МК.

Рисунок 1. Общая структура программы МК.

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

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

Если указатель стека не был автоматически сконфигурирован – тут самое место задать ему начальное значение, перед выполнением каких-либо подпрограмм или обработчиков прерываний.

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

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

Наконец, когда все инициализировано, необходимо включить аппаратные прерывания. И сделать это обязательно до того, как программа уйдет в основной цикл функции main(). На выбор существует несколько подходов к построению основного цикла. Три наиболее популярных метода – это конечные автоматы, планировщики и операционные системы реального времени. Независимо от выбранной структуры основной программы, подпрограммы-функции, отвечающие за конкретные задачи, выполняются в соответствии с программными событиями, в то время как аппаратные события запускают функции обработчиков прерываний. В любом случае, по завершении подпрограммы управление передается в главный цикл.

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

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

Я считаю, что важно понимать машину, исполняющую твой код. Безусловно, найдется место и программам с высоким уровнем абстрагирования от аппаратной части МК. Но мне доставляет настоящее удовольствие работать с «железом». Я надеюсь, найдутся единомышленники, согласные со мной. Это отправная точка в замечательном путешествии к пониманию условий, при которых можно извлечь максимум из «железа» МК.

Перевод: Антон Юрьев по заказу РадиоЛоцман

На английском языке: The bare metal enthusiast: start at the beginning

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя