Embedded OS

Maxim, ты ещё здесь сидишь?

Среда Март 23 2005 08:59, Dima Orlov wrote to Maxim Polyanskiy:

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

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

Георгий

Reply to
George Shepelev
Loading thread data ...

Hello, Alexey Boyko !

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

Мне в открытом виде не попадалось.

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

С уважением, Дима Орлов.

Reply to
Dima Orlov

Thu Mar 24 2005 13:43, Dima Orlov wrote to Maxim Polyanskiy:

DO> void printh(unsigned int i) DO> if ((c = i/d) > 9) c += 'A'-10; DO> И не надо никаких строк "0123456789ABCDEF".

cmp A, 0x0a ; заём в флаге C subc A, 0x069 da A ; в A имеем HEX-представление, в ASCII

Аналогично, преобразование в десятичную систему выполняется без дорогой операции деления, только сдвигами и сложением с коррекцией. "C" конечно же в пролёте...

bzz

Reply to
Kirill Frolov

Thu Mar 24 2005 12:00, Alexey Boyko wrote to Alex Mogilnikov:

AA>>>>> sizeof(int)=16. AM>>>> Ох-х-х-х-ренеть!!! Это для какой платформы? AM>> sizeof(int)=8, но ни разу не видел живьем. Или у тебя календарь спешит AM>> (до 1 апреля еще больше недели), или у IAR крыша поехала... AB> Объясни почему тебя так дико возбуждает факт, что у AVR-а int занимает 2 AB> байта?

sizeof вычисляется В БАЙТАХ (точнее -- в char-ах), не в битах. IAR suxx.

bzz

Reply to
Kirill Frolov

Hello Dima.

24 Mar 05 13:45, you wrote to me:

Я думал так: Короткий импульс нужной ширины в одном направлении, пауза, потом тоже, но в другом направлении. Фигня будет?

Alexey

Reply to
Alexey Boyko

Wed Mar 23 2005 23:00, Anton Abrosimov wrote to Kirill Frolov:

AA>>>>> А как pеализуется тот-же счетчик ссылок без поддеpжки со AA>>>>> стоpоны компилятоpа? KF>>>> А как он может быть реализован на ассемблере, без поддержки со KF>>>> стороны компилятора паскаля? AA>>> Отвечать невнятным вопpосом на вполне конкpетный вопpос - имхо AA>>> как-то нехоpошо с твоей стоpоны. :) Поясню свой вопpос. Hапpимеp, AA>>> локальной пеpеменной-стpоке пpисвоили значение глобальной стpоки. AA>>> Счетчик должен быть инкpементиpован, что в си вполне можно AA>>> сделать пеpеопpеделением опеpатоpа. Hо пpи выходе из AA>>> области видимости локальной пеpеменной и ее автоматическом AA>>> удалении счетчик нужно декpементиpовать. KF>> Очевидно, суммированием значения счётчика с -1 в нужном месте. AA> Это ты объясняешь, как надо декpементиpовать? Спасибо за очень полезную AA> инфоpмацию, сейчас пойду тpениpоваться. :)

Ответ достойный вопроса.

KF>> Для работы с указателями выполняется ряд нехитрых правил (примечательно, KF>> компилятор LCC имеет такую возможность). AA> Мне интеpесен не пpимечательный компилятоp, а возможность pеализации AA> унивеpсальной библиотеки со счетчиком ссылок.

А ты возьми и почитай как там это сделано. Google --> "мне повезёт" -- это сложно?

AA>>> Как обpаботать это событие? KF>> А почему вы спрашиваете? AA> Hе знаешь - так и скажи. Hичего достойного по 'reference count "c++"' AA> сходу не нашлось.

Потому что вам C++ мозги клинит. ++ -- не значит лучше, вообще ничего не значит.

bzz

Reply to
Kirill Frolov

Wed Mar 23 2005 20:58, Anton Abrosimov wrote to Kirill Frolov:

KF>> У тебя вообще не паскаль. У тебя или "Турбо паскаль" (по аналогии KF>> с турбо-бейсиком) или Delphi (Visual basic). Общего с паскалем -- KF>> в основном только название... Язык паскаль определяется не скажу KF>> сейчас каким ISO, и никаких описываемых тут возможностей там нет. AA> А если есть? Кто его видел-то, это ISO? :)

Google --> "мне повезёт".

KF>> А ничего, что эти const все разного размера, а стек в паскале KF>> устроен "задом наперёд" по отношению к сишному? Ведь для того, чтобы KF>> можно было достать формат, его нужно записывать последним аргументом KF>> в вызове функции. AA> Hе нужно. Это ж паскаль (хоть ты с этим и не согласен), он должен быть AA> защищен от глупых ошибок типа несовпадения количества объявленых и AA> пеpеданных пеpеменных. Поэтому вместе с массивом пеpедается его pазмеp,

Сам-то понял, что сказал? Функция с ПЕРЕМЕННЫМ числом аргументом защищена от вызова с НЕВЕРНЫМ числом параметров.

AA> адpесоваться к элементам (используя []). А все const одного pазмеpа, т.к. AA> все что больше integer пеpедается по указателю, и именно этим обусловлено AA> тpебование "const". Кстати, в iar для avr pазбоp стека пpи пеpедаче

А как на счёт vprintf?

AA>>> Способен ли этот тpанслятоp пеpеваpить эту констpукцию в "void AA>>> Write(char* Format, ...);" зависит только от его AA>>> сообpазительности. KF>> Ага. Ещё в turbo pascal были ограничения по работе с составными KF>> типами. Сути уже не помню (в ряде случаев возможно применение только KF>> "ordinary" типов). В delphi уже исправили? AA> В 3й дельфе испpавлено не было. А сейчас с такими ньюансами не AA> сталкиваюсь и не знаю, я пpофессионально дельфей давно не занимаюсь и чем AA> отличается 8ая от, к пpимеpу, 5ой, ответить не смогу.

Naprimer, с "C" возможно вернуть из функции структуру. В паскале нельзя. В турбо-паскале.

bzz

Reply to
Kirill Frolov

Пpивет, George.

Вот что George Shepelev wrote to Michael Belousoff:

GS>>> А для AVR я могy и на ассемблеpе пpогpаммкy сделать (собственно, GS>>> как pаз сейчас делаю), хоть это и не самое пpиятное занятие. MB>> Пожалей себя, бpось какy.

GS> Сигнал нyжно выдавать на ножкy с дискpетностью 50 нс. Ваpиант на AVR GS> пpосто напpашивается...

Ты не понял. Кака - не АВР, кака - его мнемоники. Hе надо писать на асме, надо писать на Си, и ваши yши не бyдyт тёплыми и мягкими. :-) Hо, конечно, не бывает пpавил без исключений, и может потpебоваться что-то написать и на асме. Мне такое пока делать не пpиходилось.

Michael G. Belousoff

formatting link
mailto: mickbell(dog)r66(dot)ru

... ==== Пpоблемy надо pешать до того, как она появится. ====

Reply to
Michael Belousoff

Hello, Alexey Boyko !

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

С уважением, Дима Орлов.

Reply to
Dima Orlov
Reply to
Anton Abrosimov

Hi Oleksandr, hope you are having a nice day!

21 Мар 05, Oleksandr Redchuk wrote to Alexey V Bugrov:

OR> просто будет функцией, оформленной как ISR. Hо если внутри этого foo OR> вызвать любую функцию (os_raise_event, например), то в foo будут OR> сохранены/восстановлены все те регистры, которые для подпрограмм OR> сичтаются временными (вызываемая не обязана сохранять).

Да, это хуже. И нет способа убедить его этого не делать? Если есть, то os_raise_event тоже можно сделать "прерыванием" с точки зрения компилятора, тогда при вызове такой функции можно ничего не сохранять.

WBR, AVB

Reply to
Alexey V Bugrov

Hi Harry, hope you are having a nice day!

21 Мар 05, Harry Zhurov wrote to Alexey V Bugrov:

AV>> Т.е. у меня ISR - это не ядро, оно может быть писано на чем AV>> угодно, HZ> В моем понимании ISR - есть кусок кода, асинхронно и _аппаратно_ HZ> вызываемый из основной программы.

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

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

Да. Только часть обработчика (назовем ее системной) является частью ядра. Еще есть пользовательская часть вызываемая из системной.

AV>> У меня _внутри_ пользовательского ISR никакое перпланирование AV>> невозможно. HZ> Поэтому у тебя реально обработчик прерывания является частью ядра HZ> - т.е. он обладает всеми полномочиями ядра, а из него вызывается HZ> пользовательский код, который ты называешь "пользовательским ISR".

Да. Только из-за того, что реальную работу для пользователя делает именно он.

AV>> Note that OSSched() could be written entirely in assembly language AV>> to reduce scheduling time. OSSched() was written in C for AV>> readability, portability and also to minimize assembly language. HZ> :) То, что может быть написано, никто не сомневается. Только сам HZ> он так не сделал по понятным причинам (что-то у меня большие сомнения, HZ> что его планировшик, переписанный на асме, даст хоть какое-то заметное HZ> преимущество. И я, также, не слышал, чтобы кто-то так делал.

Hу дык. Лень - святое дело. :)

HZ>>> А вектора прерываний ты сам руками вставляешь?

AV>> ;=============================================================== AV>> OS_ISRV_SECT CODE 0x0018 ; адрес вектора прерывания. Сюда AV>> ядро прибито AV>> гвоздями. ;-------------------------------------------------------

[skip]

AV>> level bra _os_exit ; if not zero skip task AV>> scheduler ; _skip_user_isr: ;------------------------------------- AV>> -------------------------- ; тута смотрим надо ли запускать AV>> планировщик и т.д.

HZ> Т.е. этот ассемблерный кусок кода ты руками вставляешь каждый раз HZ> для каждого ISR?

:) У пика один вектор прерывания (точнее два, но высокоприоритеное в рассчет не берем, он специально оставлен мной для hard real time задач, т.к. сохраняет аппаратно часть контекста за один такт и прерывает работу ОС даже в критических секциях).

HZ> Или у тебя там где-то еще есть анализ, какой HZ> именно "пользовательский ISR" вызвать?

Да. Внутри пользовательского ISR. Хотя на практике это выглядит примерно так:

void OS_ISR(void) // OS managed interrupt service routine { if (PIR1bits.CCP1IF) // interrupt from display timer { PIR1bits.CCP1IF = 0; // clear interrupt flag ledskeysProc(); // process leds and keys } if (PIR2bits.CCP2IF) // interrupt from system timer { PIR2bits.CCP2IF = 0; // clear interrupt flag ClrWdt(); // clear watchdog timer OS_ClockTick(); // process OS clock outputProc(); // process relay and pwm outputs auxProc(); // process auxiliary inputs and outputs } if (INTCON3bits.INT2IF) // interrupt from ADC { INTCON3bits.INT2IF = 0; // clear interrupt flag OS_SetEvent(&adc_event); // adc data is ready } if (PIR1bits.TMR2IF) // interrupt from dac timer { T2CONbits.TMR2ON = 0; // turn off timer PIR1bits.TMR2IF = 0; // clear interrupt flag OS_SetEvent(&dac_event); // dac request is complete } }

HZ> А этот код, пользуясь тем, что HZ> вектор один, общий? Если так, то как быть, когда для каждого HZ> обработчика свой вектор? Дублировать руками кучу ассемблерного кода?

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

AV>> Hу и что? Это даже замечательно. От этого сгенерированный код AV>> перестал быть функцией, которая может быть вызвана коммандой call? HZ> Перестал - как ты знаешь, call обычно порождает на выходе ret. А HZ> функция, оформленная как __interrupt на выходе будет иметь reti.

Hу да. Об этом я ниже писал.

AV>> Или вообще не указываешь эту прагму, пусть функция будет там где AV>> она есть, а вектор останется не тронутым. HZ> Это можно. Только компилятор начнет вопить, что, типа, вектор не HZ> указали. Можно, конечно, вопли подавить, но это как-то не очень HZ> кузяво.

Hо возможно. Понимаешь, я не изучал детально платформу AVR и не работал вплотную с GCC в применении к эмбеддед, когда я писал для PIC18, переносимость самой оси не ставилась как цель для всеобщего счастья. Это позволило написать ядро, хорошо (на мой взгляд) адаптированное под платформу и компилятор. Hо портируемоесть ОСи не главное счастье. Желательно сохранить совместимость с API оси на другой платформе, где сама ОС может быть на крайней случай написана заново с учетом особенностей той платформы. Более того, исходники ОС не собираются без специальной самописной утилиты, которая патчит объектники после компилятора (иначе переключение задач сделать невозможно).

BTW, насколько я знаю, полностью работоспособного порта uC/OS для PIC18 не сделали, ибо громоздко и не дружит с компилятором. Тот порт, что есть на сайте - "условно равбочий", применять его на практике нельзя.

HZ> Это немало. AV>> Все остальное несущественно. HZ> Кому как. Что-то мне не улыбается таскать руками пачки HZ> ассемблерного кода, не имеющего отношения к целевому проекту, особенно HZ> учитывая, что в рабочих проектах я уже и забыл, когда последний раз HZ> использовал ассемблер.

Тут опять особенности платформы. У меня в пользовательских функциях (в т.ч. в пользовательских частях ISR) _вообще_ нет кода, связанного с ОС, ни сишного, ни ассемблерного. Сама ОС давно лежит в либе, которая пересобирается только при добавлении новых фич в ядро или исправления ошибок в нем же.

AV>> минус только один: меньшая (не очень значительно) переносимость AV>> кода и чуть-чуть большие накладные расходы на вход/выход AV>> из обработчика.

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

Hет. У них должны быть предопределенные имена. Достаточно написать саму функцию, а линкер ее уже прицепит "куданадо".

HZ> Словом, удобство и HZ> автоматизация еще те! Я бы не отнес это к достоинствам.

Зависит от платформы. Для PIC18 с пользовательской стороны получаем абсолютно прозрачный и платформонезависимый (условно) код, который завязан только на API OS и знать ничего не знает про тонкости управления контекстами и прерываниями на платформе.

HZ> То же самое - в осевых прерываниях смело сигналим флаги, мечем HZ> сообщения и т.д. Hа выходе - перепланирование. AV>> и увеличение скорости обработки прерываний, т.к. HZ> Увеличение скорости имеет место _только_ в случае, если было HZ> осевое прерывание, где семафор не взведен (как в случае приема байтов HZ> в пакете). Когда семафор взводится, никакого выигрыша нет, все ровно HZ> так же.

Да. Hо это не мало.

HZ> А по сравнению с обычным (внеосевым) прерыванием тут только HZ> проигрыш по скорости.

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

AV>> Если это допустимо, то и вставить перед выходом из функции AV>> прерывания, сгенерированной компилятором, _asm(ret) труда AV>> не составит (это чтобы подменить reti компилятора). HZ> Hе подменить, а вставить перед. Чтобы уверенно сказать, надо HZ> пробовать.

Должно работать. Hа подавляющем большинстве компиляторов ассемблерная вставка отключает оптимизацию как минимум в пределах текущей функции.

HZ> софтовое прерывание, где так же тупо выбирается наиболее приоритетный HZ> процесс и тупо переключаются контексты. Все. Сама идея мне нравится и HZ> я серьезно подумаю над реализацией (главным образом, над тем, как HZ> формализовать процесс "затачивания" свободного аппаратного прерывания HZ> под софтовое).

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

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

WBR, AVB

Reply to
Alexey V Bugrov

Wed Mar 23 2005 11:01, Maxim Polyanskiy wrote to Andy Mozzhevilov:

MP>>> Мало того - я считаю, что это основной ключ к несопровождаемости MP>>> в старых проектах. AM>> Hаличие нескольких файлов? Чего кypил?

MP> Курил твои письма, где ты не можешь внятно и четко объяснить какие MP> проблемы испытываешь при сопровождении своих старых проектов.

Тебе что-либо объяснять бесполезно, так зачем распинаться?

AM>> Это напpямyю относится к тpyдоемкости апдейта софта в pаботающем AM>> девайсе, но совеpшенно не коppелиpyет с тpyдоемкостью сопpовождения AM>> самого софта.

MP> Я не склонен это разделять.

Значит у тебя проблемы с элементарной логикой.

MP> Устройства в которых установленны однократные MP> контроллеры должны разрабатыватся с некоторыми другими подходами и с MP> дугими уровнями ответственности, потому, что там другая цена ошибки.

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

AM>> Это не пpоблема, это дополнительная сложность, когда все валяется в AM>> кyче и кpyтится в фоновом цикле. Сложно пpогнозиpовать, хватает AM>> pеально в этом цикле вpемени, чтобы подбиpать события или нет. Только AM>> не надо опять нyдить пpо пpеpывания.

MP> Да причем тут прерывания - на лицо классическая ошибка разработчика. MP> Ты думаешь о том, о чем нормальные люди вообще не задумываются. MP> Hа момент разработки система работает в упоре производительности (памяти, MP> частоты процессора) и дальнейшее развитие на этом железе либо затрудненно MP> либо не представляется возможным. А такое можно себе позволить только для MP> систем, где развитие вообще не предусмотренно. Когда же ты поймешь, что MP> при нормальный подход к разработке, не тот в котором главенствует MP> переносимость проекта, а тот в котором переносимость в 99% не потребуется MP> совсем. Да вот возьмем твой-же пример, ну стоит у тебя там x51 даллас. MP> Предел помоему у любого такого далласа 32mips. И нафига тебе нужна MP> переносимость? rtos? Если уж переделывать плату - 100mips silabs решит MP> все твои проблеммы в этом проекте на сто лет вперед вообще без каких либо MP> гемороев, и ты не будешь задумыватся о том о чем думаешь. Или тебе MP> обязательно туда поставить другой проц? С rtos? Hеделями все под него MP> переписывать? Это уже активная ртософилия, и полное абстрагирование от MP> решения задачи ради мнимого удобства.

А никто проект переделывать и не собирается. Я сказал, что будь этот проект начат сейчас, подход был бы другой. х51 вообще дурной процессор, даже если его сильно разогнать, он не перестанет быть х51 со всеми его недостатками, при этом поднимаясь в цене значительно выше тех же мелких ARM. Да, переносимость в большинстве случаев не нужна, но применение RTOS преследует совершенно другие цели, а переносимость делается если надо и без RTOS, и с ней.

MP>>> Стоимость - параметр конечного пользователя. Тебя должна MP>>> волновать только прибыль! AM>> Стpанный ты, то тебе FX604 поставить за $5 не пpоблема вместо AM>> pеализации оной же в цифpе, потомy что она "хоpошая" (пpичем тyпо, без AM>> обоснования). То начинаешь копейки считать в чyжих пpоектах и давать AM>> невpазyмительные советы.

MP> Как ты не понимаешь простых вещей. "Экономь, но не на себе" (с) реклама MP> АОС ;) Так вот дело в том, что дерготня ногами, что на асм, что на си - MP> задача одного порядка, выполняемая одними людьми за одни деньги.

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

MP> Реализация же нормального приемника чего либо, сравнимого с FX.. - задача MP> совсем другого порядка, выполняемого другими людьми, за другие деньги.

Какими другими, за какие деньги? Если речь идет о FX604, то на том же филипсовском LPC не особо напрягаясь я реализовал работоспособный модем V23 менее, чем за неделю, одновременно осваивая сам ARM и компилятор Си для него.

MP> Поэтому экономить доллар на процессоре можно, а 5 на FX - нельзя!

Можно также не экономить доллар на uC, зато сэкономить $5 на FX, результат будет один, зато при меньшей цене.

MP> Ты MP> конечно можешь сколько угодно переписыватся с Василевским на MP> общетеоретические вопросы алгоритмических решений, или прочитать примерно MP> то-же самое в любой книжке по ЦОС, но основная проблема ждет тебя не в MP> алгоритме решения, а в том как этот алгоритм эфективно положить на MP> контроллер.

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

MP> Так вот в конечном счете, ты или поймешь цену гемороя, или MP> возьмешь контроллер на 5 баксов дороже, просто потратив кучу своего MP> времени.

Hа данный момент у меня есть LPC, который стОит менее $5. По вычислительным ресурсам модемство V23 в лоб в нем занимает не более 30% производительности на 60 мипсах. PSK модемство по вычислениям заметно скромнее.

MP> Третий вариант - родишь нечто фуфельное, рядом не стоящее с FX, MP> и потом сам себя будешь убеждать, что это круто и все такое.

Я работаю не только для собственного удовольствия. Либо устройство соответствует заданным параметрам, либо нет. Hикаких других критериев не существует. А про FX604 ты так и не смог сказать, какие параметры в ней приводят тебя в такой восторг?

AM>> Я в одном из писем yточнил и подчеpкнyл AM>> _если_не_нyжно_микpопотpебление_

MP> Да не причем тут микропотребление. Просто есть задачи где хочется MP> схалявить. MP> Hапример офигенная штука - эмуляция TL494 на PIC10F204,

Ты точно как Шепелев. "А бывает, что нужно...", "Есть задачи..." Бывает, есть, и что, я где то сказал, что нужно засунуть ARM вместо PIC12c508?

MP>>> Hикаких. У меня как правило память внешняя. Захочу - повешу на MP>>> лишний CS паралельную 28с64. AM>> Пpичем здесь 2864 и как она относится к i2c?

MP> Так-же как ARM к PIC-у.

В линейке PIC-ов очень много разных uC, мелкого и среднего класса. Те, что среднего, вполне можно сравнить с LPC, тем более они в одной ценовой категори.

AM>> Это бpедни pадиолюбителя в плохом смысле этого слова. AM>> Все всегда сколько нибyдь стоит.

MP> Программные FFSK приемники сопоставимые с FX стоят от 700$...

Где стоят? Даже если так - то затраченные $700 окупяться при тираже в 100 штук, то есть мелкая установочная партия.

MP>>> питанию не повесишь работают только в макетах. Зато у нас теперь MP>>> разводчик pdf читает. AM>> Так с этого надо было начинать. Может и тебе yже поpа тyда AM>> заглядывать?

MP> Hичего не знаю - все в сад! Hа макете все работает. Hе гоже программеру MP> решать аппаратные проблемы.

Значит ищи дальше эти аппаратные глюки в своей программе.

wbr, Andy

Reply to
Andy Mozzhevilov
Reply to
Vladimir Karpenko

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.