• ↓
  • ↑
  • ⇑
 
Записи с темой: борьба с техникой (список заголовков)
23:59 

Китай

Я уже встречался с чужими механическими фейлами при проектировании электроники.

И вот ещё один.

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

Все крепёжные отверстия в плате оказались сделаны очень точно: отлично влезла внутрь корпуса и надёжно закрепилась.

Однако.

На плате ещё были раз'ёмы, к которым мы, вообще-то, собирались подключаться. И вот эти раз'ёмы оказались загорожены конструкцией корпуса. Таким образом, доступ к ним снаружи отсутствует. При этом расстояние от плоскости раз'ёма до стенки корпуса оказалось около 5 мм. Поэтому подключить туда кабель и вывести его в другом месте корпуса не представляется возможным. Ответная часть раз'ёма в эту щель тупо не влезает.

Видимо, корпус придётся пилить.

@темы: Борьба с техникой, Фейлы, Электроника

23:59 

Провайдер c2_free и полноэкранные уведомления

Согласен, что Wi-Fi у меня включён был. Однако в моей памяти не осталось записей о том, что я когда-либо подключался к сети c2_free.

Также у меня был включён браузер, но на фоне.

А вот чего в смартфоне не было, так это симки.

Это ведроид, 6.0.1.

Когда я включил экран, я обнаружил полноэкранное сообщение о том, какой провайдер c2_free хороший и как мне рекомендуется к нему подключиться. При этом это не было окно браузера (по крайней мере, не было панели инструментов, которая у меня всегда включена). Это было похоже на PUSH-уведомления, которые я не разрешал (может, они были включены по-умолчанию?), но с картинками. Или на всплывающие сообщения от оператора. Сверху были кнопки "Подключить" и "Отмена" (не в стиле ОС), которые, естественно, я не стал нажимать. Вместо этого я нажал кнопку "назад" самого смартфона. Уведомление пропало. После этого я обнаружил следующее:

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

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

Кто-нибудь видел подобное? Как это вообще возможно?

@темы: Борьба с техникой

23:59 

In God We Struct

Написано:

struct
{
//...
} A,B,C;


Это должно об'являть три переменных, типом которых является (безымянный) тип этой структуры.

Однако компилятор сообщает, что вместо A,B,C он ожидает идентификаторы. Но ведь это и есть идентификаторы!

Проверяю на кириллицу -- не подходит, буквы латинские. Заменяю на A0,B0,C0 -- всё работает.

Странно.

ОКАЗАЛОСЬ

что в заголовочном файле уже были строки:

#define A 0
#define B 1
#define C 2

В итоге последняя строка определения переменных после подстановок выглядела так:

} 0,1,2;

Да, тут идентификаторов действительно нет.

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

@темы: Борьба с техникой, Говнокод, Программирование

23:54 

Вызывает Хьюстон

Есть два измерительных устройства. Они выполняют одну функцию, поэтому мы подключаем к установке только одно из них. Смотря что есть. Одно работает через виртуальный COM-порт. Другое -- USB.

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

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

В процессе отладки выясняется, что хотя логи и показывают, что устройство включено, фактически данные с него не считываются. А конкретно -- не запускается поток считывания данных. Но на другом компе поток запускается. Почему же?

Потому что я лох.

Я сделал в своё время автоматическое определение, включено устройство или нет. Делалось оно так:
1. Попробовать открыть COM-порт с фиксированным номером (жёстко зашито в код). Номер тринадцать, если что.
2. Если удалось, то включено устройство первого типа.
3. Если не удалось, поискать USB-устройство.
4. Если USB-устройство обнаружено, то включено устройство второго типа.
5. Если ничего нет -- устройства отсутствуют, работаем так (это факультативный модуль).

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

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

@темы: Борьба с техникой

23:58 

Шерлок Х.

В работе оборудования появились странные симптомы.

Система такая: программа .exe и библиотека .dll . К компу подключено оборудование, которое глючит. ПО самописное, исходники есть.

Занялся дифференциальной диагностикой.

На другой установке с той же .exe+.dll -- всё работает с любым комплектом оборудования.
Тот же комплект оборудования, подключённый к другой установке -- работает.
Другой комплект оборудования, подключённый к первой установке -- не работает.

Переустановить систему?

Воспользовался последним средством -- скопировал ВСЮ папку с ПО на другую установку, а не только .exe+.dll . И оборудование начало глючить.

Что же это значит? Дело в папке с ПО, но не в .exe и не в .dll . Остаётся только один вариант -- конфигурационный файл.

И действительно -- в нём были ошибочные значения (вне диапазона), которые в определённый момент были туда занесены пользователем. А начало глюков с редактированием файла он не связал.

@темы: Борьба с техникой

23:59 

Ударил из тьмы прожектор

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

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

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

@темы: Электроника, Борьба с техникой

22:52 

Я не такая жду трамвая

"Чтобы скачать альбом целиком, нажмите здесь."

Жму.

"Ошибка: чтобы скачать альбом целиком, нужно зарегистрироваться. Нажмите здесь."

Регистрируюсь.

"Ошибка: чтобы скачать альбом целиком, нужно войти."

Вхожу.

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

ААААРГХ!

@темы: Борьба с техникой

23:58 

Как я позвонил себе на жёсткий диск

Не буду вдаваться в технические детали. Скажу коротко -- прежде, чем записать во флеш-память внутри микроконтроллера, её надо стереть.

В контроллерах STM32 для этого есть специальная операция. Надо в специальный регистр записать не менее специальное значение. И ещё -- номер сектора для стирания. Секторов штук 10-15 (в разных моделях по разному).

Я стирал два сектора -- номер 10 и номер 11. По очереди.

Управляющий регистр 32-битный, там ещё куча других настроек. Трогать я их не хотел. Поэтому я воспользовался побитовым "или":

FLASH->CR|=sector<<3;//установить номер сектора: биты 3-6.

И тут я заметил, что когда я стираю сектор 10, всё хорошо. Сектор 11 -- всё хорошо. Но когда я после этого опять стираю 10 -- происходит ошибка стирания. Нет, все статусные регистры хороши, но когда я де-факто смотрю в содержимое памяти, оказывается, что она не стирается! Долго прохожу с отладчиком, грешу на недостаточное напряжение питания, на закончившиеся циклы перезаписи (хотя 10000 израсходовать не так просто).

Потом начинаю уже параноидально проверять содержимое всех управляющих и статусных регистров флеш-модуля после каждой строчки. И обнаруживаю, что стирание происходит у сектора 11, а не 10! То есть, я всё время стирал не тот сектор?!

Т.е. я передаю в регистр сектор 10, а в регистре указано:

ХХХХХХХХ ХХХХХХХ ХХХХХХХХ Х0011ХХХ

(как вы догадались, номера секторов выше были в двоичной системе счисления)

Тут я понял, что виной всему было побитовое логическое или. 1|0 будет 1. То есть после записи сектора 11 (3) в регистр, запись 10 (2) поверх него давала опять 11 (3).

Т.е. мне надо было не просто НАБИТЬ ЕДИНИЦАМИ нужные поля, а набить конкретными значениями, включая нули. Побитовое "или" тут уже не подходит. В итоге я решил проблему так:

FLASH->CR=(FLASH->CR&0xFFFFFF00)|(sector<<3);//ценные биты были только в старших трёх байтах

А ведь в ассемблере для этого есть специальная команда -- BFI.

@темы: Борьба с техникой, Программирование

23:56 

Докажи, что ты не верблюд

Есть два измерительных модуля в одном из приборов, которые мы делаем -- Module1 и Module2. Меряют разные характеристики. Один давление, другой температуру.

Разные экземпляры прибора могут быть укомплектованы разным набором модулей. И вот данный конкретный экземпляр имел только Module2. И его эксплуатировали 4 месяца не включая этот модуль. Но понадобилось включить. И оказалось, что модуль не работает.

Начинаю отлаживать ПО. И вижу картину маслом:

void InitModule2()
{
if(Settings.bModule1Installed==false)
return;
//далее инициализация модуля2
}


То есть: если в приборе НЕ установлен модуль 1 (а он и не был установлен), прекратить инициализацию модуля 2! Модули более-менее независимы. Это меня удивило. Я сделал svn blame. Эта команда позволяет установить, кто является автором каждой строчки кода (и у неё есть синоним -- svn praise, лол). В результате этого я выяснил, что данную строчку написал начальник. Как раз 4 месяца назад. И тогда же обновляли ПО на данном приборе.

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

@темы: Борьба с техникой, Говнокод, Программирование

22:57 

Как мне помогали вспомнить пароль к московским ГосУслугам

Московские ГосУслуги -- это вам не федеральные.

Чтобы зарегистрироваться в московских ГосУслугах мне даже не понадобилось лично являться в МФЦ. Проблемы начались позже. Когда я забыл пароль.

(эпопея)

@темы: Борьба с техникой, Случай из жизни

23:58 

Парадокс близнецов

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

Время на часах -- 14:00. Выполняю в программе операцию, которую хотел проверить. Захожу в лог -- а там последняя запись -- 13:52. Что такое?! Как так?! Проделал ещё раз операцию -- то же.

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

13:53.

Работал на целевом компьютере я по удалёнке. И смотрел время по часам основного компа. Часы целевого компа отставали на 8 минут.

@темы: Борьба с техникой, Программирование

23:59 

То лапы ломит, то хвост отваливается

Перевели один из проектов из-под MSVS 2008 под MSVS 2015. Экзешник вырос в два раза и перестал работать под Windows XP! (наше ПО эксплуатируется в т.ч. на машинах с XP)

Потом, правда, оказалось, что есть специальный набор legacy-библиотек.

@темы: Борьба с техникой, Программирование

23:52 

Раскачивание лодки

У нас на работе используется специальная PCI-карточка, которая работает только если в настройках ресурсов выделить строго определённые диапазоны портов и прерывания. Это, конечно, недоработка. А всё потому, что карточка самодельная.

В один день карточка перестала работать, потому что её адреса кто-то занял. Но кто?

Это оказался контроллер шины PCI!

Революционная ситуация, блин. Верхи не могут, низы не хотят.

@темы: Борьба с техникой

23:58 

Лакуна

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

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

Однако поток при старте очищал входной буфер виртуального COM-порта! На всякий случай -- вдруг там мусор какой от предыдущих передач остался?

Если мне везло, то устройство не успевало ответить до очистки буфера, и ошибка не возникала. Поскольку очистка производилась только при старте потока, дальнейшие запросы и ответы воспринимались нормально. Если же мне не везло, то часть ответа (или даже весь ответ) оказывалась стёрта.

@темы: Борьба с техникой, Программирование

23:57 

Дым отечества нам сладок и приятен

Схема, на входе генератор, на выходе -- нагрузка. Пришли ребята из соседнего отдела и попросили осциллограф, чтобы посмотреть сигнал на нагрузке. И меня попросили в комплекте, чтобы я об'яснил, как им пользоваться.

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

Думали, почему начинает накаляться провод ЗЕМЛИ, когда там тока быть не должно -- ничего не придумали. Позвали более опытного специалиста. Он провёл стандартную диагностику и обнаружил причину. Вот блок-схема:


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

Когда я подключил осциллограф, его земля оказалась соединена с минусом питания схемы -- это правильно. Однако ОКАЗАЛОСЬ! что земля осциллографа соединена с защитной землёй евророзетки, и, таким образом, соединена с минусом (землёй) генератора. То есть, через защитную землю накоротко замыкались плюс и минус питания. Плюс питания -- земля генератора -- земля евророзетки -- земля осциллографа -- минус питания.

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

@темы: Борьба с техникой, Электроника

23:59 

Вавилонская башня

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

Смотрю -- происходит это по адресу 0x1800 0000. Там как раз заканчивается настоящая оперативная память и начинает пустое адресное пространство. Ставлю точку останова по адресу 0x17FF FFFA -- недалеко от конца. Но она не срабатывает. Вывод -- в этот адрес упирается не программа, а данные.

Нахожу в коде следующий текст:

char out_buf[200];
char temp_buf[20];
int x;
int a,b,r[10];
// ---

//sprintf(out_buf,"%d\n",a);
sprintf(temp_buf,"%d\n",b);
strcat(out_buf,temp_buf);
for(x=0;x<10;x++)
{
sprintf(temp_buf,"%d\n",r[x]);//напечатать очередной кусок текста в строку
strcat(out_buf,temp_buf);//добавить к основной результирующей строке
}
//...


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

sprintf печатает в строку, strcat сшивает (конкатенирует) две строки.

Данный кусок выполняется в основном бесконечном цикле прошивки.
Первый вызов sprintf закомментирован. Он попал под раздачу, т.к. отвечал за одну из функций прошивки, которая была больше не нужна. Вместо её удаления, я её закомментировал. И правильно сделал. Благодаря этому я легко смог опознать, в чём же было дело.

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

Решением в данном случае было дописать после закомментированной строки:

out_buf[0]='\0';

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

P.S. Только что подумал, что можно оптимизировать, сделав:

sprintf(out_buf+strlen(out_buf),"%d\n",r[x]);

@темы: Программирование, Борьба с техникой

23:59 

Плюс пять мне сделал прокурор

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

Но тут надо было поставить туда обновление из .msu-пакета. И оказалось, что такая винда не позволяет ставить одиночные обновления!

@темы: Борьба с техникой, Программы

23:59 

Вас здесь не стояло

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

Я изучил в дизассемблере пролог функции main(), т.е. в промежуток между её началом и первой командой:

int main()
{
// <- тут пролог... его не видно, потому что его делает компилятор.
func1();
//...
return 0;
}


Обнаружил там странную команду:

SUB.W SP, #7306

То есть, вычесть из указателя стека семь тысяч с гаком. А стека было всего две тысячи. То есть, программа не работала потому, что новый указатель стека выходил за пределы стека, о чём и выдавалось предупреждение. Но это ещё не всё -- указатель оказывался В ОБЛАСТИ КОДА и переписывал его данными на ходу. Это МК, тут нету DEP. Этим и был вызван HardFault.

Но почему же вычитались семь тысяч? Я думал, это безумие какое-то. А потом мне коллега напомнил, что локальные переменные выделяются в стеке. Эта команда как раз выделяла место под них. А у меня там среди прочего массивы на пару тысяч чисел.

@темы: Программирование, Борьба с техникой

23:59 

Бур пронзит небеса

На работе у одного из приборов есть движущаяся часть, на которую установлен датчик положения. Можно следить за положением этой части вдоль одной из осей с точностью до долей микрометра. И никак не удавалось сделать, чтобы часть останавливалась где надо. То недоезд, то переезд. Нам нужна была точность плюс-минус 1 мкм. 1.1 -- уже не катит.

Тогда решили следить за координатой, когда движущаяся честь неподвижна.

ОКАЗАЛОСЬ, что координата меняется! А потом мы поняли, что рядом -- открытое окно.

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

@темы: Борьба с техникой

23:57 

Выстрелил в воздух, но не попал

Чинил ноутбук. Симптом: не запускается Касперский. Два раза кликаешь по иконке, а он ничего не показывает. Сервис при попытке запуска показывает ошибку.

Думаю, наверное вирус засел.

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

Подхожу к соседнему компьютеру, открываю сайт Касперского. Открывается.

Ну, думаю, всё понятно. Наверное, вирус подменил DNS, так что на ноутбуке открывается фальшивый сайт Касперского. Проверяю -- адреса одинаковые. Значит, дело хуже. Я сталкивался с вирусом, который подменял драйверы в стеке TCP/IP. Но может быть дело в каком-нибудь плагине для браузера?

На всякий случай на ноутбуке нажимаю F5 -- и тут сайт Касперского открывается на ноутбуке тоже!

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

@темы: Борьба с техникой

Untitled

главная