Вы находитесь на странице: 1из 97

Федеральное государственное бюджетное образовательное

учреждение высшего образования


«Национальный исследовательский университет «МЭИ»

Институт: ИЭЭ Кафедра РЗиАЭ

Направление подготовки: 13.04.02 Электроэнергетика и


электротехника

ОТЧЕТ по практике

Наименование Учебная практика: практика по


практики: получению первичных навыков научно-
исследовательской работы

СТУДЕНТ

/ Архипов А.Г.
/
(подпис (Фамилия и инициалы)
ь)

Группа Э-13м-21
(номер учебной группы)

ПРОМЕЖУТОЧНАЯ АТТЕСТАЦИЯ
ПО ПРАКТИКЕ
Отлично
(отлично, хорошо, удовлетворительно, неудовлетворительно,
зачтено, не зачтено)

/ /
(подпис (Фамилия и инициалы члена комиссии)
ь)

/ /
(подпис (Фамилия и инициалы члена комиссии)
ь)

1
Москва
2022
ОГЛАВЛЕНИЕ
Список сокращений...........................................................................................6
Введенеие............................................................................................................7
Лекция 1 Архитектура основных микропроцессорных устройств...............8
Микропроцессор............................................................................................8
Микроконтроллер..........................................................................................9
Программируемые логические интегральные схемы...............................10
Цифровой сигнальный процессор..............................................................11
Лекция 2. Программирование на языке С.....................................................13
Простой пример программы на языке С....................................................14
#include <stdio.h>......................................................................................14
int main(void).............................................................................................15
Комментарий............................................................................................16
Скобки, тело функции и блоки...............................................................16
Объявления...............................................................................................16
Функция printf()........................................................................................17
Оператор возврата....................................................................................17
Этапы сборки................................................................................................18
Типы данных................................................................................................22
Приведение типов........................................................................................24
Лекция 3 Освоение операций языка С на примерах задач...........................26
Структуры.....................................................................................................26
Указатели......................................................................................................27
Арифметика указателей...............................................................................29
Массивы........................................................................................................30
Арифметические операции.........................................................................30
Логические операции...................................................................................31
Циклы........................................................................................................32
Заключение. Выводы...................................................................................33
Лекция 4 Синтез логических схем..................................................................35
Булева алгебра..............................................................................................35

2
Стандарты на условные графические обозначения элементов цифровых
схем..........................................................................................................................36
Основные аксиомы и законы алгебры-логики..........................................38
Синтез цифровых комбинационных схем по произвольной таблице
истинности..............................................................................................................39
Совершенная дизъюнктивная нормальная форма................................39
Создание карты Карно, минимизация и приведение к базису И-НЕ. .41
Электронная схема на основе логических элементов..............................45
Электронная схема на основе микросхем..................................................47
Лекция 5 Интерфейсы для передачи данных................................................49
Введение.......................................................................................................49
Классификация интерфейсов......................................................................49
SPI..................................................................................................................52
RS-защелка................................................................................................52
Синхронная RS-защелка..........................................................................53
D-защелка..................................................................................................54
D-триггер..................................................................................................55
Принцип работы интерфейса..................................................................57
Типы подключения в шине SPI..............................................................60
UART..............................................................................................................62
Общие сведения.......................................................................................62
Асинхронность.........................................................................................63
Стартовые и стоповые биты....................................................................63
Биты данных.............................................................................................64
Контроль четности...................................................................................64
I2C..................................................................................................................65
Причины создания интерфейса I2C.......................................................65
Особенности I2C......................................................................................66
Программная часть I2C...........................................................................67
Достоинства и недостатки изученных интерфейсов................................71
SPI..............................................................................................................71
UART..........................................................................................................72
I2C..............................................................................................................73

3
Лекция 6. Вторичные измерительные преобразователи.............................74
Общие сведения...........................................................................................74
Входные преобразователи аналоговых-сигналов.....................................75
Требования к аналоговым входам МП устройств РЗА........................75
Трансформаторные схемы......................................................................77
Бестрансформаторные схемы.................................................................79
Лекция 7 Цифровая обработка сигналов.......................................................80
Обработка сигнала. Преобразование Фурье..............................................80
Основной недостаток преобразования Фурье. Решение — Вейвлет-
преобразование.......................................................................................................82
Понятие вейвлета и его сущности..............................................................85
Критерии вейвлетов.....................................................................................86
Примеры вейвлетов......................................................................................86
Преобразование Хаара для одномерного сигнала................................88
Получение семейства Вейвлетов................................................................89
Применение вейвлет-преобразования в энергосистемах.........................90
Лекция 8 Операционные системы..................................................................93
Что такое операционная система для микроконтроллера?......................93
Преимущества и недостатки ОСРВ для МК.............................................95
Обзор FreeRTOS...........................................................................................97
Основы работы ОСРВ..................................................................................98
Задачи..........................................................................................................103

4
СПИСОК СОКРАЩЕНИЙ

АЦП — Аналого-цифровой преобразователь


ВЧ — Высокочастотный
ДВП — Дискретное вейвлет-преобразование
МП — Микропроцессор
МПТ — Микропроцессорный терминал
НВП — Непрерывное вейвлет-преобразование
НЧ — Низкочастотный
ОЗУ — Оперативное запоминающее устройство
ОС — Операционная система
ОСРВ — Операционная система реального времени
ПЗУ — Постоянное запоминающее устройство
ПЛИС — Программируемая логическая интегральная схема
ППЗУ — Перепрограммируемое ПЗУ
РЗА — Релейная защита и автоматика
СДНФ — Совершенная дизъюнктивная нормальная форма
СКНФ — Совершенная конъюнктивная нормальная форма
ТН — Трансформатор напряжения
ТТ — Трансформатор тока
ЦАП — Цифро-аналоговый преобразователь
ЦСП — Цифровые сигнальные процессоры
ЭВМ — Электронно-вычислительная машина
I2C — Inter-Integrated Circuit
SPI — Serial Peripheral Interface
UART — Univsersal Asynchronos Reciever-Transmitter

5
ВВЕДЕНЕИЕ

Системы РЗА играют значительную роль в обеспечении управляемости и


надёжности работы энергосистем. До настоящего времени основную долю
находящейся в эксплуатации аппаратуры РЗА составляют отечественные
электромеханические и микроэлектронные устройства. При этом парк
технических средств РЗА физически и морально стареет. По данным
статистики, в энергосистемах России насчитывается более 40 % устройств,
прослуживших более 30 лет. Указанные обстоятельства диктуют необходимость
проведения реконструкции и модернизации РЗА в направлении применения
аппаратных и программных средств, основанных на использовании
микропроцессорных систем, интегрированных в АСУ ТП.
Переход на цифровые приёмы обработки информации в аппаратуре РЗА
практически не привёл к появлению оригинальных принципов построения
систем защиты электроустановок. Вместе с тем использование процедур
цифровой обработки сигналов существенно повлияло на структуру новых
устройств релейной защиты, методы синтеза измерительной части
микропроцессорных реле и анализа их свойств. В связи с этим от
проектировщиков защитных комплексов и эксплуатационного персонала
требуется определённый уровень базовых знаний и для умелого использования
особенностей цифровой обработки сигналов для расширения функциональных
возможностей и улучшения эксплуатационных характеристик, и для успешного
обслуживания нового поколения аппаратуры РЗА. Частичному решению этой
задачи посвящено данное учебное пособие.

6
ЛЕКЦИЯ 1
АРХИТЕКТУРА ОСНОВНЫХ МИКРОПРОЦЕССОРНЫХ
УСТРОЙСТВ

Микропроцессор

В настоящее время центральным функциональным элементом


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

Микропроцессор(МП) — процессор (устройство, отвечающее за


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

Так, в частности, в релейной защите именно МП определяет условия


срабатывания устройства в соответствии со значениями воздействующих
величин, но не в результате сравнения одной аналоговой величины с другой, а в
результате обработки двоичных чисел.
Микропроцессор работает совместно с АЦП, запоминающими
устройствами: постоянным — ПЗУ (U8), перепрограммируемым — ППЗУ (U9),
оперативным — ОЗУ (U10), а также рядом других элементов. Микропроцессор
через свои порты ввода-вывода (X1) обменивается информацией с
периферийными элементами. С помощью периферийных элементов
осуществляется сопряжение МП с внешней средой: датчиками исходной
информации, объектом управления, оператором и т.д.

7
Рисунок 1 – Структура цифрового устройства релейной защиты

В настоящее время программирование микропроцессора ведется на языке


ассемблера или языке программирования высокого уровня (C).
Микропроцессор — это объект общего назначения. За ним последовало
несколько специализированных устройств обработки. Далее будут рассмотрены
некоторые из них.

Микроконтроллер

Микроконтроллер (МК) — это специализированная микросхема,


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

Таненбаум в своей книге разделяет микроконтроллеры на два типа:


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

8
связанных с воспроизведением мультимедийных данных. Микроконтроллеры
бывают 4-, 8-, 16- и 32-разрядными.
Между универсальными микроконтроллерами, с одной стороны, и
стандартными ПК, с другой, наблюдаются существенные различия. Во-первых,
спрос на микроконтроллеры в максимальной степени обусловлен ценами на
них. Цены на микроконтроллеры определяются разрядностью, типом, емкостью
памяти и рядом других факторов.
Во-вторых, почти все микроконтроллеры работают в реальном времени.
За каждым входным сигналом должен следовать незамедлительный отклик. К
примеру, после нажатия пользователем кнопки во многих приборах включается
световой индикатор, причем между первым и вторым событием не должно быть
никаких пауз. Необходимость работы в реальном времени зачастую определяет
архитектурное решение микроконтроллеров.
В-третьих, встроенные системы зачастую ограничены по многим
электрическим и механическим параметрам, таким как размер, вес и
энергопотребление. С учетом этих ограничений и разрабатываются
микроконтроллеры, устанавливаемые в такого рода системах.
МК изначально программировались только на языке ассемблера, но
различные языки программирования высокого уровня, такие как C, Python и
JavaScript, в настоящее время также широко используются для работы с
микроконтроллерами.
Область применения МК довольно обширна: бытовые приборы,
медицинское оборудование, в робототехнике, военная техника, в
электроинструментах, в игрушках и других встроенных системах.

Программируемые логические интегральные схемы

Программируемые логические интегральные схемы (ПЛИС) —


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

С помощью ПЛИС можно в буквальном смысле проектировать цифровые


микросхемы. Именно проектировать, а не программировать, поскольку на
9
выходе получается физическая цифровая схема, выполняющая определенный
алгоритм на аппаратном уровне, а не программа для процессора.
Важной особенностью ПЛИС является то, что её структура может быть
неоднократно сконфигурирована любым образом. Этот факт позволяет
реализовать необходимую цифровую схему.
В настоящее время описание схем на ПЛИС производится в основном на
языке HDL — hardware description language (язык описания аппаратуры). На
данный момент наиболее распространённые языки — это Verilog, SystemVerilog,
VHDL.
ПЛИС крайне выгодно применять, когда скорость вычислений не очень
критична, но требуется большое количество портов ввода-вывода, либо когда
необходимо обеспечить одновременность и независимость работы этих портов.
За счёт параллельности работы, логических ячеек в ПЛИС можно реализовать
ряд устройств, работающих независимо друг от друга — и, таким образом,
сэкономить на количество корпусов на печатной плате, что в итоге может
существенно снизить стоимость изделий.
ПЛИС обычно применяется при разработке аппаратуры, требующей
нестандартных схемотехнических решений, а также при проектировании
малогабаритных устройств.

Цифровой сигнальный процессор

Цифровой сигнальный процессор (англ. Digital Signal Processors, DSP)


или ЦСП представляет собой микропроцессор, архитектура которого
ориентирована на эффективную реализацию алгоритмов цифровой
обработки сигналов в реальном масштабе времени.

ЦСП в отличие от микропроцессора имеет некоторую модификацию


архитектуры, что делает ее специализированной для обработки сигналов. Эти
модификации включают следующие основные особенности ЦСП:

 Быстрое выполнение операции умножения с накоплением;


 Архитектура памяти с множественным доступом;

10
 Специальные режимы адресации;
 Специальные возможности программного автомата;
 Специализированная периферия и интерфейсы.

Основное назначение ЦСП — встраивание их в автономные устройства


обработки сигналов, в которых они реализуют заданный алгоритм ЦОС
непрерывного потока цифровых данных.
Хорошим примером применения ЦСП может служить мобильный
телефон, в котором ЦСП реализует функции модема. Во время разговора речь
говорящего через микрофон и аналого-цифровой преобразователь поступает на
вход сигнального процессора. Процессор реализует набор стандартных
операций кодирования и модуляции, делая сигнал пригодным для передачи по
радиоканалу. Микросхема ЦСП должна быть экономичной, то есть
малопотребляющей, дешевой и компактной, так как эти параметры процессора
во много определяют соответствующие параметры и всего телефона. Речь
поступает на ЦСП непрерывным потоком, и процессор должен «успевать» ее
обрабатывать, иначе часть информации будет утеряна или искажена.
Основная задача ЦСП — реализация алгоритмов цифровой обработки
сигналов в реальном масштабе времени.
Обработка сигнала в реальном масштабе времени — это обработка
отсчетов входного сигнала в темпе их поступления.
Для программирования ЦСП обычно используют один из двух языков —
Assembler или C.
Таким образом, именно DSP решают задачи обработки больших объёмов
информации в реальном времени, возникающие при передаче данных,
например, (звонков и мобильного Интернета) в мобильных сетях, обработке
фотографий и восстановлению звука. Даже в современных телефонах вся эта
работа выполняется не на мощных ARM-ядрах, а на специализированных DSP.

11
ЛЕКЦИЯ 2.
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ С

Алгоритмы можно реализовать на разных языках программирования,


таких, но исполнение происходит на машинном языке. Однако машинный код
трудно воспринимается человеком. Поэтому в процессе развития были
разработаны языки более высокого уровня.
Один из них — язык C, который был создан в период между 1969 и 1973
годами группой сотрудников Bell Laboratories, включавшей Денниса Ритчи и
Брайана Кернигана.

Среди преимуществ языка С следует отметить

1. Доступ к памяти через использование указателей

2. Передача параметров по значению, а не по ссылке

Язык С не лишен и недостатков. Несмотря на то, что язык С


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

Пример программы на языке С

Далее будет рассмотрен пример программы на языке С. Эта программа


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

12
#include <stdio.h>
int main(void) /* первая программа */
{
int year;
year = 2022;
printf("Hello World!\n");
printf("This manual was written in %d", year);
return 0;
}

#include <stdio.h>
#include <stdio.h>  включить другой файл

Оператор «#» представляет собой пример директивы препроцессора в С.


Символ «#» означает, что данная строка должна обрабатываться
препроцессором до передачи ее компилятору.

Препроцессор (от англ. preprocess — предварительная обработка) — это


программа, которая редактирует исходный код программы согласно
инструкциям препроцессора.

Препроцессинг — процесс редактирования исходного кода; происходит


до этапа компиляции. Препроцессор является обязательным компонентом
компилятора языка С.
stdio.h — библиотека для работы с вводом/выводом информации
(STandard Input/Output Header — заголовочный файл стандартного ввода-
вывода). Совокупность информации, которая помещается в верхней части
файла называют заголовком (header).
Заголовочные файлы содержат информацию о прототипах функций,
используемую компилятором для создания конечных исполняемых программ.
Например, они могут определять константы или указывать имена функций и
способы их использования. Однако фактический программный код функции
представляет собой библиотечный файл предварительно откомпилированного
13
кода, а не заголовочный файл. Таким образом заголовочный файл оказывает
помощь в правильной компоновке программы.
В частности, с этой библиотекой, инструкция include делает ровно то,
что указано в ее названии — вставляет содержимое файла, имя которого идет
после директивы, вместо этой директивы. Т.е. препроцессор просто открывает
файл и вставляет его содержимое на место директивы.
Таким образом, первая строка необходима для того, чтобы была
возможность пользоваться библиотечными функциями ввода/вывода, одна из
которых — printf.

int main(void)
int main (void) имя

main является главной и единственной в данной программе функцией,


причем она обязательна в любой программе на С.
Круглые скобки показывают, что main() — имя функции, а сами скобки
переназначены для указания параметров (или аргументов). В случае записи
main(void) функция не принимает никаких аргументов.
int указывает на то, что функция main() возвращает некоторое целое
число.

Комментарий
/* первая программа */ комментарий

Любые символы, заключенные между /* */, представляют собой


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

Скобки, тело функции и блоки


{
…  тело функции
}

14
Фигурные скобки определяют границы функции main(). В общем случае
все функции языка С используют фигурные скобки для обозначения начала и,
соответственно, конца тела функции.

Объявления
Для хранения информации программы используют переменные.

Переменная — области памяти компьютера, куда можно записать какую-


либо информацию, а затем производить над ней различные действия.

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


объявлены до их использования. Также необходимо указать, к какому типу
данных принадлежит каждая переменная.
int year; оператор объявления

Этот оператор объявляет переменную с именем year и уведомляет, что


переменная year имеет целочисленный тип int.
year = 2022; оператор присваивания

В рассматриваемом примере эта операция требует «присвоить значение,


равное 2022 переменной year». Предшествующая ему строка int year;
резервирует в памяти компьютера пространство для хранения переменной year,
а строка с оператором присваивания записывает значение в эту ячейку.

Функция printf()
printf("Hello World!\n");

Первый оператор, использующий функцию printf(), отображает на


экране фразу «Hello Wolrd!». \n — это формат вывода информации (escape-
последовательность), которая указывает компьютеру начать новую строку, т.е.
переместить курсор в начало следующей строки. Используемая здесь функция
printf() является частью стандартной библиотеки С.

15
printf("This manual was written in %d", year);

Заключительное использование функции printf() приводит к печати


значения переменной year (которое имеет значение 2022), вставленной во
фразу, заключенную в кавычки. Спецификатор %d1 указывает компьютеру, где и
в какой форме печатать значение year. А через запятую указывается
непосредственно сам параметр, который необходимо вывести.

Оператор возврата
Для возврата целочисленного значения перед завершением функции
main() добавляется строка
return 0; оператор возврата

Под «возвратом» понимается завершение работы данной функции, а т.к.


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

Этапы сборки

Теперь, после рассмотрения примера, стоит разобраться, через какие


этапы проходит программа, написанная на языке С. (Error: Reference source not
found). И первый вопрос, который рассмотрим — это «зачем нужно
компилировать исходные файлы?»
Исходный C файл — это всего лишь код, но его невозможно запустить как
программу или использовать как библиотеку. Поэтому каждый исходный файл

1
Для более детального понимания предлагается ознакомиться с понятием «форматированный вывод в
языке Си»
16
требуется скомпилировать в исполняемый файл.
Какие действия выполняет компилятор, чтобы превратить исходный текст
в исполняемый файл?
Существуют следующие этапы сборки кода
1. Препроцессинг
На этом этапе удаляются из текста все комментарии, выполняются
директивы, начинающиеся с символа #, заменяются макросы ( #define) их
значениями, выбрав нужные фрагменты кода в соответствии с условиями #if,
#ifdef и #ifndef.
На выходе получается препроцессированный код в файле расширения .i
Посмотреть результат работы препроцессора можно через команду
$ gcc -E main.c

Флаг -E сообщает компилятору, что компилировать файл не нужно, а


только провести его препроцессинг.
2. Компиляция
Далее компилятор преобразует полученный на прошлом шаге код без
директив в ассемблерный код. В качестве примера используется компилятор
gcc.
Компиляция является промежуточным шагом между высокоуровневым
языком и машинным кодом.
Ассемблерный код — это доступное для понимания человеком
представление машинного кода.
Чтобы увидеть результат компиляции, необходимо выполнить команду
$ gcc -S main.c

Флаг -S сообщает компилятору остановиться после стадии компиляции. В


результате этого будет получен ассемблерный код в выходном файле формата
main.s.
На текущем шаге все также имеется возможность посмотреть и прочесть
полученный результат. Но для того, чтобы ЭВМ был понятен исходный код,
требуется преобразовать его в машинный код, который будет получен на
следующем шаге.
17
3. Ассемблирование
На данном этапе ассемблер преобразовывает ассемблерный код в
машинный код, для того чтобы ЭВМ исполнило команды в бинарном коде.
Результат получения объектного файла, выполняется следующим образом
$ gcc -c main.c

В результате машинный код сохраняется в выходной объектный файл


main.o.

Объектный файл — это созданный ассемблером промежуточный файл,


хранящий фрагмент машинного кода.

Данный фрагмент машинного кода, который еще не был связан вместе с


другими фрагментами машинного кода в конечную выполняемую программу,
называется объектным кодом.
4. Компоновка
Компоновка —
Так как объектных файлов может быть несколько, то на заключительном
этапе компоновщик связывает все объектные файлы и статические библиотеки в
единый исполняемый файл, который мы и сможем запустить в дальнейшем.
В случае сборки программ из нескольких С-файлов фаза сборки будет
выглядеть как представлено на Рисунок 2.

18
Рисунок 2 – Фазы сборки программного продукта

Типы данных

Язык C — язык со статической типизацией данных, т.е. тип переменной


должен быть определен на этапе создания переменной. После объявления
переменной ее тип изменить уже нельзя.
В языке С можно выделить пять базовых типов, которые задаются
следующими ключевыми словами — спецификаторами
 char — символьный;

19
 int — целый;
 float — вещественный;

 double — вещественный двойной точности;

 void — не имеющий значения.

Объект некоторого базового типа может быть модифицирован. С этой


целью используются специальные ключевые слова, называемые
модификаторами. В стандарте ANSI языка C имеются следующие
модификаторы типа:
 unsigned;
 signed;
 short;
 long.
Модификаторы записываются перед спецификаторами типа, например:
unsigned int. Если после модификатора опущен спецификатор, то компилятор
предполагает, что этим спецификатором является int. Таким образом,
следующие строки:
long а;
long int а;

являются идентичными и определяют объект «а» как длинный целый. Таблица


1 иллюстрирует возможные сочетания модификаторов (unsigned, signed, short,
long) со спецификаторами (char, int, float и double), а также показывает размер и
диапазон значений объекта (для 16-разрядных компиляторов).
Таблица 1 – Типичные характеристики базовых типов данных

Размер в Специ-
Тип Интервал изменения
байтах фикатор
char 1 %c [-128…+127]
unsigned char 1 %c [0...255]
short int 2 %hi [-32 768…+32 767]
unsigned short int 2 %hu [0...65 535]
int 2(4)2 %d (%i) [-32768…+32 767]
unsigned int 2(4) %hu [0...65 535]
2
Размер переменной типа int в стандарте языка С не определен. В большинстве систем
программирования размер переменной типа int соответствует размеру целого машинного слова. Например, в
компиляторах для 16-разрядных процессоров переменная типа int имеет размер 2 байта, а для 32-разрядных —
4 байта.
20
long int 4 %li [-2 147 483 648…+2 147 483 647]
unsigned long int 4 %lu [0…+4 294 967 295]
[−9 223 372 036 854 775 808...
long long int 8 %lld(%lli)
+9 223 372 036 854 775 807]
unsigned long long [0…
8 %llu
int 18 446 744 073 709 551 615]
float 4 %f [3.4Е-38...3.4Е+38]
double 8 %ld [1.7Е-308...1.7Е+308]
long double 10 %Lf [3.4Е-4932...3.4Е+4932]

Также не были упомянуты следующие спецификаторы типов: %s — для


строк, %p — для указателей, %x— для шестнадцатеричного представления, %o —
для восьмеричного.
Реальный размер целочисленных типов зависит от реализации. Стандарт
лишь оговаривает отношения в размерах между типами и минимальные рамки
для каждого типа:
Так, long long не должен быть меньше long, который, в свою очередь, не
должен быть меньше int, который, в свою очередь, не должен быть меньше
short. Так как char — наименьший из возможных адресуемых типов, другие
типы не могут иметь размер меньше него.
Минимальный размер для char — 8 бит, для short и int — 16 бит, для long
— 32 бита, для long long — 64 бита.

Приведение типов

Что же произойдет, если значение переменной одного типа присвоить


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

Преобразования бывают явными и неявными. Неявные преобразования


производятся непосредственно самим компилятором. Их можно разделить на
два класса преобразований:
1. Когда результат вычисления какого-либо выражения присваивается
переменной — этот результат преобразуется к типу переменной;
21
2. При вычислении выражения операнды каждой операции
преобразуются к какому-то одному типу (если они различаются),
при этом результат операции будет того же типа.
Во втором случае основное правило неявного преобразования двух типов
к какому-то одному можно сформулировать так: компилятор всегда старается
преобразовать «меньший» тип к «большему», чтобы минимизировать
возможную потерю информации3.
Для первого класса правило преобразования «меньшего» типа к
«большему» не действует. Результат вычисления выражения, стоящего справа,
просто-напросто преобразуется к типу той переменной, которая стоит слева.
Например,
int a = 2.3 + 4.5;

Второй класс преобразований — преобразования, происходящие внутри


выражения в момент его вычисления. Например:
float a = 5 / 6;
float b = 2 / 4 * 3.14;

Далее приведен пример явного преобразования типов


int a = 1, b = 2;
double result = (double)a / b;

Явно можно преобразовывать тип не только значений переменных, но и


целых выражений:
float a = 4.0, b = 2.0;
int result;

result = (int)((a * a) / (b * 6) + 4);

3
На все эти вопросы стоит обращать особое внимание, так как по невнимательности в результате
неявных преобразований можно случайно потерять значимую информацию, что иногда приводит к
трудноуловимым ошибкам.
22
ЛЕКЦИЯ 3
ОСВОЕНИЕ ОПЕРАЦИЙ ЯЗЫКА С НА ПРИМЕРАХ ЗАДАЧ

Прототипы функций

Прототипы являются весомым дополнением к языку. Они предоставляют


компилятору возможность выявлять многие ошибки или упущения, которые
были допущены при использовании функций. Если они не будут своевременно
обнаружены, они станут источником проблем, для решения которых
потребуются немалые усилия.
Назначение прототипа заключается в том, чтобы показать компилятору,
как должна использоваться функция, прежде чем компилятор выйдет на первый
случай фактического вызова этой функции. Далее приведен пример прототипа
функции в программе.
#include <stdio.h>
int imax(int first_num, int second_num); /* прототип
функции*/
int main (void)
{

return 0;
}
int imax (int a, int b)
{

Структуры

Структура в С служит средством сохранения нескольких элементов


данных, обычно разных типов, в одном и том же объекте данных. Для лёгкого
представления говорят, что структура — это класс, у которого все поля по

23
умолчанию public.
Объявление структуры представляет собой общее описание,
показывающие, из каких частей состоит структура. Объявление структуры в
данном примере имеет следующий вид:
struct book {
char title [МAXTITL];
char author [МAXAUTL];
float value;
};

Это объявление описывает структуру, образованную из двух символьных


массивов и одной переменной типа float. Оно не создает фактического объекта
данных, зато оно описывает, что именно является составляющими частями
этого объекта.
Итак, первым идет ключевое слово struct. Оно определяет, что все, что
следует за этим словом, представляет собой структуру. Далее следует
необязательный дескриптор, а именно book , так называемая сокращенная
метка, которую можно использовать для ссылки на эту структуру. Таким
образом, далее мы будем пользоваться следующим объявлением:
struct book library;

Оно объявляет library как переменную типа структуры, использующую


схему структуры book.
Следующим в объявлении структуры идет список элементов структуры,
заключенных в одинарные кавычки. Каждый элемент описан собственным
объявлением, которое оканчивается точкой с запятой. Например, раздел
названия книги представляет собой массив значений типа char из МAXTITL
элементов. Элементом структуры может быть любой тип данных С, в том числе
и тип, включающий другие структуры.
Операция принадлежности ( . ) позволяет получить доступ к отдельным
элементам структуры через использование меток шаблона структуры.

24
Указатели

В процессе разработки программного кода нередко возникает такая


ситуация, когда в какую-то конкретную функцию необходимо передать
некоторую структуру (например, массив). Не исключен тот факт, что данная
структура может занимать довольно внушительное место в памяти. И если в
этом случае передать в функцию целиком эту структуру, то тогда в функции
создастся локальная переменная (копия) и функция будет занимать уже больше
памяти на то количество, которое занимает эта структура. А если имеется
необходимость работать с несколькими структурами в одной функции, то
сколько тогда будет занимать данная функция памяти, если передать их всех?
В таких ситуациях гораздо целесообразным является использование
указателей, поскольку, если вместо структуры передавать указатель на эту
структуру, то тогда функция будет занимать 4 байта, т.к. указатель занимает 4
байта.
Таким образом, указатели, в-первую очередь, используются для того,
чтобы экономить память.
Как известно, при создании некоторой переменной и присвоении ей
некоторого значения, данная переменная будет храниться в одной из ячеек
оперативной памяти.
Адрес переменной — это номер ячейки оперативной памяти, в которой
находится значение этой переменной.
Указатель — это переменная, в которой хранится адрес другой
переменной. Рассмотрим простой пример объявления указателя.
int main(void)
{
int a = 5;
int *pa =
&a;
return 0;
}

 int* вместе задают тип переменной pa, т.е. «*» показывает, что pa

25
является не просто переменной типа int, а указателем на
переменную типа int.
 В качестве присваиваемого значения указателя pa будет &a — адрес,
который будет хранить данный указатель. Чтобы получить адрес
переменной используется унарный оператор « &» и он ставится
перед именем той переменной, адрес которой необходимо получить.
Описанный выше код можно представить, как это проиллюстрировано на
Рисунок 3.

Рисунок 3 – Схематическое изображение расположения указателя и переменной в памяти.


Значение указателя равно адресу переменной

Если же в процессе работы возникает необходимость получить значение,


на которое указывает указатель, то в таком случае необходимо воспользоваться
унарным оператором разыменования «*».
int main(void)
{
int a = 5;
int* pa =
&a;
printf("a
= %d ", *pa);
return 0;
}

Т.е. чтобы получить значение, на которое указывает указатель, нужно


использовать разыменование4.
4
Примечание. Не следует путать int *p — тип указателя и *p — оператор разыменования.
26
Разыменование используется также в тех случаях, когда возникает
необходимость переприсвоения значения переменной.

Массивы

Массивы играют важную роль во многих программах. Они позволяют


хранить некоторое количество значений однотипной информации в удобной
форме.
Массив — это набор элементов одного и того же типа, например,
значений типа char или значений типа int, хранящихся в памяти в виде
непрерывной последовательности. Массив имеет свое собственное имя, а
доступ к отдельным его элементам осуществляется с помощью целочисленного
индекса.
Объявление массива осуществляется с использованием следующего
синтаксиса:
<тип> <имя>[<размер>];

Тип указывает тип данных каждого элемента массива, имя — имя


массива, а размер задает количество элементов.
Например:
int mas[20]; // массив из 20 целочисленных переменных
double arr[100]; // массив из 100 переменных типа double

Арифметика указателей

Язык С интерпретирует имя массива как адрес первого элемента этого


массива. Иными словами, имя массива эквивалентно указателю на первый
элемент массива.
Это означает, что указатели можно использовать для идентификации
конкретного элемента массива и получения его значения. Т.е., по сути, в нашем
распоряжении имеются два различных обозначения одного и того же объекта. В
самом деле, стандарт языка С описывает массивы через указатели. Т.е. он
определяет, что mas[i] означает *(mas+i), где второе выражение можно

27
интерпретировать как «перейти к ячейке памяти mas, пройти через i единиц и
там найти нужное значение».
Получается, что в общем случае массивы и указатели тесно связаны друг с
другом. Если mas есть массив, то выражения mas[i] и *(mas + i)
эквивалентны.
Таким образом, добавление к указателю 1 увеличивает его значение на
величину размера типа в байтах переменной, на которую он указывает.
Однако не стоит путать, к примеру, *(mas+2) и *mas + 2. Операция
разыменования (*) имеет более высокий приоритет, чем «+», следовательно,
последнее выражение означает (*mas) + 2:

28
*(mas + 2) /* значение третьего элемента массива mas */
*mas + 2 /* 2 прибавляется к значению первого элемента */

ЛЕКЦИЯ 4
СИНТЕЗ ЛОГИЧЕСКИХ СХЕМ

Основу цифровой техники составляют логические элементы. К ним


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

Булева алгебра

Для описания алгоритмов работы цифровых устройств необходим


соответствующий математический аппарат.
Булева алгебра — это математическая система, оперирующая двумя
понятиями: «событие истинно» и «событие ложно». Эти понятия соответствуют
цифрам в двоичной системе счисления: логическими единице — «1» и нулю —
«0».

29
Все возможные логические функции нескольких переменных можно
образовать с помощью трех основных операций:

 конъюнкция (от лат. conjunctio союз, связь) — логическая операция,


результат которой будет истинным, если истинными являются все
аргументы. Также именуется как логическое умножение или
логическое «И».

 дизъюнкция (лат. disjunctio — разобщение) — логическая операция,


по своему применению максимально приближённая к союзу «или» в
смысле «или то, или это, или оба сразу». Также в литературе её
можно встретить как логическое сложение или логическое «ИЛИ».

 Отрицание (в логике) — логическая операция над единственным


аргументом, результатом которой будет истина, если аргумент
ложный и наоборт. Также именуется как инверсия или же
логическое «НЕ».

Стандарты на условные графические обозначения элементов


цифровых схем

В настоящее время в мире существуют несколько общепринятых


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

Название элемента Условно-графическое изображение

Логический элемент «И»


(AND)

30
Логический элемент «ИЛИ»
(OR)

Логический элемент «НЕ»


(NOT)

Наряду с простейшими распространены и более сложные логические


элементы, сочетающие в себе несколько простейших операций. Такими
являются логические элементы «И-НЕ», «ИЛИ-НЕ», «ИСКЛЮЧАЮЩЕЕ И»,
«ИСКЛЮЧАЮЩЕЕ ИЛИ».
Название элемента Условно-графическое изображение

Логический элемент «И-


НЕ» (NOT AND или NAND)

Логический элемент «ИЛИ-


НЕ» (NOT OR)

Логический элемент
«ИСКЛЮЧАЮЩЕЕ ИЛИ»
(eXclusive OR или XOR)

Логический элемент
«ИСКЛЮЧАЮЩЕЕ ИЛИ-
НЕ» (NOT eXclusive OR)

Для условно-графических изображений перечисленных элементов на


Error: Reference source not found приведены таблицы истинности.

0 0 1
A
«ИЛИ» B
0 1
1 1 1

31
«И» A
0 1
0 1
0 1 1
0 0 0
B
B
1 1 0
1 0 1

«ИЛИ-НЕ» A
0 1 «исключающе A
е ИЛИ»

0 1 0 0 1
B
1 0 0 0 0 1
B
1 1 0

«И-НЕ» A

32
«исключающе A
е ИЛИ-НЕ»

0 1

0 1 0
B
1 0 1

«НЕ» A
0 1
1 0

Рисунок 4 – Таблицы истинности для основных логических элементов

Основные аксиомы и законы алгебры-логики

Для логических операций («И», «ИЛИ», «НЕ») справедлив ряд аксиом


(тождеств) и законов, основные из которых даны в Таблица 3. Для обозначения
эквивалентности логических выражений используется знак равенства «=».
Таблица 3 – Основные аксиомы и законы алгебры-логики

0 ∙ A=0
1+ A=1
1 ∙ A=1
Аксиомы(тождества) 0+ A= A
A ∙ A= A
A+ A= A
A=A
Законы коммутативности A+ B=B+ A
(переместительности) A ∙ B=B ∙ A
Законы ассоциативности A+ B+C= A+ ( B+C )
(сочетательности) A ∙ B ∙ C=A ∙ (B ∙ C)
Законы дистрибутивности A ∙ ( B+C )=( A ∙ B ) + ( A ∙C )
(распределительности) A+ ( B ∙C )=( A+ B ) ∙( A+ C)
A+ A=1
Законы отрицания A ∙ A=0
Á=A

33
A+ B=A ∙ B
Законы Де-Моргана
A ∙ B=A
A+ A ∙ B= A
Законы поглощения
A ∙( A+ B)= A

Синтез цифровых комбинационных схем по произвольной


таблице истинности

Для реализации цифровых логических схем (синтеза) с произвольной


таблицей истинности используется сочетание простейших логических
элементов "И", "ИЛИ", "НЕ".
Под синтезом понимается …
Существует два способа синтеза цифровых схем, реализующих
произвольную таблицу истинности. Это совершенная дизъюнктивная
нормальная форма (СДНФ) и Совершенная СКНФ (логическое произведение
суммы входных сигналов)5.

Совершенная дизъюнктивная нормальная форма


ДНФ называется логическая сумма элементарных логических
произведений, в каждое из которых аргумент или его и нверсия входят один раз.
Для синтеза схемы на основе логических элементов, удовлетворяющей
таблице истинности, достаточно рассмотреть только те строки таблицы
истинности, которые содержат логические «1» в выходном сигнале. Строки,
содержащие в выходном сигнале логический «0» в построении цифровой
схемы, не участвуют. Каждая строка, содержащая в выходном сигнале
логическую «1», реализуется схемой логического элемента «И» с количеством
входов, совпадающим с количеством входных сигналов в таблице истинности.
Входные сигналы, описанные в таблице истинности логической единицей,
подаются на вход этого логического элемента непосредственно, а входные
сигналы, описанные в таблице истинности логическим нулем, подаются на вход
этого же логического элемента «И» через инверторы. Объединение сигналов с
выходов логических элементов «И», реализующих отдельные строки таблицы
5
Далее будет описан лишь один из двух методов. Самостоятельно ознакомиться со вторым можно по
ссылке https://digteh.ru/digital/SintSxem.php
34
истинности, производится при помощи логического элемента «ИЛИ».
Количество его входов определяется количеством строк в таблице истинности, в
которых в выходном сигнале присутствует логическая единица.
Рассмотрим конкретный пример. Пусть цифровому устройству
необходимо реализовать таблицу истинности, приведенную Таблица 4.
Таблица 4 – Произвольная таблица истинности

Входы Выходы

A B C D F
1 0 0 0 0 0
2 0 0 0 1 0
3 0 0 1 0 0
4 0 0 1 1 0
5 0 1 0 0 1
6 0 1 0 1 1
7 0 1 1 0 0
8 0 1 1 1 0
9 1 0 0 0 0
10 1 0 0 1 1
11 1 0 1 0 1
12 1 0 1 1 1
13 1 1 0 0 0
14 1 1 0 1 0
15 1 1 1 0 0
16 1 1 1 1 1

Для синтеза цифровой схемы, реализующей сигнал F, достаточно


рассмотреть выделенные строки, т.е. те, в которых F = 1. В таблице истинности
имеется шесть строк, содержащих единицу в выходном сигнале F, поэтому в
формуле СДНФ будет содержаться шесть произведений входных сигналов —
термов, а точнее минтермов.

Минтерм — логическое произведение всех переменных, которые входят


в прямом виде, если значение переменной равно «1», или в инверсном
виде, если значение переменной равно «0» [2].

Любую логическую функцию можно представить в виде логической


суммы минтермов, соответствующих единичным наборам переменных
(наборам, при которых логическая функция принимает значение «1»).

35
В итоге получается следующая СДНФ
F= A BCD ∪ A B C D ∪ A BC D∪ A B C D ∪ A B CD ∪ ABCD
Так как количество переменных в каждом терме (ранг терма) данного
логического выражения равно, то такое логическое выражение называется
совершенным (СКНФ).
Как и в формуле, каждая строка (терм) реализуется своим логическим
элементом «И», затем выходы этих логических элементов объединяются при
помощи логического элемента «ИЛИ». Количество входов логического
элемента «И» (ранг минтерма) в СДНФ однозначно определяется количеством
входных сигналов в таблице истинности. Количество этих элементов, а значит и
количество входов в логическом элементе «ИЛИ» определяется количеством
строк с единичным сигналом на реализуемом выходе цифровой схемы.
Более наглядное изображение представлено на Рисунок 5.

Рисунок 5 – Выражение СДНФ

Создание карты Карно, минимизация и приведение к базису И-НЕ


Можно заметить, что выражение получилось достаточно длинным. Его
можно упростить, применяя правила поглощения и склеивания. Для того, чтобы
не делать лишних действий, можно сразу получить минимизированную
функцию. Для этого следует применить метод карт Карно.
36
Карта представляет собой таблицу, каждая клетка которой соответствует
одному из наборов таблицы истинности. Для логической функции четырех
переменных карта Карно представляет собой два горизонтальных ряда по
четыре клетки. Смысл применения карт Карно определяется специально
выбранным порядком нумерации клеток, при котором любой соседней паре
клеток с единицами или нулями по горизонтали или вертикали соответствуют
склеивающиеся слагаемые или сомножители формулы. Если структурная
формула получается на основе СДНФ, то учитываются только клетки карты,
определяющие единичные наборы. (В случае СКНФ — нулевые).
Соседние клетки карты с единицами или нулями объединяются в группу.
При объединении пользуются следующими правилами

 соседними являются не только клетки, расположенные рядом по


горизонтали и вертикали, но и клетки на противоположных
границах карты;
 клетки могут объединяться по 2, по 4, по 8 и т.д.;
 одна и та же клетка может входить в несколько групп;
 минимизированная структурная формула записывается на основе
наименьшей совокупности групп, которая захватывает (покрывает)
все либо единичные (если используется СДНФ), либо нулевые
(СКНФ) клетки.

В первом случае структурная формула представляет собой логическую


сумму, каждое из слагаемых которой соответствует одной из групп карты. При
этом в каждое слагаемое входят лишь те переменные, которые не меняют своего
значения в наборах, соответствующих объединенным клеткам. Во втором
случае в группы объединяют нулевые клетки, минимизированная структурная
формула представляет собой логическое произведение, каждый сомножитель
которого записывается на основе группы карты.
Далее будем указывать в наших картах только единичные наборы.
«Нулевые» клетки будем оставлять пустыми.

37
Итак, приступим к синтезу нашего устройства, руководствуясь
вышеизложенной теорией.
Три шага для построения карт Карно

1. Т.к. используются четыре переменные (A, B, C и D), то строится


таблица 5×5 клеток;
2. Таблица заполняется на основе «координат» из таблицы
истинности (из строк, в которых F = 1) или СДНФ (Рисунок 6);
3. В заключение смежные клетки объединяются в группы. Группы
не должны содержать нули. Группы должны быть кратны двум.
Группы могут пересекаться (Рисунок 7).

Рисунок 6 – Процесс заполнения карты Карно

В итоге получаются четыре группы

38
Рисунок 7 – Карта Карно с образованными группами

Следующее действие — минимизация полученных групп (Рисунок 8).


Общий принцип можно свести к следующему:

 Если 11 — значение не меняется;


 Если 00 — присваивается отрицание;
 Если 01 (или 10) — вычеркивается.

Рисунок 8 – Минимизация полученных групп

Полученные произведения связываются в дизъюнкцию


F= A BC ∪ A B D ∪ ACD ∪ A B C
После чего составленное выражение приводится к базису «И-НЕ» при
помощи закона де Моргана (отрицание конъюнкции есть дизъюнкция
отрицаний, отрицание дизъюнкции есть конъюнкция отрицаний)
F= A BC ∩ A B D ∩ ACD ∩ A BC
Обратите внимание на изменения — появилось двойное отрицание (по
одной на «группу» и одно общее) и изменились знаки.
Полученное логическое выражение можно реализовать электронной
схемой, приведенной на Рисунок 9.
По СДНФ форме логического выражения обычно строятся современные
микросхемы большой интеграции — программируемые логические

39
интегральные схемы, такие как программируемые логические матрицы (ПЛМ),
программируемые матрицы логики ПМЛ или CPLD.

Рисунок 9 – Принципиальная схема цифрового устройства, реализующая таблицу


истинности, приведенную в Таблица 4

40
ЛЕКЦИЯ 5
ИНТЕРФЕЙСЫ ДЛЯ ПЕРЕДАЧИ ДАННЫХ

Введение

Одной из общих черт всех электронных систем является необходимость


обмена информацией между разным количеством их отдельными компонент.
Для этих целей был разработан целый ряд стандартных протоколов (или
интерфейсов), помогающих различным микросхемам успешно обмениваться
данными. Успех этот обусловлен тем, что структура и последовательность
сигналов на линиях связи чипов, работающих по одному протоколу, жестко
устанавливается соответствующими стандартами и/или соглашениями. В
подавляющем большинстве случаев каждый стандарт для передачи информации
предусматривает совместное использование сразу нескольких линий связи,
объединяемых в интерфейсные шины или шины данных. Сам же конкретный
способ передачи пачек данных называют интерфейсом, т.е. совокупностью
правил взаимодействия между элементами системы.
Отметим, что у каждого из интерфейсов имеются свои преимущества и
недостатки. Поэтому при разработке устройства важно иметь общее
представление о каждом из них, чтобы принять обоснованное решение в пользу
того или иного протокола.

Классификация интерфейсов

Для дальнейшего понимания рассматриваемых интерфейсов, следует


понимать их классификацию, которая представлена далее.
Существует следующая классификация интерфейсов
1. По принципу обмена информацией выделяют следующие
интерфейсы:
 С параллельной передачей информации;
 С последовательной передачей информации.
В параллельных интерфейсах в единицу времени данные пересылаются по
нескольким сигнальным линиям одновременно. В последовательных — по
41
одной линии бит за битом.

Рисунок 10 –Последовательный и параллельный интерфейсы передачи данных

2. По режиму обмена информацией различают интерфейсы со


следующими режимами обмена
 Симплексным;
 Полудуплексным;
 Дуплексным;
 Мультиплексным.

42
Рисунок 11 – а) Симплексный, б) Полудуплексный, в) Дуплексный, г) Мультиплексный

В интерфейсах с симплексным режимом обмена информацией возможна


лишь однонаправленная передача информации от одного абонента к другому.
В интерфейсах с полудуплексным режимом обмена в произвольный
момент времени может производиться либо только прием, либо только передача
данных между двумя абонентами.
В интерфейсах с дуплексным режимом обмена в любой произвольный
момент времени может производиться одновременный прием и передача
данных между двумя абонентами.
Мультиплексный режим позволяет связываться только между парами
абонентов и в единственном направлении от одного к другому.
3. По способу передачи информации во времени различают
интерфейсы с
 синхронной передачей данных (с постоянной временной
привязкой в цикле сбора информации);
 асинхронной (без постоянной временной привязки к
определенному временному интервалу цикла сбора).
В первом случае передача синхронизируется специальными
синхроимпульсами в виде последовательности прямоугольных импульсов. Во
втором — управляющими сигналами «ГОТОВНОСТЬ» к обмену, «НАЧАЛО»,
«КОНЕЦ» и «КОНТРОЛЬ» обмена.

43
SPI

RS-защелка
SPI (Serial Peripheral Interface — последовательный периферийный
интерфейс, шина SPI) — последовательный синхронный стандарт передачи
данных, предназначенный для обеспечения простого и недорогого
высокоскоростного сопряжения микроконтроллеров и периферии. Однако для
понимания работы SPI предварительно следует рассмотреть устройство
простейшей ячейки памяти — RS-защелку.

Рисунок 12 – RS-защелка

Таблица 5 – Таблица истинности для RS-защелки

S (set) R (reset) Q Q
1 0 1 0
0 1 0 1
1 1 0 0
0 0 Q Q

Данная схема состоит их двух элементов «ИЛИ-НЕ», объединенных


таким образом, чтобы после снятия сигналов со входов на выходе схемы
сохранялось значение, поданное на вход S. Рассмотрим вариант, когда на вход S
подается логическая единица, а на вход R логический ноль. В этом случае на
нижний элемент «ИЛИ-НЕ» приходит логический ноль и тогда сразу можно

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

Рисунок 13 – Пример работы RS-защелки. А – переход в состояние. В – сохранение состояния

Синхронная RS-защелка
Состояние, когда на вход R и S приходят единицы считается
запрещенным, так как при одновременном исчезновении этих единиц (переход
в режим хранения) значение на выходе может быть как «1», так и «0», т.е. при
переходе к хранению состояние выхода будет не определено. Такое может
происходить из-за не согласованного по времени поступления информации на
входы, это явление называется «гонкой». Это приводит к наложению одного
сигнала на другой. Вызвано это разным временем быстродействия элементов,

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

Рисунок 14 – Схема синхронной RS-защелки

Таблица 6 – Таблица истинности для RS-защелки

S (set) R (reset) Q Q
1 0 1 0
0 1 0 1
1 1 0 0
0 0 Q Q

D-защелка
Теперь перейдем к рассмотрению элемента памяти емкостью в один бит
— D-защелку (D — Delay от англ. «задержка»). Схема D-защелки приведена
Рисунок 15.

46
Рисунок 15 – Схема D-защелки

Из этой схемы становится ясно, зачем ранее рассматривался принцип


работы синхронной RS-защелки. В целом приведенную схему можно
представить несколько иначе.

Рисунок 16 – Схема D-защелки на основании RS-защелки

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

D-триггер
47
Рисунок 17 –Схема асинхронного D-триггера

В данной схеме следует обратить внимание на добавленные элементы, так


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

Рисунок 18 – Пояснение к схеме D-триггера

В данном случае инвертор выступает в роли некоторой задержки и при


изменении фронта на входе элемента «И» появляется две единицы.
Временные диаграммы для данной части схемы (Рисунок 19) будут
выглядеть следующим образом, как это представлено на Рисунок 20.

Рисунок 19 – Пояснение к временной диаграмме

48
Рисунок 20 – Временные диаграммы

Принцип работы интерфейса

Рисунок 21 – Простейший вариант подключения устройство по SPI

49
Теперь перейдем к рассмотрению непосредственно самого SPI,
основываясь на том, что было изучено выше. На Рисунок 21 изображено
упрощенное соединение двух устройств по SPI. Прямоугольниками изображены
D-триггеры, которые сохраняют значения по фронту тактового сигнала, по
этому же сигналу все значения сдвигаются на один бит. Как можно заметить,
данные от ведущего передаются ведомому старшим битом вперед. Также на
рисунке имеются выводы Qi, с которых можно считать значение конкретного
бита в данный момент, или в которые можно передавать значения.

Рисунок 22 – Симплексный вариант передачи по интерфейсу SPI

Теперь можно перейти к более детальному изучению интерфейса.


Рассмотрим принцип работы на симплексном варианте передачи данных. Перед
передачей данных slave-устройству, требуется изменить состояние инверсного
сигнала CS в «0» того slave-устройства, которому требуется передать данные.
После этого на шине передачи данных (MOSI) выставить требуемое значение,
затем по изменению фронта импульса slave-устройство считает один бит
данных, и затем цикл повторится. Алгоритм работы представлен на Рисунок 21.

50
Рисунок 23 – Процесс передачи данных

Расшифровка сокращений со схем:

 MOSI — выход ведущего, вход ведомого (англ. Master Out Slave In).
Служит для передачи данных от ведущего устройства ведомому;
 MISO — вход ведущего, выход ведомого (англ. Master In Slave Out).
Служит для передачи данных от ведомого устройства ведущему;
 SCLK или SCK — последовательный тактовый сигнал (англ. Serial Clock).
Служит для передачи тактового сигнала для ведомых устройств;
 CS или SS — выбор микросхемы, выбор ведомого (англ. Chip Select, Slave
Select). С помощью CS физически подключаем/отключаем ведомое
устройство.
 CS — то же самое, но состояние инверсное.
Также стоит отметить, что существуют 4 варианта изменения фронта
импульса, которые представлены на Рисунок 24.

51
Рисунок 24 – Варианты изменения фронта импульса

Типы подключения в шине SPI

Существует три типа подключения к шине SPI, в каждом из которых


участвуют четыре сигнала. Самое простое подключение, в котором участвуют
только две микросхемы, показано на Рисунок 25. Здесь, ведущий шины
передает данные по линии MOSI синхронно со сгенерированным им же
сигналом SCLK, а подчиненный захватывает переданные биты данных по
определенным фронтам принятого сигнала синхронизации. Одновременно с
этим подчиненный отправляет свою посылку данных. Представленную схему
можно упростить исключением линии MISO, если используемая подчиненная
схема не предусматривает ответную передачу данных или в ней нет
потребности. Таким образом, рассматриваемый вариант подключения
подчиненной схемы требует 3 или 4 линии связи. Чтобы подчиненная схема
принимала и передавала данные, помимо наличия сигнала синхронизации,
необходимо также, чтобы линия SS была переведена в низкое состояние. В
противном случае, подчиненная схема будет неактивна.

52
Рисунок 25 – Простейшее подключение к шине SPI

При необходимости подключения к шине SPI нескольких микросхем


используется либо независимое (параллельное) подключение по Рисунок 26,
либо каскадное — по Рисунок 27. Независимое подключение более
распространенное, т.к. достигается при использовании любых SPI-совместимых
микросхем. Здесь, все сигналы, кроме выбора микросхем, соединены
параллельно, а ведущий шины, переводом того или иного сигнала SS в низкое
состояние, задает, с какой подчиненной схемы он будет обмениваться данными.
Главным недостатком такого подключения является необходимость в
дополнительных линиях для адресации подчиненных микросхем (общее число
линий связи равно 3 + n, где n — количество подчиненных микросхем).
Каскадное включение избавлено от этого недостатка, т.к. здесь из нескольких
микросхем образуется один большой сдвиговый регистр. Для этого выход
передачи данных одной схемы соединяется со входом приема данных другой,
как показано на Рисунок 27. Входы выбора микросхем здесь соединены
параллельно и, таким образом, общее число линий связи сохранено равным 4.
Однако использование каскадного подключения возможно только в том случае,
если его поддержка указана в документации на используемые микросхемы.

Рисунок 26 – Независимое подключение к шине SPI

53
Рисунок 27 – Каскадное подключение к шине SPI

UART

Общие сведения
Универсальный асинхронный приёмопередатчик (Univsersal Asynchronos
Reciever-Transmitter) — определяет протокол или набор правил для обмена
последовательными данными между двумя устройствами. UART — очень
простой протокол, в котором используется только два провода между
передатчиком и приемником для передачи и приема в обоих направлениях. Оба
конца также имеют заземление. Связь в UART может быть симплексной,
полудуплексной, или полнодуплексной. Данные в UART передаются в виде
кадров. У каждого устройства, поддерживающего UART, обычно обозначены
два вывода: RX и TX. TX — означает transmit (передаю), RX — receive
(принимаю). Отсюда становится понятно, что RX одного устройства нужно
подключать к TX другого. Если подключить RX одного устройства к RX другого,
то оба устройства будут слушать друг друга. Если соединить TX и TX — это уже
более опасно, это выходы низкого сопротивления устройств и, если на одном
будет логическая единица, а на втором ноль — по проводу пойдёт ток
короткого замыкания (это зависит от конкретной программной или аппаратной
реализации). Далее приведено краткое описание и объяснены формат и
содержимое этих кадров.

54
Рисунок 28 – Схема подключения двух устройств по UART

Рисунок 29 – Процесс передачи данных UART

Асинхронность
Одним из больших преимуществ UART является его асинхронность —
передатчик и приемник не используют общий тактовый сигнал. Хотя это
значительно упрощает протокол, данное свойство предъявляет определенные
требования к передатчику и приемнику. Поскольку у них нет общего тактового
сигнала, оба конца должны передавать с одинаковой заранее заданной
скоростью, чтобы иметь одинаковую синхронизацию битов. Наиболее
распространенные скорости передачи данных UART, используемые сегодня:
4800, 9600, 19,2 кбит/с, 57,6 кбит/с и 115,2 кбит/с. Помимо одинаковой скорости
передачи данных, обе стороны UART-соединения также должны использовать
одинаковую структуру и параметры кадра.

Стартовые и стоповые биты


Поскольку UART является асинхронным протоколом, передатчик должен
сигнализировать о поступлении битов данных. Это делается с помощью
стартового бита. Стартовый бит — это переход из состояния ожидания
высокого уровня в состояние низкого уровня, за которым сразу же следуют
пользовательские биты данных. После того, как биты данных закончились,
55
стоповый бит указывает на окончание пользовательских данных. Стоповый бит
— это либо переход обратно в состояние высокого уровня или состояние
ожидания, либо сохранение этого состояния в течение дополнительного
битового интервала.

Биты данных
Биты данных являются пользовательскими данными или «полезными»
битами и идут сразу после стартового бита. Может быть от 5 до 9 битов
пользовательских данных, хотя чаще всего используется 7 или 8 битов. Эти
биты данных обычно передаются в формате с первым младшим значащим
битом.

Контроль четности
Многие реализации UART имеют возможность автоматически проверять
целостность данных методом контроля битовой чётности. Когда эта функция
включена, минимальная посылка информационных битов дополняется
конечным битом контроля чётности. При передаче посылки логическое
устройство подсчитывает число единичных битов в информационной части
посылки и по этому числу устанавливает бит контроля чётности в одно из
состояний, в зависимости от числа единичных бит и заданного текущего
режима проверки на чётность.
Существуют режимы контроля на чётность (англ. Even parity) и
нечётность (англ. Odd parity). При Even parity бит чётности выставляется в такое
состояние, чтобы сумма единичных бит в посылке (включая данные и сам бит
четности) являлась чётным числом. При Odd parity бит контроля чётности
выставляется так, чтобы сумма всех битов посылки являлась нечётной, как
показано в Таблица 7.
Таблица 7 – Контроль четности

Количество Состояние бита контроля


Информационные биты информационных четности при режиме
единичных бит Even Odd
00000000 0 0 1
10100010 3 1 0
11010010 4 0 1

56
11111110 7 1 0

При приёме посылки логическое устройство UART автоматически


подсчитывает число единичных бит в посылке, включая бит чётности. Если в
принятой посылке нарушена четность, то это является признаком
возникновения ошибки в канале передачи. Ошибки в двоичных передачах
сводятся к инверсии битов, поэтому логика контроля чётности может
обнаруживать ошибки только если искажено нечетное количестве битов (в 1, 3
и т. д.). Если произошла инверсия, например, 2 бит, то такая ошибка не
обнаруживается. При обнаружении ошибки чётности логика UART выставляет
признак ошибки в слове своего состояния, который может быть прочитан
внешним устройством, например, процессором компьютера и ошибка должным
образом обработана.

I2C

Причины создания интерфейса I2C


Первым делом следует отметить, что интерфейс I2C является намного
более сложным, чем другие простейшие шины (например, UART или SPI).
Чтобы понять, для чего понадобились такие серьезные усложнения, представим,
что нам нужно создать надежную, и в то же время универсальную систему связи
между несколькими независимыми компонентами. Ситуация будет достаточно
простой, если у нас есть одна микросхема, которая всегда является ведущей, и
одна микросхема, которая всегда является ведомой. Но что, если у нас
несколько ведомых? Что, если они не всегда знают, кто мастер? Что делать,
если ведущих несколько? Что произойдет, если мастер запросит данные у
ведомого устройства, которое по какой-то причине перестало работать? Что,
если ведомый перестанет работать в середине передачи? Что, если мастер
заявляет, что шина выполняет передачу, а затем отключается перед тем, как
отпустить шину?
Очевидно, что в такой коммуникационной среде может возникнуть
множество ошибок. И только дополнительное усложнение интерфейса может
обеспечить создание надежной, гибкой и расширяемой шины, связывающей

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

Особенности I2C
Прежде чем углубиться в какие-либо подробности, необходимо
перечислить основные особенности интерфейса I2C:
 Шина I2C является синхронной (тактируемой);
 Независимо от количества устройств на шине, для передачи
информации всегда используется только две линии: линия данных
SDA (Data Line) и линия тактовых импульсов SCL (Clock Line).
Такты на линии SCL всегда генерирует мастер;

Рисунок 30 – Общая схема подключения к I2C

 Обе линии должны быть подтянуты к «плюсу» питания через


резисторы подходящего номинала;
 Каждое ведомое устройство идентифицируется с помощью 7-битного
адреса, всего на одной шине может быть до 112 устройств (16 адресов

58
являются зарезервированными). Мастер должен знать эти адреса для
связи с конкретным ведомым устройством;
 Начало любого обмена данными инициируется и завершается
мастером. Мастер может как записывать данные в одно или несколько
ведомых устройств, так и запрашивать у них данные. Обмен
информацией между двумя ведомыми невозможен;
 Понятия «Мастер» и «Ведомый» по своей природе непостоянны: в
теории любое устройство на шине I2C может функционировать как
ведущее или ведомое, если ему это позволяет сделать аппаратная часть
и/или прошивка. Иными словами, рассматриваемая шина
поддерживает режим мультимастера. Однако на практике системы на
базе I2C чаще всего строятся по архитектуре, в которой есть только
один мастер, отправляющий команды нескольким ведомым
устройствам и собирающий с них данные;
 Данные загружаются (Updated) на линию SDA по заднему фронту
тактовых импульсов на линии SCL и считываются (Sampled) по
переднему фронту SCL;

Рисунок 31 – Запись и загрузка данных пояснения

59
• Данные передаются побайтово, за каждым байтом следует бит
подтверждения, называемый битом ACK/NACK (подтверждено или не
подтверждено).

Программная часть I2C


Для того чтобы устройства могли общаться по шине I2C, должна быть
соблюдена определенная последовательность битов на линиях синхронизации
(SCL) и данных (SDA), поскольку кроме передачи непосредственно «полезной»
информации шина предусматривает также наличие служебных битов. Обмен
данными осуществляется пачками (посылками, транзакциями). Каждая пачка
состоит из стартового бита, стопового бита, непосредственно передаваемой
информации, а также битов подтверждения/неподтверждения:

Рисунок 32 – Процесс передачи данных

Пунктирная линия, соответствующая высокому логическому уровню


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

60
что формирование стартового бита — это обязанность мастера. После того, как
старт-бит сформирован, ведущий опускает линию SCL в нуль и выставляет на
линию SDA старший бит первого байта сообщения, после чего линия SCL
устанавливается в единицу. Обратите внимание на то, что данные,
передаваемые по линии SDA, считаются действительными только во время
высокого состояния тактового импульса (т.е. при SCL = 1), а изменения на
линии SDA допускаются исключительно при SCL = 0. При этом данные с линии
SDA считываются по переднему фронту тактового сигнала, а обновляются
обычно по его заднему фронту. После отправки старшего бита передаваемого
байта, на линию данных поочередно выставляются все остальные его биты,
вплоть до младшего. Таким образом, обмен информацией по шине I2C
происходит побайтово (количество байт в сообщении не ограничено). При этом
за каждым байтом следует бит подтверждения («ACK») или не подтверждения
(«NACK»), выставляемый на шину приемником. Отметим, что «ACK»
соответствует низкому логическому уровню, а «NACK» — высокому. Так
сделано из-за того, что единица — это рецессивное состояние шины I2C, и если
приемник «заглючил», то сигнал сам по себе поднимется до «NACK». Поэтому
подтверждение «ACK» может быть передано только в том случае, когда
приемное устройство может прижать линию SDA к массе, что свидетельствует
о его работоспособности.
Заканчивается транзакция стоповым битом, определяемым как передний
фронт импульса SDA, в то время как сигнал SCL установлен в единицу. Любая
I2C-посылка должна заканчиваться стоп-битом, однако может возникнуть
ситуация, при которой стоповому биту предшествует не один, а несколько
стартовых битов. Как и в случае стартового бита, формирование стоп-бита
является обязанностью мастера. Через некоторое время после возникновения
стопового бита шина считается освободившейся. Последовательность событий
при передаче данных по I2C будет такой:
 мастер генерирует стартовый бит, чтобы инициировать транзакцию;
 в первом байте сообщения мастер передает 7-битный адрес,
соответствующий ведомому устройству, с которым он хочет связаться.
Последний бит в этом байте — это индикатор чтения/записи. Если мастер
хочет считать данные с ведомого устройства, он устанавливает данный
61
бит в единицу, если же данные должны быть записаны, то последний бит
первого байта сбрасывается;
 следующий байт — это байт данных. Он может исходить как от ведущего,
так и от ведомого, в зависимости от состояния бита чтения/записи в
первом байте. Напомним, что данные передаются по 8 бит, начиная со
старшего;
 за байтом данных следует бит подтверждения, равный «ACK» или
«NACK». Если осуществляется процедура считывания данных, то бит
подтверждения генерируется мастером. Если же производится запись
данных, то бит подтверждения должно генерировать ведомое устройство.
Отметим, что процесс формирования бита ACK/NACK в случае шины I2C
заслуживает особенного внимания, поэтому чуть ниже он будет
рассмотрен более подробно;
 после формирования бита подтверждения по шине можно передавать
следующий байт данных (напомним, что количество передаваемых байт
неограниченно);
 посылка завершается стоп-битом, сгенерированным мастером;
 после этого шина считается готовой к осуществлению новой транзакции.
Как было сказано выше, процесс формирования бита подтверждения в
случае шины I2C является нетривиальным. В том случае, когда мастером
осуществляется запись данных в ведомое устройство, бит подтверждения
генерирует ведомый. При этом на время импульса подтверждения мастер
отпускает (переводит в высокое состояние) линию SDA, а ведомое устройство
должно формировать сигнал «ACK», удерживая данную линию в низком уровне
всё время, пока импульс синхронизации SCL равен единице. В том случае, когда
ведомый не может ответить ведущему (например, когда он выполняет в данный
момент какие-либо функции реального времени), линия данных SDA должна
быть оставлена им в высоком состоянии, что будет соответствовать сигналу
«NACK». При возникновении подобной ситуации у мастера остается
возможность выдать стоповый бит для прерывания пересылки данных. В
62
случае, когда мастер считывает данные с ведомого, бит подтверждения после
каждого принятого байта он должен формировать сам. При этом возможны два
варианта. Если ведомый (по мнению мастера) передал еще не всю информацию,
ведущий должен сгенерировать сигнал «ACK». Если же мастер считает
принятый байт последним в посылке, то в этом случае вместо «ACK»
выставляется сигнал «NACK», сообщающий ведомому об окончании транзакции
и требующий от него освободить шину. Подобный подход является крайне
эффективным в тех случаях, когда мастер получает от ведомого (например, от
датчика температуры) непрерывный поток данных. В этом случае ведущему не
нужно для считывания нового значения постоянно начинать новую транзакцию
— достаточно просто не прерывать старую, раз за разом выставляя «ACK» в
ответ на принятые данные. Если же мастеру нужно отвлечься на что-то еще, он
может сформировать «NACK» после приема очередного байта и начать новую
транзакцию только тогда, когда он будет к этому готов. Отметим, что для
описанной работы интерфейса I2C ведомый, передающий данные мастеру,
должен отпускать (т.е. переводить в высокое состояние) линию данных SDA на
время формирования ведущим бита подтверждения.

Достоинства и недостатки изученных интерфейсов

SPI
Достоинства SPI:

 Полнодуплексная передача данных по умолчанию;


 Более высокая пропускная способность по сравнению с I2C;
 Возможность произвольного выбора длины пакета, длина пакета не
ограничена восемью битами;
 Простота аппаратной реализации:
 более низкие требования к энергопотреблению по сравнению с I2C;
 возможно использование в системах с низко стабильной тактовой
частотой;

63
 ведомым устройствам не нужен уникальный адрес, в отличие от I2C;
 Однонаправленный характер сигналов позволяет при необходимости
легко организовать гальваническую развязку между ведущим и
ведомыми устройствами;
 Максимальная тактовая частота ограничена только быстродействием
устройств, участвующих в обмене данными.

Недостатки SPI:
 Необходимо больше выводов, чем для интерфейса I2C;
 Ведомое устройство не может управлять потоком данных;
 Нет подтверждения приема данных со стороны ведомого устройства
(ведущее устройство может передавать данные «в никуда»);
 Нет определенного стандартом протокола обнаружения ошибок;
 Отсутствие официального стандарта, что делает невозможным
сертификацию устройств;
 По дальности передачи данных интерфейс SPI уступает таким стандартам,
как UART;
 Наличие множества вариантов реализации интерфейса.

UART
Достоинства UART:

 Простота реализации;
 Наличие всего лишь двух проводов для создания соединения;
 Хорошая помехозащищенность;
 Возможность передавать данные на относительно большие расстояния
(порядка 1 км);
 Встроенный в протокол способ обнаружения ошибок передачи.

64
Недостатки UART:

 Отсутствие возможности использования нескольких


принимающих/передающих устройств;
 Довольно низкая скорость обмена информацией;

I2C
Основными достоинствами шины I2C являются следующие:
 Поддержка сравнительного большого количества устройств (до 112);
 Даже при большом количестве устройств на шине для ее реализации
достаточно всего двух линий — SDA и SCL;
 На шину легко повесить ведомые устройства разного типа;
 Одновременная поддержка несколько мастеров на одной шине;
 Наличие бита подтверждения (ACK/NACK), облегчающего обработку
ошибок.
К недостаткам рассматриваемой шины можно отнести:
 Увеличение сложности прошивки МК или усложнение аппаратной
части;
 Наличие битов подтверждения снижает максимальную пропускную
способность шины;
 Для нормальной работы шины требуются подтягивающие резисторы,
которые ограничивают тактовую частоту и занимают место на
печатной плате (что особенно критично в системах с ограниченным
свободным пространством). Кроме того, подтягивающие резисторы
увеличивают энергопотребление устройства в целом.

65
ЛЕКЦИЯ 6.
ВТОРИЧНЫЕ ИЗМЕРИТЕЛЬНЫЕ ПРЕОБРАЗОВАТЕЛИ

Общие сведения

На данной лекции будет рассматриваться та часть платы ввода-вывода


МПТ РЗА, которая отвечает за преобразование сигналов от внешних
источников. Эта часть называется входным измерительным преобразователем
(выделена на Рисунок 30), они обеспечивают гальваническую развязку внешних
цепей от внутренних цепей устройства. Одновременно входные
преобразователи осуществляют приведение контролируемых сигналов к
единому виду (обычно — это напряжение) и нормированному уровню. Здесь
принимаются меры по защите внутренних элементов устройства от воздействия
помех и перенапряжений. Различают входные преобразователи аналоговых и
логических сигналов. Первые выполняются так, чтобы обеспечить
максимальную линейность передачи контролируемого сигнала во всём
диапазоне его изменения. Преобразователи логических сигналов, наоборот,
выполняются чувствительными только к узкой области диапазона возможного
нахождения контролируемого сигнала. Такое исполнение позволяет в ряде
случаев избежать неправильного действия устройства релейной защиты.
На Рисунок 30 представлена часть функциональной схемы устройства
аналогового ввода, куда со вторичной обмотки первичных трансформаторов
тока приходят измеренные значения токов, эти токи, соответственно, приходят
на вторичные измерительные преобразователи, где приводятся к одному
уровню и виду — напряжению. После этого преобразованные сигналы в виде
напряжения попадают на фильтры низких частот, которые позволяют срезать
высокочастотные составляющие из сигнала, тем самым защищая от
высокочастотных помех, которые могут повлиять на правильность работы
защиты. Далее отфильтрованные значения напряжения передаются на
устройства-выборки хранения, в которых по сигналу от специального
процессора записываются значения. Это производится с той целью, чтобы все
значения были взяты в единый момент времени. Затем аналоговые сигналы
поступают на мультиплексор, который под управлением специального
66
процессора выбирает один из сигналов и передает его на оцифровку в
аналогово-цифровой преобразователь.

Рисунок 33 – Функциональная схема устройства аналогово ввода ВИП- вторичные


измерительные преобразователи, ФНЧ-фильтр низких частот, УВХ-устройство выборки
хранения, ОР-оптронная развязка, СП -специальный процессор, АЦП-аналогово-цифровой
преобразователь, М-мультиплексор

Входные преобразователи аналоговых-сигналов

Особенностью устройств релейной защиты, выполненных на


микропроцессорной элементной базе, является необходимость приведения
входной информации к одному виду — напряжению, максимальное значение
которого ограничивается входными эксплуатационными параметрами
используемых микросхем. В связи с этим возникает проблема согласования
измерительной части устройств с наиболее распространенными датчиками
информации — электромагнитными измерительными трансформаторами тока и
напряжения с нормированными номинальными уровнями: 1 А, 5 А, 100 В,
100/√3 В. Такие уровни сигналов обеспечивают необходимую
помехоустойчивость, но совершенно неприемлемы для обработки в
электронных схемах. Использование же датчиков с выходными сигналами,
согласованными с требованиями электроники, наталкивается на необходимость
резкого ограничения длины линий связи и, следовательно, размещения
устройства вблизи датчиков информации или применения дополнительных мер
по их защите от помех.

Требования к аналоговым входам МП устройств РЗА


67
Согласно СТО 56947007-29.120.70.241-2017 «Технические требования к
микропроцессорным устройствам РЗА (с Изменениями от 11.12.2019) к
аналоговым входам МП устройств РЗА» предъявляются требования,
приведенные в Таблица 8.
Таблица 8 – Требования к аналоговым входам МП УРЗА

Наименование показателя Значение


Рабочая область значений переменного
напряжения, В
 для фазных входов 0-120
 для входа «разомкнутый 0-200
треугольник»
Диапазон измерений действующих значений
напряжения переменного тока, В
 для фазных входов 0,05-100
 для входа «разомкнутый 5-180
треугольник»
Относительная погрешность измерения
действующего значения напряжения, %, не ±0,5
более
Перегрузочная способность входов
напряжения, В, не менее, длительно:
 для фазных входов 150
 для входа «разомкнутый 250
треугольник»
Диапазон измерений действующих значений
переменного тока, I ном:
 для чувствительных органов тока 0,04-0,1
 для остальных органов 0,1-30
Относительная погрешность измерения
действующего значения силы тока, %, не
более, в диапазонах
 (0,04 – 0,1) I ном ± 1 ,0
 (0,1 – 2,0) I ном ±0,5
 (2 – 30) I ном ± 2 ,5
Перегрузочная способность токовых входов,
не менее, I ном

68
Наименование показателя Значение
 длительно 2
 кратковременно (1 с) 40
Каналы тока и напряжения (аналоговые
входы устройства) должны обеспечивать
гальваническую изоляцию внешних цепей +
от внутренних цепей МП устройства РЗА
Мощность, потребляемая по каждому
аналоговому входу при номинальном токе и
напряжении сигнала, не более
 по цепям тока при I ном, ВА 0,5 (при I ном=1,0 А) / 2,0 (при I ном=5,0 А)
 по цепям напряжения, ВА 0,5

Рассмотрим некоторые требования более подробно. Требования по


диапазону измерений и относительной погрешности влияют на требуемую
разрядность используемого АЦП особенно для каналов тока, так как чем
больше кратность тока, тем больший диапазон требуется поддерживать. Стоит
обратить внимание, что перегрузочная способность по цепям тока составляет
40∙ I ном, т.е. эти цепи должны остаться работоспособными, но к ним уже не
предъявляются требования по точности, главное в данном случае сохранение
работоспособности.
Требование по потребляемой мощности говорит о том, какое должно быть
входное сопротивление соответствующего входа напряжения или тока.
Рассмотрим этот момент подробнее. Определим, какое сопротивление должно
быть у вторичного измерительного преобразователя тока с входным током 1,0 А
2 S 0 ,5
S=UI=I Z → Z= = =0 ,5 Ом ;
I
2
1
Особое внимание требует обратить на требования по гальванической
развязке, так как применение бестрансформаторных схем требует организации
ее другим способом.

Трансформаторные схемы
Преобразование информации в один вид и масштабирование наиболее
часто осуществляются посредством промежуточных ТТ и ТН (Рисунок 34).
Несмотря на то, что такие трансформаторы имеют нелинейные передаточные

69
характеристики, определённый разброс параметров, некоторую температурную
нестабильность, они всё же приемлемы для построения устройств релейной
защиты.
К входным преобразователям предъявляются следующие требования:
минимальные значения амплитудной и фазовой погрешности (особенно в
области низких частот); осуществление требуемого уровня гальванической
развязки первичных и вторичных цепей; габаритные минимальные размеры;
обеспечение необходимой помехозащищенности и пр.

Рисунок 34 – Входные измерительные преобразователи аналоговых сигналов: а) с


промежуточным ТТ, б) с промежуточным ТН

Преобразователи на основе трансформаторов обеспечивают


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

70
снижению межобмоточной ёмкости, по которой возможно попадание
импульсных помех внутрь устройства. С этой целью секционируют вторичную
обмотку или помещают между первичной и вторичной обмотками экранную.
Для защиты электронных элементов от возможных перенапряжений широко
применяют варисторы RU.
Отдельным вопросом применения трансформаторных преобразователей
тока является точность передачи ими апериодических слагающих входных
сигналов, поскольку большинство современных микропроцессорных устройств
РЗА являются одновременно и регистраторами (осциллографами). Не требует
особых объяснений тот факт, что для повышения точности
осциллографирования требуется максимально возможная индуктивность цепи
намагничивания промежуточных ТТ. После использования всех остальных
средств этого можно добиться только увеличением габаритных размеров
трансформаторов.

Бестрансформаторные схемы

Рисунок 35 – Бестрансформаторные схемы: а) с балластным резистором в цепи напряжения,


б) с шунтом в цепи тока

Радикально решить проблему неточности передачи апериодической


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

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

72
ЛЕКЦИЯ 7
ЦИФРОВАЯ ОБРАБОТКА СИГНАЛОВ

Обработка сигнала. Преобразование Фурье

Как известно, математические преобразования по отношению к сигналу


применяются для того, чтобы получить о нем какую-то информацию,
недоступную в исходном виде. Большинство сигналов, встречающихся на
практике, представлены во временной области, т.е. сигнал есть некоторая
функция времени. И при отображении сигнала на графике одной из координат
является ось времени, а другой — ось амплитуд. Данный график называется
амплитудно-временное представление сигнала (Рисунок 36).

Рисунок 36 – Амплитудно-временное представление синусоидального сигнала частотой 50 Гц

Однако для большинства приложений обработки сигнала это


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

73
Рисунок 37 – Амплитудно-временное представление стационарного6 сигнала

Во многих случаях наиболее значимая информация скрыта в частотной


области сигнала. Частотный спектр есть совокупность
частотных(спектральных) компонент, он отображает наличие тех или иных
частот в сигнале.
Тогда каким же образом найти частоту сигнала?
Среди многих известных преобразований сигналов наиболее известным
является преобразование Фурье. И в результате преобразования Фурье сигнала,
заданного во временной области, получается его спектральное представление,
т.е. вместо значений времени по оси абсцисс графика сигнала будут отложены
значения частоты, а ось ординат будет отображать амплитуду той или иной
частоты в сигнале.

6
Понятие стационарного сигнала будет пояснено далее.

74
Рисунок 38 – Наглядная демонстрация преобразования Фурье

Кроме преобразования Фурье существует и много других часто


применяемых преобразований сигнала. Примерами являются преобразование
Гильберта, оконное преобразование Фурье, распределение Вигнера,
преобразование Уолша, вейвлет-преобразование и многие другие. Для каждого
преобразования можно указать наиболее подходящую область применения,
достоинства и недостатки, и вейвлет-преобразование не является в этом смысле
исключением.

Основной недостаток преобразования Фурье. Решение —


Вейвлет-преобразование

Для того чтобы выяснить потребность вейвлет-преобразования,


необходимо рассмотреть несколько подробнее преобразование Фурье. Но
прежде стоит разобраться с понятием стационарного сигнала.
Стационарным называются сигналы, частотное наполнение которых не
меняется во времени.
Если взять преобразование Фурье сигнала электрического тока частотой
50 Гц, то мы получим единственный импульс этой же частоты.
75
Рисунок 39 – Преобразование Фурье синусоиды 50 Гц

А в случае с сигналом, представленным на Рисунок 37 его частотный


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

Рисунок 40 – Частотный спектр стационарного сигнала с Рисунок 37

Получается, что вышеприведенные сигналы являются стационарными, так


как содержащиеся в данных сигналах частоты не изменяются во времени.
Напомним, что преобразование Фурье дает частотную информацию,
содержащуюся в сигнале, т.е. говорит о том, каково содержание каждой частоты
в сигнале. Однако в какой именно момент времени возникла та или иная
76
частота, когда она закончилась — на эти вопросы ответ получить не удастся.
Впрочем, эта информация и не потребуется, если сигнал стационарный.
А как поведет себя преобразование Фурье, если сигнал будет
нестационарным, т.е. если частота будет изменяться во времени, как на Рисунок
41?

Рисунок 41 – Нестационарный сигнал

Рисунок 42 – Частотный спектр нестационарного сигнала

77
Как видим, что на обоих графиках (Рисунок 40 и Рисунок 42) видны две
частотные составляющие 50 и 120 Гц. Кроме неодинаковости амплитуд,
различий спектров нет. Это побочный эффект того, что, используя фильтр
Фурье, нельзя узнать, в какой именно момент времени существует та или иная
частота, поэтому он не пригоден для анализа нестационарных сигналов.
Эффективным решением будет использование Вейвлет-преобразования,
которое позволяет получить частотно-временное представление сигнала.

Понятие вейвлета и его сущности

Слово «вейвлет» является калькой с английского «wavelet», что означает в


переводе «маленькая волна», или «волны, идущие друг за другом». И тот и
другой перевод подходит к определению вейвлетов. Вейвлеты — это семейство
функций, которые локальны во времени и по частоте, и в которых все функции
получаются из одной посредством ее сдвигов и растяжений по оси времени (так,
что они «идут друг за другом»). Математики иногда называют вейвлеты
всплесками.
На Рисунок 43 представлена иллюстрация работы вейвлета, где график
волновой функции накладывается на график сигнала, «вырезая» попавший под
него участок.

Рисунок 43 – Иллюстрация работы вейвлета


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

Критерии вейвлетов

Для осуществления Вейвлет-преобразования функция должна


удовлетворять следующим критериям
1. Нулевое среднее
Среднее значение функции должно быть равно нулю (площадь под
графиком, находящимся ниже оси x должна быть равна площади под графиком,
находящимся над осью x).

∫ ψ ( t ) dt =0
−∞

2. Ограниченность
Квадрат нормы функции должен быть конечным или, иными словами,
функция должна быть локализована на временной оси

‖ψ‖ =∫ |ψ (t )| dt< ∞
2 2

−∞

Примеры вейвлетов

Рассмотрим несколько таких функций. Возьмём косинусоидальный


сигнал, который умножим на Гауссову функцию, а затем построим график
полученного сигнала и его ДПФ

79
Рисунок 44 – Получение вейвлета Морле

Полученная функция называется вейвлетом Морле. И она действительно


удовлетворяет сформулированным выше условиям.
Если взять вторую производную от Гауссовой функции, получим ещё
один вейвлет, который из-за своей причудливой формы называется
«Мексиканская шляпа».

Рисунок 45 – Вейвлет «Мексиканская шляпа»

Итак, было приведено уже два примера непрерывных вейвлетов. Но


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

{
1 , 0≤ x <1/2
ψ [ x ] = −1 , 1/2≤ x< 1
0 , x ∉ [ 0 ,1 ) .
Иллюстрация выражения представлена на Рисунок 46.

Рисунок 46 – Вейвлет Хаара

Преобразование Хаара для одномерного сигнала


Пусть имеется одномерный дискретный входной сигнал S. Каждой паре
соседних элементов ставятся в соответствие два числа:

и .
Повторяя данную операцию для каждого элемента исходного сигнала, на
выходе получают два сигнала, один из которых является огрубленной версией
входного сигнала — , а второй содержит детализирующую информацию,
необходимую для восстановления исходного сигнала. Аналогично,
преобразование Хаара может быть применено к полученному сигналу и т.д.
Рассмотрим разложение сигнала из 8 значений

81
Можно заметить, что — показывает постоянную составляющую, а
—среднее значение за период.

Рисунок 47 – Дискретный сигнал

На рисунке выше изображены два сигнала. Синим цветом первая


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

82
результат.

Получение семейства Вейвлетов

Из каждой рассмотренной выше функции (назовём их материнскими


вейвлетами) можно составить целые семейства вейвлетов. Каждый материнский
вейвлет можно, во-первых, масштабировать (растянуть или сжать), а во-вторых,
сдвинуть влево или вправо вдоль временной оси. Тогда из одного выбранного
материнского вейвлета можно получить семейство вейвлетов в виде
1
произведения масштабного коэффициента « » на исходный вейвлет от
√a
сдвинутого или растянутого аргумента
ψa, τ (t )=
1
√a
∙ψ ( )
t−τ
a
,

где a — масштабный коэффициент, τ — сдвиг по времени.


1
Масштабный коэффициент « » предназначается для того, чтобы
√a
интеграл от квадрата любого вейвлета этого семейства не отличался от такого
интеграла для материнского вейвлета.
Тогда само непосредственно вейвлет-преобразование будет функция от
выбранных нами параметров масштаба и сдвига. И она будет представлять
собой скалярное произведение по всей числовой оси времени от заданной
функции и функции комплексно-сопряженной к выбранному вейвлету из
образованного нами семейства.

W ( a , τ )=∫ f ( t ) ∙ ψ
¿
a, τ ( t ) dt ,
−∞
¿
где f ( t )— анализируемый сигнал, ψ a ,τ ( t ) — комплексно-сопряженный вейвлет.
Если анализирующий вейвлет — действительный, то комплексно-
сопряженная к нему функция равна сама этому вейвлету.
Получается, что в процессе вейвлет-преобразования мы находим
корреляцию исходного сигнала с набором вейвлетов, каждый из которых имеет
различный масштаб и сдвиг относительно начала исследуемого сигнала. В

83
случае, если сигнал на каком-либо участке похож на заданный вейвлет с
заданным масштабом, мы увидим всплеск функции.

84
ЛЕКЦИЯ 8
ОПЕРАЦИОННЫЕ СИСТЕМЫ

Что такое операционная система для микроконтроллера?

В нынешний век высоких технологий все профессионалы знакомы с


термином «операционная система». История ОС начинается с 1960-х годов.
Первые ОС предназначались для больших ЭВМ, а впоследствии — и для
персональных компьютеров. Назначением ОС стало заполнение ниши между
низкоуровневой аппаратурой и высокоуровневыми программами, они
предоставляют программам удобный интерфейс обращения к системным
ресурсам, будь то процессорное время, память или устройства ввода/вывода. С
тех пор технологии шагнули далеко вперед: целую вычислительную систему
(процессор, память, устройства ввода/вывода) разместили на одном кристалле
— появились микроконтроллеры.
Столь удачная концепция ОС не могла не быть применена и к
микроконтроллерам. В настоящее время создано и развивается множество ОС,
ориентированных на выполнение на МК. Однако МК как платформа для
выполнения ОС имеет существенные отличия от современных компьютеров.
Прежде всего, МК работает в режиме реального времени, то есть время
реакции микроконтроллерного устройства на внешнее событие должно быть
строго меньше заданной величины и должно быть сопоставимо со скоростью
протекания внешних процессов. Типичный пример: время реакции на
срабатывание датчика давления в промышленной установке должно быть не
более 5 мс, иначе произойдет авария. Таким образом, ОС для МК — это
операционная система реального времени. К ОСРВ предъявляются жесткие
временные требования в отличие от распространенных ОС общего назначения
(Windows, UNIX-подобные и др.).
Во-вторых, микроконтроллер, по сути, это однокристальный компьютер с
сильно ограниченными аппаратными ресурсами, хотя диапазон выпускаемых
МК по производительности и объемам памяти очень широк. Но тем не менее
все МК имеют существенные аппаратные ограничения, что предъявляет
специфические требования к ОСРВ для МК.
85
Их основные особенности

 Низкая производительность.
 Малый объем ОЗУ и ПЗУ.
 Отсутствие блока управления памятью (Memory management unit,
MMU), используемого большинством современных ОС, например
Windows и UNIX-подобными.
 Отсутствие аппаратных средств поддержки многозадачности
(например, средств быстрого переключения контекста).

В-третьих, микроконтроллер сам по себе предназначен для выполнения


низкоуровневых задач, будь то опрос состояния кнопок, передача команды по
I2C-интерфейсу или включение обмотки электромотора. Программа для МК,
как правило, обращается к периферии напрямую, программист имеет полный
контроль над аппаратной частью, нет необходимости в посредниках между
аппаратурой и прикладной программой. Может показаться, что операционная
система для МК вообще не нужна, что любую программу можно написать и без
ОС. На самом деле так оно и есть! Но есть один нюанс: микроконтроллер редко
используют только для опроса состояния кнопок, только для передачи команды
по I2C-интерфейсу или только для включения обмотки электромотора. Гораздо
чаще из МК пытаются «выжать» все, на что он способен, а в
микроконтроллерное устройство заложить все возможные функции. Количество
функций-задач, одновременно выполняемых МК, может доходить до
нескольких десятков. И вот тут-то и начинаются проблемы.
Как организовать мультизадачность и поочередное выполнение каждой
задачи? Как обеспечить запуск задачи через строго определенные интервалы
времени? Как передать информацию от одной задачи другой? Обычно эти
вопросы не встают перед программистом в начале разработки, а возникают где-
то в середине, когда он запрограммировал большинство функций будущего
устройства, используя изобретенные им самим средства «многозадачности». И
тогда заказчик «просит» добавить еще несколько «маленьких» деталей в работу
устройства, например сбор статистики работы и запись ее на какой-нибудь
носитель.
86
Преимущества и недостатки ОСРВ для МК

Здесь на помощь приходит ОСРВ. Рассмотрим преимущества, которые


получил бы наш гипотетический программист, заложив в основу программного
обеспечения своего устройства ОСРВ
1. Многозадачность. ОСРВ предоставляет программисту готовый,
отлаженный механизм многозадачности. Теперь каждую отдельную
задачу можно программировать по отдельности так, как будто
остальных задач не существует. Например, можно разработать
архитектуру программы, то есть разбить ее на отдельные задачи и
распределить их между командой программистов. Программисту не
нужно заботиться о переключении между задачами: за него это
сделает ОСРВ в соответствии с алгоритмом работы планировщика.
2. Временная база. Необходимо отмерять интервалы времени?
Пожалуйста, любая ОСРВ имеет удобный программный интерфейс
для отсчета интервалов времени и выполнения каких-либо действий
в определенные моменты времени.
3. Обмен данными между задачами. Необходимо передать
информацию от одной задачи к другой без потерь? Используйте
очередь, которая гарантирует, что сообщения дойдут до адресата в
том объеме и в той последовательности, в которой были
отправлены.
4. Синхронизация. Разные задачи обращаются к одному и тому же
аппаратному ресурсу? Используйте мьютексы или критические
секции для организации совместного доступа к ресурсам.
Необходимо выполнять задачи в строгой последовательности или
по наступлении определенного события? Используйте семафоры
или сигналы для синхронизации задач.
Кроме этого, одна и та же ОСРВ для МК может выполняться на
множестве архитектур микроконтроллеров. Какое преимущество это дает?
Часто приходится решать задачу не как разработать устройство с требуемой
функциональностью, а как перенести имеющуюся разработку на новую
аппаратную платформу. Это может быть связано с завершением производства
того или иного МК (окончание Life cycle), с появлением на рынке МК,
87
включающего в состав некоторые блоки, которые ранее были реализованы как
отдельные микросхемы, и т. д. В случае использования ОСРВ затраты времени
и сил на переход на другую платформу будут заметно ниже за счет того, что
часть кода, связанная с работой ОСРВ, останется без изменений. Изменения
коснутся только кода, отвечающего за обращение к встроенной периферии
(таймеры, АЦП, последовательный приемопередатчик и т.д.). Однако за все
надо платить. Использование ОСРВ приводит к определенным накладным
расходам
1. Дополнительный расход памяти программ для хранения ядра ОСРВ.
2. Дополнительный расход памяти данных для хранения стека каждой
задачи, семафоров, очередей, мьютексов и других объектов ядра
операционной системы.
3. Дополнительные затраты времени процессора на переключение
между задачами.
Конечно же, если вам необходимо разработать простейшее устройство,
например индикатор температуры, который будет выполнять две функции:
опрос датчика и индикацию на 7-сегментный светодиодный индикатор, то
применение ОСРВ в таком устройстве будет непозволительным
расточительством и приведет, в конечном счете, к удорожанию устройства.
Итак, применение ОСРВ оправдано в случае использования достаточно
мощного МК при разработке сложного устройства с множеством функций,
например:
1. Опрос датчиков.
2. Интерфейс с пользователем (простейшие клавиатура и дисплей).
3. Выдача управляющего воздействия.
4. Обмен информацией по нескольким внутрисхемным шинам I2C,
SPI, 1-Wire и др.
5. Обмен информацией с внешними устройствами по интерфейсам RS-
232C, RS-485, CAN, Ethernet, USB и др.
6. Реализация высокоуровневых протоколов, например TCP/IP,
ProfiBus, ModBus, CANOpen и др.
7. Поддержка Flash-накопителей и, соответственно, файловой
системы.

88
Обзор FreeRTOS

FreeRTOS — это многозадачная, мультиплатформенная, бесплатная


операционная система жесткого реального времени с открытым исходным
кодом. FreeRTOS была разработана компанией Real Time Engineers Ltd.
специально для встраиваемых систем. Бóльшая часть кода FreeRTOS написана
на языке Си, ассемблерные вставки минимального объема применяются лишь
там, где невозможно применить Си из-за специфики конкретной аппаратной
платформы.
Основные характеристики FreeRTOS
1. Планировщик FreeRTOS поддерживает три типа многозадачности:
 вытесняющую;
 кооперативную;
 гибридную.
2. Размер ядра FreeRTOS составляет всего 4–9 кбайт, в зависимости от
типа платформы и настроек ядра.
3. FreeRTOS написана на языке Си (исходный код ядра представлен в
виде всего лишь четырех Си-файлов).
4. Возможность отслеживать факт переполнения стека.
5. Нет программных ограничений на количество одновременно
выполняемых задач.
6. Нет программных ограничений на количество приоритетов задач.
7. Нет ограничений в использовании приоритетов: нескольким задачам
может быть назначен одинаковый приоритет.
8. Поставляется с отлаженными примерами проектов для каждого
порта и для каждой среды разработки.
9. FreeRTOS полностью бесплатна, модифицированная лицензия GPL
позволяет использовать FreeRTOS в проектах без раскрытия
исходных кодов.

Основы работы ОСРВ

Прежде чем говорить об особенностях FreeRTOS, следует остановиться на


89
основных принципах работы любой ОСРВ и пояснить значение терминов,
которые будут применяться в дальнейшем.
Основой ОСРВ является ядро (Kernel) операционной системы. Ядро
реализует основополагающие функции любой ОС. В ОС общего назначения,
таких как Windows и Linux, ядро позволяет нескольким пользователям
выполнять множество программ на одном компьютере одновременно. Каждая
выполняющаяся программа представляет собой задачу (Task). Если ОС
позволяет одновременно выполнять множество задач, она является
мультизадачной (Multitasking). Большинство процессоров могут выполнять
только одну задачу в один момент времени. Однако при помощи быстрого
переключения между задачами достигается эффект параллельного выполнения
всех задач. На Рисунок 48 показано истинно параллельное выполнение трех
задач.

Рисунок 48 – Истинно параллельное выполнение задач

В реальном же процессоре при работе ОСРВ выполнение задач носит


периодический характер: каждая задача выполняется определенное время, после
чего процессор «переключается» на следующую задачу (Рисунок 49).

Рисунок 49 – Распределение процессорного времени между несколькими задачами в ОСРВ

90
Планировщик (Scheduler) — это часть ядра ОСРВ, которая определяет,
какая из задач, готовых к выполнению, выполняется в данный конкретный
момент времени. Планировщик может приостанавливать, а затем снова
возобновлять выполнение задачи в течение всего ее жизненного цикла (то есть с
момента создания задачи до момента ее уничтожения).
Алгоритм работы планировщика (Scheduling policy) — это алгоритм, по
которому функционирует планировщик для принятия решения, какую задачу
выполнять в данный момент времени. Алгоритм работы планировщика в ОС
общего назначения заключается в предоставлении каждой задаче процессорного
времени в равной пропорции. Алгоритм работы планировщика в ОСРВ
отличается и будет описан ниже.
Среди всех задач в системе в один момент времени может выполняться
только одна задача. Говорят, что она находится в состоянии выполнения.
Остальные задачи в этот момент не выполняются, ожидая, когда планировщик
выделит каждой из них процессорное время. Таким образом, задача может
находиться в двух основных состояниях: выполняться и не выполняться.
Кроме того, что выполнение задачи может быть приостановлено
планировщиком принудительно, задача может сама приостановить свое
выполнение. Это происходит в двух случаях. Первый — это когда задача
«хочет» задержать свое выполнение на определенный промежуток времени (в
таком случае она переходит в состояние сна (sleep)). Второй — когда задача
ожидает освобождения какого-либо аппаратного ресурса (например,
последовательного порта) или наступления какого-то события (event), в этом
случае говорят, что задача блокирована (block). Блокированная или «спящая»
задача не нуждается в процессорном времени до наступления
соответствующего события или истечения определенного интервала времени.
Функции измерения интервалов времени и обслуживания событий берет на себя
ядро ОСРВ.
Пример перехода задачи в блокированное состояние показан на Рисунок
50.

91
Рисунок 50 – Переключение между задачами, которые используют один и тот же аппаратный
ресурс

Задача 1 исполняется на протяжении определенного времени (1). В


момент времени (2) планировщик приостанавливает задачу 1 и возобновляет
выполнение задачи 2 (момент времени (3)). Во время своего выполнения (4)
задача 2 захватывает определенный аппаратный ресурс для своего
единоличного использования. В момент времени (5) планировщик
приостанавливает задачу 2 и восстанавливает задачу 3 (6). Задача 3 пытается
получить доступ к тому же самому аппаратному ресурсу, который занят задачей
2. В результате чего задача 3 блокируется — момент времени (7). Через
некоторое время управление снова получает задача 2, которая завершает работу
с аппаратным ресурсом и освобождает его (9). Когда управление получает
задача 3, она обнаруживает, что аппаратный ресурс свободен, захватывает его и
выполняется до того момента, пока не будет приостановлена планировщиком
(10).
Когда задача выполняется, она, как и любая программа, использует
регистры процессора, память программ и память данных. Вместе эти ресурсы
(регистры, стек и др.) образуют контекст задачи (task execution context).
Контекст задачи целиком и полностью описывает текущее состояние
процессора: флаги процессора, какая инструкция сейчас выполняется, какие
значения загружены в регистры процессора, где в памяти находится вершина
стека и т.д. Задача «не знает», когда ядро ОСРВ приостановит ее выполнение
или, наоборот, возобновит.
На Рисунок 51 (а) показан абстрактный процессор, который выполняет
задачу 1, частью которой является операция сложения. Операнды загружены в

92
регистры Reg1 и Reg2 (инструкции LDI). Пусть перед инструкцией сложения
ADD ядро приостановило задачу 1 и отдало управление задаче 2, которая
использует регистры Reg1 и Reg2 для своих нужд (б). В какой-то момент
времени ядро возобновит выполнение задачи 1 с места, где она была
приостановлена: с инструкции ADD (в). Однако для задачи 1 изменение ее
контекста (регистров Reg1 и Reg2) останется незамеченным, произойдет
сложение, но его результат «с точки зрения» задачи 1 окажется неверным.
Таким образом, одна из основных функций ядра ОСРВ — это обеспечение
идентичности контекста задачи до ее приостановки и после ее восстановления.
Когда ядро приостанавливает задачу, оно должно сохранить контекст задачи, а
при ее восстановлении — восстановить. Процесс сохранения и восстановления
контекста задачи называется переключением контекста (context switching).
Немаловажным понятием является квант времени работы планировщика (tick)
— это жестко фиксированный отрезок времени, в течение которого
планировщик не вмешивается в выполнение задачи. По истечении кванта
времени планировщик получает возможность приостановить текущую задачу и
возобновить следующую, готовую к выполнению. Далее квант времени работы
планировщика будет называться системным квантом. Для отсчета системных
квантов в МК обычно используется прерывание от таймера/счетчика.
Системный квант используется как единица измерения интервалов времени
средствами ОСРВ.

93
Рисунок 51 – Переключение между задачами без переключения контекста

Подводя итог, можно выделить три основные функции ядра любой ОСРВ:

94
1. Работа планировщика, благодаря которой создается эффект
параллельного выполнения нескольких задач за счет быстрого
переключения между ними.
2. Переключение контекста, благодаря которому выполнение одной
задачи не сказывается на остальных задачах (задачи работают
независимо).
3. Временная база, основанная на системном кванте как единице
измерения времени.

Задачи

Любая программа, которая выполняется под управлением FreeRTOS,


представляет собой множество отдельных независимых задач. Каждая задача
выполняется в своем собственном контексте без случайных зависимостей от
других задач и ядра FreeRTOS. Только одна задача из множества может
выполняться в один момент времени, и планировщик ответственен, какая
именно. Планировщик останавливает и возобновляет выполнение всех задач по
очереди, чтобы достичь эффекта одновременного выполнения нескольких задач
на одном процессоре. Так как задача «не знает» об активности планировщика,
то он отвечает за переключение контекста при смене выполняющейся задачи.
Для достижения этого каждая задача имеет свой собственный стек. При смене
задачи ее контекст сохраняется в ее собственном стеке, что позволяет
восстановить контекст при возобновлении задачи.
Как было сказано выше, при грубом приближении задача может
находиться в двух состояниях: выполняться и не выполняться. При подробном
рассмотрении состояние «задача не выполняется» подразделяется на несколько
различных состояний в зависимости от того, как она была остановлена (рис. 5).
Подробно рассмотрим состояния задачи в FreeRTOS. Говорят, что задача
выполняется (running), если в данный момент времени процессор занят ее
выполнением. Состояние готовности (ready) характеризует задачу, готовую к
выполнению, но не выполняющуюся, так как в данный момент времени
процессор занят выполнением другой задачи. Готовые к выполнению задачи (с
одинаковым приоритетом) по очереди переходят в состояние выполнения и
пребывают в нем в течение одного системного кванта, после чего возвращаются
95
в состояние готовности. Задача находится в блокированном состоянии, если она
ожидает наступления временного или внешнего события (event). Например,
вызвав API-функцию vTaskDelay(), задача переведет себя в блокированное
состояние до тех пор, пока не пройдет временной период задержки (delay): это
будет временное событие. Задача блокирована, если она ожидает события,
связанного с другими объектами ядра — очередями и семафорами: это будет
внешнее (по отношению к задаче) событие. Нахождение задачи в
блокированном состоянии ограничено тайм-аутом. То есть если ожидаемое
внешнее событие не наступило в течение тайм-аута, то задача возвращается в
состояние готовности к выполнению. Это предотвращает «подвисание» задачи
при ожидании внешнего события, которое по каким-то причинам никогда не
наступит. Блокированная задача не получает процессорного времени.

Рисунок 52 – Состояния задачи в FreeRTOS

Приостановленная (suspended) задача также не получает процессорного

96
времени, однако, в отличие от блокированного состояния, переход в
приостановленное состояние и выход из него осуществляется в явном виде
вызовом API-функций vTaskSuspend() и xTaskResume(). Тайм-аут для
приостановленного состояния не предусмотрен, и задача может оставаться
приостановленной сколь угодно долго.
В любой программе реального времени есть как менее, так и более
ответственные задачи. Под «ответственностью» задачи здесь понимается время
реакции программы на внешнее событие, которое обрабатывается задачей.
Например, ко времени реакции на срабатывание датчика в производственной
установке предъявляются куда более строгие требования, чем ко времени
реакции на нажатие клавиши на клавиатуре. Для обеспечения преимущества на
выполнение более ответственных задач во FreeRTOS применяется механизм
приоритетов задач (Task priorities). Среди всех задач, находящихся в состоянии
готовности, планировщик отдаст управление той задаче, которая имеет
наивысший приоритет. Задача будет выполняться до тех пор, пока она не будет
блокирована или приостановлена или пока не появится готовая к выполнению
задача с более высоким приоритетом.

97

Вам также может понравиться