Что такое в строительстве пин

Данный пост посвящен тому, с чем сталкиваются все пользователи Ардуино (далее по тексту А, имейте в виду что под этой буквой будет прятаться как сам кристалл, так и среда разработки программ), а именно с работой с портами ввода/вывода.

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

Все это верно, но лишь до того момента, когда вам потребуется подключать к А что-нибудь пошустрее светодиода (у меня нет претензий к этим замечательным приборам, но обычно в силу специфики использования особого быстродействия от них не требуется), и тут то Вам понадобится эффективная работа с пинами (будем так для краткости именовать порты ввода/вывода), и тогда на форумах возникают вопросы «почему у меня так медленно работает программа», на которые молодые гуру мгновенно отвечают «работай напрямую с регистрами и будет тебе счастье» и показывают, как именно, по их мнению, следует это делать.

Яркий след в истории — Смешарики. ПИН — код | Познавательные мультфильмы

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

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

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

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

Например, если Вы хотите, чтобы расположенный на плате А светодиод засветился, то Вы должны на пин 13 подать уровень «Low», а для продвижения данных через микросхему сдвигового регистра сформировать на пине 6 переход из низкого уровня в высокий и так далее. Причем для первого случая — управления светодиодом дальнейшие рассуждения не имеют особого смысла, поскольку приемником информации является человеческий глаз, а его возможности по части быстродействия не превышают десятков Герц, то для управления сдвиговым регистром время изменения уровня на ножке весьма существенно, так как для вывода информации на внешнее устройство (например, семи-сегментный индикатор) Вам потребуется множество изменений и их совокупное время может оказаться неприемлемым для конкретного случая (будет блокировать работу остальных частей программы, критичных по периоду опроса, типа обработки энкодера, что нарушит их работу). Ну а если Вы управляете пином виртуального SPI, то получившееся быстродействие SD карточки Вас весьма неприятно удивит, так что задача ускорения работы с пинами вполне практическая.

Глиночурка. Эко-дом из дров. Cordwood. Полено вместо кирпича. Обработка древесины.

Для управления пинами в А существуют предопределенные функции, главной из которых является DigitalWrite, которой Вы должны сообщить номер пина для модификации и значение на нем после выполнения функции. Однако, если у Вас после написания команды DigitalWrite(13,Low) проблемы закончились (при условии, что Вы не забыли где то раньше команду настройки режима пина), то у исполняющей системы они только начинаются.

Дело в том, что существуют архитектуры МК, в которых каждый пин действительно имеет уникальный адрес, чем обеспечивается легкое отображения Вашей команды на систему команд МК, чем и занимается исполняющая система (связка компилятора и системной библиотеки), но фирма Atmel в те времена, когда создавалась А, своих поклонников подобными изысками не баловала (это не совсем верно, но в первом приближении так). В микроконтроллерах семейства Мега, на которые платформа А исторически базировалась, принята несколько иная схема работы с пинами. Здесь работа с внешним миром осуществляется не через уникальные пины, а через порты ввода/вывода, которые представляют собой совокупность пинов (в данном случае не более 8) и, соответственно, каждый пин имеет в физическом представлении 2 параметра — имя порта (представляется буквой от А до Е в разных представителях семейства МК) и номером бита внутри порта (цифра от 0 до 7). Так, например, пин 13 может иметь физический адрес РB.5 в одном МК, и РC.0 в другом.

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

Прежде всего, заметим, что в исполняющую систему входят две компоненты — компилятор (на самом деле под этим собирательным именем прячутся отнюдь не одна функция, а, как минимум, препроцессор, собственно компилятор, ассемблер, компоновщик и библиотекарь, а также исполняющая подсистема, представленная библиотечными модулями (скетчами). Так вот, задача преобразования должна быть решена либо на этапе компиляции, либо на этапе исполнения, либо каким то образом распределена между этими этапами. И предпочтительнее сделать как можно больше работы на первом этапе, поскольку затраты времени на нем пренебрежимы по сравнению со временем собственно написания кода, а вот любые затраты (памяти и времени) на этапе исполнения требуют расходования ограниченных (по сравнению с платформой разработки) ресурсов МК. К сожалению, данное предложение не всегда реализуемо, но в условиях, когда известен конкретный состав системы исполнения и наличествуют все исходные файлы, может быть весьма полезно. Но это я слегка забежал вперед, чуть приостановимся и посмотрим реализацию функции работы с пином в А. Вот исходный код функции

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

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

Что мы тут видим — прежде всего преобразование номера пина в физический адрес, осуществленное путем извлечения информации из таблицы констант. Рассмотрим эту операцию более подробно, для чего пойдем по исходному тексту, смотрим код и видим операцию получения битовой маски:

И обнаруживаем, что это макрос-расширение, который передает номер пина другой функции и добавляет имя таблицы, где хранятся номера битов. Далее выясняем, что:

Это тоже макрос-обертка, передающий свои аргументы следующей функции, сразу же выясняется, что:

Это… да, верно, макрос-обертка, Вы начинаете улавливать принцип, передающий свои аргументы в функцию:

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

Рассмотрим текст функции извлечения данных из таблицы более внимательно, тут есть ряд интересных моментов. Поскольку нам дана ассемблерная вставка, то следует учитывать особенности реализации архитектуры МК, для нас важно, что он 8-разрядный и аккумуляторный.

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

Сразу же подумаем об альтернативах — во-первых, это может быть вариантная реализация, основывающаяся на определении типа параметра, если это возможно в данном препроцессоре (я его не настолько хорошо знаю, чтобы привести данное решение), в-вторых, это может быть прямой запрет использования статически неопределенных выражений, когда конструкция DigitalWrite(BasePinNumber+6, Low) приведет к ошибке компилятора и Вам придется превратить ее в int PinNumber=BasePinNumber+6; DigitalWrite(PinNumber,Low) , что мне представляется приемлемой ценой за увеличение быстродействия в остальных случаях.

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

Необходимое пояснение — хотя я и рассуждаю о недостатках реализации А функции, тем не менее должен признаться что самой платы А у меня нет, то есть конечно есть, но это так называемая А совместимая плата Intel Edisson, которая хоть и может программироваться из А среды, тем не менее никоим образом на является заменой платы собственно А. Следующий грех, в коем я должен признаться — я не пользуюсь А средой разработки, на что есть множество причин…

Есть великолепный анекдот на эту тему. После одной из битв Наполеон спрашивает у маршала артиллерии, почему артиллерия не стреляла. Маршал отвечает: «На то было множество причин, Сир. Во-первых, у нас не было снарядов. Во-вторых . ». Наполеон прерывает его: «Достаточно»

… из которых в данный момент определяющей является то, что в ней весьма неудобно смотреть промежуточные файлы, в том числе код на языке ассемблер. Поэтому дальнейшие рассматриваемые результаты относятся к коду, получаемому в онлайн компиляторе gcc.godbolt.org в режиме AVR gcc 4.5.2 при включенной оптимизации -O. Сразу хочу заверить читателя, что данный компилятор порождает весьма эффективный код, если бы я писал его руками, то получилось бы не намного лучше (хотя все таки и чуть лучше), я думаю, что в А компиляторе результаты лучше, чем полученные этим способом, точно не будут.

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

Возможно, это наследие проклятого прошлого, истинный смысл подобного решения недоступен для непосвященных в сокровенные тайны А. Что мы можем сделать для ускорения работы? Ну можно совместить данную проверку с получением индекса порта, введя специальное значение, тем более, что такая подобная проверка индекса порта на допустимость осуществляется несколькими строками позже. Далее, мы можем определить условную компиляцию, предоставив пользователю возможность определить, а готов ли он платить временем исполнения (если бы речь шла о времени компиляции, я был бы только рад) за дополнительную проверку. Ну и как вишенка на торте, само условие проверки с использованием двойного отрицания мне лично представляется несколько вычурным, простое условие if (timer == IS_ON_TIMER) ничем не уступает оригинальному условию, но понятнее при прочтении. Обратим еще внимание на то, что получаем это значение в одном месте, а используем (причем один раз) намного позже, что тоже не есть красиво, что неизбежно для языка С, но у нас то С++, и можно сделать правильнее, хоть и не быстрее.

Еще один интересный момент, связанный с проверкой на таймер. Тут присутствует несомненная ошибка, если Вы посмотрите на порождаемый код в функции выключения шима (посмотрите этот код самостоятельно) turnOffPWM(), то увидите возможность нарушения работы других модулей. Конечно, она будет проявляться крайне редко, может быть, вообще никогда не проявится (но не забывайте о законах Мерфи), но она есть и должна быть безусловно исправлена, ведь иначе ЭТО могут увидеть дети, и решить, «а я и не знал, что ТАК можно».

Далее следует проверка индекса порта на допустимость, поскольку далеко не все пины могут иметь физическое представление в конкретном МК. И опять тут не все сделано хорошо. Во первых, нарушается правило, что каждая функция должна иметь одну точку выхода, ну тут достаточно слегка подправить текст.

Читайте также:  Для чего применяют пенопласт в строительстве

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

Вот в чем с разработчиками А нельзя не согласиться, так с необходимостью не допустить модификацию внутренних битов регистров МК при задании неверного номера пина, чем указанный фрагмент кода и занимается, но тогда почему, черт подери, такой проверки нет в самом начале функции, ведь если мы попросим изменить состояние пина 137, то получим совершенно непредсказуемое поведение программы, и это разработчиков А абсолютно не волнует — налицо забавное сочетание паранойи и пофигизма, я думал, последнее свойственно только нам, славянам. Мы можем вставить такую проверку в текст функции, но намного лучше делать, как я советовал в самом начале — создать пользовательский тип и компилятор сделает нужные проверки сам и на фазу исполнения ничего не останется. Опять таки, Вы легко можете данную проверку обойти и выстрелить, куда только захотите, но Вам придется ясно и четко компилятор о своем намерении предупредить и потом не жалуйтесь.

Смотрим дальше и замечаем, что номер бита извлекается в одну стадию, а адрес порта — в две стадии, сначала по номеру пина получаем индекс порта — число от 0 до количества портов, а затем на основании индекса извлекаем собственно адрес порта. Зачем так сделано, ведь это очевидно дольше, чем сразу получить нужный нам адрес — можно придумать два объяснения.

Во-первых, такая методика дает бОльшую гибкость — честно говоря, притянутое за уши объяснение. Вторая возможная причина — экономия размера ПЗУ, которая составит в байтах количество пинов минус размер дополнительного кода, то есть байтов 6-8, что мне представляется явно недостаточной компенсацией за существенное уменьшение быстродействия. Более того, тот же результат может быть достигнут и при помощи указания в первой таблице не индекса, а смещения с последующим превращением его в адрес менее затратным путем сложения с базой или даже комбинирования, как продемонстрировано в моей реализации. Да, этот способ не столь переносим, как оригинальный, но насколько я помню, директивы условной компиляции никто не отменял. Вообще то, у меня складывается впечатление, что многие компоненты библиотек А делались на скорую руку из уже существующих универсальных (кто такой универсал — человек, который умеет делать множество дел одинаково плохо) заготовок, а дальше действовали по принципу «Эта штука работает? — Да. — Не трогай ее.» К сожалению, намного более быстрый способ обращения к портам через команды in и out в данном случае неприемлем, поскольку указать номер порта в качестве аргумента команды в общем случае невозможно.

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

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

И еще один маленький камешек в огород А — из текста функции нетрудно видеть, что описание работы функции не вполне верно — если значение второго параметра равно LOW, то бит будет сброшен, в противном случае (а не если параметр будет равен HIGH, как в описании) бит будет установлен. Если этот параметр принимает только указанные значения, то данное уточнение не имеет смысла, но в оригинальной функции его значения ничем не ограничены, кроме доброй воли программиста.

Для того, чтобы Вам были понятны следующие вычисления, под спойлером лежит получившийся при компиляции код с комментариями:

Теперь можно подвести итоги. Вызов+преамбула+постамбула — 4+9+10 = 23, защита ресурса — 3, защита таймера — 7+3 = 10, защита пина — 2 получение номера бита — 7, получение адреса порта — 7+14 = 21, модификация значения — 10/8, что дает нам время исполнения функции 76/74 такта, или при тактовой частоте МК 16 МГц составит 4.75/4.625 мксек — результат вполне ожидаемый для того, кто видел исходный код и знаком с архитектурой AVR. В разных источниках я видел разные цифры времени исполнения функции digitalWrite, но они были только больше полученных в данном случае.

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

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

получить следующую минимально возможную программу

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

Конечно, переход 0-1 просто невозможен, но переход 1-0 вполне себе представим. Как то мне не по себе стало от такого открытия, либо я чего то недопонимаю, либо одно из двух. Единственное, что могло бы спасти в подобной ситуации — внутренний запрет на прерывания на 1 такт после чтения регистра состояния, но в документации я такого примечания не нашел. Если кто в курсе — прошу в комменты.

Ну а теперь посмотрим, к чему мы пришли в результате реализации вышеперечисленных изменений при оптимизации на скорость. Вот исходный код:

Вызов+преамбула+постамбула — 4+1+4 = 9, защита ресурса — 0, защита таймера — 0, защита пина — 0, получение номера бита — 7, получение адреса порта — 7+2 = 9, модификация значения — 8/8, что дает нам время исполнения функции 9+7+9+8/8 = 33/33 такта, или при тактовой частоте МК 16 МГц составит 2.062/2.062 мксек, совсем неплохо, ускорение в 2 раза, но можно и лучше, для чего есть два пути.

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

И мы видим, что наши усилия увенчались успехом — время модификации пина составляет всего лишь 13+3+9+8/8 = 33 такта при включенной защите от прерываний и 30 тактов при выключенной (остальные режимы не влияют на данную функцию, поскольку остались в фазе преобразования, а Вы догадались не ставить ее перед каждым вызовом фазы исполнения), при этом время вычисления адреса увеличилось незначительно, чего и следовало ожидать. Но почему прирост не слишком большой, всего лишь 10%, ведь мы убрали из фазы выполнения работу с таблицами? Все дело в извлечении параметров функции из памяти при таком подходе, обратите внимание на то, как возросла длительность преамбулы и длительность выборки (9) и поглотила значительную часть выигрыша от операции.

Для улучшения ситуации используем другой способ передачи параметров, а именно DigitalPut2(Pin13.Port,Pin13.Mask,LOW); и получаем куда больший выигрыш 15+8/8 = 24 такта с отключенной защитой (27 с защитой), что почти на 30% лучше быстрого варианта в 30 тактов и в 3 раза быстрее оригинального варианта:

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

Разумеется, можно, иначе бы я этот вопрос не задавал. Еще большее увеличение быстродействия связано со вторым путем, а именно учетом особенностей архитектуры МК. Да, этот путь тернист, такой подход требует изучения документации на конкретный МК (но я это сделал за Вас и Вы можете просто пожинать плоды), он практически не переносим на другой МК (но нам это и не нужно сейчас), он требует учета особенностей компилятора и ассемблера, в общем «Нельзя просто так взять и . », но этот путь приводит нас к необычайно хорошему результату и мы на него встанем (то есть я встану, а Вам придется либо последовать за мной либо бросить чтение данного опуса).

Дело в том, что когда я заявлял о невозможности другого способа изменения состояния бита в регистре, я намекнул, что он таки есть. И этот путь связан с использованием специальных команд работы с битами, а именно команд с мнемониками CBI и SBI. Почему мы оставили эту возможность напоследок — потому что это зависимое решение и оно плохо реализуемое (вообще никак не реализуемое) в рамках языка С, но то же самое можно сказать и про чтение данных из таблиц, привлечение ассемблера неизбежно.

К сожалению, обе эти команды не принимают никаких параметров, что не позволяет указать номер пина для модификации и вид модификации, а эта информация есть часть самой команды и мы имеем чисто теоретически 32 различных команды для 32 различных портов. Учтем возможность наличия у каждого порта 8 бит и получим 256 различных команд. Поскольку вид модификации пина, а именно установка либо сброс бита, тоже есть часть команды, всего получается 512 различных команд.

Немаленькое такое количество, в архитектуре 51 всех команд было не более 256, а тут такая роскошь, но 16-разрядная система команд может себе это позволить. Конечно, далеко не все из этих 512 команд будут производить осмысленные действия на конкретном МК, но некоторые будут и мы должны иметь возможность максимально быстро одну конкретную команду из этого набора выполнить.

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

Вызов+преамбула+постамбула — 4+0+4 = 8, защита ресурса — 0 (но она есть), учет значения — 3, получение точки входа — 6, получение адреса функции — 3+3+2 = 8, выполнение операции 3+2+4 = 9, что дает нам время исполнения функции 8+3+6+8+9 = 34/34 такта. Пока не очень ясно, зачем мы вообще все это затеяли, но вот как раз наступил момент, когда мы можем (и должны) слегка улучшить код, порожденный компилятором, и заменить вызов функции p() на asm («ijmp nt») (ну не совсем так, но смысл передает), что позволяет нам сэкономить 4 такта на постамбуле за счет совмещения операций, итого 30 тактов с защитой.

При этом нам потребуется 3*П (максимальное количество пинов) слов памяти программ по 2 байта каждый — 1 слово для собственно кода команды, 1 слово для кода возврата после выполнения каждой команды и 1 слово для хранения адреса команды в таблице адресации. Сразу же отметим, что эти вычисления дают верхнюю границу, поскольку для несуществующих пинов точка входа в пустую функцию одна и мы должны выделить 2*П1 (количество реально используемых пинов + 1)+П слов памяти программ, тем не менее требуемое количество памяти неплохо бы уменьшить.

Пробуем применить принцип разделения фаз вместе с модификацией таблиц и получаем:

Вызов+преамбула+постамбула — 7+0+4 = 11, защита ресурса — 0 (но она есть), учет значения — 3, получение точки входа — 0, получение адреса функции — 0, выполнение операции 2+3+2+4 = 11(7), что дает нам время исполнения функции 11+3+11(7) = 25(21) тактов, что лучше, чем для варианта с портами на целых 6 тактов. Заметим, что для ослабления требований к памяти, мы расположили таблицу команд несколько иным образом, тогда нам потребуется ровно 2*П слов в памяти программ. Вам решать, какая реализация предпочтительнее, быстродействие их близко.

Если мы аккуратно перепишем на ассемблере вызов функции и саму функцию работы с пином (оставляю это упражнение на долю пытливого читателя), то получим 11+3+(3+2)5=19 тактов, и это, похоже, предел совершенства.

Что мы получили в результате такой резкой смены парадигмы — существенное увеличение быстродействия в варианте с защитой от совместного использования ресурса, но не слишком значительный прирост в сравнении с вариантом, когда для порта защита отключена. На первый взгляд, несколько странный результат, ведь если раньше основная работа производилась четырьмя командами, то теперь только одной и мы должны были бы получить кратный прирост скорости. Дело в том, что накладные расходы на выполнение собственно модификации состояния пина не изменились и мы по прежнему должны потратить 2 такта на вызов функции и 4 на выход из нее (а еще определенное количество тактов на передачу фактических параметров, но будем считать, что нам повезло и эта часть оптимизирована компилятором до полного отсутствия), раньше было 4+4=8 тактов на обработку, теперь получается 1+4=5 тактов и прирост производительности даже не в 2 раза, а если учесть еще и время на подготовку — пересылку параметров в регистры, то и того меньше. А заплатить за такое не слишком значительное увеличение быстродействия нам пришлось вполне конкретной памятью программ и данных для хранения адреса функции.

Читайте также:  Организация строительства торгового центра

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

Что это за случаи и почему они не всегда присутствуют, хотя и довольно таки часто? Речь идет о ситуации, когда выполнены два условия: первое — нам доступны исходные коды программных модулей, для которых необходима быстрая работа с пинами, и второе — номера пинов должны быть константными, то есть известны на этапе компиляции (именно константными, а не статически определенными, это важно). Тогда мы можем создать макро-подстановку для работы с пинами следующего вида:

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

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

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

Но мне почему то построить подобную конструкцию не удалось, если кто знает, как это сделать, прошу в комментарии.

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

Вот такое получилось эссе на тему быстрой работы с портами в система А, может быть, кто то станет лучше понимать происходящее в МК, для кого нибудь станет отправной точкой для своих собственных экспериментов с платформой. Кстати, у меня давно лежит недописанный пост на тему собственно платформы А как таковой (конечно, это не рассказ о том, как установить и настроить среду разработки и помигать светодиодом, я обычно парю с других эмпиреях), не нахожу в себе сил закончить и опубликовать, когда начинал, думал, что тема будет интересна широкому кругу читателей, а потом засомневался и решил сделать более практически применимый пост, который Вы и прочитали до конца, я надеюсь. Замотивируйте меня в опросе на его завершение и публикацию, ведь обратная связь — важная часть любого рода деятельности, в особенности публичной, каковой и является написание постов.

Источник: habr.com

Что такое в строительстве пин

PIN — Штырьковый контакт в разъемах и кабелях

Смотреть что такое PIN в других словарях:

[pɪn]пробойник, палец, штифт, болт, шкворень, ось, цапфа, шейка, чека, шплинтштырь, вывод, пин, ногаколокскалкакегляногибулавка, кнопка, шпилька, прище. смотреть

[pɪn]личный номер, код

1. [pın] n1. 1) булавкаto put /to stick/ (in) a pin — заколоть, приколоть2) шпилька (тж. hair pin); заколка (тж. bobby pin)3) брошка; брошь4) значокfra. смотреть

1. n 1. 1) булавка to put /to stick/ (in) a ~ — заколоть, приколоть 2) шпилька (тж. hair ~); заколка (тж. bobby ~) 3) брошка; брошь 4) значо. смотреть

pin: translation•Roman•I.•/Roman• noun 1 sharp-pointed object for fastening thingsADJECTIVE ▪ safety ▪ bobby (AmE), hair (usually hairpin) ▪ bent. смотреть

pin 1. [pın] n 1. 1) булавка to put /to stick/ (in) a ~ — заколоть, приколоть 2) шпилька (тж. hair ~); заколка (тж. bobby ~) 3) брошка; брошь 4) зн. смотреть

• ___ money • ___ placement • ___ placement (golfer’s concern) • ___-Up Girl (1944 Betty Grable film) • 1 badge, say • 5D need • 7 or 10, in a 7-10 sp. смотреть

pin [pɪn] 1. n 1) була́вка; шпи́лька; прище́пка; кно́пка; редк. гвоздь 2) бро́шка, значо́к 3) ке́гля 4) pl разг. но́ги; he is quick on his pins он бы. смотреть

1. шпилька; штифт; чека; шплинт; палец; цапфа; ось || соединять на штифтах 2. пробойник || пробивать 3. штырь; вывод 4. ниппельная часть трубы или . смотреть

1) штифт; шпилька; палец; штырь; шкворень || закреплять штифтами или шпильками; штифтовать 2) шейка; цапфа 3) болт 4) ось; стержень || устанавливать на оси 5) упор; кулачок 6) направляющая колонка (пресс-формы) 7) зашплинтовывать • pin with conical notches — штифт с коническими насечками pin with cup points — штифт с засверленными концами — actuator pin — adjustable lock pin — adjusting pin — aligning pin — alignment pin — angle pin — arrester pin — axis pin — backing dowel pin — ball-lock pin — banking pin — bent pin — beveled pin — bolt pin — breaking pin — bullet-nosed pin — cam follower pin — cam pin — camshaft thrust pin — carrier pin — catch pin — center pin — centering pin — chain link pin — chain pin — check pin — checking pin — chisel-edged pin — chuck release pin — clapper pin — clevis pin — clutch pin — coding pin — collar pin — connecting pin — copying pin — core pin — cotter pin — crank pin — cylinder pin — cylindrical pin with cup points — cylindrical pin with internal thread — cylindrical pin — detent pin — diamond locating pin — diamond pin — double-acting pin — dowel pin — dowel-locating pin — drive pin — driver pin — driving plate pin — drop pin — eccentric pin — ejector pin — end pin — expanding pin — extraction pin — feeler pin — firing pin — fitting pin — follower pin — fork pin — form pin — fulcrum pin — gage pin — grooved pin — grooved straight pin — guard pin — gudgeon pin — guide pin — hinge pin — hinged pin — index crank pin — indexing arm pin — indexing pin — joint pin — keep pin — knockout pin — knuckle pin — latch pin — lever pin — lifting pin — linch pin — link pin — locating pin — locator pin — lock pin — male pin — measuring pin — mounting pin — notched pin — notchet pin — parallel pin — pilot pin — piston pin — pivot pin — plate locking pin — plunger pin — poppet pin — positioning pin — press-fit pin — press-fitted pin — pressure pin — preventer pin — projecting pin — punching pin — quick release alignment pin — quick release pin — rapping pin — register pin — regular index pin — reject pin — relieved locating pin — resilient pin — rest pin — retention pin — rider pin — roll pin — safety locking pin — safety pin — securing pin — set pin — shear pin — shot pin — shoulder pin — single-acting pin — slotted pin — spider pin — split pin — spring pin — spring-type straight pin — steady pin — stop pin — straight pin — strain pin — stripper pin — stud pin — sunk pin — supporting pin — swivel pin — taper pin with threaded stem — tapered pin — tension taper pin — test pin — through pin — thumb pin — toe pin — tooling pin — tow pin — tracer pin — trip pin — wedge pin — wrist pin — X-axis stop pin — Y-axis stop pin. смотреть

PIN: übersetzung Persönliche Identifikationsnummer; Persönliche Geheimnummer; Personal Identification Number * * * Pịn 〈m. 6〉 1. ansteckbares Schildch. смотреть

1) штифт; шпилька; палец; штырь; шкворень || закреплять штифтами или шпильками; штифтовать 2) шейка; цапфа 3) болт 4) ось; стержень || устанавливать на оси 5) упор; кулачок 6) направляющая колонка (пресс-формы) 7) зашплинтовывать • pin with conical notches — штифт с коническими насечками pin with cup points — штифт с засверленными концами — actuator pin- adjustable lock pin- adjusting pin- aligning pin- alignment pin- angle pin- arrester pin- axis pin- backing dowel pin- ball-lock pin- banking pin- bent pin- beveled pin- bolt pin- breaking pin- bullet-nosed pin- cam pin- cam follower pin- camshaft thrust pin- carrier pin- catch pin- center pin- centering pin- chain pin- chain link pin- check pin- checking pin- chisel-edged pin- chuck release pin- clapper pin- clevis pin- clutch pin- coding pin- collar pin- connecting pin- copying pin- core pin- cotter pin- crank pin- cylinder pin- cylindrical pin- cylindrical pin with cup points- cylindrical pin with internal thread- detent pin- diamond pin- diamond locating pin- double-acting pin- dowel pin- dowel-locating pin- drive pin- driver pin- driving plate pin- drop pin- eccentric pin- ejector pin- end pin- expanding pin- extraction pin- feeler pin- firing pin- fitting pin- follower pin- fork pin- form pin- fulcrum pin- gage pin- grooved pin- grooved straight pin- guard pin- gudgeon pin- guide pin- hinge pin- hinged pin- index crank pin- indexing pin- indexing arm pin- joint pin- keep pin- knockout pin- knuckle pin- latch pin- lever pin- lifting pin- linch pin- link pin- locating pin- locator pin- lock pin- male pin- measuring pin- mounting pin- notched pin- notchet pin- parallel pin- pilot pin- piston pin- pivot pin- plate locking pin- plunger pin- poppet pin- positioning pin- press-fit pin- press-fitted pin- pressure pin- preventer pin- projecting pin- punching pin- quick release pin- quick release alignment pin- rapping pin- register pin- regular index pin- reject pin- relieved locating pin- resilient pin- rest pin- retention pin- rider pin- roll pin- safety pin- safety locking pin- securing pin- set pin- shear pin- shot pin- shoulder pin- single-acting pin- slotted pin- spider pin- split pin- spring pin- spring-type straight pin- steady pin- stop pin- straight pin- strain pin- stripper pin- stud pin- sunk pin- supporting pin- swivel pin- taper pin with threaded stem- tapered pin- tension taper pin- test pin- through pin- thumb pin- toe pin- tooling pin- tow pin- tracer pin- trip pin- wedge pin- wrist pin- X-axis stop pin- Y-axis stop pin. смотреть

pin: translationSynonyms and related words:a continental, a curse, a damn, a darn, a hoot, ankle, anklet, arbor, armlet, armory, articulate, axis, axle. смотреть

articulated rod knuckle pin — палец прицепного шатуна (звездообразного поршневого двигателя)articulated rod piston pin — поршневой палец прицепного шат. смотреть

PIN: translation PIN PIN [pɪn] noun [countable] BANKING personal identification number; a secret number given to you by your bank tha. смотреть

I [ЈЎ­] pin.wav 1. сущ. 1) а) тех. пробойник, штифт, болт, ось б) эл., информ. штырь, соединительная шина; вывод, контакт в) муз. колок • — pull the pin Syn: peg, bolt 2) а) скалка б) кегля Syn: skittle 3) мн.; разг. ноги 4) а) булавка, кнопка, шпилька, прищепка; редк. гвоздь a pin pricks — булавка колется bobby pin — заколка для волос drawing pin — чертёжная или канцелярская кнопка safety pin — английская булавка straight pin — острая булавка (в отличие от английской) б) брошка, значок; знак принадлежности к обществу, клубу в) граммофонная игла • — pins and needles 5) (что-л. мелкое, незначительное) — not to care a pin 6) (бочонок объемом в 4,5 галлона) 7) шахм. цугцванг 2. гл. 1) а) прикалывать (обыкн. pin up; to, on), прикреплять, скреплять, скалывать (обыкн. pin together) to pin up a notice on the wall — приколоть записку к стене to pin papers together — скрепить документы Be careful with that collar, it’s just pinned to the dress. — Будь осторожнее с этим воротничком, он всего лишь приколот к платью. б) прокалывать, протыкать, пробивать to pin holes in metal plates — пробить дырки в металлических пластинках 2) а) придавить, прижать, пригвоздить The crash pinned the driver against the wheel. — В результате аварии водителя бросило на руль. б) загнать в угол, связать, схватить (кого-л.); шахм. создавать цугцванг или ситуацию, что та или иная фигура не может ходить — pin down to Syn: seize в) ловить на слове, ставить кого-л. в такое положение, что он обязан выполнить данное обещание г) портить кому-л. жизнь, быть источником неприятностей для кого-л.; иметь на кого-л. зуб 3) раскатывать тесто скалкой • — pin down — pin on — pin one’s ears back Syn: transfix, fix, attach II [ЈЎ­] pin.wav сущ. коренная средняя лошадь в тройке. смотреть

Читайте также:  Старт в строительстве это

1) шпилить2) болтовый3) нагель4) пестик5) ушковый6) цапфа7) цапфенный8) чека9) штепсельный10) штепсельный штырь11) шиповой12) шкворень13) шпенек14) шпи. смотреть

1) графейка (фальцаппарата); штифт; шплинт; палец; игла2) пробойник || пробивать3) прокалывать (при шитье); прикалывать- banking pin- centering pin- cu. смотреть

1. n 1) шпилька; 2) брошка; значок; fraternity ~ амер. значок студентської організації; 3) канцелярська кнопка; 4) прищіпка; 5) тех. штифт; шплінт; шворінь; вісь; цапфа; 6) ел. штир; вивід; 7) pl розм. ноги; she is quick on her ~s вона швидко бігає; 8) кеглі; 9) pl гра в кеглі; 10) барило на 4 1/2 галона; а ~ of beer бочечка пива; 11) в’язальна спиця; 12) муз. кілочок; 13) (скор. від rolling-pin) качалка; ♦ ~’s point matter проста справа; I don’t care a ~ мені байдуже: not worth a ~ ламаного гроша не вартий; ~s and needles мурашки в кінцівках (після оніміння); to be on ~s and needles сидіти як на голках; to be down a ~ бути в поганому настрої, хворіти; to find a ~’s head шукати голку в стозі сіна; to keep in the ~ утримуватися від пияцтва, не пити; to let loose a ~ почати пиячити; to put in the ~ кинути пити; покінчити з чимсь; 2. v 1) приколювати; сколювати (up, together, to); пришпилювати; 2) проколювати, пробивати; наколювати; 3) придавити, притиснути; to ~ smb. against the wall притиснути когось до стіни; 4) спорт. покласти на обидві лопатки; 5) загнати, заперти; 6) розм. поцупити; 7) амер. розм. заручитися з дівчиною (давши їй значок своєї студентської організації); ♦ to ~ smth. on smb. покладати на когось вину за щось; to ~ smb.’s ears back амер. покарати когось, розквитатися з кимсь. смотреть

1) палец; шкворень 2) шплинт || шплинтовать 3) штекер 4) штифт; штырь 5) шейка; шип •- anchor pin- ball pin- blocking pin- brake cam sliding pin- calip. смотреть

1) болтовой 2) болтовый 3) булавка 4) игла 5) игольчатый контакт 6) кнопка 7) нагель 8) ось 9) палец 10) пестик 11) прижимать 12) пробивать 13) ушковый 14) цапфа 15) цапфенный 16) чека 17) шейка 18) шиповой 19) шкворень 20) шпенек 21) шпилечный 22) шпилить 23) шпилька 24) шплинтовой 25) штепсельный 26) штепсельный штырь 27) штифт 28) штифтовой 29) шток 30) штыревой 31) штырь • pin of index table — шип поворотного стола starting crank pin — палец пусковой рукоятки track link pin — палец трака гусеницы — chain pin — crank pin — cross-head pin — drawbar pin — firing pin — glut pin — guide pin — impulse pin — king pin — link pin — lock pin — picker pin — pin compatibility — pin cushion distortion — pin description — PIN diode — pin hinge — pin insulator — pin jack — pin joint — pin pad — pin plug — pin wheel — pin wire — piston pin — register pin — retention pin — rip pin — round pin — safety pin — safety-lock pin — set pin — shear pin — slotted pin — stop pin — tracer pin — track pin — worm pin. смотреть

mсоснаpin sylvestre — обыкновенная соснаpin maritime — приморская соснаpin de montagne — горная соснаpin à encens — ладанная соснаpin de Parana — брази. смотреть

pin: übersetzungpɛ̃ m; BOT Kiefer fpomme de pin — Tannenzapfen npin pin [pɛ̃] Substantif masculin Kiefer féminin; Beispiel: pin parasol Schirmpinie f. смотреть

1. шпилька; болт; шплинт; палец 2. шпилька (геодезическая) 3. стержень; ось (шарнира)- barbed dowel pin- boom pin- corbel pin- cotter pin- drift. смотреть

deutsch: Stift m español: espiga f français: aiguille f italiano: perno m 中文: 针 русский: штифт m Synonyms: Peg, bolt, Fasten with a pin / Straw (. смотреть

transcription, транскрипция: [ pɪn ]pin n AmE sl The cops think they caught the pin this time Полицейские полагают, что на этот раз они поймали главаря. смотреть

I n AmE sl The cops think they caught the pin this time — Полицейские полагают, что на этот раз они поймали главаря II vt AmE sl 1) The boys in blue pinned him and took him away — Полиция арестовала его и увела с собой 2) The guy has been trying to pin me but he barfs me, like, out — Этот парень все время пытается закадрить меня, но меня от него, так сказать, рвать тянет 3) The two marines went into the bar — they weren’t queer, they were just pinning the queer scene — Двое морских пехотинцев зашли в бар. Они не были голубыми, а просто зашли посмотреть на гомосеков 4) She’s pinned to the captain of the football team — Она помолвлена с капитаном футбольной команды. смотреть

банк. сокр. от personal identification number* * *abbrev.: PINpersonal identification numberличный идентификационный номер: цифровой код, присваиваемый. смотреть

1. personal identification number — индивидуальный идентификационный номер; личный идентификационный номер;2. piping interference notification — извеще. смотреть

pin: translation deutsch: Stift m español: espiga f français: aiguille f italiano: perno m 中文: 针 русский: штифт m

1. n1) шпилька; прищіпка2) брошка, значок3) тех. цапфа; штифт; шплінт4) рад. вивід; штир5) барило в 4 1/2 галонаpins and needles — мурашки в кінцівках . смотреть

прикалывать (обыкн. pin up; to, on); скреплять булавкой (обыкн. pin together) прокалывать; пробивать; пригвождать арестовать, взять с поличным; закадрить; быть помолвленным прижимать (к стене и т. п.; against); глазеть pin something on someone — «шить», вешать что-л. на кого-л. булавка; шпилька; прищепка; кнопка (pl.) coll. ноги; бочонок в 41/2 галлона кегля; брошка, значок; mus. колок шпиль; скалка PIN (number) — personal identification number — личный идентификационный номер. смотреть

m сосна pin sylvestre — обыкновенная сосна pin maritime — приморская сосна pin de montagne — горная сосна pin à encens — ладанная сосна pin de Parana . смотреть

штифт m* * *пресс. шпилька; колонка- angle-guide pin- butt pins- carrier pin- core pin- ejector pin- guide pin- hole forming pin- insert pin- knock-out. смотреть

Rzeczownik pin m пин m PIN ПИН m персональный интернет — номер m

1) (контактный) штырёк; штекер 2) вывод; контакт 3) пуансон 4) штифт — bent-under pin — chip pin — control pin — drive pin — extra pins — feeler pin — input pin — input/output pins — low-active pin — output pin — primary pins — punch pin — sensing pin — spring-loaded pin — strapping pin — test pin — wire-wrap pin. смотреть

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

1. ирл. горный пик 2. каменная булавка (тонкий прожилок железняка или другой твёрдой пора ды, также стяжения цилиндрической формы глинистого железняка в угольных пластах Уэльса) 3. геод. штырь, шпилька
* * *шпиндель
. смотреть

тех. сокр.Personal Identification NumberПерсональный идентификатор (абонента сотовой связи). Запрашивается при включении аппарата.см. тж PUK.

n. булавка, шпилька; брошка, значок; кнопка, прищепка; гвоздь, штифт; шкворень, ось, цапфа, шейка; штырь; ножка, ножка микросхемы; вывод; кегля; бочонок, бочонок в 4 1/12 галлона; скалка; вязальная спица; колок, шип, пробойник. смотреть

Rzeczownik pin m пин m

• (vb.) зашплинтовывать, заштифтовывать, прикалывать, скреплять• ось, цапфа, шкворень, шпилька, шплинт, штифт, штырек

Pin-: übersetzung Pin- [lat. pinus = Kiefer, Pinie, Fichte]: Bestimmungswort von Zus. mit der Bed. »aus Kiefem etc. hergestellt oder gewonnen«, z. B. . смотреть

Personal Identification Number личный идентификационный номер Конфиденциальная информация, которая может использоваться в процедурах аутентификации между абонентом и SIM в целях проверки идентификатора абонента. смотреть

(product identification number)1. товарный шифр2. товарный код* * *• товарный код• товарный шифр

скор. від personal identification number персональний код користувача; особистий номер клієнта

Источник: computer.slovaronline.com

Что такое пины и как их крепить

Пин – это тонкий металлический стержень с наконечником. Толщина пина колеблется от 0,5 до 0,8 мм. Самый ходовой размер – 0,7 мм. Пины отличаются по длине стержня : от 0,5 мм (вкручивающиеся короткие пины) до 50 мм – для крупных бусин, а также бус и браслетов.

Из чего делают пины

Базовая основа (металл), из которой изготовлен пин — латунь, серебро 925 пробы, медь, хирургическая сталь и недорогие ювелирные сплавы металлов. Цвета пинов зависят от цвета покрытия: золото, серебро, латунь, медь, а также искусственно состаренные варианты — «античные» золото и серебро, «античная патина», «античная бронза».

Покрытия пинов

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

Виды пинов

Гвоздики — простой пин с маленькой плоской шляпкой на конце. Используется как конечное крепление в украшении.

Петельки – на конце располагается петля, за которую крепят остальные элементы украшения. Используют для бус, колье и браслетов. Петельки – на конце располагается петля, за которую крепят остальные элементы украшения. Используют для бус, колье и браслетов.

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

Штифты – маленькие (около 0,5 мм) и толстые пины, которые имеют резьбу и колечко на конце. Чтобы вкрутить их в изделие, отдельно проделывают отверстие, а затем плотно фиксируют бусину.

Для чего нужен пин

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

Как закрепить бусину на пине

Главное – верно подобрать диаметр пина к отверстию в бусине. Штырек продевается в бусину, затем круглогубцами осторожно загибается в сторону под углом в 90 градусов. Далее стержень пина закручивается в петлю, а лишний хвост отрезается кусачками.

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

Советы по работе с пинами

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

Пины в готовых украшениях

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

Источник: www.charm-beads.ru

Пин-код. Что такое «пин»? Значение и происхождение?

Пин-код — слово, заимствованное в русский язык из английского, как и многие термины экономики, информационных технологий и индустрии развлечений постсоветского времени. В оригинале это PIN code, и большие буквы говорят о том, что в языке-источнике это сокращение, аббревиатура.

Когда она появилась, мне попадалась ее расшифровка, которую можно использовать и на русском, так как все ее слова тоже заимствованы в наш язык, и даже ещё раньше: это personal identification nimber — персональный идентификационный номер (мы помним, что пин-код выдаётся к банковской карте строго персонально и служит для идентификации входа в аккаунт именно ее законного владельца, что в последнее время начали заменять биометрией). Таким образом, пин-код (PIN code) — это персональный идентификационный номер (personal identification number) . Но и это не вся информация о слове PIN (pin).

Для удобства запоминания информации в английском языке особенно маркетологи любят использовать простой психологический приём: словесное выражение (например, рекламный слоган или название товара) иногда выбирается таким образом, чтобы, совпадать — например при сокращении выражения до аббревиатуры — с простым или приятным или тематически связанным словом, которое обычный человек помнит. Иногда специально берется какое-то слово, и маркетолог или психолог или диетолог, автор популярной диеты, придумывает к этому слову новую «расшифровку» значения каждой его буквы.

Для таких расшифровок в английском языке даже придумали специальное название: backronym (бэкроним), которое является стяжением выражения «back(ward) acronym», то есть обратный акроним, обратная аббревиатура (в английском языке аббревиатуры чаще называют акронимами, а аббревиатурами — усечения слов при написании, хотя оба этих названия идут от слов со значением краткости в латинском (бревис) и в греческом (акрос, если не путаю)). Вот и к обычному слову pin придумали вышеупомянутую расшифровку.

Что же значит pin? О, это слово в зависимости от ситуации имеет очень много переводов на русский язык, часто обозначая многие не слишком большие продолговатые предметы.

Это, например, булавка и заколка (например, в оскароносном фильме 1964г. «Моя прекрасная леди» Элиза Дулитл шокирует аристократов, рассказывая на уличном жаргоне, но с аристократическим произношением, как ее родственники убивали друг друга из-за подозрений в краже шляпки, но сделали бы это и за булавку для оной, hat pin). На булавках крепятся к одежде популярные в прежние годы значки, и значки тоже по-английски pins, а страстные их собиратели — pinheads, хотя чаще pinhead — это булавочная головка, что-то очень маленькое. Pin — это шплинт в технике и чека для активации гранаты. Pins — это и кегли (nine-pins bowling), а на сленге ещё и ноги («Move your pins!” — «Пошевеливайся!»). Наиболее полное обыгрывание слова pins мне попалось в романе фантаста сатирика из Великобритании сэра Терри Пратчетта «Going postal» (русский перевод названия «Опочтарение»).

Источник: www.bolshoyvopros.ru

Рейтинг
Загрузка ...