Какие команды обычно не меняют флаги psw processor status word
В результате обдумывания особенностей выполнения потоковых программ мне пришло в голову написать о интереснейшем (незавершённом!) этапе технологического прогресса человечества в области информационных технологий – развитии техники реализации условного выполнения вычислений. Без наличия условности вычислений труднопредставима реализация современных программ любой парадигмы и уровня сложности.
После краткого экскурса в историю будет рассказано о реальном применении предикатного подхода к реализации условности выполнения операторов в (ранее упомянутом) программном симуляторе DF-вычислителя.
Идея условности выполнения некоторой части программного кода формально была озвучена Джоном (Яношом Лайошом) фон Нейманом в 1945 году в (вызвавшем немало нареканий со стороны работавших с автором исследователей) отчёте “ The First Draft Report on the EDVAC”. Ниже приводятся основные принципы архитектуры фон Неймана (она же Принстонская), текст приводится в во́льном изложении:
Двоичного кодирования (применение двоичной системы счисления).
Однородности кодирования (команды и данные хранятся в единой памяти, причём и те и другие могут быть модифицированы одинаковым образом). Гарвардская архитектура предполагает наличие двух пулов памяти – для команд и данных.
Адресуемости памяти (процессору в произвольный момент доступна любая из ячеек основной памяти по её номеру - адресу).
Последовательного программного управления (команды располагаются в памяти и выполняются последовательно - одна после завершения другой).
Условного перехода (команды могут выполняться не только последовательно, но и в зависимости от состояния данных – т.е. фактически постулируется наличие команд условного перехода).
Похоже, Янош Лайош прекрасно понимал (ибо соответствующее упоминание более чем кратко и выполнено в форме дополнения к одной из базисной идей – концепции последовательного программного управления), что последний принцип был прекрасно известен ещё Чарльзу Бэббиджу и сотрудничающей с ним Аде Августе Байрон-Лавлейс - единственной “дочерью дома и сердца” великого поэта. В идиоматике фон Неймана условность выполнения реализовывалась путём перехода к иной (относительно следующей при последовательном выполнении) точке памяти, причём механизм этого перехода вряд ли был интересен самому автору.
Конкретную последовательность действий по “переходу к новой точке памяти” разработчикам пришлось реализовывать “по месту”. Прошли десятилетия, пока технология “устаканилась”. Пожалуй, наиболее документированной является технология, применяемая в процессорах фирмы Intel Corp.
Ниже приведена (наби́вшая оско́мину всем, кому довелось изучать архитектуру вычислительных систем) классическая структура процессора i8086 от 1978 г. архитектуры фон Неймана с конкретизацией технологии условного выполнения машинных команд (фирма Intel Corp.).
Механизм условного выполнения реализуется в полном соответствие с “указаниями” фон Неймана и включает регистр флагов состояния процессора, регистр - счётчик команд и набор обслуживающих машинных команд (мнемоника которых обычно начинается с символа ‘J’ – от “jump”, прыжок, переход). Набор битов кодов условий регистра флагов состояния процессора выбран так, что позволяет выявлять все ситуации, необходимые для корректной организации процесса вычислений.
Последовательность выполнения условного (включает и безусловный как вариант) перехода представляет собой двухстадийный процесс (в 32- и 64-битных системах используются дополнительные регистры, но общий принцип не изменяется):
Следующая далее команда перехода анализирует состояние соответствующего ей PSW-бита и заданным образом модифицирует (увеличивает или уменьшает) содержимое регистра – счётчика команд (IP, Instruction Pointer), всегда содержащий адрес в оперативной памяти (обычно в форме смещения относительно некоторого базового адреса) начала следующей долженству́ющей быть исполненной машинной инструкции.
Первая часть процесса выполняется в любом случае, вторая обычно игнорируется (при последовательном выполнении инструкций счётчик команд инкрементируется на число байт длины выполненной команды автоматически (так реализуется “4-й принцип фон Неймана” из вышеприведённого списка).
Описанный механизм хорошо работал два десятка лет, но в конце XX века при попытках дальнейшего увеличения быстродействия вычислителей путём увеличения тактовой частоты начал сказываться сформулированный лордом Рэлеем в 1871 г. фундаментальный закон, согласно которому (в применимости именно к процессорам) мощность их тепловыделения пропорциональна четвёртой степени тактовой частоты (увеличение частоты вдвое повышает тепловыделение в 16 раз). Современные конструкции микропроцессоров обладают рядом неприятных особенностей (малая площадь теплоотдачи и возможность отдачи тепла только с одной плоскости), ограничивающие эффективное охлаждение при выделяемой мощности (TDP, Thermal Design Power) пределом 150-200 ватт.
Решение нашлось (технология на рубеже XXI позволяла) в разработке многоядерных процессоров, при этом закон тепловыделения трансформировался в линейную зависимость от числа параллельных вычислителей (при сохранении тактовой частоты).
При относительно небольшом количестве процессорных ядер классическая технология обеспечения условности выполнения частей программы не претерпела изменений (каждое ядро получило весь набор регистров). Но начали разрабатываться процессоры с десятками/сотнями и бо́льшим числом ядер – вот тогда стало понятно, что идея снабжать каждое ядро полным набором регистров является анахронизмам.
Пришлось обратиться к иным идеям. Специалисты знают, что чуть ранее “эпохи i8086” фирма ARM (Advanced RISC Machine, иногда Acorn RISC Machine, Великобритания) разработала процессор фон-Неймановской архитектуры с системой команд RISC (Reduced Instruction Set Computer, “компьютер с сокращённым набором команд”).
Одной из особенностью системы команд процессоров ARM является так называемая предикация - возможность условного исполнения команд. В то время как для других архитектур таким свойством обычно обладают только команды условных переходов, в ARM была изначально заложена возможность условного исполнения практически любой команды. Реализовано это добавлением в коды машинных инструкций особого 4-битового поля (предиката); одно из его значений зарезервировано на случай безусловного выполнения, а остальные кодируют то или иное сочетание бинарных условий (флагов). Подобная модификация системы команд позволяет строить очень компактные программы (и, кстати, отказаться от ресурсно-затратного механизма предсказания переходов в серии i80x86).
В качестве иллюстрации используем сакраментальный пример “с просторов InterNet’а” - вычисление наибольшего общего делителя двух чисел согласно алгоритму Эвклида (вариант, основанный на вычитании), иллюстрирующий выполнение программы на Ассемблере ARM.
Исходный текст на языке C (исходные числа i и j, решение в i):
Вариант ассемблера ARM (инструкция BNE соответствует JNE в ассемблере для Intel):
Здесь CMP, как и ожидалось, сравнивает Ri и Rj и устанавливает или сбрасывает значение бита Z регистра состояния процессора. Команды SUBGT и SUBLT представляет собой модификации обычной SUB (целочисленное вычитание) с добавленным условий (достаточно комментариев в тексте программы). Интересно, что обработка Ri==Rj не производится вообще!
Идея “проста и гениальна” – никаких команд переходов, а выполнение или пропуск команд регулируется системой предикатов (булевых переменных, включённых в собственно код команды)! В результате процесс управления выполнением команд становится децентрализованным вместо опоры на центральное управление посредством счётчика команд. Кажется, при таком подходе и сам счётчик команд не особенно нужен (а ведь именно он вызывал проблемы при параллельном выполнении)… Да, имеется минус – длина кода каждой команды увеличивается (всего-то на один или несколько бит).
Естественно, при разработке фирмой Intel революционного для конца XX века процессора Itanium для реализации условного выполнения была использована система предикатов. Itanium (в варианте Itanium-2 архитектура получила название IA-64) относится к VLIW-машинам (VLIW, Very Long Instruction Word, сверхдлинное машинное слово), базируется на подходах ILP (ILP, Instruction-Level Parallelism, параллелизм на уровне команд) и EPIC (EPIC, Explicitly Parallel Instruction Computing, явный параллелизм выполнения команд). Архитектура VLIW предполагает упаковку значительного количества машинных команд последовательно в слово значительной длины (“bundle”, свя́зка), которое поступает на вход процессора и каждая команда выполняется на собственном вычислителе одновременно (параллельно, об этом говорит аббревиатура ILP). EPIC предполагает выявление параллелизма уровня ILP программным путём (уровень компилятора) и формирование VLIW из независимых по данным машинных команд (обеспечивая т.о. параллелизм их выполнения). Itanium-2 разрабатывался в расчёте на идею максимального упрощения аппаратной (естественно, за счёт усложнения программной) части для снижения стоимости без чрезмерного повышения тактовой частоты.
Далее приведём примеры простого кода, показывающего применение предикации при выполнении команд IA-64 (цитируем из “великого и могучего” Эндрю Стюарта Таненбаума).
Рассмотрим простой if:
Код на Ассемблере (классическое использование условного перехода):
А теперь с предикацией (допустим, имеются условные команды CMOVZ и CMOVN – копирование по условию равенства/неравенства нулю флага Z в PSW, в качестве условия-предиката выступает R1==0):
Чуть более сложный пример использования предикации:
В архитектуре IA-64 все команды обладают свойством предикатного выполнения, аппаратная часть включает 64 битовых регистра предикатов, доступных всем параллельным вычислителям в связке (конкретный номер управляющего бита выбирается 6-разрядным предикатным регистром).
Если номер бита управляющего предиката задаётся в предикатном регистре P4, то получаем удивительно простой и изящный код (синтаксис взят у вышеупомянутого автора с минимальной доработкой, причём ¬<P4> означит логическое обращение P4-того бита регистра предикатов):
Предикатные команды архитектуры IA-64 очень эффективны, т.к. могут помещаться в вычислительный конвейер последовательно без каких-либо проблем и не приводят к простоям конвейера. При этом каждая команда физически выполняется (дабы исключить лакуны на ступенях конвейера), а проверка истинности предиката происходит в самом конце конвейера перед сохранением результата (в зависимости от истинности или ложности предиката результат сохраняется в выходной регистр или пропадает).
Важно, что предикатное выполнение команд позволяет уйти от постоянного “прыгания” по адресам (что свойственно применению операторов условного/безусловного переходов), следствием является ненужность механизма предсказания переходов.
Концептуально близкое решение использует фирма NVIDIA Corp. в своих содержащих тысячи вычислительных ядер арифметических ускорителяx – априори выполняются операторы всех возможных ветвлений в программе, но результаты сохраняются только для соответствующих заданным логическим условиям.
В вычислителях потоковой архитектуры процесс выбора операторов для исполнения удобно представить результатом взаимодействия множества некоторых сущностей (“актёров”), асинхронно выполняющих определённые действия, при этом натуральным образом моделируются связанные с характеристиками времени параметры обработки операторов. При должном выборе функциональности “актёров” удаётся получить максимально плотную (ограниченную только естественным потенциалом параллелизма выполняемого алгоритма) загруженность АИУ процессом вычислений.
Данный симулятор позволяет визуально проанализировать ход выполнения программы (для это используется отслеживающая динамику процесса вычислений цветовая гамма), получить информацию о функции интенсивности вычислений (число занятых вычислениями АИУ в каждый момент времени, см. подокно в левой верхней части копии экрана), фиксировать в файлах протокола автоматически сгенерированное DF-машиной расписание параллельного исполнения (с возможностью коррекции динамики выполнения путём управлениями приоритетами выборки из буфера ГКВ команд, визуально план выполнения представлен в подокне в центре левой части копии экрана в форме диаграммы Ганта) при любом заданном числе гомогенных АИУ. DF-машина имеет общую память (архитектура SMP, Symmetric Multiprocessing, равно́приоритетный доступ всех АИУ к общей памяти).
Сам принцип DF в настоящее время ограниченно применяется фирмой Intel в своих изделиях. Начиная с модели Pentium Pro (P6, 1995 г.) процессор содержит блок DE (Dispatche/Execute Unit, устройство диспетчирования и выполнения команд), выполняющий в согласии с принципом DF ограниченное количество упрежда́юще считанных машинных команд. В России до своей кончины в 2005 г. проблемами реализации DF-вычислителей занимался Всеволод Бурцев. Широкомасштабное применению DF в настоящее время сдерживается отсутствием производства ассоциативной памяти значительного объёма и проблемами затрат на обмен данными внутри процессора.
Укрупнённая схема DF-вычислителя приведена ниже:
Тем не менее программная симуляция DF вполне полезна в вопросе изучения алгоритмов (в первую очередь со стороны их внутреннего параллелизма) и построения рациональных расписаний выполнения параллельных программ. Программа моделирует статическую DF машину, принцип единократного присваивания (следствие принципиальной неопределённости порядка присваивания значений одинаковым переменным) является обязательным.
DF-симулятор интерпретирует команды низкого уровня (уровня арифметико-логических операций, близких к Ассемблеру) с переменной адресностью (2-4), присваивание происходит в стиле AT&T ("слева направо"), мнемоника команд трёхсимвольная. Пример команды (время обработки каждой задаётся в настроечном файле data_flow.ini):
где ADD – мнемоника команды (здесь - сложение), Оp1 и Оp2 – аргументы команды, Res – результат выполнения команды, Pred – необязательное имя предиката (при отсутствии считается true), перед именем предиката допускается символ отрицания ‘!’.
Т.к. здесь (в отличие от Itanium-2) нет необходимости поддержки целостности конвейера, вывод о необходимости или нет исполнения каждой команды принимается сразу после анализа поля предиката. Новая переменная создаётся каждый раз, когда в команде встречается неиспользованное ранее имя результата, константы задаются двухадресной командой SET.
Имя предиката не отличается от имени переменной, имеются все варианты условий - PGE, PLE, PEQ, PGT, PLT, PNT, POR, PAN, PIM, PEV и дополнительные для работы с числовыми переменными и предикатами, сами предикатные функции не могут являться условно выполни́мыми):
Первый пример – получение вещественных корней полного квадратного уравнения (применение предикатов не является необходимостью):
Для решения такого же уравнения с возможностью получения комплексных корней достаточен один предикат (переменная IS_re, принимающая значение true в случае неотрицательности величины дискриминанта D уравнения; ниже имена предикатов выделены жирным шрифтом):
Пример далее – поиск максимального элемента в массиве методом последовательного сравнения смежных элементов массива (элементы массива m01-m08):
Также поиск максимального элемента в массиве методом “сдва́ивания”:
Исходя из целей данной работы автору было достаточно остановиться на уровне статической DF-машины и не использовать известные языки потокового программирования. Несмотря на это, некоторые средства автоматизации программирования были разработаны
Важной возможностью является работа с циклами и массивами. Аппаратной поддержкой циклов является именно условный переход к нужной точке программы. Но в DF-машине нет привычного понятия адреса! В какую точку программы переходить при достижении некоторого логического условия? Значит, и “goto” бессмысленен… Вот она, “территория счастья” для великого Эдсгера Вибе Дейкстры!
Для DF-машины привычным методом служит “развёртка циклов” (описание в форме последовательности тела цикла при различных значениях индекса). Для описываемого симулятора автором разработан макрос, позволяющий работать с одномерными “псевдомассивами” (пример ниже):
Синтаксис макроса такой:
где I1,I2,I3 - начальное и конечное значения индекса I и шаг его изменения (константы); в квадратных скобках допускается использование выражений вида X[функция_от_I], где "функция_от_I" может включать 4 основные операции арифметики, получение остатка от деления (%), возведение в степень (^), стандартные функции sin, cos, tg, ctg, arcsin, arccos, arctg, arcctg, sh, ch, th, cth, exp, lg, ln, sqrt, поддерживаются круглые скобки любой вло́женности.
Выражение "функция_от_I" будет вычислено и заменено препроцессором конкретным числовым значением в виде строки. Тело макроса повторяется в соответствие со значениями I1,I2,I3; в случае некорректностей макроса все инструкции комментируются и не окажут воздействия на выполняемую программу.
Внутри тела макроса возможен вариант инструкции SET с первым операндом в форме "функция_от_I". С помощью такого макроса описывается множество алгоритмов, например, с применением дихотомии (“деление отрезка пополам”).
Описанное моделирование является необходимым этапом в реализации блоков компиляторов для заданной системы команд процессора (на практике придётся учесть немало особенностей конкретной системы команд, однако без наличия общего подхода конкретная реализация практически всегда оказывается малоэффективной).
Предыдущие публикации на тему исследования параметров функционирования вычислительных систем методами математического моделирования:
Правильные ответы выделены зелёным цветом.
Все ответы: Разъясняются основные понятия микропроцессорной техники, рассматриваются принципы функционирования микропроцессорных систем, предлагаются методы проектирования микропроцессорных систем на основе микроконтроллеров.
В чем главное преимущество микропроцессорной системы?
Сколько видов сброса реализовано в микроконтроллерах подгруппы PIC16F8Х?
Какая сфера применения является наиболее типичной для цифровых устройств на микроконтроллерах?
В каком порядке следуют типы информации в ассемблерной строке?
Какая шина персонального компьютера наиболее быстрая?
В чем основное преимущество шины ISA перед другими шинами компьютера?
Когда компьютер начинает цикл обмена по интерфейсу Centronics?
Какая из приведенных операций не требует проведения цикла обмена информацией?
К какой группе команд относятся команды работы со стеком?
Какие преимущества дает модульная организация микроконтроллера?
(3) создание разнообразных по структуре МК в пределах одного семейства
Какое значение сигнала считывается при вводе данных с порта микроконтроллера?
(3) логическое " И " над содержимым триггера данных и значением сигнала на внешнем выводе МК
Какой модуль микроконтроллера прекращает работу в режиме ожидания?
Какой формат команд используется в семействе микроконтроллеров среднего уровня PIC16CXXX?
Какой режим обмена предполагает отключение процессора?
Можно ли стереть бит защиты программного кода в микроконтроллерах подгруппы PIC16F8Х?
(2) можно, только если знать идентификационный код МК
(3) только вместе с содержимым памяти программ и данных МК
(2) средство для исполнения разработанной программы на программно-логической модели МК
(3) программа для оптимизации размещения данных в памяти МК
Какая система счисления принимается по умолчанию в ассемблере MPASM ?
Какой процессор ПК был первым полностью 32-разрядным?
Какая операция на магистрали ISA не требует обмена сигналами?
(5) через равные промежутки времени, начиная от стартового бита
Какой тип обмена обеспечивает гарантированную передачу информации любому исполнителю?
Для чего нужен селектор адреса в составе модуля памяти?
(4) для выделения адресов этого модуля в адресном пространстве системы
Какой метод адресации предполагает размещение операнда внутри выполняемой программы?
Что отличает процессоры с RISC-архитектурой от процессоров с CISC–архитектурой?
(2) возможность параллельного исполнения нескольких команд
При каких условиях триггер переполнения таймера/счетчика генерирует запрос на прерывание микроконтроллера?
(4) при переполнении таймера/счетчика, если прерывания от таймера разрешены
Какой способ тактирования микроконтроллера обеспечивает наивысшую стабильность частоты?
Что дает двухступенчатый конвейер исполнения команд в PIC-микроконтроллерах?
(1) возможность одновременной выборки и исполнения команд
(3) возможность параллельного исполнения двух команд
(4) возможность динамического предсказания переходов
Микропроцессорная система какого типа не обеспечивает управление внешними устройствами?
(3) все типы обеспечивают управление внешними устройствами
Что может использоваться в качестве регистра назначения в системе команд микроконтроллеров подгруппы PIC16F8Х?
(1) рабочий регистр W или регистр, используемый в команде
(4) средство для крепления платы развития в устройстве
(1) она дополнительно увеличивает объем системной памяти
(4) она ускоряет обмен процессора с системной памятью
(5) она ускоряет обмен процессора с устройствами ввода-вывода
На основе чего организован внутренний календарь ПК?
Какие адресные разряды участвуют в цикле регенерации памяти?
(3) на шине PCI возможен синхронный и асинхронный обмен
При каком типе прерываний число различных прерываний может быть больше?
(3) максимальное число прерываний постоянно при любом типе прерываний
(5) внешнее устройство, с которым осуществляется сопряжение
Какой регистр определяет адрес текущей выполняемой команды?
Какая память не изменяет своего содержимого в ходе выполнения программы?
Для чего в первую очередь предназначен модуль выходного сравнения микроконтроллера?
(1) для формирования временных интервалов заданной длительности
(3) для измерения интервалов времени между событиями на выходах МК
Что используется в качестве простейшего устройства аналогового ввода информации в микроконтроллере?
Для каких целей используются регистры специальных функций PIC-микроконтроллера?
Какие команды микроконтроллеров подгруппы PIC16F8Х используются для организации условных переходов в программе?
(1) команды DECFSZ f , d , INCFSZ f , d , BTFSC f , b и BTFSS f , b
Для чего используется файл инициализации .INI при работе симулятора MPSIM ?
(2) для задания всех используемых в программе параметров
Каков типичный объем памяти данных микроконтроллера?
Где хранится содержимое младшего байта счетчика команд микроконтроллеров подгруппы PIC16F8Х?
Какова разрядность портов ввода/вывода микроконтроллеров подгруппы PIC16F8Х?
Какова разрядность таймера/счетчика TMR0 микроконтроллеров подгруппы PIC16F8Х?
Когда происходит инкремент таймера/счетчика в режиме счетчика без пределителя в микроконтроллерах подгруппы PIC16F8Х?
Какие регистры управляют процессом чтения и записи энергонезависимой памяти данных микроконтроллеров подгруппы PIC16F8Х?
Разрядность какой шины прямо определяет быстродействие микропроцессорной системы?
От какого генератора работает сторожевой таймер в микроконтроллерах подгруппы PIC16F8Х?
(4) от собственного внутреннего кварцевого генератора
Что включает в себя понятие «работа в реальном времени»?
(1) максимально достижимое на данный момент быстродействие
(2) обеспечение реакции на внешние события в течение определенного интервала времени
(3) возможность выдачи сигналов строго определенной длительности
(4) включение и выключение устройства по сигналам точного времени
Какова максимальная длина ассемблерной строки ассемблера MPASM ?
К какой шине персонального компьютера подключается больше всего устройств?
Какая функция не выполняется программой из ROM BIOS?
(4) задание текущих базовых параметров аппаратуры компьютера
Какой сигнал используется для организации асинхронного обмена по магистрали ISA ?
Как компьютер узнает об отсутствии бумаги в принтере при использовании Centronics?
(3) компьютер посылает специальный запрос о наличии бумаги
(5) принтер выдает особую комбинацию нескольких сигналов
Какой тип обмена обеспечивает более высокую скорость передачи информации?
(4) синхронный обмен с возможностью асинхронного обмена
(1) для хранения флагов результатов выполненных операций
(4) для определения режима работы микропроцессорной системы
Какой метод адресации наиболее удобен для последовательной обработки массивов данных?
Для чего используются команды программных прерываний?
Какие возможности отсутствуют при использовании микроконтроллеров с «закрытой» архитектурой?
(2) возможность подключения памяти программ и данных по параллельным магистралям
(3) возможность использования всей совокупности системы команд МК
Какой тип логической функции позволяет реализовать объединение «квазидвунаправленных» выходов микроконтроллера?
Как зависит ток потребления микроконтроллера от напряжения питания?
Какая архитектура используется в PIC-микроконтроллерах?
Какой режим обмена обеспечивает наибольшую скорость передачи информации?
Где хранятся биты конфигурации микроконтроллеров подгруппы PIC16F8Х?
(1) программа для контроля состояния внутренних регистров МК
(2) аппаратное устройство для реализации пошагового режима работы МК
(3) программно-аппаратное средство для замены МК в реальной схеме
Какая фирма является основным поставщиком процессоров для персональных компьютеров?
Какой тип прерываний требует более сложной аппаратуры устройства-исполнителя?
(3) запись и чтение могут следовать в произвольном порядке
(4) содержимое стековой памяти не меняется за время работы системы
(5) стековая память ускоряет работу памяти векторов прерываний
Каково разделение функций между внутренними регистрами процессора?
(3) половина регистров используется для данных, половина — для адресации
(5) одни регистры специализированные, другие — универсальные
Каково типичное соотношение между требуемыми объемами памяти программ и данных микроконтроллера?
(1) объем памяти данных больше объема памяти программ
(2) объем памяти данных меньше объема памяти программ
(3) объем памяти данных равен объему памяти программ
Для чего в первую очередь предназначен модуль входного захвата микроконтроллера?
(3) для измерения временных интервалов между событиями на входах МК
(4) для выдачи импульсов фиксированной продолжительности
Зачем нужна задержка времени при запуске тактового генератора микроконтроллера?
(2) для минимизации энергопотребления при запуске МК
(4) для исключения выдачи ложных сигналов на выходах МК
Сколько тактов занимает выполнение одного командного цикла PIC-микроконтроллером?
Какая архитектура обеспечивает более высокое быстродействие?
Какие команды микроконтроллеров подгруппы PIC16F8Х могут изменить все биты состояния?
(3) команды ADDWF f , d , SUBWF f , d , ADDLW k и SUBLW k
(1) устройство для расширения объема внешней памяти МК
(2) устройство для «вскрытия» содержимого памяти программ МК
(3) схема для сопряжения МК с внешней памятью программ
(4) когда системная память имеет малое быстродействие
(5) когда объем системной памяти компьютера очень большой
(1) при нажатии — коды символов, соответствующих клавишам
(3) при нажатии и отпускании — коды символов, соответствующих клавишам
(5) при отпускании — коды символов, соответствующих клавишам
(1) распределение ресурсов с помощью переключателей на плате
(2) распределение ресурсов с помощью программы-драйвера платы
Какой параметр слабее других влияет на процесс обмена сигналами по магистрали?
(3) положительная или отрицательная логика шины данных
(5) неодновременное выставление сигналов на линиях шины
Какое устройство не относится к устройствам ввода-вывода?
Какой регистр процессора 8086/8088 определяет адрес ввода/вывода?
Сколько раз можно изменить содержимое памяти программ на основе ПЗУ масочного типа?
(3) один раз на стадии программирования пользователем
Какой параметр выходного сигнала изменяется при широтно-импульсной модуляции?
АЦП какого типа чаще всего используют в составе микроконтроллера?
Где хранится информация о выборе банка памяти данных микроконтроллеров подгруппы PIC16F8Х?
Какие действия выполняет команда CLRWDT системы команд микроконтроллеров подгруппы PIC16F8Х?
(4) сбрасывает в 0 содержимое сторожевого таймера и пределителя (если он используется)
Для чего используется файл стимуляции .STI при работе симулятора MPSIM ?
(2) для задания контрольных точек останова при симуляции
Чем ограничена глубина вложений циклов вызова подпрограмм в микроконтроллере?
Где хранится указатель стека микроконтроллеров подгруппы PIC16F8Х?
Где хранится информация о направлении передачи информации портов ввода/вывода микроконтроллеров подгруппы PIC16F8Х?
Какой бит определяет режим работы таймера/счетчика микроконтроллеров подгруппы PIC16F8Х?
Какой бит определяет режим использования предделителя микроконтроллеров подгруппы PIC16F8Х?
Сколько источников запросов прерываний имеют микроконтроллеры подгруппы PIC16F8Х?
Структура какой шины влияет на разнообразие режимов обмена?
В какое состояние переходит счетчик команд микроконтроллеров подгруппы PIC16F8Х после сброса?
Что включает в себя понятие «закрытая архитектура» микроконтроллера?
(3) отсутствие возможности изменения тактовой частоты МК
(4) реализация большинства функций устройства внутренними средствами
(1) последовательность любых допустимых ASCII символов, заключенная в двойные кавычки и длиной до 132 колонок
(2) последовательность любых допустимых ASCII символов, заключенная между тире, длиной в пределах 80 колонок
(3) последовательность любых допустимых ASCII символов, заключенная между точками с запятой, длиной до 132 колонок
(4) последовательность любых допустимых ASCII символов, заключенная в двойные кавычки, длиной в пределах 80 колонок
Командная строка Windows - это функция, которая долгое время была основной частью операционной системы Windows. Есть некоторые команды CMD, которые настолько полезны и просты в использовании, что даже обычные пользователи видят командную строку Windows как ключевую часть операционной системы.
Ниже приведены 21 из лучших команд CMD, которые вы должны знать, если хотите иметь большой контроль над своим ПК с Windows.
1. ASSOC: Исправьте Ассоциации файлов
Одним из самых мощных инструментов в библиотеке команд CMD является команда ASSOC.
Ваш компьютер связывает определенные расширения файлов с определенными программами. Именно так ваш компьютер узнает, что нужно открыть Adobe, когда вы дважды щелкаете файл PDF, или Microsoft Word, когда вы дважды щелкаете файл DOC.
Вы можете просмотреть все ассоциации файлов, о которых знает ваш компьютер, набрав ASSOC в командном окне. Вы увидите расширение файла и программу, с которой он связан.
2. FC: Сравнение файлов
Иногда, когда файлы меняются с течением времени, трудно вспомнить, в чем были различия между версиями. Возможно, вы не знаете, что команда CMD дает возможность сравнивать файлы и видеть все различия, но это правда.
Команда FC выполняет сравнение ascii или двоичного файла и перечисляет все найденные различия.
Fc /a File1.txt File2.txt сравним два ascii-файла.
Fc /b Picture1.jpg Picture2.jpg сделаем бинарное сравнение на двух изображениях.
3. IPCONFIG: Конфигурация IP
Устранение неполадок в сети никогда не бывает простым делом, но одна команда, которая делает это намного проще - это IPCONFIG .
Использование этой команды в командной строке CMD возвращает подробную информацию о текущем подключении сетевого адаптера включая:
- Текущий IP-адрес
- Маска подсети
- IP-адрес шлюза по умолчанию
- Текущий домен
Эта информация может помочь вам устранить неполадки с маршрутизатором и другими проблемами подключения к сетевому адаптеру.
4. NETSTAT: Сетевая Статистика
Обеспокоены тем, что на вашем компьютере может быть запущена вредоносная программа, которая подключается к Интернету без вашего ведома?
Если вы запустите команду NETSTAT в командной строке, то сможете получить список всех активных TCP-соединений с вашего компьютера.
5. PING: Отправка тестовых пакетов
Лучший друг ИТ - это аналитика, команда PING. Выполнение этой команды отправляет тестовые пакеты по сети в целевую систему.
Вы можете использовать команду PING, чтобы проверить, может ли ваш компьютер получить доступ к другому компьютеру, серверу или даже веб-сайту. Это может помочь в выявлении сетевых отключений. Он также обеспечивает транзитное время для пакетов в миллисекундах, поэтому он также показывает плохое сетевое соединение.
6. TRACERT: Трассировка маршрута
TRACERT - это увлекательная команда Windows для использования. Если вам когда-нибудь было интересно увидеть путь, по которому ваш интернет-трафик проходит от вашего браузера к удаленной системе, такой как серверы Google, вы можете использовать TRACERT, чтобы увидеть его.
Команда расшифровывается как “Trace Route”, которая отправляет пакеты в удаленное место назначения (сервер или веб-сайт) и предоставляет вам всю следующую информацию:
- Количество переходов (промежуточных серверов) до прибытия в пункт назначения
- Время, необходимое, чтобы добраться до каждого прыжка
- IP адрес, а иногда и имя каждого прыжка
TRACERT может показать, как меняются маршруты ваших интернет-запросов в зависимости от того, где вы получаете доступ к Сети. Это также помогает с устранением неполадок маршрутизатора или коммутатора в локальной сети, которые могут быть проблематичными.
7. POWERCFG: Конфигурация питания
Вы разочарованы тем, как быстро ваш ноутбук, кажется, разряжается? Возможно, ваши параметры питания настроены максимально эффективно. Существует команда Windows CMD под названием POWERCFG (power configuration), которая может помочь. Запустите командную строку от имени администратора и введите powercfg – energy , чтобы получить полный отчет об энергоэффективности.
Этот процесс может занять около минуты, но когда он будет завершен, вы увидите, есть ли какие-либо предупреждения или ошибки, которые могут помочь вам повысить энергоэффективность вашей системы.
Просмотр energy-report.html файл, чтобы увидеть подробную информацию об этих ошибках и предупреждениях.
8. SHUTDOWN: Выключите Компьютер
Эта команда-довольно универсальная команда, которая позволяет вам выключить компьютер, но контролировать поведение этого выключения. Он обычно используется в качестве запланированной задачи или части ИТ-пакетного задания после применения исправлений к компьютерной системе.
Ввод shutdown /i из командной строки инициирует завершение работы, но он будет на графическом интерфейсе, чтобы дать пользователю возможность перезапустить или сделать полное завершение работы. Если вы не хотите, чтобы какой-либо графический интерфейс всплывал, вы можете просто выполнить команду shutdown /s .
Существует длинный список других параметров, которые вы можете использовать для выхода из системы, гибернации, перезагрузки и многое другое. Просто введите shutdown без каких-либо аргументов, чтобы увидеть их все.
9. SYSTEMINFO: Информация о системе
Если вам нужно узнать марку вашей сетевой карты, сведения о процессоре или точную версию вашей операционной системы Windows, вам может помочь команда SYSTEMINFO .
Эта команда опрашивает вашу систему и извлекает наиболее важную информацию о вашей системе. Он перечисляет информацию в чистом формате, который легко читается.
10. SFC: Проверка Системных файлов
Если вы когда-либо беспокоились, что вирус или какое-либо другое программное обеспечение может повредить ваши основные системные файлы, есть команда Windows, которая может сканировать эти файлы и обеспечить их целостность.
Вам нужно запустить CMD от имени администратора (щелкните правой кнопкой мыши и выберите Запустить от имени администратора ). Вводим эту команду SFC /SCANNOW и она проверит целостность всех защищенных системных файлов. Если проблема обнаружена, файлы будут восстановлены с помощью резервных копий системных файлов.
Команда SFC также позволяет вам:
Сканирование может занять до 10 или 15 минут, так что дайте ему время.
11. NET USE: Подключение, удаление и настройка общих ресурсов, таких как сопоставленные диски и сетевые принтеры
Если вы хотите сопоставить новый диск, вы всегда можете открыть проводник, щелкнуть правой кнопкой мыши на этом компьютере и пройти через мастер Map Network Drive. Однако, используя команду NET USE , вы можете сделать то же самое с одной командной строкой.
Например, если у вас есть общая папка на компьютере в сети с именем \\OTHER-COMPUTER\SHARE , вы можете сопоставить ее как свой собственный Z: диск, введя команду:
Net use Z: “\\OTHER-COMPUTER\SHARE” /persistent:yes
Persistent - эта команда говорит компьютеру, что вы хотите, чтобы этот диск переназначался каждый раз, когда вы входите обратно в компьютер.
12. CHKDSK: Проверка диска
В то время как команда SFC проверяет только целостность основных системных файлов, вы можете использовать команду CHKDSK для сканирования всего диска.
Команда для проверки диска C: и устранения любых проблем, запустите командное окно от имени администратора и введите CHKDSK /f C: .
Эта команда проверяет такие вещи, как:
- Фрагментация файла
- Ошибки диска
- Плохие сектора
13. SCHTASKS: Планирование задач
Windows поставляется с мастером для создания запланированных задач. Например, может быть, у вас есть файл BAT , хранящийся на диске C:\temp .
Вам нужно будет щелкнуть по мастеру запланированных задач, чтобы настроить это. Или вы можете ввести одну команду SCHTASKS , чтобы настроить ее.
SCHTASKS /Create /SC HOURLY /MO 12 /TR Example /TN c:\temp\File1.bat
Переключатель scheduled принимает такие аргументы, как minute, hourly, daily и monthly. Затем вы указываете частоту с помощью команды /MO .
Если вы ввели команду правильно, то увидите ответ SUCCESS: The scheduled task “Example” has successfully been created .
14. ATTRIB: Изменение атрибутов файла
В Windows вы можете изменить атрибуты файла, щелкнув правой кнопкой мыши на файле и найдя нужное свойство для изменения. Однако вместо того, чтобы искать атрибут файла, вы можете использовать команду ATTRIB для установки атрибутов файла.
Например, если ввести: ATTRIB +R +H C:\temp\File1.bat , он установит файл File1.bat как скрытый файл, доступный только для чтения.
Другие команды Windows CMD
Как вы можете видеть, есть несколько мощных и полезных команд, которыми вы можете воспользоваться с помощью командной строки Windows.
Хотите верьте, хотите нет, но есть еще больше команд, которые дадут вам возможность делать некоторые вещи, которые вы, вероятно, никогда не осознавали, просто набрав простую команду.
- BITSADMIN : Инициируйте загрузку или загрузку заданий по сети или Интернету и контролируйте текущее состояние этих передач файлов.
- COLOR : Измените цвет фона окна командной строки.
- COMP : Сравните содержимое любых двух файлов, чтобы увидеть различия.
- FIND/FINDSTR : Поиск строк внутри любых файлов ASCII .
- PROMPT : Измените командную строку с C:\> на что-то другое.
- TITLE : Измените заголовок окна командной строки.
- REGEDIT : Редактирование ключей в реестре Windows (используйте с осторожностью).
- ROBOCOPY : Мощная утилита копирования файлов, встроенная прямо в Windows.
Статья была переведена с зарубежного сайта - HELP DESK GEEK
Эта функция, судя по названию, что-то обрабатывает (process). Но что означают параметры? Какой параметр здесь true, а какой false? По вызывающему коду об этом нельзя судить.
Нам придется заглянуть в объявление функции, которое дает подсказку:
Очевидно, автор использует два параметра типа bool как флаги (toggles). Реализация функции может быть похожа на это:
Назначение флагов очевидно, поскольку каждый из них имеет осмысленное название. Проблема возникает в вызывающем коде. И дело не только в том, что мы не можем сразу понять, какие флаги используются. Даже зная это, мы легко можем перепутать их порядок. На самом деле, мой первый пример должен был выглядеть так:
Но я перепутал порядок аргументов.
Столкнувшись с этим багом, программист, вероятно, добавит комментарии к вызову функции, чтобы явно показать свои намерения:
И это слишком похоже на именованные параметры функции — возможность, отсутствующую в C++. Если б она была, то могла бы выглядеть как-нибудь так:
Но если бы даже в C++ такое было, вряд ли это было бы совместимо с прямой передачей (perfect forwarding):
С этим может быть связан еще более коварный баг, который гораздо труднее отследить. Представьте, что функция process — это виртуальный метод класса. И в каком-то другом классе мы его переопределяем, при этом располагая флаги в неправильном порядке:
Компилятор не заметит проблемы, поскольку параметры различаются только по именам, а их типы одинаковы (оба bool).
Баги, возникающие по причине использования логических параметров в интерфейсе, на этом не заканчиваются. Из-за того, что почти все встроенные типы преобразовываются в bool, следующий пример компилируется без ошибок, но делает не то, что ожидается:
Более распространенная проблема — с использованием bool в конструкторах. Пускай есть класс с двумя конструкторами:
В какой-то момент Вы решаете удалить второй конструктор, и может быть надеетесь, что компилятор укажет Вам на все места, требующие исправления. Но этого не происходит. Из-за неявных преобразований в bool, первый конструктор будет использован везде, где раньше использовался второй.
Однако есть причина, почему люди обычно используют bool для представления флагов. Это единственный встроенный тип, доступный «из коробки» и предназначенный для представления только двух возможных значений.
Перечисления
Чтобы решить указанные проблемы, мы должны располагать типом, отличным от bool, который удовлетворял бы следующим требованиям:
— для каждого флага создается уникальный тип,
— неявные преобразования запрещаются.
C++11 вводит понятие классов перечислений, которые удовлетворяют обоим требованиям. Также мы можем использовать тип bool как базовый тип перечисления; таким образом, мы гарантируем, что перечисление содержит только два возможных значения и имеет размер одного bool. Вначале определяем классы флагов:
Теперь мы можем объявить нашу функцию:
Есть некоторая избыточность в этом объявлении, но зато порядок использования функции теперь такой, какой нужен:
И если я поставлю флаги в неправильном порядке, то получу ошибку компиляции из-за несоответствия типов:
Каждый флаг имеет уникальный тип, который исправно работает при прямой передаче (perfect forwarding), и Вы никак не сможете расположить параметры в неправильном порядке в объявлениях функций и переопределениях виртуальных методов.
Но использование перечислений в качестве флагов имеет свою цену. Флаги в некоторой мере похожи на значения типа bool, но классы перечислений не имитируют эту схожесть. Неявные преобразования в bool и обратно не работают (и это хорошо), но явные преобразования тоже не работают, и это проблема. Если мы взглянем еще раз на тело функции process, то поймем, что оно не компилируется:
Мне приходится использовать явное преобразование:
И если мне понадобится логическое выражение с двумя флагами, то оно будет выглядеть еще неадекватнее:
Кроме того, для экземпляра класса перечисления Вы не можете сделать прямую инициализацию из bool:
Опять придется делать явное преобразование:
Это можно считать дополнительной гарантией безопасности, но здесь слишком много явных преобразований. В классах перечислений больше «explicit», чем в конструкторах и операторах преобразования, объявленных как «explicit».
tagged_bool
Из-за проблем, возникающих при использовании bool и классов перечислений, мне пришлось сделать свой собственный инструмент, который называется tagged_bool. Вы можете найти его реализацию здесь. Она совсем небольшая. С ее помощью, классы флагов объявляются вот так:
Вам придется сделать предварительное объявление класса-тэга, такого как «WithValidation_tag». Определение для него писать не нужно. Он используется для создания уникальной специализации шаблона класса tagged_bool. Эта специализация может быть явно преобразована в bool и обратно, а также в другие специализации шаблона tagged_bool, поскольку, как обычно бывает на практике, какой-нибудь bool, передающийся на нижние уровни приложения, становится впоследствии другим флагом с другим именем. Использовать созданные таким образом флаги можно вот так:
Вот и все. tagged_bool — это часть библиотеки Explicit library, которая содержит несколько инструментов, позволяющих более явно выразить Ваши намерения при проектировании интерфейсов.
От переводчика
У Анджея ранее была другая статья про тэги — «Intuitive interface — Part I» от 5 июля 2013 г. (Part 2 так и не появилась на свет, не ищите). Если вкратце, то там поднималась такая проблема:
Когда поведение конструктора зависит от формы скобочек, это само по себе опасно. Кроме того, это делает непонятным вызывающий код:
Что такое 5 и 6? Это будет 5 шестерок или 6 пятерок? Если забыли — идите смотреть документацию.
И хотелось бы иметь еще один конструктор, создающий пустой вектор с заданной capacity: std::vector v(100). К сожалению, конструктор, принимающий один size_t, уже занят — он создает вектор с заданным size’ом, заполненный сконструированными по умолчанию объектами.
Анджей упоминает, что такой порядок вещей не дает в полной мере воспользоваться возможностями прямой передачи, но в комментариях ему разъяснили, что эта проблема решается без всяких тэгов.
Анджей пришел к выводу, что реализация вектора в библиотеке STL не вполне удачная. Было бы куда проще, если бы в его конструкторах использовались тэги:
Применительно к настоящей статье, это выглядело бы так:
Разница в том, что тэг и значение теперь объединены в один объект. В статье «Competing constructors» от 29 июля 2016 г. Анджей мимоходом написал, что ему не нравится идея такого объединения.
Теперь это уже не тэги, а полноценные объекты. Кому-нибудь может прийти в голову положить их в контейнер:
Поведение этого кода опять зависит от формы скобочек. Что за радость была вводить тэги, если мы снова вернулись к той же проблеме? По крайней мере, простые тэги вряд ли кому-нибудь захочется хранить в контейнере. Ведь они могут иметь только одно значение.
С bool, однако, эта угроза не так страшна. Конструкторы контейнеров STL не принимают bool, иначе как в составе initializer_list’ов. Видимо, поэтому Анджей и решился в этот раз объединить тэг и значение.
Напоследок приведу перевод нескольких комментариев к статье.
Комментарии
kszatan
February 17, 2017 at 11:36 am
Я бы в первую очередь подумал об избавлении от всех этих флагов и вывел бы код для подтверждений (validations) и нового/старого движка (new/old engine) в отдельные классы, чтобы передавать их как аргументы. Функция «process» и так уже делает слишком много.
Andrzej Krzemieński
February 17, 2017 at 12:03 pm
В простых случаях отказ от любых флагов действительно может оказаться лучшим выбором. Но когда решение установить флаг принимается несколькими уровнями выше в стеке вызовов, такой рефакторинг может оказаться неосуществимым или непрактичным.
micleowen
February 17, 2017 at 10:41 pm
«explicit» используется в конструкторах с одним параметром.
Andrzej Krzemieński
February 20, 2017 at 8:22 am
Есть основательная причина объявлять почти все конструкторы как «explicit», а не только конструкторы с 1 аргументом (особенно с выходом стандарта C++11). Иногда даже конструктор по умолчанию лучше объявить как «explicit». Кому интересно, советую обратиться вот к этой статье .
===Конец треда===
ARNAUD
February 18, 2017 at 6:39 pm
«Неявные преобразования в bool и обратно не работают (и это хорошо), но явные преобразования тоже не работают, и это проблема»
Не понимаю, что в этом плохого:
Сначала Вы используете общеизвестную возможность языка, и Ваш код прекрасно читается и понимается всеми специалистами по С++. Потом Вы переходите к использованию специального шаблона для автоматического преобразования в bool и обратно? Меня это не убеждает.
И еще. Представьте, что через какое-то время один из параметров перестанет быть bool и сможет принимать значения no_engine, engine_v1, engine_v2… Класс перечисления позволяет сделать такое расширение естественным путем, в отличие от Вашего tagged_bool.
Andrzej Krzemieński
February 20, 2017 at 8:36 am
Вы подняли два вопроса.
И, в случае использования пространств имен:
Для меня это компромисс между желаемым уровнем безопасности и удобством использования. Мой личный выбор — что-то безопаснее bool, но не такое многословное как классы перечислений. Видимо, Ваш компромисс лежит ближе к классам перечислений.
2. Возможность добавить третье состояние
Если Вы предвидите, что в будущем Вам может понадобиться третье состояние, то классы перечислений и правда могут быть предпочтительнее. А могут и не быть. Потому что, когда Вы добавляете третье состояние, все Ваши if’ы продолжают исправно компилироваться, хотя Вы, может быть, желаете их отредактировать, чтобы добавить проверку третьего состояния.
По моему опыту, эти флаги используются как временные решения, и их дальнейшее развитие не в том, чтобы добавить третье состояние, а в том, чтобы избавиться от двух имеющихся. Например, я улучшаю какую-то часть программы, но в течение пары месяцев хочу дать пользователям возможность переключиться обратно на старую реализацию, на случай, если я что-то недосмотрел, и улучшение только все испортит. Если после пары месяцев все пользователи остались довольны, я удаляю поддержку старой реализации и избавляюсь от флага.
mftdev00
March 13, 2017 at 1:05 pm
Я вообще не люблю флаги. Они противоречат принципу единственной ответственности. Делай что-то, если true, делай что-то другое, если false…
Andrzej Krzemieński
March 13, 2017 at 1:10 pm
Согласен. Везде, где это возможно, нужно обходиться без флагов.
SebB
March 21, 2017 at 6:09 pm
Можно ли вместо явного удаления конструкторов для каждого типа:
…просто удалить их для всех типов (кроме bool) разом?
Andrzej Krzemieński
March 22, 2017 at 7:32 am
Я просто не учел такую возможность, когда разрабатывал интерфейс. Может, и полезно было бы это добавить. Но теперь, когда Вы это предложили, я вижу один случай, где это имело бы отрицательный эффект: кто-то может использовать свой собственный (безопасный) логический тип с неявным преобразованием в bool. В этом случае, нам, может быть, нужно позволить этому типу работать с tagged_bool.
Читайте также: