Густав Олссон, Джангуидо Пиани - Цифровые системы автоматизации и управления (1087169), страница 111
Текст из файла (страница 111)
10.9 а). Требусмос и фактическое время про буждения процесса не совпадают. О»цибки ожидания накапливаются, если это время рассчитывается так новое время пробуждения = время начала ожидания + интервал По такому алгоритму работает холостой цикл "ждать 10 секунд". Накопленная временная ошибка представляет собой сумму времени, проведенного в очереди " ение времени, необходимого для непосредственного исполнения. Правильное реше»н получается, если отсчет ведется от момента предылущего пробуждения новое время пробуждения = время предыдущего пробуждения + интервал Таким образом, относительное время преобразуется в абсолютное.
На практике н необходимы две команды ша)е ппьп (ге(»»ше); ге1 г»»пе:= ге1 г»шее 10 весов»Ь; 0 1Т 2Т ЗТ 4Т б ждать ждать ждать ждать до момента до момента до момента до момента времени Т времени 2Т времени ЗТ времени 4Т исполнение испап»»впив исполнение исполнение исполнение ЗТ 4Т 2Т 1Т Рнс. 10.9. (а) Неправильный способ определенна момента очередного запуска пернолнческих задач — ошибка времени накапливается; (б) правильное решение — ошибка времени не накапливается 10.6.6. Внутренние подпрограммы операционной системы Типичной ситуацией при программировании в реальном времени является непосредг»венное обращение к подпрограммам операционной системы из-за топ», что в используе"ом языке программирования отсутствует эквивалентное средство.
Обращения к функциям операционной системы также необходимы при работе в сетевой и распределенной 'реле. Операционная система отвечает за все обслуживание прикладных задач, включая Файловые и сетевыс операции. Простое обращение к операционной системе может привести к сложной последовательности действий для доступа к удаленной базе ланных, ьилю илючая все сопутствующие проверки и операции управления, избавляющие приклад- программу от лишних деталей.
Интерфейс операционной системы делает выполнеинет ~аких операции более прозрачным н упрощает написание сложных программ. Многие языки программирования высокого уровня, например С, обеспечивают Инте ерфейс с операционной системой лля непосредственного вызова ее модулей из Испо полняемых процессов. Существуют различные виды программных интерфейсов гоп 5И" "ерационной системой — неп~~редственные вызовы, примитивы и доступ через "блиотечные модули.
Непосредственные (системные) вьшовы осуществляются с помощью конструкИн "н языка высокого уровня, кот"Р ередает Управление подпро! Рамме, являющей- то ая пе е »я частью операционной снстеь' днмые параметры передаются списком, как мы. Необхо и И рн обычном обращении к под Р Р осле завершения системной процедуры и ограмме.
П везу»!ьтат возвращается вызывающей программе, 1в 6, Метопы пРогРаммиРованиЯ в Реальном вРемени 452 Глава 10. Программирование систем реального вр „ меии 453 Так как в многозадачной среде системные программы и примитивы могут в, ызы. ваться одновременно разными процессами, их код всегда реентерабелен. Это и„ озие. ляет избежать конфликтов при прерывании системной программы другим заир„ осол~ требующим ту же услугу из другого контекста.
В некоторых случаях для доступа к внутренним ресурсам операционной сист емм можно использовать библиотечные модули. Эти модули уже предварительно от „,. пилированы, н их остается только связать с основной программой. Необходимо „„ верить по документации системы требуемые параметры, а также механизмы их и дачи и редактирования связей в языке высокого уровня. 10.б.7. Приоритеты процессов и производительность системы Многозадачная операционная система реального времени должна допускать навил. чение приоритетов исполняемым процессам.
Обычно приоритеты являются динамичег. кими, что означает, что во время исполнения они могут изменяться как самими процессами, так и операционной системой. Обычно существуют определенные ограничения и механизмы контроля, которые определяют, кто и как может менять приоритеты. 11азначение приоритетов оказывает серьезное влияние на работу системы в целом. Наиболее важные процессы нли пропессы, время реакции которых жестко от раничено, получают более высокий приоритет. К последним относятся обработчики прерываний. Задачи, выполняющие менее важные действия, например печать, получают более низкий приоритет.
Очевидно, что необходимо обращать внимание на соглашения, используемые в системе относительно того, связан ли более высокий приоритет с бальшим или меньшим числом. Приоритеты имеют относительное значение и оказывая'т влияние только тогда, когда суп1ествуют процессы с разными приоритетами.
В системах реального времени реакция на прерывания отделена от вычислений, требующих значительных ресурсов процессора. Как только происходит событие ияи прерывание, его обработчик немедленно включается в очередь готовых процессия Программы обработчиков прерываний обьгшо компактны, так как они должны «ы вбеги авление печивать быструю реакцию, например ввод новых данных, н передавать управл а,которые более сложным процессам, интенсивно потребляющим ресурсы процессора, к исполняются с более низким приоритетом.
В вышеприведенном примере системы управлении манипулятором роб (Р~" обота (Раз дел 10.6.3) одна задача, которую можно построить как обработчик прерыв ываний, ждег лято а К'""" поступления от датчика новых данных о текущем положении манипуля р'. — за ача должна сразу поступает прерывание от датчика — есть новые данные, — эта задач получить управление. Затем она передает данные о положении прогр .. ог амме их о Рк ботки, требующей больших вычислительных ресурсов.
Эта програл амма не отвечае™ обработку прерываний и может использовать болыне времени для вычислений. ~ее поддает Производительность системы Реального времени значительно труппе оценке, чем систем, использУющих обычные последовательные пР кР -' 'ь я а,лГ !о ная последовательная програмлка исполняется на конкретном проце р ссо е с извести" скоростью, то прогргимма реального времени зависит от поведения окру жающей сред" т. е.
управляемых технических процессов. Общая производительность системы долж' быть достаточной для того, чтобы выполнять все операции и выдавать реву льтаты зз'" тановленное время. Иными словами, система реального времени всегда должн' а быт" говз к максимальной нагрузке, которую может создать технический процесс. В развитых и сложных операционных системах, таких как П)л)1Х и Ъ%пк)олчз )л)Т н и еще большей степени в распределенных операционных системах, доступ к большиниу функций (ввод/вывод, сетевая поддержка и т. д.) происходит через системные выны илн механизм удаленного вызова процедур (раздел 10.5.4).
В прикладных програм„ах для вызова системных функций используется довольно простая нотация, за которой, к правило, стоит длинная последовательность действий операционной системы. Гслн яе;кду двумя процессами, исполняющимися в разных узлах сети, организован прозммный канал, то считывание одного символа из этого канала требует целой серии неРаций в обоих Узлах. ПосколькУ на этн опеРации обычно наложены жесткие огРанияевня по времени, необходимо провести глубокий предварительный анализ прежде, чем иринимать то или иное проектное решение.
Если локальная сеть используется не только ,зрячими реального времени, но и интерактивными пользователями, то от количества и ллтивности последних в значительной мере зависит и ее общая нагрузка, Многозадачные операционные системы имеют команды, показывающие в каждый момент все активные процессы, их текущий статус (например, ожидание ввода/ иывода, ожидание прерывания и т. д,) и долю в потреблении ресурсов процессора с момента последней перезагрузки системы или какого-либо иного события.
Первый и~лг по проверке характеристик системы — анализ ее работы с помощью подобной команды. Выявление процессов, занимающих слишком большуло долю процессорного времени, может быть хорошей отправной точкой для поиска узких мест и оптимизации характеристик системы. Нет ничего плохого в том, если некоторые процессы загружают процессор больше, чем другие, однако разработчик системы должен иметь ясное представление о том, когда это происходит и почему. 10.Б.8.
Тестирование и отладка Локазательство правильности работы программы является обязательным шагом ее разработке. Необходимо проверить, что программа выполняет свои функции без иаибо . вбок. Визуальные и формальные методы позволяют выявить только ограниченное количе т шчество ошибок. На практике это означает, что формальная теория тестирования имеет м т мало смысла, а основную роль играет собственный опыт и "народные программистские" 'кне" предания. Реальное тестирование проводится в "боевых" условиях. Выявл являть ошибки трудно — многие нз них проявляются спорадически и их нельзя вос ° я воспроизвести по желанию.
Никакое доказательство не может гарантировать, го поо~ ам Р 'рамма полностью свободна от ошиоок, и никакие тесты не могут убедить, что ямявлены все ны все ошибки. Цель тестирования — найти как можно большее число ошибок и гаранти >ова Ровать, что программа работает с разумной надежностью. Один из создатеейтео ни опе . р и операционных систем, Эдсгер Дейкстра (Ег)зйег О11)слега), заметил: "ТесиРование может может доказать только наличие ошибок, но не их отсутствие". Тщательный т «ый тест требует соответствующей разработки и подготовки необходиосочетание п ак е пРактических и аналитических тестов. Сначала тестовые процедуры и "ные н ожидаем ы жидаемые результаты описываются в специальном документе.
В процессе стирования ве ння ведется журнал испытаний, который затем сравнивается со специфилцией тестов.' ов. Желательно, чтобы коллектив разработчиков системы отличался от "о, кото ы" рый будет определять процедуры испытаний и проводить их. Р 'естировании систем реа' ' Рсмени существует дополнительная слож Ри тест ауп ного в из-за оольшого количеств ' к взаимосвязей между задачами. Вероята возможны 454 Глава 10. Программирование систем реального вре, мани л т Языки программирования и операционные системы 455 ность внесения новой ошибки при исправлении старой очень велика — имеющ„» "йся опыт разработки программ размером свыше 10 000 строк дает вероятность в пре Ределах от 15 до 50%. Существует два основных метода тестирования — исчерпывающий и на прим ииерах. При исчерпывающелч тестировании проверяются все возможные комбинаци авиа входных и выходных данных.
Очевидно, что этот метод можно использовать лшв вьв случае, если число таких сочетаний невелико. Метод испытаний на примерах используется наиболее часто. Производится з, бор репрезентативного числа сочетаний входа и выхода. Тестовые данные долж„, также включать крайние значения, например находящиеся за пределами допустимо. го диапазона. Тестируемый модуль должен правильно распознать и обработать зти данные.