Dmitry Develop
IMG_20240823_225928.jpg
Всё ещё мучаюсь с китайским велокомпьютером, о котором я говорил в своей группе.
После замены провода и геркона он довольно долгое время работал, но потом снова перестал реагировать на датчик.
Мультиметром в режиме прозвонки я проверил, что датчик на магнит реагирует и обрыва нигде нет.
И что велокомпьютер работает, если пинцетом замыкать его два подпружиненных контакта.
Полдня ещё мучился, но в итоге после всех тестов и экспериментов я обратил внимание на наличие сопротивления между проводами в несколько мегаом.
Подумал, что это довольно большое сопротивление, чтобы микроконтроллер велокомпьютера реагировал на него или оно как-то мешало различать низкий и высокий логический уровень.
Велокомпьютер, если что, считает оборот на переходе между логическими уровнями: с низкого на высокий или с высокого на низкий.
Дальше подумал, а что, если этого сопротивления как раз хватает, чтобы велокомпьютер считывал низкое логическое значение, а когда датчик просаживает напряжение, получается то же низкое логическое значение, и следовательно перехода между уровнями нет и соответственно оборота колеса и какой-либо скорости.
Немного времени спустя я вспомнил закон Ома из школьного курса физики и решил параллельно запаять резистор на 10 мегаом, чтобы при замыкании геркона его сопротивление поделилось на два.
Таким образом я немного сдвинул напряжения разомкнутого и замкнутого геркона.
В итоге я идеально угадал напряжения срабатывания: велокомпьютер снова заработал.
ссылка на канал | ссылка на группу
После замены провода и геркона он довольно долгое время работал, но потом снова перестал реагировать на датчик.
Мультиметром в режиме прозвонки я проверил, что датчик на магнит реагирует и обрыва нигде нет.
И что велокомпьютер работает, если пинцетом замыкать его два подпружиненных контакта.
Полдня ещё мучился, но в итоге после всех тестов и экспериментов я обратил внимание на наличие сопротивления между проводами в несколько мегаом.
Подумал, что это довольно большое сопротивление, чтобы микроконтроллер велокомпьютера реагировал на него или оно как-то мешало различать низкий и высокий логический уровень.
Велокомпьютер, если что, считает оборот на переходе между логическими уровнями: с низкого на высокий или с высокого на низкий.
Дальше подумал, а что, если этого сопротивления как раз хватает, чтобы велокомпьютер считывал низкое логическое значение, а когда датчик просаживает напряжение, получается то же низкое логическое значение, и следовательно перехода между уровнями нет и соответственно оборота колеса и какой-либо скорости.
Немного времени спустя я вспомнил закон Ома из школьного курса физики и решил параллельно запаять резистор на 10 мегаом, чтобы при замыкании геркона его сопротивление поделилось на два.
Таким образом я немного сдвинул напряжения разомкнутого и замкнутого геркона.
В итоге я идеально угадал напряжения срабатывания: велокомпьютер снова заработал.
ссылка на канал | ссылка на группу
🤔2👻1
👍1
Dmitry Develop
cm559ugreen1.jpg
Бывает, необходимо m.2 диск новый или из другого ПК подключить, как внешний накопитель, чтобы напрямую установить на него windows, например, или сделать резервную копию данных.
У меня есть два способа подключить диск с таким разъёмом: в мой ноутбук и ПК, у них обоих есть разъём m.2.
Но разбирать каждый раз ноутбук или ПК не удобно и не безопасно.
Я давно хотел себе внешний корпус для m.2 ssd, и сегодня настал тот день, когда я его купил.
Можно сказать, я уже стал любителем техники от производителя ugreen, поэтому именно у него я и купил ugreen CM559.
Так как ещё я любитель универсальности, я стал разбираться: какие бывают контроллеры, какие у них особенности поддержки интерфейсов m.2, какие есть ключи и в чём их особенность, всякий ли m.2 диск подойдёт в m.2 разъём, будет ли поддерживать его контроллер, в общем разбираться, как мне выбрать тот самый универсальный переходник.
Начать решил со спецификации m.2, она предусматривает 12 ключей (или прорезей), интересуют меня не все, а только два из них: это B и M, и три их комбинации: B, M, B & M.
Отличия между ними, если не учитывать контроллер, в поддерживаемом интерфейсе передачи данных, в скорости и в количестве линий.
Ключ B: SATA и / или PCIe x2.
Ключ M: SATA и / или PCIe x4.
Ключ B + M: SATA и / или PCIe x2 (является самым универсальным).
Однако, эта информация ничего не гарантирует, нужно смотреть спецификацию контроллера и его поддержку интерфейсов и разъёма m.2, что печально и создаёт одни трудности.
Ugreen CM559 мне сразу понравился своим внешним видом и массивным радиатором, а так же поддержкой двух протоколов: PCIe и SATA с ключами M или B + M.
Однако, тут очень важно учесть ревизию или номер продукта: есть два CM559, только один с P/N 90408 с контроллером RTL9210B, который поддерживает PCIe и SATA, и диск до 8 TB, а другой с P/N 15511 с контроллером JMS583, который поддерживает только PCIe и диск до 4 TB.
Мне то ли повезло, то ли повлияло моё сообщение продавцу - не знаю, но мне пришёл CM559 именно 90408 модели, как я хотел.
Как я уже говорил, мне он очень понравился по внешнему виду, тяжёленький такой, весь металлический, толстая крышка.
Комплектация богатая: два 10 gbps type c на type c и type c на usb a провода, силиконовый чехол, отвёртка, термопрокладка и запасная защёлка, которую я сейчас обсужу отдельно.
Насчёт пластиковой или резиновой защёлки, это какая-то лютая ошибка и просчёт инженеров ugreen, почему нельзя было просто сделать, как у всех, крепление на бонку и винт?
Тем более, из-за особенностей расположения банок памяти и радиатора на моём ssd диске, они не дают защёлке полностью зафиксировать диск.
Потом я найду бонку или гайку и винт, и по-нормальному зафиксирую диск вместо этого недоразумения.
В остальном мне всё очень понравилось).
(Ugreen, пришлите на обзор мне внешний корпус для 3,5 HDD 😏)
ссылка на канал | ссылка на группу
У меня есть два способа подключить диск с таким разъёмом: в мой ноутбук и ПК, у них обоих есть разъём m.2.
Но разбирать каждый раз ноутбук или ПК не удобно и не безопасно.
Я давно хотел себе внешний корпус для m.2 ssd, и сегодня настал тот день, когда я его купил.
Можно сказать, я уже стал любителем техники от производителя ugreen, поэтому именно у него я и купил ugreen CM559.
Так как ещё я любитель универсальности, я стал разбираться: какие бывают контроллеры, какие у них особенности поддержки интерфейсов m.2, какие есть ключи и в чём их особенность, всякий ли m.2 диск подойдёт в m.2 разъём, будет ли поддерживать его контроллер, в общем разбираться, как мне выбрать тот самый универсальный переходник.
Начать решил со спецификации m.2, она предусматривает 12 ключей (или прорезей), интересуют меня не все, а только два из них: это B и M, и три их комбинации: B, M, B & M.
Отличия между ними, если не учитывать контроллер, в поддерживаемом интерфейсе передачи данных, в скорости и в количестве линий.
Ключ B: SATA и / или PCIe x2.
Ключ M: SATA и / или PCIe x4.
Ключ B + M: SATA и / или PCIe x2 (является самым универсальным).
Однако, эта информация ничего не гарантирует, нужно смотреть спецификацию контроллера и его поддержку интерфейсов и разъёма m.2, что печально и создаёт одни трудности.
Ugreen CM559 мне сразу понравился своим внешним видом и массивным радиатором, а так же поддержкой двух протоколов: PCIe и SATA с ключами M или B + M.
Однако, тут очень важно учесть ревизию или номер продукта: есть два CM559, только один с P/N 90408 с контроллером RTL9210B, который поддерживает PCIe и SATA, и диск до 8 TB, а другой с P/N 15511 с контроллером JMS583, который поддерживает только PCIe и диск до 4 TB.
Мне то ли повезло, то ли повлияло моё сообщение продавцу - не знаю, но мне пришёл CM559 именно 90408 модели, как я хотел.
Как я уже говорил, мне он очень понравился по внешнему виду, тяжёленький такой, весь металлический, толстая крышка.
Комплектация богатая: два 10 gbps type c на type c и type c на usb a провода, силиконовый чехол, отвёртка, термопрокладка и запасная защёлка, которую я сейчас обсужу отдельно.
Насчёт пластиковой или резиновой защёлки, это какая-то лютая ошибка и просчёт инженеров ugreen, почему нельзя было просто сделать, как у всех, крепление на бонку и винт?
Тем более, из-за особенностей расположения банок памяти и радиатора на моём ssd диске, они не дают защёлке полностью зафиксировать диск.
Потом я найду бонку или гайку и винт, и по-нормальному зафиксирую диск вместо этого недоразумения.
В остальном мне всё очень понравилось).
ссылка на канал | ссылка на группу
В процессе написания функции, которая будет вычислять количество цифр в числе, в варианте реализации через умножение (как бы вычисление логарифма), я столкнутся с двумя проблемами.
Первая, это переполнение знакового числа при аргументе
Вторая, это отсутствие изменения знака числа с отрицательного на положительное при аргументе
Из-за этого число оставалось отрицательным, проверка в цикле выдавала false, и это приводило к досрочному завершению работы функции и результату 0 знаков.
Всё дело в способе хранения знаковых чисел в языке C++ и допустимом диапазоне значений.
Формат two`s complement (двойное дополнение) имеет следующий диапазон допустимых значений:
И если изменить знак минимального числа -4 для данного диапазона значений, то получится 4, что не может быть в нём представлено, всё просто.
В конкретном случае для этой функции и с текущим алгоритмом нужно строго положительное число,
Хотя в будущем хотелось бы отказаться от такого "костыля" и переписать алгоритм по-другому.
Для реализации функции проверки переполнения выражения a * b, пришлось много искать информацию в google, вспомнить законы умножения, которые когда-то давно многим нам в школе рассказывали учителя.
Вот если бы все учителя не только интересно рассказывали и объясняли материал, но и показывали где можно в реальной жизни применить эти знания на практике...
Что ж, мне понадобился переместительный закон умножения (от перестановки множителей произведение не изменяется) и одно из тождественных преобразований (если обе части уравнения умножить или разделить на одно и то же число, не равное нулю, то получится уравнение равносильное данному).
Прежде чем составлять уравнение или неравенство, надо задать вопрос или описать проблему.
Будет ли произведение a и b больше c?
С этого и начнём, пусть a будет первым числом, b будет вторым числом, а c будет
Так же, чтобы не допустить деления на ноль, этот случай нужно обработать отдельно.
Если один из множителей является нулём, произведение будет всегда ноль (это ещё одно математическое тождество), так что в таком случае можно просто добавить проверку на ноль и вернуть false.
В итоге получается такая простая функция, которая поможет определить переполнение производного и избежать UB кода и сопутствующих проблем:
(Спустя время после тестирования я обнаружил, что функция работает некорректно с отрицательными аргументами и при изменении их порядка, а ещё отрицательный результат проверяет на INT_MAX, хотя нужно на INT_MIN).
Кто умный?
Я умный?
Да нее, сам я ничего не знал и не понимал).
Вот буквально недавно столкнулся с проблемой.
Начал разбираться, читать, анализировать, делать выводы.
И тут бим-бим, бам-бам, бум-бум и пост родился, и типа я такой умный и всё знаю и понимаю)).
Математика и другие точные науки наше всё).
ссылка на канал | ссылка на группу
Первая, это переполнение знакового числа при аргументе
INT_MAX и умножении на 10, такой код является UB (undefined behavior), и в моём случае он проявился, как бесконечный цикл и зависание программы навечно.Вторая, это отсутствие изменения знака числа с отрицательного на положительное при аргументе
INT_MIN.Из-за этого число оставалось отрицательным, проверка в цикле выдавала false, и это приводило к досрочному завершению работы функции и результату 0 знаков.
abs(INT_MIN) возвращает INT_MIN, не знаю почему было сделано именно так вместо возвращения INT_MAX, но можно понять, почему так произошло.Всё дело в способе хранения знаковых чисел в языке C++ и допустимом диапазоне значений.
Формат two`s complement (двойное дополнение) имеет следующий диапазон допустимых значений:
[-2 ^ (N - 1), +2 ^ (N - 1) - 1].
Если рассмотреть 3 битную переменную, то у неё будет следующий диапазон значений: [-4, 3].И если изменить знак минимального числа -4 для данного диапазона значений, то получится 4, что не может быть в нём представлено, всё просто.
В конкретном случае для этой функции и с текущим алгоритмом нужно строго положительное число,
INT_MIN и INT_MAX имеют одинаковое количество цифр, поэтому будет достаточно такого кода:if(number == INT_MIN)
{
number = INT_MAX;
}
Хотя в будущем хотелось бы отказаться от такого "костыля" и переписать алгоритм по-другому.
Для реализации функции проверки переполнения выражения a * b, пришлось много искать информацию в google, вспомнить законы умножения, которые когда-то давно многим нам в школе рассказывали учителя.
Вот если бы все учителя не только интересно рассказывали и объясняли материал, но и показывали где можно в реальной жизни применить эти знания на практике...
Что ж, мне понадобился переместительный закон умножения (от перестановки множителей произведение не изменяется) и одно из тождественных преобразований (если обе части уравнения умножить или разделить на одно и то же число, не равное нулю, то получится уравнение равносильное данному).
Прежде чем составлять уравнение или неравенство, надо задать вопрос или описать проблему.
Будет ли произведение a и b больше c?
С этого и начнём, пусть a будет первым числом, b будет вторым числом, а c будет
INT_MAX, произведение больше которого не должно быть, чтобы не было UB.a * b > ca > c / ba > INT_MAX / b, где b != 0Так же, чтобы не допустить деления на ноль, этот случай нужно обработать отдельно.
Если один из множителей является нулём, произведение будет всегда ноль (это ещё одно математическое тождество), так что в таком случае можно просто добавить проверку на ноль и вернуть false.
В итоге получается такая простая функция, которая поможет определить переполнение производного и избежать UB кода и сопутствующих проблем:
bool multiplyOverflow(int64_t a, int64_t b)
{
return b != 0 && a > INT64_MAX / b;
}
(Спустя время после тестирования я обнаружил, что функция работает некорректно с отрицательными аргументами и при изменении их порядка, а ещё отрицательный результат проверяет на INT_MAX, хотя нужно на INT_MIN).
Я умный?
Да нее, сам я ничего не знал и не понимал).
Вот буквально недавно столкнулся с проблемой.
Начал разбираться, читать, анализировать, делать выводы.
И тут бим-бим, бам-бам, бум-бум и пост родился, и типа я такой умный и всё знаю и понимаю)).
Математика и другие точные науки наше всё).
ссылка на канал | ссылка на группу
❤2
Dmitry Develop
ссылка на канал | ссылка на группу
Уже прошёл месяц с того момента, как я открыл issue в github репозитории расширения code lldb для vs code, но мне так никто и ничего не ответил.
https://github.com/vadimcn/codelldb/issues/1127
Суть проблемы в том, что при использовании LLDB на windows 10 в vs code во время отладки кнопка изменения значения переменной неактивна, если переменная типа псевдонима из stdint.h (cstdint), а если стандартного типа, то всё работает, как ожидается.
Через консоль отладки значения переменных обоих типов спокойно изменяются.
Такое наблюдается что на одном расширении, что на втором, если использовать LLDB.
Если вместо LLDB использовать GDB, проблема пропадает.
Проблема в vs code, в расширении, в отладчике?
Подскажите, с чего мне начать, что почитать, что попробовать?
Может, есть какой-то ключ для отладчика?
ссылка на канал | ссылка на группу
https://github.com/vadimcn/codelldb/issues/1127
Суть проблемы в том, что при использовании LLDB на windows 10 в vs code во время отладки кнопка изменения значения переменной неактивна, если переменная типа псевдонима из stdint.h (cstdint), а если стандартного типа, то всё работает, как ожидается.
Через консоль отладки значения переменных обоих типов спокойно изменяются.
Такое наблюдается что на одном расширении, что на втором, если использовать LLDB.
Если вместо LLDB использовать GDB, проблема пропадает.
Проблема в vs code, в расширении, в отладчике?
Подскажите, с чего мне начать, что почитать, что попробовать?
Может, есть какой-то ключ для отладчика?
ссылка на канал | ссылка на группу
👍1
Dmitry Develop
IMG_20240930_100642.jpg
Это что ещё за булочка?)
А это мне сегодня пришли два микроконтроллера esp32-c3ревизии модели FN4 со встроенной памятью 4MB.
Их покупку мне проспонсировал один участник группы по arduino.
С моей стороны нужно будет сделать инструкцию, как развернуть окружение в vs code для полноценной работы с этими микроконтроллерами.
Не знаю сколько уйдёт на это времени, ведь нужно собрать как можно больше материала, проверить его, систематизировать, записать видео, смонтировать и озвучить.
Постараюсь так же воспроизвести специально или столкнуться случайно с какими-то распространёнными проблемами, решить их, описать проблему и решение.
ссылка на канал | ссылка на группу
А это мне сегодня пришли два микроконтроллера esp32-c3
Их покупку мне проспонсировал один участник группы по arduino.
С моей стороны нужно будет сделать инструкцию, как развернуть окружение в vs code для полноценной работы с этими микроконтроллерами.
Не знаю сколько уйдёт на это времени, ведь нужно собрать как можно больше материала, проверить его, систематизировать, записать видео, смонтировать и озвучить.
Постараюсь так же воспроизвести специально или столкнуться случайно с какими-то распространёнными проблемами, решить их, описать проблему и решение.
ссылка на канал | ссылка на группу
🔥5❤2🥰1👏1