Разновидности Си-программ

April 9, 2014 by admin Комментировать »

Наличие в программе функций накладывает отпечаток на построение листинга. Обзорно можно выделить несколько конструкций:

•                 программа имеет только системные функции («Архитектура-1»);

•                 программа имеет системные и внутренние функции («Архитектура-2»);

•                 программа имеет обработчик прерываний («Архитектура-3»);

•                 программа имеет системные и внешние функции («Архитектура-4»).

Теоретически любую микроконтроллерную Си-программу можно построить по любой из перечисленных архитектур, но отличаться они будутдлиной листинга и скоростью выполнения операций. Чаще всего встречаются программы, в которых смешано несколько архитектур. Например, мирно уживаются системные, внутренние и внешние функции, дополненные обработчиком прерываний.

«Архитектура-1» (системные функции).

Листинг, приведенный на Рис. 6.7, относятся к «Архитектуре-1», поскольку содержит одну лишь системную функцию «main». В других, более сложных программах, системных библиотечных функций может быть несколько (Рис. 6.28).

Рис. 6.28. Структурная схема Си-программы с «Архитектурой-1».

Выполнение программы начинается с «Оператора-1» главной системной функции «main». Как только управление перейдёт к оператору «_delay_ms (10)», компилятор определяет, что это библиотечная функция и автоматически подставляет вместо неё определённый блок ассемблерных команд, выполняющих задержку времени ровно на 10 мс. Поскольку вмешаться в данный процесс нельзя, то функция получается не зависящей от желания программиста, т.е. системная.

В AVR-GCC многие системные функции начинаются с символа подчёркивания «_» или имеют этот символ внутри названия функции. Практическая рекомендация — при составлении своих собственных функций, их названия не должны начинаться с символа «_».

«Архитектура-2» (системные и внутренние функции).

Философия языка Си заключается в толерантности к выбору алгоритмов. Никто не осудит человека, который составит простую и длинную, как «трубопровод», программу с использованием «Архитектуры-1». Лишь бы терпения и внимательности хватило, да коды прошивки поместились в память MK.

Однако рано или поздно приходит понимание того, что физические возможности MK не безграничны. Проблема сокращения объёма программы заставляет искать более экономичные построения.

На Рис. 6.29 показаны взаимосвязи в Си-программе с «Архитектурой-2», где применяется внутренняя функция с абстрактным именем «test».

Рис. 6.29. Структурная схема программы с «Архитектурой-2».

Работа программы, как и прежде, начинается с функции «main». Выполняется «Оператор-1» и далее до строки «test ();», после чего нормальный ход программы прерывается и управление передаётся на «Оператор-N», но уже функции «test». Затем последовательно выполняются операторы «N»…«T» и по команде «return» происходит возврат в основную программу к следующему по счёту «Оператору-К».

«Архитектура-3» (системные функции и прерывания).

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

Чтобы облегчить задачу, предлагается для каждой разновидности прерываний конкретного MK составлять таблицу Си-операторов, отвечающих за активацию определённых режимов. Программисту понадобится лишь правильно скомпоновать Си-операторы применительно к требуемым режимам и вставить их единым блоком в программу. К сожалению, универсальной таблицы для всех AVR- контроллеров сделать не получится. В каждом конкретном случае надо внимательно читатьдаташиты, написанные на языке Шекспира, или ознакомиться с их русифицированными переводами [6-21].

Таймеры/счётчики являются базовыми элементами системы прерываний любого MK. По внутреннему устройству это наборы регистров, в которые можно записать и из которых можно считать информацию. Количество таймеров/счётчиков и их функции различаются у разных моделей семейства ATmega. Обозначаются они индексами «0»…«5». Чтобы не распыляться, далее будут рассмотрены только самые простые таймеры/счётчики с индексом «0».

Прерывания делятся на внутренние, зависящие от тайминга тактового генератора MK, и внешние, где управляющие сигналы подаются извне через строго назначенные линии портов.

В фирменном даташите MKATmega48A [6-9] фигурирует обобщённое понятие «таймер/счётчик» (Timer/Counter). Однако не будет большой крамолы, если для облегчения понимания разбить одно целое на две части: таймер и счётчик.

Таймер в MK похож на обычный секундомер, только отсчитывает он не секунды, а машинные такты. Длительность одного машинного такта обратно пропорциональна F_CPU — тактовой частоте MK. Зная её , нетрудно подсчитать физическое время по обратной пропорции 1 /F_CPU. Например, для частоты 1 МГц время одного «тика» таймера MK составляет ровно 1 МК с.

Таймер можно образно представить в виде механического будильника, который «гудит» ровно в 12 часов. После этого он либо продолжает свободный счёт до полного обхода циферблата, либо его стрелки принудительно переводятся вперёд, например, на 9 часов 43 минуты. В первом варианте таймер будет подавать сигнал каждые 12 часов, во втором — каждые 2 часа 17 минут. Под словом «сигнал» программисты понимают прерывание.

В ATmega48A насчитывается три таймера, а именно, 8-битный «Таймер-0», 16-битный «Таймер-1» и 8-битный «Таймер-2». Таймеры работают независимо друг от друга и от основной программы, в том смысле, что программисту не надо вставлять в листинг операторы, постоянно корректирующие «часы». Главное, изначально правильно настроить режим счёта при помощи регистров.

Самым простым для изучения является «Таймер-0». Именно он отвечает за режим Normal, при котором по каждому тактовому импульсу изменяется состояние определённого счётного регистра от 0x00 до OxFF, а в момент перехода через 0x00 возникает прерывание (Табл. 6.10).

Таблица 6.10. Установка режима Normal «Таймера-0» в MKATmega48A

Счётчик в MK похож на вертушку в метро, автоматически подсчитывающую число пересекающих её пассажиров. Счётчик можно настроить так, чтобы он выдавал сигнал (читай, прерывание) после каждого входящего человека или после определённого числа посетителей. Разумеется, вместо людей MK подсчитывает электрические импульсы, поступающие на его линии портов с альтернативными названиями INTx или Tx, где «х» — порядковый номер индекса.

В микросхеме ATmega48A имеются входы INT0 (вывод 4), INT1 (вывод 5), ТО (вывод 6), T1 (вывод 11). В условном обозначении MK их легко найти по надписям через дробь, например, PD2/INT0/PCINT18 (Рис. 6.9).

Счётчики, как и таймеры, работают автономно. Как можно догадаться по названиям сигналов, к «Счётчику-О» относится вход 1NT0 (счётчик одиночных импульсов или, по-другому, регистратор фронтов сигнала), а также вход ТО (счётчик пачек приходящих импульсов).

Счётчик одиночных импульсов INT0 генерирует прерывание по нарастающему/спадающему фронту входного сигнала или при появлении НИЗКОГО уровня (Табл. 6.11).

Таблица 6.11. Установка режимов счётчика одиночных импульсов в MKATnega48A

Счётчик пачек импульсов ТО работает подобно «Таймеру-0», но только вместо внутренних «тиков» тактовой частоты F_CPU он подсчитывает количество внешних импульсов на входе ТО (Табл. 6.12).

Общий запрет прерываний производится системной функцией «C1i()», общее разрешение — системной функцией «sei()».

Таблица 6.12. Установка режимов счётчика пачек импульсов в MK AThiega48A

Прерывания в MK — это программная реакция на некоторые важные события. Среди них могут быть сигналы оповещения от таймеров/счётчиков, от каналов UART, АЦП, аналогового компаратора и т.д. Каждое прерывание оформляется в листинге как внутренняя функция, но с заранее заданным системным именем.

К сожалению, разработчики компиляторов не смогли договориться о едином стандарте. Поэтому, название <<1SR(SIG_1NTERRUPR0)>>, применяемое в компиляторе AVR-GCC, будет выдавать ошибку в компиляторе lCCAVR и наоборот. Более того, в прежних версиях WinAVR использовались другие названия функций прерывания, что следует учитывать при портировании «старых» листингов. С полным списком системных прерываний, применяемых в WinAVR-20100110, можно ознакомиться в «Библиотечном руководстве».

На Рис. 6.30 показаны взаимосвязи в Си-программе с «Архитектурой-3», использующей обработчик прерываний. Главное её отличие от ранее рассмотренной конструкции на Рис. 6.29 заключается в плавающей точке выхода из основной программы. Это логично, поскольку прерывание может наступить в любой момент времени после любого из операторов «1»…«М».

Рис. 6.30. Структурная схема программы с «Архитектурой-3».Работа программы начинается с «Оператора-1». В нём или в нескольких последующих операторах должен быть настроен режим прерывания. Для этого используются тексты из правых колонок Табл. 6.11, Табл. 6.12. Заканчиваться блок инициализации должен командой «sei ()», разрешающей прерывания.

В ходе выполнения программы все активные источники прерываний незаметно прослушиваются аппаратными средствами MK. Если какой-либо из источников «сработал», то сразу же будет произведён вызов обработчика прерываний, в данном случае «ISR» (Interrupt Service Routines). Выход из него осуществляется на следующую по счёту строку программы. Например, если вход в прерывание был с «Оператора-3», то возврат из прерывания будет на «Оператор-4».

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

Применительно к MK, «чтение газеты» — это процесс последовательного выполнения операторов в программе; «звонок» — запрос на прерывание; «ответ на звонок» — процедура обработки прерывания; «продолжение чтения» — возврат из прерывания в основную программу.

Как известно, после начального рестарта MK компилятор AVR-GCC запрещает все прерывания. Проводя аналогию, можно сказать, что перед чтением газеты телефон был выключен из розетки. Однако его в любой момент можно включить обратно, если ожидается важный звонок. Точно так же и в MK существуют системная функция «sei()», которая оперативно включает (разрешает) прерывания.

«Архитектура-4» (системные и внешние функции).

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

Рис. 6.31. Структурная схема программы с «Архитектурой-4».Головной файл «example.c» содержит функцию «main», что и определяет его верховенство. Внешний файл «пате.с» начинается с собственного заголовка, в котором, как и положено, перечисляются библиотеки, переменные, константы, макроопределения.

Связь между функциями файлов «example.c» и «пате.с» осуществляется при помощи ключевого слова «extern» в третьей сверху строке головной программы. Это сокращение от англ. EXTERNal — «внешний, наружный».

Внешних файлов, как и внешних функций, может быть несколько. Например, в одном из них хранятся функции ввода данных, в другом — вывода сигналов, в третьем — индикации ЖКИ и т.д. В дальнейшем мелкие внешние файлы могут быть объединены в пользовательские библиотеки для быстрой сборки больших по объёму проектов.

Переменные, используемые в разных внешних файлах, можно сделать общими опять-таки через «магическое» слово «extern». Другой вариант — создать собственный заголовочный файл с расширением «.h», в котором будут перечислены прототипы функций, общие переменные и т.д. Если листинг состоит из нескольких сотен или тысяч строк, то такой подход является единственно правильным.

Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).

Оставить комментарий

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