Команды программы выполняются последовательно

Одна из особенностей Linux- и Unix-подобных операционных систем, возможность мощная, но, в то же время, вызывающая немало путаницы, заключается в том, что в этих системах до одной и той же цели можно добраться разными путями. Возьмём, например, что-то простое, вроде запуска последовательностей команд. Как это сделать?

Пожалуй, самый очевидный ответ на этот вопрос заключается в написании shell-скрипта. Это — потрясающе гибкий подход к решению подобной задачи. Но что если нужно всего лишь запустить несколько команд, по возможности ничем не усложняя себе жизнь? Выглядит такая задача весьма простой, но существует множество способов решить её — от простого ввода этих команд в командной строке, до планирования их запуска. За выполняющимися командами, кроме того, можно наблюдать, организовав мониторинг очереди задач так, как он может быть организован на мейнфрейме.

Поговорим о запуске команд в Linux, рассмотрим несколько способов запуска последовательностей команд из bash (и из многих других оболочек Linux). Здесь мы коснёмся таких вопросов, как использование утилит cron и at , поговорим о системе пакетного выполнения команд с использованием очереди (task spooler). Я, как и в большинстве случаев обсуждения возможностей Linux, не могу сказать, что то, о чём я хочу рассказать, хотя бы близко подходит к полному освещению способов запуска команд в Linux. Но я надеюсь, что мой рассказ даст вам некоторые идеи относительно управления выполнением последовательностей команд.

Scratch_Lesson_23. Последовательное выполнение команд исполнителями


Все переводы серии

Запуск команд из командной оболочки

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

date ; df ; free

Этот приём работает в большинстве командных оболочек, которые более или менее похожи на bash. Он хорошо подходит для запуска простого набора команд. Команды просто выполняются последовательно. Но что если надо запустить нечто вроде такой конструкции:

Не запускайте эту последовательность команд в реальной системе!

Нам нужно стереть в папке foo все файлы (но не подпапки — для этого нужен ключ -r ). А что если не удастся выполнить команду cd ? Тогда будут стёрты все файлы в текущей папке. А это — очень плохая идея, которая, к тому же, нарушает правило наименьшего удивления.

Защититься от вышеописанной проблемы можно, воспользовавшись оператором . Эта последовательность символов, как и в языке C, представляет собой оператор И . Практически все Linux-команды возвращают, успешно отработав, 0, что воспринимается как истинное значение, а все остальные значения, указывающие на ошибки, считаются ложными. Это позволяет программистам возвращать коды ошибок при возникновении в программах каких-то проблем. Вот более удачный вариант вышеописанного примера:

Задание 5_ОГЭ информатика (2)


cd /foo ls # команда rm тут не используется, поэтому эта конструкция ничего не испортит

Если директория foo существует — команда cd вернёт 0, который будет воспринят как истинное значение. Это означает, что результат операции И может быть истинным. Поэтому работа продолжается и выполняется команда ls . А вот если команду cd выполнить не удастся — результат будет ложным.

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

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

Более длинная конструкция, в которой используется (тут тоже есть rm, поэтому будьте очень осторожны, пытаясь запустить нечто подобное в реальной системе)

В ситуациях, подобных вышеописанной, может найти применение ещё один оператор — || ( ИЛИ ). Он позволяет завершить работу после того, как хотя бы одна команда вернёт истинное значение, то есть — отработает успешно. Например:

grep «alw» /etc/passwd || echo No such user

Использование ||

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

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

Читайте также:
Программа которая разбирает предложения

Планирование запуска команд в определённое время

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

Файл crontab редактируют, пользуясь одноимённой командой ( crontab -e ). Каждая строка этого файла, не являющаяся комментарием, описывает некую команду, которую нужно выполнить. Первая часть такого описания сообщает о том, когда именно нужно выполнить команду. Вторая часть содержит указание на саму команду. Например, вот запись, позволяющая запустить команду обновления duckdns:

*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>https://habr.com/ru/companies/ruvds/articles/536958/» target=»_blank»]habr.com[/mask_link]

Последовательность работы ПК при выполнении программы

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

Каждая команда программы начинает исполняться сразу, как только ее адрес (смещение) поступит в регистр микропроцессора Instruction Pointer (IP). Для выполнения любой, даже самой короткой команды в МП типа CISC требуется несколько тактов.

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

l в регистр IP поступает сигнал считывания информации, и считанный код адреса смещения команды (Асмещ) поступит на вход узла формирования адреса в УУ;

l на второй вход этого устройства из МПП поступит считанный из регистра сегмента кода (CS) начальный адрес кодового сегмента;

l в УФА эти коды сложатся и сформируется абсолютный адрес команды по формуле

l абсолютный адрес по кодовым шинам адреса (КША) поступит в регистр адреса оперативного запоминающего устройства (ОЗУ), и будет подготовлена соответствующая этому адресу ячейка памяти для считывания информации;

l в ОЗУ поступит управляющий импульс считывания, и код команды из ячеек памяти будет передан на кодовые шины данных (КШД). Количество считанных ячеек зависит от длины кода считываемой команды;

l по КШД код команды пройдет на регистр данных ОЗУ и будет записан обратно в ячейки памяти, из которых он считывался (будет регенерирован);

l одновременно по тем же КШД код команды пройдет в УУ и будет записан в БРК.

Второй и последующие такты команды зависят от кода этой команды, и в первую очередь, от кода операции (КОП). Рассмотрим дальнейшую работу ПК применительно к выполнению ассемблерной команды ADD AX, Pole.

2. В соответствии с данной командой на втором такте должен быть расшифрован код операции команды для определения набора управляющих сигналов, необходимых для выполнения команды, из регистра АХ считано первое число, участвующее в операции, и это число помещено в регистр Рег1 АЛУ. Для этого:

l в начале второго такта выполнения команды код операции, соответствующий мнемонике ADD, поступит из БРК на вход дешифратора операций (ДШО) устройства управления, в котором по данному коду будет выбрана одна из шин;

l эта шина является адресной шиной ПЗУ микропрограмм, инициирующей группу ячеек памяти, содержащих сигналы, необходимые для управления выполнением операции сложения. Под действием этих управляющих сигналов в этом же втором такте из БРК будет считан адрес первого числа — АХ, код которого пройдет транзитом через УФА и по КША поступит в МПП;

l в МПП будет подготовлен для работы регистр АХ и из этого регистра будет считано первое число, которое по КШД пройдет в Рег1 АЛУ.

3. На третьем такте выполнения команды ADD AX, Pole из инициированных ячеек ПЗУ микропрограмм будут считаны сигналы, которые выполнят следующие действия:

l считают второй адрес из команды, находящейся в БРК. Символическое имя этого адреса Pole, но в коде машинной команды будет находиться уже двоичный код адреса Асмещ, взятый из таблицы адресов именованных полей памяти (эту таблицу можно видеть в конце листинга программы);

Читайте также:
Microsoft excel описание программы

l передадут этот адрес на вход УФА. На второй вход УФА поступит начальный адрес сегмента данных Асегм из регистра DS. В УФА будет сформирован абсолютный адрес второго числа:

(составляющие Абаз и Аинд в команде не использованы);

l адрес Аабс по КША пройдет в ОЗУ, где по этому адресу будет считано второе число;

l по КШД считанное число поступит в Рег2 АЛУ и обратно в ОЗУ для регенерации.

4. На четвертом такте все управляющие сигналы поступят в АЛУ, где:

l число из Рег1 будет передано на один вход сумматора;

l число из Рег2 будет передано на второй вход сумматора;

l в сумматоре числа сложатся и сумма поступит в Рег1 АЛУ.

5. В пятом последнем такте выполнения команды ADD AX, Pole сумма чисел из АЛУ должна быть передана и записана в регистр АХ МПП, а в регистре IP — сформирован адрес смещения следующей команды программы. Для этого:

l из кода команды в БРК будет считан первый адрес — АХ, который транзитом через УФА пройдет по КША в МПП, где инициирует для приема информации регистр АХ;

l из Рег1 АЛУ будет считана сумма чисел, которая по КШД пройдет на вход МПП и будет записана в регистр АХ;

l в регистр IP будет добавлено число 6, равное длине выполненной команды (в нашем случае команда ADD AX, Pole имеет длину 6 байтов);

Поскольку в регистре IP сменился код адреса смещения, ПК приступит к выполнению следующей команды программы.

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

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Источник: studopedia.ru

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

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

Переход или пропуск команды осуществляется, если условие выполняется. Переход возможен, как вперед (максимум через 63 команды), так и назад (максимум через 64) команды.

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

Переход может быть осуществлен:

а) по результату сравнения двух регистров общего назначения или регистра общего назначения с константой. Возможные варианты сравнения: Rd = Rr (Rd = K), Rd ¹ Rr (Rd ¹ K), Rd < Rr (Rd < K), Rd ≥ Rr (Rd ≥ K);

б) по значению одного из битов (установлен или сброшен) в регистре статуса (SREG).

Пропуск команды может быть осуществлен:

а) при равенстве двух регистров общего назначения (Rd = Rr);

б) по значению одного из битов (установлен или сброшен) в регистрах общего назначения (РОН)

в) по значению одного из битов (установлен или сброшен) в 32 младших регистрах I/O.

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

Количество повторений цикла известно.

LDI R16,К; установка счетчика циклов.

CIKL:; метка начала цикла.

…; начало тела цикла.

…; конец тела цикла.

DEC R16; уменьшение счетчика циклов на 1.

CPI R16,0; проверка числа выполненных циклов.

BRNE CIKL; переход на метку CIKL, если заданное число циклов не

…; выполнено, т.е результат сравнения не 0. Если резуль-

; тат сравнения 0,то выход из цикла и выполнение сле-

Значение К может лежать в диапазоне 1…255. Если необходимое число повторений больше 255, то можно организовать повторение самого цикла. В этом случае цикл может иметь вид:

LDI R17,К; установка внешнего счетчика циклов.

LDI R16,К; установка внутреннего счетчика циклов.

CIKL2:; метка начала внешнего цикла.

CIKL1:; метка начала внутреннего цикла.

…; начало тела цикла.

…; конец тела цикла.

DEC R16; уменьшение счетчика внутренних циклов на 1.

CPI R16,0; проверка числа выполненных внутренних циклов.

BRNE CIKL1; переход на мет CIKL1, если заданное число внутрен-

Читайте также:
Программа которая увеличивает диск с

; них циклов не выполнено.

DEC R17; уменьшение счетчика внешних циклов на 1.

CPI R17,0; проверка числа выполненных внешних циклов.

BRNE CIKL2; переход на мет CIKL, если заданное число внешних

…; циклов не выполнено, т.е результат сравнения не 0.

; Если результат сравнения 0,то выход из цикла и

; выполнение следующей команды.

При необходимости изменения числа повторения цикла в процессе выполнения программы, например, задания числа повторения с внешних устройств через порт А, вместо команды LDI R17,К используется команда IN R17,PINA.

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

CIKL:; начало цикла.

CP R1,R2; проверка соблюдения условия выхода из цикла.

BREQ WYX; переход на метку WYX, выход из цикла при соблюдении

…; начало тела цикла.

…; конец тела цикла.

RJMP CIKL; переход на начало цикла.

WYX:; метка перехода из цикла при соблюдении условия.

В таком варианте проверка соблюдения условия выхода из цикла осуществляется до выполнения цикла, и если условие соблюдается сразу, то цикл не будет выполнен вообще.

Ниже приведен вариант цикла, в котором соблюдение условия выхода из цикла проверяется после выполнения цикла. В этом случае при любых условиях цикл будет выполнен хотя бы один раз.

CIKL:; начало цикла.

…; начало тела цикла.

…; конец тела цикла.

CP R1,R2; проверка соблюдения условия выхода из цикла.

BREQ WYX; переход на метку WYX, выход из цикла при соблюдении

RJMP CIKL; переход на начало цикла.

WYX:; метка перехода из цикла при соблюдении условия.

Пример организации цикла при тестировании бита (в данном случае второго в регистре общего назначения R1):

CIKL:; начало цикла.

SBRC R1,2; проверка соблюдения условия выхода из цикла (тест бита).

RJMP WYX; переход на метку WYX, выход из цикла при соблюдении

; условия (бит равен 1).

…; начало тела цикла.

…; конец тела цикла.

RJMP CIKL; переход на начало цикла.

WYX:; метка перехода из цикла при соблюдении условия.

Пока значение второго бита регистра общего назначения R1 остается равным 0, будет пропускаться команда RJMP WYX и выполняться цикл. Как только значение этого бита станет равным 1, будет выполнена команда RJMP WYX, и осуществится выход из цикла на метку WYX.

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

Пример текста такой программы:

; начало основной (фоновой) программы

SBIS PIND,2; тестирование бита 2 порта D и пропуск следую-

; щей команды, если он равен 1

RJIMP OPROS0; переход на начало опроса, если бит 2 порта D

RCALL PROGROMMA; переход к выполнению подпрограммы

SBIC PIND,2; тестирование бита 2 порта D и пропуск следую-

; щей команды, если он равен 0

RJIMP OPROS1; переход на начало опроса, если бит 2 порта D

RJIMP OPROS0; переход на начало основной (фоновой) программы,

; если бит 2 порта D равен 0

RET; конец подпрограммы

Если необходимо выполнение подпрограммы при появлении перепада с 1 на 0, то изменяется только порядок опроса.

6.3.1 Выполняется при подготовке к работе.

а) Рассмотреть принципы построения и структуру текста программы для микроконтроллеров AVR;

б) Изучить систему команд для микроконтроллеров AVR;

в) Изучить теоретические сведения;

г) Подготовить алгоритм программы в виде блок-схемы;

д) Подготовить исходный текст программы;

е) Отладить программу в среде AvrStudio;

ж) Подготовить текстовый файл программы на электронном носителе.

6.3.2 Выполняется на лабораторном занятии.

а) Отладить программу в среде AvrStudio (если это не удалось при подготовке к работе) и продемонстрировать ее работу;

б) Со своего рабочего места ввести программу в компьютер, скомпилировать и записать в микроконтроллер;

в) Продемонстрировать работу программы на лабораторном стенде;

г) Подготовить распечатку программы с комментариями.

Источник: studopedia.su

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru