Outp, outpw вывод в порт


Содержание

Инструкция OUT

Что такое JavaScript

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

Команда OUT в Ассемблере выполняет вывод данных в порт. Синтаксис:

OUT ПРИЁМНИК, ИСТОЧНИК

После выполнения этой команды флаги не изменяются.

Инструкция OUT выводит данные из регистра AL или AX (ИСТОЧНИК) в порт ввода-вывода. Номер порта должен быть указан в ПРИЁМНИКЕ.

ПРИЁМНИК может быть указан как непосредственное значение (константа), если номер порта укладывается в байт (не более 255). Если номер порта более 255, то он должен быть предварительно помещён в регистр DX, и тогда этот регистр должен быть указан в качестве ПРИЁМНИКА.

С помощью команды OUT выполняется вывод на все стандартные устройства ввода-вывода, такие как клавиатура, последовательные и параллельные порты, жёсткий диск и другие накопители.

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

Как вывести данные в порт

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

Комментарии довольно подробные, поэтому пояснять особо больше нечего. Обратите внимание на цикл — он содержит вложенный цикл. Дело в том, что современные процессоры очень быстрые, и если использовать один цикл, то звук включится и выключится настолько быстро, что вы не успеете ничего услышать (а, как вы догадались, эти циклы используются для выполнения задержки времени, в течение которого динамик включен).

Более подробно работу с таймером, динамиком и т.п. здесь рассматривать не буду, так как статья посвящена не этому, а инструкции OUT. Если будет время и возможность, то сделаю это в другой раз.

Напоследок, как всегда, о происхождении названия OUT. Здесь всё просто — в этот раз никаких сокращений. Слово OUT переводится как ВОН, ПРОЧЬ, НАРУЖУ, ВОВНЕ. То есть с помощью этой команды выполняется ВЫВОД данных в порт, который связан обычно с внешним устройством.

ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ

Блог технической поддержки моих разработок

Урок 6. Порты ввода-вывода STM32.

В уроке узнаем структуру, функциональные возможности, электрические характеристики портов ввода-вывода общего назначения. Изучим регистры микроконтроллера для управления портами.

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

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

И про аппаратное устройство портов и их электрические характеристики я пишу не для того, чтобы набрать объем урока. Это очень важный вопрос. Знание его необходимо для подключения к микроконтроллеру различных электронных компонентов. Микроконтроллер сам по себе никогда не работает. К нему всегда что-то подключается.

Через порты ввода-вывода микроконтроллер управляет и связывается со всем, что к нему подключено. Есть еще коммуникационные интерфейсы, но о них в последующих уроках. Хотя интерфейсы также используют порты, только в режиме альтернативных функций.

В системе STM32 применяется общепринятое название портов ввода-вывода общего назначения, а именно GPIO (General purpose input-output).

Под “общим назначением” имеется в виду, что состояние выводов устанавливается или считывается программно, т.е. вывод не является входным или выходным сигналом какого-либо аппаратного узла микроконтроллера.

В системе STM32:

  • Порты обозначаются GPIOA, GPIOB, GPIOC и т.д. На схеме микроконтроллера соответствующие портам выводы обозначаются PA0-PA15, PB0-PB15, PC0-PC15…
  • Порты 16ти разрядные, т.е. у каждого порта 16 выводов.
  • Режим и состояние каждого вывода могут быть установлены отдельно, независимо от других выводов.
  • Каждый вывод может использоваться в режиме:
    • Input floating – вход без подтягивающего резистора, брошенный в воздухе вход.
    • Input pull-up – вход с подтягивающим резистором, подключенным к питанию микроконтроллера.
    • Input pull-down — вход с подтягивающим резистором, подключенным к общему проводу (земле).
    • Analog – аналоговый вход ( вход АЦП, компараторов и т.п.).
    • Output open-drain – выход с открытым стоком. Функционально аналогичен выходу с открытым коллектором. При низком логическом уровне замыкает вывод на землю, при высоком – бросает в воздухе.
    • Output push-pull – обычный активный выход. При низком логическом уровне напряжение на выводе равно 0, при высоком – напряжение близко к напряжению питания микроконтроллера, обычно + 3 В.
    • Alternate function push-pull – альтернативная функция вывода в обычном (активном) режиме.
    • Alternate function open-drain – альтернативная функция вывода в режиме открытый сток.
  • Существует система защиты конфигурационных параметров порта. Для ее активизации необходимо выполнить определенную последовательность действий над регистрами конфигурации. Разблокировка происходит только после сброса.
  • В нашем микроконтроллере STM32F103C8T6 существуют 37 портов ввода-вывода:
    • GPIOA – 16 выводов: PA0-PA15;
    • GPIOB – 16 выводов: PB0-PB15;
    • GPIOC – 3 вывода: PC13-PC15;
    • GPIOD – 2 выводов: PD0, PD1.

Порты STM32 с аппаратной точки зрения.

К портам ввода-вывода мы будем подключать реальные аппаратные устройства, узлы, схемы. Поэтому важно знать, как они устроены, их электрические характеристики.

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

Нас интересует правая, выходная часть.

Режим входов.

При использовании вывода в качестве входа, к нему могут быть подключены подтягивающие резисторы сопротивлением порядка 40 кОм. Либо к питанию Vdd, либо к земле Vss.

Основные для нас входные параметры портов.

Параметр Значение
Напряжение низкого уровня Не более 0,35 VDD
При питании 3,3 В не более 1,16 В
Напряжение высокого уровня Не менее 0,65 VDD
При питании 3,3 В не менее 2,15 В
Ток утечки ± 1 мкА
Сопротивление подтягивающих резисторов 30 – 50 кОм,
типовое значение 40 кОм
Емкость 5 пкФ

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

Согласно схеме к выводу подключены 2 защитных диода. Один на землю Vss, другой на шину питания Vdd. Первый замыкает через себя входное напряжение отрицательной полярности, другой ограничивает его на уровне Vdd, у нас на плате это 3,3 В.

Сигналы с напряжением, превышающим эти пределы должны подключаться через ограничительные резисторы. Входной ток не должен превышать ± 5 мА. Это предельный ток защитных диодов.

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

Но большая часть входов микроконтроллера допускает подачу напряжения 5 В. Это, так называемые, толерантные к 5 В входы. В схеме для таких выводов верхний защитный диод подключен не к питанию Vdd, а к ограничителю напряжения Vdd_ft. Толерантные выводы обозначаются FT (five volt tolerant). Напряжение ограничевается до уровня на 4 В выше Vdd. Сделано это для подключения сигналов с 5 В уровнями. На схеме распределения выводов STM32F103C8T6 толерантные к 5 В выводы отмечены закрашенными точками.

Предельно-допустимые входные параметры портов.

Параметр Значение
Напряжение на толерантных входах Не менее — 0,3 В, не более Vdd + 4 В
При питании 3,3 В — 0,3 … 7,3 В
Напряжение на остальных входах Не менее — 0,3 В, не более 4 В
Максимальный втекающий ток через защитные диоды ± 5 мА

Режим выходов.

В режиме выхода порта работают 2 комплементарных транзистора.

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

Выходные параметры портов.

Параметр Значение
Напряжение низкого уровня при втекающем токе 8 мА Не более 0,4 В
Напряжение низкого уровня при втекающем токе 20 мА Не более 1,3 В
Напряжение высокого уровня при вытекающем токе 8 мА Не менее Vdd – 0,4 В
Напряжение высокого уровня при вытекающем токе 20 мА Не менее Vdd – 1,3 В

Предельно-допустимые выходные параметры портов.

Параметр Значение
Максимальный вытекающий ток вывода 25 мА
Максимальный втекающий ток вывода — 25 мА
Общий вытекающий или втекающий ток портов Не более 150 мА.

Получается, что к каждому выводу порта можно подключать нагрузку до 25 мА. Но при этом уровень логического сигнала выйдет за допустимые значения логических уровней. Чтобы этого не произошло нельзя нагружать вывод током свыше 8 мА.

Программное управление портами STM32.

Для каждого порта (16 выводов) есть два 32х разрядных регистра конфигурации. Они образуют 64 битный регистр конфигурации порта.

Младший регистр конфигурации портов GPIOx_CRL (Port configuration register low)

Старший регистр конфигурации портов GPIOx_CRH (Port configuration register high)


На каждый вывод отводится 4 бита, которые делятся на 2 битные поля режима и конфигурации.

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

Поле режима (биты Mode).

Биты режима MODE [1 : 0] Режим
0 0 Вход
0 1 Выход, синхронизация 10 мГц
1 0 Выход, синхронизация 2 мГц
1 1 Выход, синхронизация 50 мГц

Поле режима дополняют биты конфигурации.

Конфигурация Биты конфигурации
CNF [1 : 0]
Биты режима
MODE [1 : 0]
Бит в регистре вывода данных
PxODR
Выход общего назначения Активный выход 0 0 0 1

1 1

0 или 1
Открытый сток 0 1 0 или 1
Выход альтернативной функции Активный выход 1 0
Открытый сток 1 1
Вход Аналоговый вход 0 0 0 0
Свободный вход 0 1
Вход, подтяжка к земле 1 0
Вход, подтяжка к питанию 1

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

Регистр блокировки конфигурации порта GPIOx_LCKR (Port configuration lock register)

Каждому выводу порта соответствует бит блокировки LCK0 – LCK15. При установке бита в 1 запрещается изменение соответствующих битов режима и конфигурации. После задания всех нужных битов регистра блокировки необходимо активизировать защиту. Для этого надо в 16й бит регистра блокировки (LCKK) последовательно записать 1, 0, 1. После этого блокировка будет действовать и изменение защищенных битов конфигурации и режима возможно только после сброса микроконтроллера.

Проверить установлена ли защита конфигурации можно чтением этого же 16-го бита (LCKK). При активированной защите два подряд чтения бита должны дать результат 0, 1.

Доступ к портам происходит через регистры ввода и вывода данных.

Регистр ввода данных порта GPIOx_IDR (Port input data register)

Регистр вывода данных порта GPIOx_ODR (Port output data register)

Первый доступен только для чтения. Биты IDR0 – IDR15 содержат состояние соответствующих выводов порта.

Запись данных во второй регистр устанавливает состояние выводов порта (ODR0 – ODR15).

Если задан режим вывода – вход, то состояние соответствующего бита ODR0 – ODR15 определяет, куда подключен подтягивающий резистор, к шине питания или земле.

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

Регистр установки/сброса битов GPIOx_BSRR (Port bit set/reset register)

Регистр установки/сброса битов разделен на 2 равные части(0-15 и 16-31). Первая предназначена для установки выводов в состояние 1, вторая – в состояние 0.

  • Запись данного с 1 в битах BS0 – BS15 устанавливает соответствующие выводы в состояние высокого уровня.
  • Запись данного с 1 в битах BR0 – BR15 переводит соответствующие выводы в состояние низкого уровня.

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

Регистр сброса битов GPIOx_BRR (Port bit reset register)

Это 16ти разрядный регистр, который работает точно так, как младшая половина предыдущего регистра установки/сброса.

Запись слова с 1 в битах BR0 – BR15 переводит соответствующие выводы в состояние низкого уровня.

Конфигурация портов с помощью STM32CubeMX.

Здесь все просто и понятно. Мы это уже делали.

Давайте настроим вывод PB12 на вход с подтягивающим резистором к шине питания, а PB13 на активный выход.

Закладка System Core -> GPIO.


Правой кнопкой мыши нажимаем на вывод PB12. Выбираем GPIO_Input.

Для вывода PB13 задаем режим GPIO_Output

В поле Configuration выбираем строку PB12 и задаем Pull-up и имя вывода. Я написал Button.

Выбираем строку PB13 и задаем:

  • высокий уровень при включении (High);
  • активный выход (Output Push Pull);
  • имя Led.

Я не буду описывать режимы, они очевидны.

Давайте настроим систему тактирования и вывод PC13, как в уроке 3, и создадим проект Lesson6_1.

Проект будем использовать в следующем уроке.

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

Программирование STM32. Часть 5: Порты ввода-вывода GPIO

В этой части мы разберемся с порами ввода-вывода GPIO микроконтроллера STM32F103C8 и напишем «Hello, World!» с мигающим светодиодом, а так же научимся читать состояние выводов микроконтроллера и использовать встроенный подтягивающий резистор. Предыдущая статья здесь, все статьи цикла можно посмотреть тут: http://dimoon.ru/category/obuchalka/stm32f1.

Введение

General-purpose input/output (GPIO) — важный компонент любого микроконтроллера, с помощью которого он взаимодействует с окружающим миром. В микроконтроллерах STM32 порты именуются буквами A, B, C и так далее: GPIOA, GPIOB, GPIOC... Каждый GPIO имеет 16 линий ввода/вывода, причем каждая линия может быть настроена независимо от других. Вот варианты настройки:

  • Input floating — вход с отключенными подтягивающими резисторами
  • Input pull-up — вход с подтяжкой к логической единице
  • Input-pull-down — вход с подтяжкой к логическому нулю
  • Analog — аналоговый вход (например, для АЦП)
  • Output open-drain — выход с открытым коллектором (записали 1 — выход в высокоимпедансном состоянии, записали 0 — выход прижат внутренним транзистором к земле)
  • Output push-pull — выход «тяни-толкай» (записали 1 — на выходе лог. 1, записали 0 — на выходе лог. 0)
  • Alternate function push-pull — альтернативная функция в режиме «тяни-толкай»
  • Alternate function open-drain — альтернативная функция в режиме открытого коллектора

Дам несколько пояснений по поводу режимов.

Режим Analog. Внутри микроконтроллера есть аналогово-цифровые преобразователи, которые, как известно, должны иметь аналоговые входы. Так вот, в режиме Analog ножка микроконтроллера подключается к аналоговому входу АЦП внутри микроконтроллера. Кроме того, отключается вся цифровая обвязка этой ножки для уменьшения цифрового шума и энергопотребления.

Alternate function. В этом режиме ножкой микроконтроллера управляет внутренняя цифровая периферия, например, модуль USART.

Регистры GPIO

Давайте рассмотрим регистры портов GPIO.

Port configuration register low (GPIOx_CRL)

Рис. 1. Регистр CRL

Это конфигурационный регистр для выводов порта с номерами от 0 до 7. Каждому выводу предоставлено 4-ре бита конфигурации: 2 бита MODEy и 2 бита CNFy.

MODEy[1:0]: Режим ножки порта, вход или выход. В режиме выхода нужно выбрать максимальную частоту переключения данной ножки, насколько понял это является оптимизацией энергопотребления порта.

  • 00: Вход (значение после сброса)
  • 01: Выход, максимальная частота 10 MHz.
  • 10: Выход, максимальная частота 2 MHz.
  • 11: Выход, максимальная частота 50 MHz.

CNFy[1:0]: Конфигурация режима.

В режиме входа (MODEy[1:0]=00):

  • 00: Analog mode — аналоговый режим (подключен к АЦП или ЦАП-у)
  • 01: Floating input — вход с отключенными подтягивающими резисторами (значение после сброса)
  • 10: Input with pull-up / pull-down — вход с подтяжкой вверх или вниз
  • 11: Reserved — не используется


В режиме выхода (MODEy[1:0]>00):

  • 00: General purpose output push-pull — выход в режиме тяни/толкай
  • 01: General purpose output Open-drain — выход с открытым коллектором
  • 10: Alternate function output Push-pull — выход альтернативной функции режиме тяни/толкай
  • 11: Alternate function output Open-drain — выход альтернативной функции с открытым коллектором

Port configuration register high (GPIOx_CRH)

Рис. 2. Регистр CRH

Это конфигурационный регистр для выводов порта с номерами от 8 до 15. Тут все то же, что и для регистра GPIOx_CRL.

Port input data register (GPIOx_IDR)

Рис. 3. Регистр IDR

IDRy: в этих битах содержится входное значение соответствующего порта ввода-вывода.

Port output data register (GPIOx_ODR)

Рис. 4. Регистр ODR

ODRy: выходные данные порта.

Port bit set/reset register (GPIOx_BSRR)

Рис. 5. Регистр BSRR

С помощью этого регистра можно сбросить или установить любой бит регистра ODR без операций чтение-модификация-запись.

BRy: Сбросить бит у регистра ODR порта ввода-вывода (y= 0 .. 15)

  • 0: не оказывает влияние на соответствующий бит ODRx
  • 1: Сбрасывает в ноль соответствующий бит ODRx

BSy: Установить бит у регистра ODR порта ввода-вывода (y= 0 .. 15)

  • 0: не оказывает влияние на соответствующий бит ODRx
  • 1: Устанавливает в единицу соответствующий бит ODRx

Port bit reset register (GPIOx_BRR)

Рис. 6. Регистр BRR

С помощью этого регистра можно сбросить любой бит регистра ODR без операций чтение-модификация-запись.

BRy: Сбросить бит у регистра ODR порта ввода-вывода (y= 0 .. 15)

  • 0: не оказывает влияние на соответствующий бит ODRx
  • 1: Сбрасывает в ноль соответствующий бит ODRx

Port configuration lock register (GPIOx_LCKR)

Рис. 7. Регистр LCKR

Этот регистр используется для блокировки конфигурационных битов порта после записи корректной последовательности в 16 бит (LCKK) регистра. Значения битов [15:0] используется для блокировки конфигурации GPIO. Во время блокирующей последовательности в LCKK значения LCKR [15: 0] не должны меняться. Когда блокирующая последовательность была записана, конфигурация выбранных портов ввода/вывода может быть изменена только после сброса микроконтроллера. Каждый LCKy бит блокирует возможность изменения четырех битов конфигурации порта (CRL, CRH).


LCKK[16]: Ключ блокировки.

  • 0: Блокировка конфигурации порта не активна.
  • 1: Блокировка конфигурации порта активна. GPIOx_LCKR заблокирован до следующего сброса микроконтроллера.

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

  • Записать 1
  • Записать 0
  • Записать 1
  • Прочитать 0
  • Прочитать 1 (эта операция чтения не является обязательной, а всего лишь подтверждает успешность установки блокировки)

LCKy: Эти биты могут быть прочитаны и записаны, но запись можно произвести только если бит LCKK равен нулю.

  • 0: Конфигурация пина номер y не заблокирована
  • 1: Конфигурация пина номер y заблокирована

Настройка порта GPIO

Итак, с регистрами разобрались, настало время практики. Все примеры в этой статье для микроконтроллера STM32F103C8. В моем распоряжении есть вот такая отладочная плата:

На ней установлен кварцевый резонатор на 8 МГц и светодиод на порту PB12. Вот с помощью этого светодиода мы и устроим Hello, World! ��

Задача ясна: настраиваем PB12 на выход в режиме push-pull и с помощью регистра ODR дергаем 12-й пин порта GPIOB туда-сюда! Но мы забыли об одной маленько детали: RCC. Дело в том, что по-умолчанию после сброса микроконтроллера все периферийные модули отключены от источника тактового сигнала, в том числе и GPIO. А подать тактирование можно с помощью регистров RCC. В 3-ей части я про это говорил. Для начала нужно определить, к какой шине у нас подключен GPIOB. Открываем даташит на микроконтроллер, ищем вот эту таблицу:

Рис. 8. Таблица шин и периферийных устройств

GPIOB у нас подключен к шине APB2. Идем в Reference manual, открываем раздел про RCC, переходим к пункту 7.3.7 APB2 peripheral clock enable register (RCC_APB2ENR). С помощью этого регистра можно подать тактовый сигнал на устройства шины APB2:

Рис. 9. Регистр RCC_APB2ENR

В регистре RCC_APB2ENR много флагов для разной периферии, в том числе и для нашего GPIOB, флаг называется IOPBEN. Перед началом инициализации PB12 нам надо установить этот бит в единицу.

Outp, outpw вывод в порт

Код вывода (Output)

Отправляет значение или значение переменной в определенный порт и/или биты

Данные отправляются в бинарном (BYTE) формате.

Display Name
Имя иконки.

Variable or value
Выбор цифрового значения или имени переменной с цифровым значением отправляемые в порт.
Данные должны быть или в десятичном (целым) или в HEX формате (с префиксом 0x) например 255 или 0xFF.

Variables кнопка
Кнопка вызова списка заранее заготовленных имен переменных. Так же позволяет создать новую переменную.

Port
Выбор доступных портов данного микроконтроллера

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

Entire Port
Отправка в весь порт.

Use Masking
Используя маску. Можно выбрать несколько регистров порта для отправки значения в них. Удобно, когда часть порта работает на выход, а часть на вход.
С маской только выбранные биты получают свое значение, все не выбранные биты не затронуты

Перенаправление вывода терминала в переменную

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


Вопрос: можно ли перенаправить вывод терминала windows не используя temp.txt файл, тобиш сразу выгружать значение в переменную.? sys.stdout пробовал.

3 ответа 3

subprocess.check_output() — это самый простой способ получить вывод внешней команды:

Всё что программа выводит в стандартный вывод, сохраняется в output . Если программа завершится с ненулевым статусом возврата (как правило на ошибку указывает), то check_output() выбросит исключение (не следует неявно ошибки игнорировать).

Начиная с простого случая существует множество вариаций. К примеру, чтобы получить объединённый вывод как из стандартного потока команды (stdout) так и из потока ошибок (stderr), можно передать stderr=subprocess.STDOUT параметр в check_output() . Дочерний процесс может вообще напрямую в терминал писать в обход своих stdout/stderr, в этом случае на POSIX системах можно pty создать, чтобы перехватить вывод (в таких случаях удобно pexpect модуль использовать).

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

Стоит упомянуть, что в отличии от старых интерфейсов, унаследованных из Си (таких как system() , popen() ), функции в subprocess модуле никогда не запускают командную оболочку, если явно об этом не попросить. Что позволяет избежать shell injection и делает вызов более переносимым (если сама программа переносима).

Базовые сведения о работе с коммутаторами Cisco

Базовые сведения о работе с коммутаторами Cisco

Данная статья когда-то разрабатывалась, как пособие по основам работы с коммутаторами для «самых начинающих» инженеров. Постараемся в нём рассмотреть практические аспекты работы, не закапываясь особенно в теорию коммутации. В качестве подопытной зверушки у нас будут выступать коммутатор L3 серии Cisco Catalyst 3560 – достаточно универсальная железка, позиционируемая производителем как коммутатор корпоративного класса с фиксированной конфигурацией. Может применяться, как на уровне доступа, так и на уровне распределения.
При написании статьи предполагается, что читающий уже знаком с основами работы в Cisco IOS, или способен разобраться с встроенной системой помощи, благо, что она достаточно информативна и дружелюбна. Также предполагается само собой разумеющимся хотя бы базовое знание технологий TCP/IP и модели OSI.

Базовая конфигурация режимов работы портов.

Поскольку в построении сети практически невозможно обойтись без использования VLAN, то первое, на что мы обратим внимание – это два основных режима работы портов для передачи тегированного и нетегированного трафика, или, в терминологии Cisco – trunk & access соответственно.
К access порту подключаются, как правило, оконечные устройства, не умеющие работать с тегированным трафиком, а к trunk – каналы для передачи данных по различным VLAN в сети.

Конфигурация access-порта предельно проста, и выглядит примерно так:

interface FastEthernet0/4
description –simple access port—
switchport access vlan 100
switchport mode access

Настраивается, соответственно, так:

sw1.cs.ntk#conf t
Enter configuration commands, one per line. End with CNTL/Z.
sw1(config)#interface fastEthernet0/4
sw1(config-if)# description —SKY-CONTROL—

Задаем описание интерфейса. Не обязательно, но очень помогает в документации сети.
sw1(config-if)# switchport access vlan 100
Устанавливаем VLAN в который будет попадать трафик при входе в этот интерфейс. Соответственно, при выходе кадров из него, метки VLAN снимаются.

sw1(config-if)# switchport mode access
Переключаем порт в режим access.

Базовая конфигурация транковых портов тоже элементарна:

interface FastEthernet0/21
description –simple trunk port—
switchport trunk encapsulation dot1q
switchport trunk allowed vlan 952, 953
switchport mode trunk

Как мы видим – добавляется только список разрешенных к прохождению VLAN (не обязательно, но в целях безопасности лучше применить) и применяемый стандарт энкапсуляции – dot1q, пропиетарный Cisco ISL, или автосогласование.

Транковый порт сам по себе не умеет работать с нетегированным трафиком, поэтому такой трафик будет просто отброшен. Для его обработки можно настроить на портах native vlan. Любой пакет, не принадлежащий к определенному VLAN будет помечаться меткой native vlan, а трафик из данного vlan будет передаваться в транковый порт нетегированным.

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

interface FastEthernet0/21
description — port — switchport access vlan 2
switchport trunk encapsulation dot1q
switchport mode trunk

Конфигурация скорости и дуплекса.

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

sw1(config-if)#speed?
10 Force 10 Mbps operation
100 Force 100 Mbps operation
auto Enable AUTO speed configuration

sw1(config-if)#duplex?
auto Enable AUTO duplex configuration
full Force full duplex operation
half Force half-duplex operation

О диагностике проблем, связанных с автосогласованием будет сказано далее.
Сами VLAN создаются так:
ors-sw-ortpc(config)#vlan 777
ors-sw-ortpc(config-vlan)#name test_vlan
ors-sw-ortpc(config-vlan)#exit

Просмотр информации о созданных VLAN – show vlan

Catalyst 3560 поддерживает до 1005 созданных VLAN. Возникает вопрос – что делать, если число созданных VLAN подходит к концу, а нужно подключить скажем, новый сегмент сети? Или же, до новой БС присоединяющий оператор выделил 1 VLAN, а нам нужно пробрасывать свой VLAN. В таком случае можно использовать dot1q tunneling, или Q-in-Q – двойное тегирование VLAN. В таком случае на входе транспорта внуть одного VLAN упаковываются остальные VLAN, и распаковываются на выходе. Сражу стоит отметить что 29хх серия Catalyst, в отличие от 35xx, 37xx такой режим работы не поддерживает.
Настраивается тоже достаточно элементарно:

sw1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
sw1(config)#interface fa0/17
sw1(config-if)#description – QinQ double encapsulation — sw1(config-if)#switchport mode dot1q-tunnel
sw1(config-if)#switchport access vlan 77


interface FastEthernet0/17
switchport access vlan 77
switchport mode dot1q-tunnel
end

Таким образом настроенный порт все приходящие пакеты будет энкапсулировать в VLAN 77, который и будет виден для всех устройств, находящихся далее. Достаточно передать данный VLAN до того узла, на котором необходимо развернуть обратно, и там распаковать, используя аналогичные настройки порта.
При этом, возможно, нужно будет увеличить MTU по данному пути на 4 байта, для обеспечения дополнительной метки vlan tag.

Адресация и маршрутизация.

Catalyst 3560 может работать как на третьем уровне сетевой модели, так и на втором. В любом случае для доступа к нему необходимо присвоить ему IP адрес в требуемом VLAN (как правило, для управления устройствами выделяется отдельный VLAN) и настроить маршрутизацию.

interface Vlan100
ip address 192.168.10.254 255.255.255.0

ip default-gateway 192.168.10.1

Тем самым мы назначили коммутатору IP-адрес 192.168.10.254/24 в 100м VLAN и установили шлюзом по умолчанию 192.168.10.1. При такой схеме коммутатор используется как L2. Включить L3 маршрутизацию можно командой ip routing. При этом становится возможным задавать множество маршрутов, и просматривать, соответственно, таблицу маршрутизации (show ip route). Естественно, перед переключение необходимо сначала указать маршруты, чтобы не потерять управление коммутатором из другой сети.

conf t
ip route 0.0.0.0 0.0.0.0 192.168.10.1

Получение и обработка информации.

Думаю, тут стоит рассмотреть практические примеры с пояснениями:

show interfaces status – выводит общую информацию по всем портам.

sw1#show interfaces status
Port Name Status Vlan Duplex Speed Type
Fa0/1 Sector-1 connected trunk a-full a-100 10/100BaseTX
Fa0/2 Sector-2 connected trunk a-full a-100 10/100BaseTX
Fa0/3 Sector-3 connected trunk a-full a-100 10/100BaseTX
Fa0/4 notconnect 1 auto auto 10/100BaseTX
Fa0/5 port connected 100 a-full a-100 10/100BaseTX
Fa0/6 connected trunk full 100 10/100BaseTX
Fa0/7 disabled 100 auto auto 10/100BaseTX

Здесь мы можем видеть:
Собственно, сам порт, его имя (задаваемое description).
Status – порта – подключен и поднят (connected)/не подключен физически (notconnect) либо административно отключен (disabled).
Vlan – режим работы порта – trunk, или соответствующий access vlan.
Дуплекс и скорость порта – авто, или же жестко заданные установки (Fa0/6 – принудительно в режиме 100 Mb, full duplex.), Обратите внимание что на нерабочих интерфейсах прописано auto.

sh interfaces – просмотр подробной информации об указанном интерфейсе.

sw1#sh interfaces fa0/21
FastEthernet0/21 is up, line protocol is up (connected)
Hardware is Fast Ethernet, address is 001f.0001.0001 (bia 001f.0001.0001)
Description: — some port — MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec,
reliability 255/255, txload 1/255, rxload 2/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Full-duplex, 100Mb/s, media type is 10/100BaseTX
input flow-control is off, output flow-control is unsupported
ARP type: ARPA, ARP Timeout 04:00:00
Last input 00:00:00, output 00:00:06, output hang never
Last clearing of «show interface» counters 17w4d
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: fifo
Output queue: 0/40 (size/max)
5 minute input rate 1056000 bits/sec, 203 packets/sec
5 minute output rate 551000 bits/sec, 269 packets/sec
1015031190 packets input, 556493190204 bytes, 0 no buffer
Received 8800603 broadcasts (0 multicasts)
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 watchdog, 5337282 multicast, 0 pause input
0 input packets with dribble condition detected
1761812043 packets output, 340685749958 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 babbles, 0 late collision, 0 deferred
0 lost carrier, 0 no carrier, 0 PAUSE output
0 output buffer failures, 0 output buffers swapped out

Is up, line protocol is up (connected) — Первое «up» относится к состоянию физического уровня передачи данных интерфейса. Сообщение «line protocol up» показывает состояние уровня канала передачи данных для данного интерфейса и означает, что интерфейс может отправлять и принимать запросы keepalive.
Для сравнения
FastEthernet0/4 is down, line protocol is down (notconnect) – порт отключен.
FastEthernet0/7 is administratively down, line protocol is down (disabled) – отключен административно (shutdown).
Full-duplex, 100Mb/s (полнодуплексный, 100 Мбит/с) — текущая скорость и режим дуплексирования для данного интерфейса. Заметьте, что сейчас невозможно узнать – было ли включено автосогласование для порта.
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
– очередь входа для пакетов. На коммутаторах данной серии не используется, но служит для отброса пакетов с низким приоритетом в случае перегрузки CPU. Общее число сбросов. Стоит заметить, что типичной причиной сброса пакетов может быть прием трафика в канал с меньшей пропускной способностью из более широкого канала.

5 minute input rate 1056000 bits/sec, 203 packets/sec
5 minute output rate 551000 bits/sec, 269 packets/sec

Скорость ввода/вывода трафика за 5 минут – в битах и пакетах. Возможно подсчитывать трафик за иные промежутки времени – для этого используется команда load-interval. Однако, это ведет к увеличению загрузки CPU.
sw1(config)#int fa0/1
sw1(config-if)#load-interval?
Load interval delay in seconds

1015031190 packets input, 556493190204 bytes, 0 no buffer
Received 8800603 broadcasts (0 multicasts)
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 watchdog, 5337282 multicast, 0 pause input
0 input packets with dribble condition detected
1761812043 packets output, 340685749958 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 babbles, 0 late collision, 0 deferred
0 lost carrier, 0 no carrier, 0 PAUSE output
0 output buffer failures, 0 output buffers swapped out

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

sw1#sh interfaces fa0/1 counters errors
Port Align-Err FCS-Err Xmit-Err Rcv-Err UnderSize
Fa0/1 0 0 0 3 1.46E+08
Port Single-Col Multi-Col Late-Col Excess-Col Carri-Sen Runts Giants
Fa0/1 0 0 0 0 0 3 64

Счетчик и некоторые рекомендации:

Align-Err
Количество ошибок выравнивания.
Как правило, увеличение данного счетчика свидетельствует о проблемах согласования дуплексных режимов, либо о наличии проблемы на физическом уровне.

collisions
Число коллизий произошедших до окончания передачи пакета. Нормальное явление для полудуплексного интерфейса. Быстрый рост счетчика может быть вызван высокой загрузкой интерфейса, либо несоответствием режимов дуплекса.

CRC
Несовпадение контрольной суммы кадра.
Обычно является результатом конфликтов, но может указывать и на физическую неполадку. В некоторых случаях возможны наводки на физику ЛВС, либо помехи.

pause input
Подключенное устройство запрашивает приостановку передачи трафика при переполнении его буфера.
Excess-ColПодобно коллизиям не должно наблюдаться на полнодуплексном интерфейсе.

FCS-Err
Ошибки в контрольной последовательности кадров.
Как правило, увеличение данного счетчика свидетельствует о проблемах согласования дуплексных режимов, либо о наличии проблемы на физическом уровне.

ignored
Может быть признаком широковещательного шторма в сети.

Late-Col
Коллизии на последних этапах передачи кадра. Не должны наблюдаться на полнодуплексном порту.

lost carrier
Потеря несущей. Проблемы на физическом уровне.

Underruns
Скорость передатчика превышает возможности коммутатора.


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

Для получения подробной информации по обработанным пакетам можно использовать команду
sh controllers ethernet-controller
Пример вывода:
sw1 #sh controllers ethernet-controller fa0/21

Transmit FastEthernet0/1 Receive
665578020 Bytes 662563391 Bytes
3057832162 Unicast frames 2887447872 Unicast frames
2443399319 Multicast frames 100518228 Multicast frames
132541948 Broadcast frames 90307083 Broadcast frames
0 Too old frames 533536518 Unicast bytes
0 Deferred frames 3228404572 Multicast bytes
0 MTU exceeded frames 1010212552 Broadcast bytes
0 1 collision frames 0 Alignment errors
0 2 collision frames 0 FCS errors
0 3 collision frames 0 Oversize frames
0 4 collision frames 145990113 Undersize frames
0 5 collision frames 0 Collision fragments
0 6 collision frames
0 7 collision frames 735750877 Minimum size frames
0 8 collision frames 1557036200 65 to 127 byte frames
0 9 collision frames 305275380 128 to 255 byte frames
0 10 collision frames 95908725 256 to 511 byte frames
0 11 collision frames 126755638 512 to 1023 byte frames
0 12 collision frames 257546363 1024 to 1518 byte frames
0 13 collision frames 0 Overrun frames
0 14 collision frames 0 Pause frames
0 15 collision frames
0 Excessive collisions 0 Symbol error frames
0 Late collisions 0 Invalid frames, too large
0 VLAN discard frames 64 Valid frames, too large
0 Excess defer frames 0 Invalid frames, too small
521536351 64 byte frames 145990113 Valid frames, too small
3679829207 127 byte frames
317941784 255 byte frames 0 Too old frames
197523329 511 byte frames 64 Valid oversize frames
114203781 1023 byte frames 0 System FCS error frames
802738977 1518 byte frames 0 RxPortFifoFull drop frame
0 Too large frames
0 Good (1 coll) frames
0 Good (>1 coll) frames

На этом позвольте закончить, все дополнительное уже мало укладывается в рамки данной статьи.

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

Система команд x86

Влияние команды на флаги и форматы команды:

Вывести байт из AL в порт в/в по адресу imm8

Вывести слово из AX в порт в/в по адресу imm8

Вывести двойное слово из EAX в порт в/в по адресу imm8

Вывести байт из AL в порт в/в по адресу в DX

Вывести слово из AX в порт в/в по адресу в DX

Вывести двойное слово из EAX в порт в/в по адресу в DX

Описание:

Команда OUT пересылает байт, слово или двойное слово данных из регистра AL, AX или EAX в порт вывода, заданный первым операндом. Адрес порта может задаваться непосредственным операндом imm8 или содержимым регистра DX. Таким образом, возможно обращение к 256 портам, адреса которых фиксированы в программе (байт imm8), или к 65536 портам, адреса которых могут изменяться путем перезагрузки содержимого регистра DX.

При работе с 16-разрядными данными число адресуемых портов уменьшается вдвое, а их адресация обычно производится четными числами — 0, 2, 4, . 254 при адресации непосредственным операндом и 0, 2, 4, . 65534 при адресации через регистр DX. Соответственно, для 32-разрядных данных число портов сокращается еще вдвое, а их адресация производится числами кратными четырем 0, 4, 8, . 252, . 65532. Таким образом, номера портов должны быть выровнены по границам передаваемых данных согласно их разрядности (1, 2 или 4 байта). В этом случае пересылка осуществляется за один цикл. Если заданный номер 16- или 32-разрядного порта имеет невыровненное значение, то для передачи данных требуется дополнительный цикл шины.

Операция:

IF (PE = 1) AND ((VM = 1) OR (CPL > IOPL))

THEN (* Виртуальный-8086 режим, или защищенный режим с CPL > IOPL *)

IF NOT I-O-Permission(DEST, width(DEST))

[DEST] = SRC; (* Запись в пространство ввода-вывода *)

Особые ситуации защищенного режима:

#GP(0), если значение текущего уровня привилегий CPL больше по значению уровеня привилегий ввода-вывода IOPL и любой из соответствующих порту битов разрешения ввода-вывода в TSS равен 1.

Особые ситуации режима реальной адресации:

Особые ситуации режима V86:

#GP(0), если любой из соответствующих порту битов разрешения ввода-вывода в TSS равен 1.

Замечание:

По окончании выполнения команды OUT процессоры, начиная с Pentium, проверяют, установлен ли сигнал на выводе EWBE# в активное состояние, задерживая выполнение следующей команды до его установления. Заметьте, что команда может быть выбрана с упреждением, даже если EWBE# не активен, но она не выполняется до тех пор, пока сигнал отсутствует. В более ранних моделях процессоров вывод EWBE # отсутствует и никаких задержек не производится.

STM32. Урок 2. Порты ввода/вывода

Во втором уроке цикла, посвященного работе с микроконтроллерами STM32, речь пойдет о портах ввода/вывода.
Порты микроконтроллера позволяют взаимодействовать с внешними устройствами, начиная от светодиода и кнопки и заканчивая более сложными устройствами: дисплеями, GPS и GSM модемами и так далее. Также порты позволяют организовать связь с другими устройствами, например с компьютером.


General Purpose Input/Output (GPIO). GPIO основной и часто применяемый способ связи с внешней средой. Порты могут работать в двух режимах: вход (прием сигнала) и выход (передача сигнала). Работают они только с логическими уровнями 0 (низкий уровень) или 1 (высокий уровень).
Например, если подключить к порту в режиме выхода светодиод, то при подаче сигнала высокого уровня светодиод будет светиться, а при подаче низкого – потухнет.
Если включить вывод в режим входа и подключить к нему кнопку, то с помощью микроконтроллера можно отслеживать ее состояние: нажатое или отпущенное.
По сути GPIO самый простой и примитивный способ организации работы с внешними устройствами, но использование обработки прерываний и таймеров значительно расширяет возможности. Речь о них пойдет немного позже.

Решим первую практическую задачу: управление светодиодами и считывание состояние кнопки.
Следует отметить очень важный момент – порты микроконтроллера могут выдать ток не более 20 мА. Хотя выдать он их может, но один раз и ненадолго, до хлопка и сизого дыма;). Для подключения более мощных нагрузок следует использовать силовые ключи.

Итак, начнем. Для работы возьмем плату STM32F4 Discovery. На ней изначально установлена пользовательская кнопка, подключенная к порту PA0 и 4 светодиода, подключенные к портам PD12-PD15.

Схема подключение кнопки и светодиодов показаны на рисунке.

Резистор R1 номиналом 10кОм – «подтяжка к земле», позволяет избежать ситуации, когда порт не подключен ни к «0», ни к «1» — этого необходимо избегать, а резистор решает эту проблему. Такую подтяжку можно включить и программно, но лучше обезопасить себя так.

Резисторы R2-R5 330Ом ограничивают ток, протекающий через светодиоды. Их можно выбрать в диапазоне от 200Ом до 1кОм, все зависит от необходимой яркости.

Теперь перейдем к написанию программы. В качестве среды разработки я использую CooCox. Среда бесплатная и, на мой взгляд, удобная. Как начинать в ней работать рассказывать не буду – в интернете по ней достаточно информации, для прошивки использую STM32 ST-LINK Utility.
Для начала включаем тактирование порта A, к которому подключена кнопка:

Теперь нужно правильно сконфигурировать порт:

Существует несколько вариантов режима работы порта:
GPIO_Mode_IN – цифровой вход;
GPIO_Mode_OUT – цифровой выход;
GPIO_Mode_AF – альтернативная функция (UART и т.д.);
GPIO_Mode_AN – аналоговый режим.

Возможны следующие режимы «подтяжки»:
GPIO_PuPd_NOPULL – без подтяжки, вывод «болтается в воздухе»
GPIO_PuPd_UP – подтяжка к 3,3В
GPIO_PuPd_DOWN – подтяжка к «земле»

Теперь сконфигурируем выводы, к которым подключены светодиоды:

Вот и все, порты сконфигурированы. Теперь напишем обработку в основном цикле программы:

Вот и все, программа готова. Полная версия в архиве с проектом. Работа платы показана на видео.

Теперь подробнее об использованных функциях:
GPIO_ReadInputDataBit – чтение состояния выбранного порта.
Синтаксис:

Где GPIOx – выбранный порт, GPIO_Pin – выбранный пин. Возвращает 0 или 1.

GPIO_SetBits и GPIO_ResetBits устанавливают или сбрасывают бит выбранного порта. Синтаксис:

Где GPIOx – выбранный порт, GPIO_Pin – выбранный пин.

Вот собственно и все, что нужно знать для работы с цифровыми портами. Следующая статья будет посвящена работе с UART.

порта завершения ввода / вывода — Input/output completion port

Вход / выход порта завершения ( IOCP ) представляет собой API , для выполнения нескольких одновременных асинхронного ввода / вывода операций в Windows NT версии 3.5 и более поздних версий, AIX и на Solaris 10 и более поздних версий. Ввода / вывода порта завершения объекта создается и связано с числом гнезд или дескрипторов файлов . Когда / O услуги I запрашиваются на объекте, завершение обозначается сообщение помещается в очередь порта завершения ввода / вывода. Процесс запроса услуги ввода / вывода не уведомляется о завершении услуг ввода / вывода, но вместо проверки порта завершения ввода / вывода очереди сообщений , чтобы определить статус своих запросов ввода / вывода. Порта завершения ввода / вывода управляет несколькими темы и их параллельность .

Outp, outpw вывод в порт

Код вывода (Output)

Отправляет значение или значение переменной в определенный порт и/или биты

Данные отправляются в бинарном (BYTE) формате.

Display Name
Имя иконки.

Variable or value
Выбор цифрового значения или имени переменной с цифровым значением отправляемые в порт.
Данные должны быть или в десятичном (целым) или в HEX формате (с префиксом 0x) например 255 или 0xFF.

Variables кнопка
Кнопка вызова списка заранее заготовленных имен переменных. Так же позволяет создать новую переменную.

Port
Выбор доступных портов данного микроконтроллера

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

Entire Port
Отправка в весь порт.

Use Masking
Используя маску. Можно выбрать несколько регистров порта для отправки значения в них. Удобно, когда часть порта работает на выход, а часть на вход.
С маской только выбранные биты получают свое значение, все не выбранные биты не затронуты

Илон Маск рекомендует:  Нестандартные теги
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL