close

Вход

Забыли?

вход по аккаунту

?

Leontevndd

код для вставкиСкачать
Министерство образования и науки Российской Федерации
Государственное образовательное учреждение
высшего профессионального образования
Санкт-Петербургский государственный университет
аэрокосмического приборостроения
Системы реального времени
Методические указания
к выполнению лабораторных работ
Санкт-Петербург
2011
Составители: А. Е. Леонтьев, М. Д. Поляк, А. В. Яковлев
Рецензент доктор технических наук, профессор Б. В. Соколов
Приводится ряд лабораторных работ, выполняемых в рамках
курса «Системы реального времени». Лабораторные работы основаны на использовании ядра ОСРВ µC/OS-II.
Пособие рассчитано на студентов старших курсов и аспирантов,
специализирующихся в области математического и программного
обеспечения вычислительной техники.
Редактор А. В. Подчепаева
Верстальщик С. Б. Мацапура
Сдано в набор 18.01.11. Подписано к печати 15.02.11.
Формат 60×84 1/16. Бумага офсетная. Усл. печ. л. 2,4.
Уч.-изд. л. 2,6. Тираж 150 экз. Заказ № 50.
Редакционно-издательский центр ГУАП
190000, Санкт-Петербург, Б. Морская ул., 67
© Санкт-Петербургский государственный
университет аэрокосмического
приборостроения (ГУАП), 2011
Предисловие
Операционная система µC/OS-II (читается «микро Си ОС два»,
другие обозначения – MicroC/OS-II, uCOS-II) – операционная система жесткого реального времени (ОСРВ) с поддержкой вытесняющей многозадачности и распространяющаяся в свободном доступе.
Ядро ОСРВ полностью написано на языке программирования Си,
благодаря чему данная операционная система является легко переносимой на различные аппаратные платформы. На данный момент
µC/OS-II портирована более чем на сто различных платформ, среди
которых есть и 8-битные микроконтроллеры. Имеет широкое применение от встроенных бытовых приборов до авиационных комплексов.
Перед выполнением лабораторных работ рекомендуется ознакомиться с учебным пособием [‎1]. В данном пособии содержатся
теоретические материалы по основным понятиям и параметрам систем реального времени, а также описание состава ядра, планировщика, механизмов межзадачного взаимодействия, обработки прерываний и структур работы с памятью.
Данный цикл лабораторных работ предназначен для курса
«Системы реального времени». Исходный код ОСРВ и симулятора предлагается для сборки в интегрированной среде разработки
Microsoft Visual Studio, и его работа протестирована в Microsoft
Visual Studio версий 2003, 2005, 2008 под семейство ОС Windows
XP, Vista и Seven.
3
Лабораторная работа № 1
Многозадачность в µC/OS-II
Теоретическая часть
В данной лабораторной работе необходимо ознакомиться с основами построения программ для µC/OS-II и функциями ОСРВ по организации многозадачной работы.
Рассматриваемая портированная версия µC/OS-II работает поверх ядра ОС Windows с использованием функций Win32 API. При
помощи данных функций создается несколько потоков, управляющих OSCtxSw(), OSTickISR() и другими компонентами µC/OS-II.
Портированная версия предоставляет пользователю возможность запуска и отладки программного кода (рисунок рис. 1), а
также его написание в интегрированной среде программирования,
чтобы затем, в случае необходимости, с минимальными изменениями перенести код на целевую платформу.
На рис. 2 приведена схема взаимодействия пользовательского
приложения, µC/OS-II и ОС Windows.
Задачи µC/OS-II запускаются как потоки Windows в контексте
консольного приложения и стек каждой задачи преобразуется в
стек потока ОС Windows. Системный счетчик µC/OS-II использует
Рис. 1. Пример запущенного приложения µC/OS-II в Windows
4
¨ÉÁÄÇ¿¾ÆÁ¾
Ž $04**
8JO"1*
¨Ç½½¾É¿Ã¹
ÈÇËÇÃÇ»
¨Ç½½¾É¿Ã¹
„ÊоËÐÁùËÁÃÇ»”
¨Ç½½¾É¿Ã¹
ʾŹÍÇÉÇ»
Рис. 2. Поддержка функций приложения µC/OS-II в ОС Windows
мультимедийный таймер, если в заголовочном os_cpu.h объявлен
макрос WIN_MM_TICK или, в противном случае, использует системную
функцию Sleep(). Мультимедийный таймер позволяет эффективнее эмулировать работу в реальном времени, поскольку обладает
большей точностью (1 миллисекунда), чем стандартные программные таймеры Windows.
Критические секции реализуются также за счет системных
функций межзадачного взаимодействия Win32 API, программы
могут использовать все традиционные функции µC/OS-II для синхронизации действий.
Поскольку задачи µC/OS-II являются фактически бесконечными циклами, необходимо отметить, что в ОС Windows использование процессора во время выполнения программ с µC/OS-II будет
близко к 100%, это можно посмотреть в диспетчере задач. Данная
ситуация является нормальным рабочим поведением для консольных программ с бесконечным циклом в ОС Windows.
Описание системных функций µC/OS-II и примеры их использования можно найти в учебном пособии [‎1] и в книге [‎2].
Задание
Необходимо
разработать
программу,
осуществляющую
последовательно-параллельное выполнение задач в ОС µC/OS-II с использованием средств синхронизации. Для создания потоков предлагается использовать функции OSTaskCreate() и OSTaskCreateExt()
(половина потоков создаются с помощью одной функции, половина – с помощью другой).
5
В соответствии с номером варианта задан граф моментов запуска
и порядка выполнения задач, вершины которого являются точками
запуска/завершения задач, дуги – потоками выполнения. В графе
выделяются три группы потоков. Первая группа потоков никак не
синхронизирована. Вторая группа синхронизирована мьютексом
(захватывает мьютекс на время выполнения), и третья – семафорами (передает управление другой нити после каждой итерации).
В процессе своей работы каждая задача выводит свою букву
в консоль. Оценка правильности выполнения лабораторной работы осуществляется следующим образом: если задачи a и b должны
выполняться параллельно, то в консоли должна присутствовать
последовательность вида abababab; если задачи выполняются последовательно, то в консоли присутствует последовательность вида
aaaaabbbbbb, причем после появления первой буквы b, буква a больше не должна появиться в консоли.
В качестве механизмов синхронизации рекомендуется использовать следующие функции:
• OSMutexCreate(), OSMutexPend(), OSMutexPost() – для работы с
мьютексами;
• OSSemCreate(), OSSemPend(), OSSemPost() – для работы с семафорами.
Регламентирование использования того или иного механизма для
синхронизации каждого случая не приводится, однако мьютексы и
семафоры должны быть использованы хотя бы по одному разу.
Варианты заданий приведены ниже.
C
L
G
Q
O
I
B
D
F
H
N
E
J
C
D
B
H
I
L
O
G
E
N F
6
C
I
G
N
F
I
C
G
N
D
B
H
J
F
L
E
I
D
H
C
B
G
J
N
E
F
L
H
N
G
F
B
I
E
C
L
D
I
E
D
B
O
J
F
G
J
N
L
C
H
H
F
C
B
O
J
L
G
D
N
E
F
I
7
C
B
E
D
J
G
H
D
N
E
F
I
C
B
E
J
G
D
H
D
I
E
B
C
H
D
B
L
J
E
H
G
F
G
L
N
I
C
J
F
F
O
G
B
H
J
C
D
I
N
E
D
E B
J
F
C
I
G
H
8
L
N
L
F
E
C
H
G
B
D
I
F
H
C
E
Q
I
D
B
O
J
L
G
O
N
I
L
H
B
C
N
J
Q
G
D
F
O
E
F
C
B
I
D
E
H
L
J
G
I
G
C
N
H
D
B
J
F
L
E
L
C
F
H
D
B
I
E
9
G
N
L
E
L
C
F
H
D
B
I
E
G
N
J
Содержание отчета по данной лабораторной работе должно
включать в себя:
1) титульный лист;
2) задание и номер варианта;
3) описание используемых механизмов ОС;
4) исходный код программы;
5) выводы с указанием использованных механизмов для запуска
каждой новой задачи и пояснением их целесообразности.
10
Лабораторная работа № 2
Почтовые ящики и очереди сообщений
Теоретическая часть
В данной работе необходимо ознакомиться с основами использования механизмов межзадачной синхронизации в µC/OS-II, осуществляющих передачу информации, таких как почтовые ящики
и очереди сообщений.
Почтовые ящики – один из способов синхронизации, доступный
для использования в µC/OS-II, где сообщения могут быть переданы
задаче с помощью специальных сервисов ядра. Почтовый ящик,
также называемый сервисом обмена сообщений – обычно реализован как переменная-указатель. С помощью сервисов, предоставляемых ядром, задача или ISR может оставить сообщение (указатель)
в этом почтовом ящике. Таким образом, одна или несколько задач
могут получать сообщения с помощью данного сервиса.
С каждым почтовым ящиком при помощи функциональности
ядра µC/OS-II связывается список ожидания – на случай, если из
него попытаются получить сообщения одновременно несколько задач. Если задача пытается получить сообщение из пустого ящика –
она будет приостановлена и помещена в список ожидания, пока не
получит сообщение. Обычно ядро позволяет задаче ждать сообщение, пока не истечёт определённое время. Если по истечении этого
времени задача не получает сообщения – она снова запускается и ей
передаётся код ошибки, сигнализирующий, что произошёл таймаут. Существует две схемы выборки задач из списка ожидания:
• по приоритету;
• по принципу First-In-First-Out (FIFO).
На рис. 3 представлена схема работы механизма почтового ящика.
¨ÇÐËÇ»ÔÂØÒÁÃ
¹½¹Ð¹
POST
PEND
¹½¹Ð¹
10
Рис. 3. Почтовый ящик
11
С помощью почтовых ящиков также можно реализовать и бинарные семафоры.
Очереди сообщений также являются одним из способов организации синхронизации. Фактически очередь сообщений представляет собой массив из почтовых ящиков. Для извлечения сообщения из очереди, используется принцип FIFO, однако µC/OS-II позволяет также использовать и механизм Last-In-First-Out.
Как и в случае с почтовыми ящиками, очередь связывается со
списком ожидания – на случай, если к ней обратится несколько задач. В остальном работа очередей схожа со схемой почтовых ящиков (рис. 4).
Описание системных функций µC/OS-II и примеры их использования можно найти в учебном пособии [‎1].
Задание
Необходимо
разработать
программу,
выполняющую
последовательно-параллельное выполнение задач в ОС µC/OSII с использованием средств синхронизации и передачей данных. Для создания потоков предлагается использовать функции
OSTaskCreate() и OSTaskCreateExt() (половина потоков создается с помощью одной функции, половина – с помощью другой).
В соответствии с номером варианта задан граф запуска и выполнения задач, вершины которого являются точками запуска/завершения задач, дуги – потоками выполнения. В графе выделяются
три группы потоков. Первая группа потоков никак не синхронизирована. Вторая группа синхронизирована почтовыми ящиками, и
третья – очередями сообщений.
В процессе своей работы каждая задача выводит свою букву в
консоль. Оценка правильности выполнения лабораторной работы
осуществляется следующим образом: если задачи a и b должны
§Ð¾É¾½ÕÊÇǺҾÆÁÂ
¹½¹Ð¹
POST
10
PEND
0
Рис. 4. Очередь сообщений
12
¹½¹Ð¹
выполняться параллельно, то в консоли должна присутствовать
последовательность вида abababab; если задачи выполняются последовательно, то в консоли присутствует последовательность вида
aaaaabbbbbb, причем после появления первой буквы b, буква a больше не должна появиться в консоли.
В качестве механизмов синхронизации рекомендуется использовать следующие функции:
• OSMboxCreate(), OSMboxPend(), OSMboxPost() – для работы с почтовыми ящиками;
• OSQCreate(), OSQPend(), OSQPost() – для работы с очередями сообщений.
Регламентирование использования того или иного механизма
для синхронизации каждого случая не приводится, однако почтовые ящики и очереди сообщений должны быть использованы хотя
бы по одному разу.
Содержание отчета по данной лабораторной работе должно
включать в себя:
1) титульный лист;
2) задание и номер варианта;
3) описание используемых механизмов ОС;
4) исходный код программы;
5) выводы с указанием использованных механизмов для запуска
каждой новой задачи и пояснением их целесообразности.
13
Лабораторная работа № 3
Работа с памятью.
Обработка массивов измерительной информации
Теоретическая часть
Одной из современных и наиболее динамично развивающихся
систем обработки информации и событийного управления является область автоматизированных систем управления технологическими процессами (АСУ ТП).
Рассмотрим АСУ ТП космического аппарата. Важной особенностью подобной системы является передача телеметрической
информации (ТМИ) об объекте управления по каналу связи «Космос – Земля» (рис. 5), который характеризуется большим числом
искажающих воздействий (помех). На этапе первичной обработки
ТМИ возникают задачи фильтрации, отбора искаженных значений
и замещения отобранных значений (аппроксимации). Поскольку
помехи в канале связи представляют собой случайные воздействия
(атмосферные явления, космическая радиация, магнитное поле
земли и т. п.), которые накладываются на исходный информационный сигнал. Для решения указанных задач применяются вероятностные модели и теория случайных процессов.
Отдельно следует упомянуть о способе передачи данных по каналу связи «Космос – Земля». В столь сложном техническом объекте,
как космический аппарат, имеются тысячи датчиков с частотами
дискретизации от десятков до сотен герц. Крайне нерационально
использовать отдельный канал связи для каждого датчика, поэтому, поскольку датчики цифровые, используется один основной канал связи, а данные со всех датчиков группируются и передаются в
пакетах. Пакет данных несет в себе информацию со всех датчиков в
½¹ËÐÁÃÁ
§¬ ½¹ËÐÁÃÁ
£Ç½ÁÉÇ»¹ÆÁ¾
ÁÆÍÇÉŹÏÁÁ
ùƹÄÊ»ØÀÁ ¨¾É»ÁÐƹØ
ǺɹºÇËù
½¾ÃǽÁÉÇ»¹ÆÁ¾
Á½ÉÀ¹½¹ÐÁ
›ËÇÉÁÐƹØ
ǺɹºÇËù
¹Æ¹ÄÁÀ
ÌÈɹ»Ä¾ÆÁ¾
Рис. 5. Схема передачи ТМИ в АСУ ТП космического аппарата
14
определенный момент времени (так называемый информационный
срез системы).
Пример. Датчиковая система состоит из двух датчиков давления, датчика температуры и датчика угла поворота. Тогда, обозначив пакет данных как массив x[k], k = 4, получим:
⋅ x[0] – значение с первого датчика давления;
⋅ x[1] – значение со второго датчика давления;
⋅ x[2] – значение с датчика температуры;
⋅ x[3] – значение с датчика угла поворота.
В данной работе рассматривается идеализированный случай,
когда частоты дискретизации всех датчиков равны и значения на
выходе всех датчиков имеют один и тот же тип данных, что позволяет объединить их в один массив.
В качестве математического описания зашумленного сигнала часто используется так называемую модель «сигнал плюс
шум» [4, 5]:
y(t) = s(t) + a(t),
где s(t) – информационная составляющая (исходный сигнал);
a(t) – случайная помеха; y(t)– зашумленный сигнал. Очевидно,
что если a(t) – случайная функция, то y(t) также будет случайной
функцией.
Если компонента s(t) медленноменяющаяся по сравнению с
a(t), можно построить фильтр, осуществляющий преобразование
f (y(t)) → s∗ (t),
где s*(t) – некое приближение функции s(t).
Подобный фильтр зачастую является адаптивным, его характеристики изменяются в зависимости от стохастических свойств
процесса y(t). Для построения, настройки и подстройки в процессе
работы такого фильтра необходимо рассчитать вероятностные характеристики случайного процесса y(t) [5].
Основные характеристики дискретного случайного процесса,
заданного на интервале:
• Математическое ожидание: x =
2
• Дисперсия: D = σ =
1 n
∑ xi .
n i=1
1 n
(xi − x )2 .
∑
n i=1
15
• Супремум: sup = max(xi ), i = 1,n.
• Число пересечений случайным процессом нулевого уровня
(число пересечений нуля). Данная характеристика может использоваться, например, для определения доминирующей частоты процесса [6].
Пример. Пусть задан случайный процесс: ξ=[3;7;-1;2;6;-8;1;2;4]. Данный процесс шесть раз пересекает нулевой уровень: первый раз между значениями 7 и -1, второй раз – между -1 и 2, затем
между 6 и -8, -8 и 1, 1 и -2 и в последний раз между -2 и 4.
Задание
Для заданного варианта реализовать алгоритм математического
моделирования и оценки параметров случайного процесса.
Необходимо написать программу, осуществляющую моделирование входных данных с измерителя и их обработку (буферизацию и
расчет вероятностных характеристик) в соответствии с вариантом.
Построить график зависимости времени выполнения алгоритма
(в тиках µC/OS-II) от суммарного объема выделяемой памяти для
двух случаев:
1) для выделения памяти используется malloc;
2) для выделения памяти используются средства работы с памятью µC/OS-II (см. учебное пособие [‎1]).
Пример графика приведен на рис. 6. Следует отметить, что по
обеим осям используется логарифмический масштаб. На основе полученных данных сделать вывод об эффективности средств работы
с памятью µC/OS-II.
Для моделирования входного сигнала с заданным законом распределения можно воспользоваться следующими упрощенными
формулами для преобразования равномерно распределенной величины Ri:
α i = ln Ri – экспоненциальное распределение;
 α = −2 ln R sin (2πR )
i
i+1
 i
– нормальное распределение;

α i+1 = −2 ln Ri sin(2πRi+1 )

α i = −2ln Ri – распределение Рэлея.
Здесь Ri, Ri+1 – равномерно распределенные случайные величины, принимающие значения из диапазона (0; 1). Источником та16
ких чисел является стандартный генератор случайных чисел, имеющийся практически в любом языке программирования. В языке
Си встроенный генератор возвращает целые числа из диапазона [0;
RAND_MAX] (RAND_MAX обычно много больше 1). Чтобы получить равномерно распределенную случайную величину из диапазона (0; 1), рекомендуется воспользоваться функцией:
FP32 randomNumber() //the correct random number generator for (0,1)
{
FP32 scale;
// scale in range [0,1) and filter out «==0» case
do {
scale = rand()/(FP32)(RAND_MAX);
} while (scale == 0);
return scale; //scale is in range (0,1)
}
Программа должна работать по следующей схеме. На каждом
такте работы генерируется случайный пакет ТМИ, каждое поле пакета вычисляется по приведенным выше формулам в соответствии
с вариантом. Смоделированный пакет поступает на вход устройства обработки. Устройство обработки выделяет под поступивший
пакет память в своем буфере. Происходит перерасчет указанной в
варианте характеристики случайного процесса для всех полей пакета. В начале нового такта работы программы генерируется следующий случайный пакет ТМИ.
Варианты заданий представлены ниже.
№
варианта
1
2
3
4
5
6
7
8
9
10
11
12
Закон
распределения
Нормальное (гауссовское) распределение
Экспоненциальное
Рэлеевское
Нормальное
Экспоненциальное
Рэлеевское
Нормальное
Экспоненциальное
Рэлеевское
Нормальное
Экспоненциальное
Рэлеевское
Рассчитываемая
характеристика
Число пересечений нуля
Дисперсия
Математическое ожидание
Поиск супремума
Математическое ожидание
Превышение порогового
значения
Дисперсия
Число пересечений нуля
Поиск супремума
Математическое ожидание
Поиск супремума
Дисперсия
Размер блока
памяти, байт
160
128
192
256
192
128
256
96
128
160
96
160
17
5
10
malloc
µC/OS-II
Время выполнения в тиках µC/OS-II
4
10
3
10
2
10
1
10
0
10
4
10
5
6
10
10
Число блоков памяти (размер блока — 64 байта)
7
10
Рис. 6. График зависимости времени выполнения алгоритма
от объема выделяемой памяти для двух случаев:
для выделения памяти используется функция malloc (прямая линия);
память выделяется самой µC/OS-II (пунктирная линия)
Содержание отчета по данной лабораторной работе должно
включать в себя:
1) титульный лист;
2) задание и номер варианта;
3) график зависимости времени выполнения алгоритма от объема выделяемой памяти при использовании malloc;
4) график зависимости времени выполнения алгоритма от объема выделяемой памяти при использовании средств работы с памятью µC/OS-II;
5) исходный код программы;
6) выводы об эффективности средств работы с памятью µC/OS-II.
18
Лабораторная работа № 4
Обработка прерываний
Теоретическая часть
В данной лабораторной работе необходимо ознакомиться с основами использования и обработки прерываний.
Прерывание (англ. interrupt) – сигнал, сообщающий процессору
о наступлении какого-либо события. При этом выполнение текущей
последовательности команд приостанавливается, и управление передаётся коду обработчика прерывания, который выполняет работу
по обработке события и возвращает управление в прерванный код.
В зависимости от источника возникновения сигнала прерывания делятся на:
• аппаратные – события от периферийных устройств (например,
нажатия клавиш клавиатуры, движение мыши, сигнал от таймера,
сетевой карты или дискового накопителя) – внешние прерывания,
или события в микропроцессоре – (например, деление на ноль) –
внутренние прерывания или исключения;
• программные – инициируются выполняемой программой явным исполнением специальных инструкций, то есть синхронно, а
не асинхронно. Программные прерывания могут служить для вызова сервисов операционной системы.
В данной лабораторной работе будут рассматриваться аппаратные прерывания. Для работы программного кода необходимо написать симулятор, который позволяет контролировать ход выполнения программы и генерировать аппаратные прерывания. Простейший симулятор, генерирующий аппаратное прерывание, а также
программа, реагирующая на это прерывание, приведены в примере
в приложении 2. Также в приложении 2 дано краткое описание
программы (wcos), симулятора (wsim) и функций для создания векторов прерываний (ISR).
Задание
На базе заданий, реализованных в лабораторных работах № 1, 2 необходимо разработать программу, выполняющую
19
последовательно-параллельное выполнение задач в ОС µC/OS-II
с использованием средств синхронизации управляемых прерываниями. Для формирования прерываний необходимо написать симулятор, способный генерировать минимум два различных прерывания.
При срабатывании прерывания от симулятора необходимо с использованием механизма почтового ящика запустить указанную
в варианте задачу. Для этого нужно реализовать два обработчика
прерываний, в которых осуществляется операция отправки сообщения. Задача, указанная в варианте, должна ждать данное сообщение. В случае, когда в варианте указано две задачи, необходимо использовать для каждой из них разные прерывания, когда
указано одно – реализовать два варианта кода и использовать для
запуска задачи сначала один обработчик, затем второй.
Варианты заданий приведены ниже. В вариантах указаны имена задач, которые должны быть запущены при помощи векторов
прерываний, согласно графам состояний из лабораторной работы № 1.
1) e, h
2) a, f
3) c
4) b,f
5) e,h
6) e,g
7) a,e
8) a,i
9) d,g
10) b
11) f
12) a,c
13) a
14) c,p
15) f,e
16) a
17) c
18) e,g
Содержание отчета по данной лабораторной работе должно
включать в себя:
1) титульный лист;
2) задание и номер варианта;
20
3) описание событийного управления с использованием эмуляции прерываний;
4) исходный код программы;
5) выводы с описанием особенностей использования прерываний в системах реального времени в качестве механизмов запуска/
управления задачами.
21
Лабораторная работа № 5
Работа с АЦП
Теоретическая часть
В данной лабораторной работе необходимо ознакомиться с основами работы с аппаратными устройствами путем проведения операций низкоуровневого ввода-вывода.
В качестве устройства рассматривается аналого-цифровой преобразователь сигнала. Аналого-цифровой преобразователь (АЦП) –
устройство, преобразующее входной аналоговый сигнал в дискретный код (цифровой сигнал). Как правило, АЦП – электронное
устройство, преобразующее напряжение в двоичный цифровой
код.
Разрешение АЦП характеризует количество дискретных значений, которые преобразователь может выдать на выходе. Измеряется в битах. Например, АЦП, способный выдать 256 дискретных
значений, имеет разрядность 8 бит, поскольку 28 = 256.
Разрешение может быть также определено в терминах входного
сигнала и выражено, например, в вольтах. Разрешение по напряжению равно разности напряжений, соответствующих максимальному и минимальному выходному коду, делённой на количество
выходных дискретных значений.
Пример 1
Диапазон входных значений – от 0 до 10 вольт;
Разрядность АЦП 12 бит: 212 = 4096 уровней квантования;
Разрешение по напряжению: (10-0)/4096 = 0.00244 вольт =
2.44 мВ.
Пример 2
Диапазон входных значений – от −10 до +10 вольт;
Разрядность АЦП 14 бит: 214 = 16384 уровней квантования;
Разрешение по напряжению: (10-(-10))/16384 = 20/16384 =
0.00122 вольт = 1.22 мВ.
На практике разрешение АЦП ограничено отношением сигнал/
шум входного сигнала. При большой интенсивности шумов на входе АЦП различение соседних уровней входного сигнала становится
невозможным, то есть ухудшается разрешение. При этом реально
22
достижимое разрешение описывается эффективной разрядностью,
которая меньше, чем реальная разрядность АЦП. При преобразовании сильно зашумленного сигнала младшие разряды выходного
кода практически бесполезны, так как содержат шум. Для достижения заявленной разрядности отношение С/Ш входного сигнала
должно быть примерно 6 дБ на каждый бит разрядности.
Линейные АЦП
Большинство АЦП считаются линейными, хотя аналогоцифровое преобразование по сути является нелинейным процессом
(поскольку операция отображения непрерывного пространства в
дискретное – операция нелинейная). Термин линейный применительно к АЦП означает, что диапазон входных значений, отображаемый на выходное цифровое значение, связан по линейному
закону с этим выходным значением, то есть выходное значение k
достигается при диапазоне входных значений от
m(k+b)
до
m(k+1+b),
где m и b – некоторые константы. Константа b, как правило, имеет
значение 0 или −0.5. Если b = 0, АЦП называют квантователь с
ненулевой ступенью (mid-rise), если же b = −0.5, то АЦП называют
квантователь с нулём в центре шага квантования (mid-tread).
Нелинейные АЦП
Если бы плотность вероятности амплитуды входного сигнала имела равномерное распределение, то отношение сигнал/шум
(применительно к шуму квантования) было бы максимально возможным. По этой причине обычно перед квантованием по амплитуде сигнал пропускают через безынерционный преобразователь,
передаточная функция которого повторяет функцию распределения самого сигнала. Это улучшает достоверность передачи сигнала,
так как наиболее важные области амплитуды сигнала квантуются с
лучшим разрешением. Соответственно, при цифро-аналоговом преобразовании потребуется обработать сигнал функцией, обратной
функции распределения исходного сигнала.
8-битные логарифмические АЦП с a-законом или μ-законом
обеспечивают широкий динамический диапазон и имеют высокое
23
разрешение в наиболее критичном диапазоне малых амплитуд; линейный АЦП с подобным качеством передачи должен был бы иметь
разрядность около 12 бит. Подробнее об устройстве АЦП и их программировании см. литературу [3, 7].
Рассматриваемый в данной работе АЦП имеет 3 регистра:
• управляющий регистр (регистр устройства, ADC_CONTROL);
• регистр состояния (ADC_STATUS);
• и регистр данных, состоящий из двух регистров ADC_DATAL и
ADC_DATAH.
Длина первых двух регистров – по 8 бит, длина третьего регистра – 16 бит (по 8 бит для старшего и младшего регистров).
Регистр ADC_CONTROL может содержать комбинацию следующих
флагов:
ADC_INPUT_1 ADC_INPUT_2 ...
ADC_INPUT_8 ADC_CONVERT ADC_DATA_ACK ADC_ENABLE_INT
АЦП преобразует данные со входа #1
АЦП преобразует данные со входа #2
АЦП преобразует данные со входа #8
Если флаг установлен, АЦП должен прочитать данные
с указанного входа и преобразовать их
Флаг установлен, если данные были считаны
программой (АЦП ждет, пока данные не будут
считаны, прежде чем заменять их новыми)
Если флаг установлен, АЦП резрешены прерывания
Только один из входов ADC_INPUT_x может быть указан в один момент времени.
Пример состояния регистра ADC_CONTROL:
ADC_INPUT_5 | ADC_CONVERT | ADC_ENABLE_INT
Интерпретация этого примера такова: преобразовать аналоговый сигнал с входа номер 5 в цифровой код, по готовности результата послать прерывание (так как прерывания разрешены).
Регистр ADC_STATUS может принимать одно из двух значений:
ADC_BUSY
ADC_DATA_READY
АЦП занят
Данные в регистрах ADC_DATAL и ADC_DATAH
подготовлены
Регистры ADC_DATAL и ADC_DATAH могут принимать любые значения.
В данной лабораторной работе имеется некоторое устройство,
в состав которого входят АЦП, ЖК-дисплей, процессор и модуль
памяти. В примере выполнения работы приведена программа, выполняющая следующую последовательность действий:
1) запросить АЦП провести измерения;
24
2) получить с АЦП измеренные значения (с помощью ISR);
3) сохранить их в память;
4) преобразовать данные;
5) записать результат преобразования в память;
6) отобразить результат на дисплее.
Все устройства имеют свои регистры. Регистры АЦП были рассмотрены выше. ЖК-дисплей имеет два регистра: DISPL и DISPH.
Для вывода байта на дисплей его необходимо записать в один из
этих регистров. Необходимо учесть, что АЦП является внешним
устройством относительно рассматриваемого обрабатывающего
устройства, поэтому обращаться к его регистрам нужно через порты ввода-вывода, в то время как дисплей является не съемной частью устройства и его регистры расположены в собственной памяти
устройства.
В памяти устройства имеется также регистр переключателя. Переключатель определяет, какой из 8 каналов является активным
(см. описание регистра ADC_CONTROL АЦП). Регистр переключателя
INPUT_BUTTONS принимает одно из значений ADC_INPUT_x и используется для определения области памяти, значения из которой попадут
на дисплей.
Константы INPUT_x_DATAL и INPUT_x_DATAH задают адреса младшего
и старшего байтов канала с номером x.
Например, если в регистре INPUT_BUTTONS содержится значение
константы ADC_INPUT_3, то в регистры DISPL и DISPH должно быть записано содержимое ячеек памяти с адресами INPUT_3_DATAL и INPUT_3_
DATAH соответственно. При защите лабораторной работы необходимо показать, как при изменении значения регистра INPUT_BUTTONS
автоматически меняется и значение регистров DISPL и DISPH.
Для отладки и демонстрации работы программы с помощью симулятора следует использовать следующие команды TestBench:
• после запуска TestBench и приложения uCOS выбрать в меню
среды TestBench Debug->Trace (пропустить один тик) или Debug>Step (пропустить несколько тиков, сколько именно – задается в
Debug->Step over);
• с помощью пункта меню Event->Add добавить новое событие –
прерывание (INTERRUPT), указав в поле «Interrupt vector» номер
прерывания (по варианту);
• пропустить несколько тиков с помощью команды Debug>Step;
• убедиться, что содержимое регистров DISPL и DISPH изменилось.
25
Перед началом отладки необходимо задать исходные значения
всех регистров во вкладках HW I/O Ports и HW Memory симулятора TestBench. Симулятор не генерирует сигнал для АЦП, соответственно необходимо вручную задавать значения выходных регистров АЦП, чтобы сымитировать его работу.
Задание
Необходимо разработать и отладить с помощью симулятора программу для устройства, состоящего из двух АЦП, двух переключателей и дисплея. Первый переключатель задает номер активного
АЦП, второй переключатель определяет номер активного канала
используемого АЦП. В программе должны выполняться параллельно три задачи: первая осуществляет запросы на выполнение
измерений первым АЦП (если он свободен), вторая – на выполнение измерений вторым АЦП (если он свободен), третья осуществляет вывод на дисплей измерений, полученных с активного АЦП.
Также необходимо написать процедуру для обработки прерывания
АЦП, проверяющую наличие новых данных на выходе АЦП, которые еще не были обработаны программой, и выполняющую их обработку. Таких процедур обработки прерывания АЦП должно быть
две – по одной для каждого АЦП.
Для защиты лабораторной работы необходимо продемонстрировать корректную работу программы при всех значениях переключателей.
Варианты заданий приведены ниже.
№
вариантов
Номер прерывания
первого АЦП
Номер прерывания
второго АЦП
1
0
3
2
2
1
4
7
3
2
5
4
26
Число каналов
АЦП
4
3
6
3
5
4
7
7
6
5
0
5
7
6
1
3
8
7
2
6
Содержание отчета по данной лабораторной работе должно
включать в себя:
1) титульный лист;
2) задание и номер варианта;
3) описание структуры используемого АЦП;
4) исходный код программы;
5) выводы.
27
Лабораторная работа № 6
Разработка механизма синхронизации задач
без использования ОС
Теоретическая часть
В ряде случаев в составе устройства, управляемого микроконтроллером, отсутствует достаточный объем памяти для загрузки в
нее одновременно и ядра ОСРВ и целевой программы. Если объем
памяти программ на плате не велик (менее десятка килобайт), использование даже такой компактной встраиваемой ОСРВ, как µC/
OS-II, не представляется возможным. В подобном случае проблема
синхронизации выполняемых задач в разрабатываемой целевой
программе целиком ложится на программиста, поскольку какиелибо средства организации и синхронизации многозадачности полностью отсутствуют.
Одним из эффективных решений данной проблемы является написание собственной функции диспетчеризации задач, оптимизированной под конкретную программу. Рассмотрим разные способы
реализации многозадачности в программе.
Программы, основанные на циклическом выполнении кода, позволяют создать иллюзию параллельной работы нескольких задач
без использования прерываний путем выполнения в бесконечном
цикле относительно коротких (по времени выполнения) задач на
быстром процессоре [‎8]. Примером подобной системы может служить следующий код:
for(;;) { /* бесконечный цикл */
Process_1();
Process_2();
...
Process_N();
}
Здесь Process_1() … Process_N() – быстро завершающиеся задачи;
при работе такой системы создается впечатление, что они выполняются параллельно.
Другой подход основан на коде, управляемом состояниями.
Такая программа использует вложенные условные операторы if28
then-else, операторы case или конечные автоматы (КНА, Finite
State Automata, FSA; Finite State Machine, FSM), чтобы разбить
выполнение функций на сегменты и реализовывать условные переходы между ними. Важным достоинством использования КНА является возможность их формализованной оптимизации благодаря
хорошо исследованной теории конечных автоматов. Рассмотрим
общий пример:
void process_a(void)
{
for(;;) {
switch(state_a)
{
case 1: phase_a1();
return;
case 2: phase_a2();
return;
case 3: phase_a3();
return;
case 4: phase_a4();
return;
case 5: phase_a5();
return;
}
}
}
void process_b(void)
{
for(;;) {
switch(state_b)
{
case 1: phase_b1();
return;
case 2: phase_b2();
return;
case 3: phase_b3();
return;
case 4: phase_b4();
return;
case 5: phase_b5();
return;
}
}
}
29
В этом примере каждая из двух задач process_a и process_b разбита на пять фаз выполнения. По завершении каждой фазы управление возвращается диспетчеру задач, который выбирает следующую
задачу для выполнения. В данном примере state_a и state_b – глобальные переменные, с помощью которых диспетчер управляет выполнением процессов.
Функция диспетчеризации также может быть реализована с помощью КНА. Общий пример такой функции приведен
ниже:
int mainloop()
{
for(;;) {
switch(state)
{
case STATE_1:
process_a();
process_b();
if ( /* условие перехода */ )
state = STATE_2;
break;
case STATE_2:
process_c();
break;
}
}
}
Задачи process_a и process_b выполняются параллельно, а задача process_c начинает выполняться по их завершении. В качестве
условия перехода КНА из состояния STATE_1 в состояние STATE_2 может быть использован, к примеру, реализуемый с помощью счетчика таймер.
Для запрета одновременного выполнения заданных участков
кода или для поочередного доступа к критическому ресурсу чаще
всего применяются семафоры. Они весьма просты в реализации,
так как позволяют выполнить всего три операции:
• init(n):
счётчик:= n;
• enter():
ждать пока счётчик станет больше 0, после этого уменьшить счётчик
на единицу;
• leave():
увеличить счётчик на единицу.
30
Задание
По аналогии с лабораторными работами № № 1, 2 необходимо разработать программу, осуществляющую последовательнопараллельное выполнение задач с использованием средств синхронизации.
В соответствии с номером варианта задан граф запуска и выполнения задач, вершины которого являются точками запуска/завершения задач, дуги – потоками выполнения (см. лабораторную
работу № 1). В рамках данной работы вершины графа следует трактовать как состояния КНА, а дуги – как переходы из одного состояния в другое.
В процессе своей работы каждая задача выводит свою букву в
консоль. Оценка правильности выполнения лабораторной работы
осуществляется следующим образом: если задачи a и b должны
выполняться параллельно, то в консоли должна присутствовать
последовательность вида abababab; если задачи выполняются последовательно, то в консоли присутствует последовательность вида
aaaaabbbbbb, причем после появления первой буквы b, буква a больше не должна появиться в консоли.
Также следует разработать свой механизм синхронизации задач,
не использующий существующие синхронизационные функции
ОС. Механизм синхронизации задач необходимо разработать самостоятельно. Для запуска задач и организации их последовательнопараллельного выполнения следует разработать программное решение с использованием конечных автоматов, глобальных переменных и флагов. Реализовать средство синхронизации «семафор»
(см. выше) и использовать его для синхронизации задач.
Содержание отчета по данной лабораторной работе должно
включать в себя:
1) титульный лист;
2) задание и номер варианта;
3) описание графа состояния;
4) исходный код программы;
5) выводы с пояснением целесообразности использования графа
в качестве механизма контроля над выполнением задач.
31
Приложение 1
Структура проекта
Типовой проект для µC/OS-II состоит из следующих файлов:
1) os_cfg.h – файл конфигурации µC/OS-II для данной программы;
2) app_cfg.h – файл дополнительных данных для настройки работы программы (например, описание констант, задающих приоритеты для пользовательских задач; константы, задающие размеры стеков задач и т. п.). Данный файл не является обязательным;
3) includes.h – файл содержит директивы, подключающие все
заголовочные файлы, необходимые для работы программы. Данный файл не является обязательным;
4) app.c – файл содержит точку входа в программу и вспомогательные функции, подключает заголовочный файл includes.h (при
его наличии).
32
Приложение 2
Пример программы
Представленный RTOS-симулятор состоит из двух модулей,
которые запускаются на хост-системе (ОС Windows) как обычные
приложения.
Первый модуль (WCOS), используя API-функции операционной
хост-системы описывает аппаратно-зависимые функции симулируемой ОСРВ (например, переключение задач или системный тайминг). Также он позволяет симулировать контроллер прерываний.
Второй модуль (WSim) предоставляет функции для запуска и
контроля симуляции, а также – для симуляции поведения любой
аппаратной платформы.
Схема симулятора изображена на рис. 7.
TestBench
™ÈȹɹËÆÔÂÁÆ˾É;ÂÊ
«¹ÂžÉÈɾÉÔ»¹ÆÁØ
›ÔÀÇ»ÍÌÆÃÏÁÂ
HAL
­ÌÆÃÏÁÁ»»Ç½¹»Ô»Ç½¹
¸½ÉÇ RTOS
¡Æ˾É;ÂÊÈÉÁÄÇ¿¾ÆÁØ
¹½¹Ð¹ ¹½¹Ð¹ ¹½¹Ð¹O
*43
*43
*43O
Рис. 7. Схема симулятора
33
Первое приложение (TestBench) выполняет следующие основные функции:
• генератор временной базы, определяющий минимальный временной шаг симуляции;
• уведомление о запросе прерывания (модуль WSim уведомляет
модуль WCOS о том, что было запрошено прерывание);
• симулятор поведения программного обеспечения (позволяет
написать собственные функции-перехватчики на языке C, которые
описывают поведение симулируемых периферийных устройств);
• запускает и контролирует процесс симуляции;
• делает возможным вносить изменения напрямую в память или
менять значения на портах ввода/вывода;
• визуализировать запросы встроенного приложения и собирать
различную RTOS-статистику.
Второе приложение (RTOS) является разработанным встроенным приложением, которое включает в себя ядро uC/OS-II. Ядро
требует существования HAL (уровня абстракции аппаратного обеспечения), который, фактически, описывается WCOS-модулем.
WCOS так же предоставляет некоторые API-функции (установка
пользовательских ISR (interrupt service routines) адресов).
Ключевыми свойствами WSim/WCOS-симулятора являются:
• работа в реальном времени, с кратчайшим временным шагом 1
миллисекунда;
• взаимодействие со стандартными отладчиками для Win32
платформ;
• лёгкий перенос исходного кода с симулируемой платформы на
реальную.
WCOS (Windows C Operating System) представляет собой порт
ядра uC/OS-II для Windows-систем (9x, ME, 2000, XP), работающих на платформе Intel (32-bit). Ниже приведен набор констант и
API-функций, предоставляемый WCOS.
#define
BYTE
INT8S
#define UBYTE INT8U
#define WORD INT16S
#define UWORD INT16U
#define LONG INT32S
#define ULONG INT32U // uC/OS v1.00
совместимые типы данных
#define OS_ENTER_CRITICAL() EnterCriticalSection(&WCCritSe
ct);
34
#define OS_EXIT_CRITICAL() LeaveCriticalSection(&WCCritSe
ct);
#define OS_STK_GROWTH 1
#define OS_TASK_SW() OSCtxSw()
typedef
INT32U
OS_STK;
typedef void (CALLBACK USERISR)(void);
// прототип
пользовательской ISR функции
typedef USERISR FAR *LPUSERISR; // указатель на
пользовательскую ISR
Листинг 1. WCOS_API: Константы и типы данных
int
WCInit(BOOLEAN onErrorExit);
// инициализация Windows C Operating System (!ОБЯЗАТЕЛЬНО!
должна быть вызвана перед OSInit())
void
WCExit(BOOLEAN shutdown);
// завершение работы Windows C Operating System (WCOS)
int
WCSetIntVect(HW_INTERRUPT_TYPE intvect, LPUSERISR userisr);
// устанавливает ISR
UINT WCGetTicksPerSec(void);
// возвращает количество тактов за одну секунду
BOOLEAN
WCIsWSimReady(void);
// вовзращает флаг готовности WSim
Листинг 2. WCOS_API: Прототипы public-функций
WSim (Windows Simulation Environment) – это инструментальная библиотека, предоставляющая функции для запуска и контроля Windows C Operating System, а так же – для симуляции поведения аппаратного обеспечения.
define�������������������������������������������������������������
����������������������������������������������������
WS��������������������������������������������������
_�������������������������������������������������
TIME���������������������������������������������
_��������������������������������������������
NOW�����������������������������������������
-1 // непосредственное //время наступления события, может быть использовано
// в качестве
первого //параметра функции WSAddEvent
typedef enum
{
WS_STATE_READY
= 0,
35
WS_STATE_RUNNING = 1,
WS_STATE_SUSPENDED
= 2,
WS_STATE_TERMINATED
= 3
} ���������������������������������������������������������������������
WS�������������������������������������������������������������������
_������������������������������������������������������������������
STATE�������������������������������������������������������������
; //тип данных, описывающий состояние симуляции
typedef struct wsevent
{
INT32U
// время наступления события
INT8U
// команда управления
HW_INTERRUPT_TYPE
вектора прерывания
struct wsevent
указатель на следующее событие
struct wsevent
указатель на предыдущее событие
} WS_EVENT;
event list datatype
time;
cmd;
intvect; // битовая маска
*next;
//
*prev;
//
//
typedef void (CALLBACK USERHOOK)(INT32U time); // ������������������
прототип����������
���������
пользовательской Hook-функции
typedef���������������������������������������������������������������
��������������������������������������������������������������
USERHOOK������������������������������������������������������
�����������������������������������������������������
FAR��������������������������������������������������
*������������������������������������������������
LPUSERHOOK��������������������������������������
; // указатель на пользовательскую hook-функцию
Листинг 3. WSim_API: Константы и типы данных
int
WSInit(BOOLEAN onErrorExit, UINT timerperiod);
// инициализация Windows Simulation Environment (следует
вызывать первой)
void
WSExit(BOOLEAN shutdown);
// уничтожает �������������������������������������������
Windows������������������������������������
�����������������������������������
Simulation�������������������������
������������������������
Environment�������������
(следует вызывать последней)
int
WSBegin(void);
// начало симуляции (единственная команда, чтобы начать
симуляцию)
int
WSEnd(void);
// останавливает симуляцию и уничтожает WCOS
int
int
36
WSSuspend(void);
// замораживает симуляцию
WSResume(void);
// продолжает замороженную симуляцию
int
WSReset(BOOLEAN onErrorExit, UINT timerperiod);
// сброс симуляции (при надобности, уничтожает WCOS)
WS_EVENT* WSPeekEvent(void);
// ищет событие в списке готовых событий
void
vect);
WSAddEvent(INT32U time, INT8U cmd, HW_INTERRUPT_TYPE int-
int
intvect);
WSRemoveEvent(INT32U time, INT8U cmd, HW_INTERRUPT_TYPE
// добавляет событие к списку готовых событий
// удаляет событие из списка готовых событий
int
WSRegisterUserHook(LPUSERHOOK userhook);
// регистрирует пользовательскую hook-функцию
int
WSDeleteUserHook(void);
// удаляет пользовательскую hook-функцию
WS_STATE
WSGetState(void);
// возвращает состояние симуляции
INT32U
WSGetSimTime(void);
// возвращает время симуляции
UINT
WSGetTimerPeriod(void);
// возвращает временной период
void WSGetSystemInfo(OS_SYSTEM_INFO *si);
// заполняет системную информационную структуру
int
WSGetRunTime(FP64 *runtime);
// получает время работы WCOS
BOOLEAN
WSIsWCOSReady(void);
// возвращает флаг готовности WCOS
Листинг 4. WSim_API: Прототипы public-функций
В качестве примера рассмотрим создание программы, которая
регистрирует семь пользовательских прерываний, а также четыре пользовательских задачи. Срабатывание прерывания и выполнение задачи отражается с помощью выводов соответствующей
37
информации в консоль. Необходимо обратить внимание, что одна
из задач – TaskStart, служит для отслеживания нажатия клавиши
Esc (символ 27), при нажатии которой происходит выход из программы.
Исходный код данной программы хранится в main.c, рассмотрим его фрагменты:
#include
“includes.h”
//содержит список необходимых заголовочных файлов
#define
задач
TASK_STK_SIZE 1024 //задание величины стека
#define
TASK_START_PRIO 10 //задание приоритета задачи
#define TASK_1_PRIO 11
#define TASK_2_PRIO 12
#define TASK_3_PRIO 13
OS_STK
OS_STK
OS_STK
OS_STK
void
void
void
void
TaskStartStk[TASK_STK_SIZE]; //создание стека задачи
Task1Stk[TASK_STK_SIZE];
Task2Stk[TASK_STK_SIZE];
Task3Stk[TASK_STK_SIZE];
TaskStart(void *data); //объявление задачи
Task1(void *data);
Task2(void *data);
Task3(void *data);
void CALLBACK myint0handler(void)
{
printf(«\n *** INT0 *** %d\n», OSTime);
}
//создание прерывания
....
int main(void)
{
WCInit(TRUE); //инициализация WCOS
WCSetIntVect(HW_INTERRUPT_0, &myint0handler);
//регистрируем наше прерывание
....
OSInit(); //инициализация операционной системы
OSTaskCreate(TaskStart, 0, (void *)&TaskStartStk[TASK_STK_SIZE
- 1], ���������������������������������������������������������������
TASK�����������������������������������������������������������
_����������������������������������������������������������
START�����������������������������������������������������
_����������������������������������������������������
PRIO������������������������������������������������
);//регистрируем в операционной системе нашу задачу
....
38
OSStart(); //старт операционной системы
}
return 0;
//теперь описываем, что будут делать наши задачи
void TaskStart(void *data)
{
data = data;
for (;;)
{
if (kbhit())
if (getch() == 27)
break;
OSTimeDlyHMSM(0, 0, 1, 0);
//задержка выполнения задачи, в формате (часы, минуты, секунды, миллисекунды)
}
WCOS
}
WCExit(TRUE);//когда прекращается цикл - происходит выход из
void Task1(void *data)
{
data = data;
for (;;)
{
тактах
}
printf(“1”);
OSTimeDly(750); //и это тоже задержка, измеряется в
}
Необходимо обратить внимание на то, что для компиляции проекта необходимы исходные файлы самой операционной системы
uC/OS-II. Пути к различным исходным файлам этой системы в данном случае хранятся в файле uC/OS-II.
Далее рассмотрим исходный файл симулятора WSim.
#include <windows.h>
#include <stdio.h>
39
#include <conio.h>
#include “wsim_api.h”
int main(void)
{
FP64 runtime;
int c;
WSInit(TRUE, 0);//инициализация симулятора
....
while (1)
{
switch (c = getch())
{
case ‘1’ : printf(«1 - begin\t%d\n», WSGetSimTime());
WSBegin(); break;
//если пользователь ввёл 1 - начать задачу
case ‘2’ : printf(«2 - suspend\t%d\n», WSGetSimTime());
WSSuspend(); break;
//2 - приостановить
case ‘3’ : printf(«3 - resume\t%d\n», WSGetSimTime());
WSResume(); break;
//3 - продолжить
case ‘4’ : printf(“4 - end\t%d\n”, WSGetSimTime());
WSEnd(); break;
//4 - закончить выполнение задачи
}
if (c == 27) break;
//при нажатии Esc - выйти из цикла для дальнейших действий
}
WSEnd();//закончить задачу
WSGetRunTime(&runtime);//получить время выполнения задачи
printf(«\nruntime: %f\n», runtime);
WSExit(TRUE);//выйти из симулятора
}
40
....
Как видно в примере, исполняемый файл предоставляет интерфейс для управления выполнением написанной программой, а
также может выводить определенную статическую информацию, в
данном случае – время выполнения программы.
Необходимо обратить внимание, что при запуске написанного
приложения, всегда сначала надо запускать симулятор, и лишь
потом – программу. В противном случае, программа работать не
будет. Также необходимо заметить, что симулятор должен быть запущен на протяжении всего времени работы программы.
41
Библиографический список
1. Системы реального времени: учебное пособие / А. Е. Леонтьев,
М. Д. Поляк, А. В. Яковлев. СПбГУАП. СПб., 2010.
2. Jean J. Labrosse. μC/OS-II, The Real-Time Kernel
3. Jean J. Labrosse. Embedded Systems Building Blocks, Second
Edition.
4. Тихонов В. И., Хименко В. И. Выбросы траекторий случайных
процессов. М.: Наука, 1987.
5. Волгин В. В., Каримов Р. Н. Оценка корреляционных функций
в промышленных системах управления. М.: Энергия, 1979.
6. Кедем Б. Спектральный анализ и различение сигналов по пересечениям нуля // ТИИЭР, ноябрь 1986.
7. Аналого-цифровое преобразование. М.: Техносфера, 2007.
8. Laplante, Phillip A. Real-time systems design and analysis:
an engineer’s handbook. 3rd ed. IEEE Press, Wiley-Interscience.
ISBN 0-471-22855-9.
42
Содержание
Введение........................................................................... Лабораторная работа № 1. Многозадачность в µC/OS-II............ Лабораторная работа № 2. Почтовые ящики и очереди
сообщений........................................................................ Лабораторная работа № 3. Работа с памятью. Обработка
массивов измерительной информации................................... Лабораторная работа № 4. Обработка прерываний.................. Лабораторная работа № 5. Работа с АЦП............................... Лабораторная работа № 6. Разработка механизма
синхронизации задач без использования ОС........................... Приложение 1. Структура проекта....................................... Приложение 2. Пример программы...................................... Библиографический список................................................. 3
4
11
14
19
22
28
32
33
42
43
Документ
Категория
Без категории
Просмотров
2
Размер файла
1 403 Кб
Теги
leontevndd
1/--страниц
Пожаловаться на содержимое документа