Стадии подготовки программного обеспечения для микроконтроллеров .



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

Можно использовать следующий порядок работ по подготовке программы для микроконтроллеров:

1. Разработка алгоритма.

2. Написание модулей программы на мнемоническом языке программирования (Ассемблер, Си, Паскаль и т.д.).

3. Ввод исходного текста программы текстовым редактором.

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

5. Сборка отдельных объектных модулей в единую программу в двоичном коде (HEX-файл) и с абсолютными адресами в памяти.

6. Отладка с помощью моделирующего отладчика в среде проектирования.

7. Макетная отладка с помощью отладочной платы, эмулирующей выбранный процессор или с процессором этого типа.

8. Занесение программы в память программ микроконтроллера (программирование или прошивка) с помощью программатора.

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

 

 

Языки программирования для микроконтроллеров.

В настоящее время исходный текст программы пишется на одном из языков программирования.

 

Рис.7. Классификация программ-трансляторов языков программирования.

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

1. Языки программирования "высокого" уровня.

2. Языки программирования "низкого" уровня.

К языкам программирования "низкого" уровня относятся языки программирования, в которых каждому оператору соответствует не более одной машинной команды. Набор машинных команд каждого конкретного процессора обязательно входит в состав такого языка программирования. Языки программирования низкого уровня в настоящее время называются ассемблерами (старое название автокоды). Для каждого процессора существует своя группа ассемблеров. Ассемблеры для одного и того же процессора различаются между собой дополнительными возможностями, облегчающими программирование.

Языки программирования "высокого" уровня позволяют заменять один оператор несколькими машинными командами. Это позволяет увеличивать производительность труда программистов. Кроме того, языки "высокого" уровня позволяют писать программы, которые могут выполняться на различных микропроцессорах. (Естественно, что при этом необходимо использовать программы - трансляторы для соответствующего процессора.) В настоящее время наиболее распространены языки программирования высокого уровня, основывающиеся на С и Паскале. В тех случаях, когда объём ОЗУ и ПЗУ мал (в районе нескольких килобайт) альтернативы ассемблеру нет. Именно эти языки программирования позволяют получать самый короткий и самый быстродействующий код программы (при прочих равных условиях). Языки программирования высокого уровня позволяют значительно сократить время создания программы, но при этом увеличивается размер программы, поэтому для выбора такого языка программирования для микропроцессорных систем необходимо иметь достаточно большой объём памяти программ (несколько десятков килобайт). Увеличение объёма программы связано с несколькими факторами:

1. Язык программирования рассчитывается на все случаи жизни, поэтому в большинстве случаев человек мог бы написать программу короче (исключив не нужные в данном конкретном случае проверки или защиты).

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

3. Программист не использует подпрограммы там, где они могли бы сократить объём программы, так как на языке программирования высокого уровня — это всего один или несколько операторов.

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

4. Виды компиляторов

Программы-компиляторы бывают оценочные и профессиональные.

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

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

5. Применение комментариев

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

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

Программа, написанная на языке программирования ассемблер, читается прежде всего по комментариям и только потом, если этого недостаточно, проводится разбор команд на языке программирования.

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

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

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

Ещё более крупные блоки алгоритма выделяют специальными символами, которые сразу бросаются в глаза (обычно это звёздочки или символы знака минус '-'). При этом нужно помнить, что те действия, которые абсолютно ясны в момент написания программы через месяц вызовут затруднения даже у программиста, написавшего эту программу, не говоря уже о человеке, который видит эту программу впервые.

6. Применение подпрограмм

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

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

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

 

Рис.8. Вызов подпрограммы и возврат к выполнению основной программы.

Для того, чтобы получить возможность возвращаться на команду, следующую за командой вызова подпрограммы, требуется запомнить адрес этой команды. Адрес возврата хранится в особых ячейках памяти. После выполнения подпрограммы необходимо осуществить переход к адресу, который записан в этих ячейках. Для обращения к подпрограмме и возврата из неё в систему команд микропроцессоров используют команды CALL и Return. Эти команды не только осуществляют передачу управления на указанный адрес, но и запоминают адрес команды, следующей за командой вызова подпрограммы. Команда возврата из подпрограммы RETURN передаёт управление команде, адрес которой был запомнен командой вызова подпрограммы. Внимание! Ни в коем случае нельзя попадать в подпрограмму любым способом кроме команды вызова подпрограммы CALL! В противном случае команда возврата из подпрограммы передаст управление случайному адресу! По этому адресу могут быть расположены данные, которые в этом случае будут интерпретированы как программа, или обратиться к внешней памяти, откуда будут считываться случайные числа. Очень часто требуется из одной подпрограммы обращаться к другой подпрограмме. Такое обращение к подпрограмме называется вложенным или рекурсивным. Количество вложенных подпрограмм называется уровнем вложенности подпрограмм. Максимально допустимый уровень вложенности подпрограмм определяется количеством ячеек памяти, предназначенных для хранения адресов возврата из подпрограмм. Ячейки памяти, в которых хранятся адреса возврата из подпрограмм называются стеком. Логически эти ячейки памяти организованы так, чтобы считывание последнего записанного адреса производилось первым, а первого записанного адреса производилось последним. Такая логическая организация формируется специальным счётчиком. Этот счётчик называется указателем стека SP. Ячейка памяти, в которую в данный момент может быть записан адрес возврата из подпрограммы, называется вершиной стека. Количество ячеек памяти, предназначенных для организации стека, называется глубиной стека. Последняя ячейка памяти, в которую можно производить запись называется дном стека. Логическая организация стека приведена на следующем рисунке:

                                  Рис.9. Организация стека в памяти данных микропроцессора.

Архитектура AVR-микроконтроллеров. AVR-микроконтроллеры содержат на кристалле следующие аппаратные средства: 8-разрядное процессорное ядро, память программ, оперативную память данных, энергонезависимую память данных, регистры ввода-вывода, схему прерываний, схему программирования, а также периферийные устройства, схема представлена на рис. 9.

 

                                  Рис.10 Архитектура микроконтроллеров семейства AVR

Память AVR-микроконтроллеров организована по схеме гарвардского типа – адресные пространства памяти программ и памяти данных разделены.

Процессорное ядро (Central Processing Unit – CPU) AVR-микроконтроллеров содержит арифметико-логическое устройство (АЛУ), регистры общего назначения (РОН), программный счётчик, указатель стека, регистр состояния, регистр команд, дешифратор команд, схему управления выполнением команд. В АЛУ выполняются все вычислительные операции. Операции производятся только над содержимым РОН. На выборку содержимого регистров, выполнение операции и запись результата обратно в РОН затрачивается один машинный такт (один период тактовой частоты). Регистры общего назначения представляют собой 8-разрядные ячейки памяти с быстрым доступом, непосредственно доступные АЛУ. В AVR-микро-контроллерах имеется 32 РОН. К периферийным устройствам AVR-микроконтроллера относятся порты ввода-вывода, таймеры, счётчики, сторожевой таймер, аналоговый компаратор, аналого-цифровой преобразователь, универсальный асинхронный (синхронно-асинхронный) приёмопередатчик – УАПП (УСАПП), последовательный периферийный интерфейс SPI, интерфейс JTAG и др. Набором периферийных устройств определяются функциональные возможности микроконтроллера.

Этапы разработки программ

 

 

                                                       Рис.11

 

Курс будет касаться серии STM32-F4. Это Cortex-M4, который является прямым наследником Cortex-M3(STM32- L1, F1, F2) и отличается от него главным образом ядром с наличием DSP (цифрового сигнального процессора) и FPU (модуля операций с плавающей запятой).

Блок-схема периферии МК STM32F407VGT6.


Дата добавления: 2020-01-07; просмотров: 192; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!