Перейти к содержанию
    

Ruslan1

Свой
  • Постов

    3 026
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Весь контент Ruslan1


  1. Ничесе! Я почему-то думал с гироскопами все гораздо лучше. Или это просто датчик никакой и можно покачественнее взять? Кста, а чисто оптикой не вытнуть такое? ну типа щелевые диски, разные там энкодеры. Вот первое попавшееся https://www.meandr.ru/Leine-Linde-absolut-mnogooborotnie. Там обещают. например "Разрешение 31 бит (19 бит однооборотных + 12 бит многооборотных)".
  2. у LittleFS есть драйвера под Винду? или софт? в Интернете вижу обсуждение "LittleFS Explorer for Windows", может оно? При чем тут кольцевые буферы? Мне нужна система работы с файлами. Разными файлами. С функциями создания, удаления, добавления, чтения, и чтобы можно было создавать-удалять директории (хотя бы два уровня вложений от корневого), и поддержка длинных имен очень желательна. Ну и чтобы не приходилось долго объяснять, как эту SD-карту увидеть на компьютере (ну максимум спец драйвер или спец-ТоталКоммандер какой-то поставить).
  3. Устройство безостановочно работает месяцами-годами. Периодически пишет на SD-карту. Используется FAT32 (из FatFS Чина), SDIO интерфейс. И есть сильные подозрения, что внутренний контроллер SD карты не очень-то и выравнивает количество записей по физическим секторам. В результате появляются bad block, и время чтения некоторых секторов сильно увеличивается. Бэды появляются там, куда часто пишем (FAT). Время доступа тоже очень вырастает для части блоков. Пример ниже. Тестировал чудесной прогой DiskGenius, карта SаnDisk 16GB после примерно года работы (заполненность файлами примерно 10% и менее): два блока плохих и кучка "тормозных": Вопрос даже не в том кто виноват (я, конечно), а в том, как с этим бороться (не со мной, а с проблемами на карте)? Я думаю, что нужно менять файловую систему, но на что? Хотелось бы: - чтобы не писала в одно и то же место (уменьшить пероятность "затирания" физического сектора) - чтоб возникновение bad block не было критичным - устойчивость к резким отключениям не так важна (так как есть резервное питание), но приветствуется. В наличии STM32F4, память есть.
  4. Так Топикстартеру, наверное, не угол наклона (вверх-вниз), а угол поворота (влево-вправо) нужен. Акселерометром тоже можно- измерять перемещение, ну и, зная расстояние, вычислять угол.
  5. Про 4-слойку- так на ней зато можно импеданс цепи просимулировать, так как известно где GND. Да и про EMC сертификаты разные нужно помнить, с 2-слойкой больше боли головной. Я уже не говорю про удобство разводки и качество земли/питания. Про изменение порядка битов- без проблем в пределах разумного. Я так прямо на схеме и пишу себе памятку текстом радом с микросхемой памяти, чтоб не забыть:
  6. все можно если осторожно. Я делал без проблем, но в серию все-таки пустили 4-слойку (ARM9) Но у меня еще последовательно резисторы (сборки) стояли, кажется 47 Ом.
  7. Я не использую. Значит не все. (Вспомнилась "Трасса 60".... :)
  8. Я видел такое устройство в промышленном исполнении лет 10 назад. Так как оно мне много крови выпило своими кривыми протоколами, то я хорошо помню его название: Счетчик измерения газа, фирма Шлюмбурже, тип SEVC-D. У него протокол установления связи (хэндшейк) был что-то типа "запрос на 1200- ответ на 9600", ну и далее еще много эротики. Так как через каналы связи такое фиг протянешь, делали устройство для локального сбора данных из него, ну а система уже общалась с этим нашим устройством, а не с счетчиком. Там еще много странного было в протоколе. Почему так сделано- не знают даже на фирме-изготовителе. Вроде бы студенты из Испании писали им софт во время практики, ну оно так и пошло в серию. Может быть, для совместимости с каким-то древним оптосчитывателем делалось. Кстати, про уже упоминаемую тут "псевдо-мышь": я тоже такое видел, когда комп (Win 7) был подключен к Модбас сети слейвом (то есть пакеты бегали и во время загрузки компьютера): винда детектила этот порт как мышь, и не давала доступ к нему другим программам (порт уже занят системой). Лечилось фиксом в винде, вот ссылка на описание как бороться: Disabling Windows detection of Serial Mice to fix “COM Port not available” errors . Статья написана в 2012, но актуальна до сих пор :)
  9. Спасибо! Моя ошибка была: я его за максимальное почему-то принял (проклятый Ковид!). То есть правильно мой вопрос бы звучал: Сколько максимально ждать. Но на этот вопрос тоже уже отвечено. Как оказалось, раньше "здравый смысл" у меня был маловат, всего 2 (то есть использовал 30 секунд). Теперь удлинил "здравый смысл", использую время 3 минуты :)
  10. Вот пока дополз сюда ответить- за меня уже все написали, повторять уже сказанное выше не буду :) Угу, моя ошибка- взял типовое и в данном топике назвал его максимальным, звиняюсь. Поставил я конечно это время в 3 минуты еще вчера. Будут рекламации- поменяю опять. Но все-таки хорошо бы указывать максимальное время в документации. Если знаете что это около 1 минуты- ну так укажите 10 минут и сделайте сноску при каких условиях.
  11. В документации SIM7600G написано, что максимальное время от момента включения до готовности порта 14 секунд: Я каждую секунду посылаю "AT" и жду ответ, если нет-повторяю, и так в течении 30 секунд (двойной запас от указанных в документации 14 секунд). Оказалось, что новые модемы (то есть модуль приехал с завода и это первое включение) не отвечают в течении этих 30с если SIM карта установлена. Начал разбираться, упростил тест: просто подключал питание и ждал, когда модем передаст "RDY". И вижу гораздо большие цифры для первых включений, чем написано в документации. Во время следующих включений время уменьшается: включение #1 (без SIM) : 22 c включение #2 (с SIM) : 41 c включение #3 и следующие (с SIM) : 18-20 с. Что это? Это связано с инициализацией модема ежиножды после первого в его жизни включения с SIM? Или это происходит всегда когда новую SIM-карту вставили? Или причина вообще другая? Хорошо бы знать, в каких ситуациях модем так долго может включаться. О себе модем пишет: Manufacturer: SIMCOM INCORPORATED Model: SIMCOM_SIM7600G Revision: SIM7600M21-A_V2.0.1 SVN: 01 Кстати, в старой партии были модемы "SIM7600M21-A_V2.0", так там строки "SVN: 01" в ответе на "ATI" не было. Она означает что-то важное? (старые модемы V2.0 вели себя примерно так же- тормозили во время первых включений, но время не считал)
  12. Ну, у меня менталитет из прошлого века, оттуда же и афоризмы. :) И Вы даже не поверите, насколько разное понимание "не побираться и не ужиматься" у разных людей. Ну невозможно сказать, сколько денег зарабатывать чтобы жить хорошо. В некоторых странах считается, что жить достойно- это тратить на съем жилья (чистая аренда, без учета платежей за воду-электичество-тв-интернет) нужно не более трети зарплаты, еще половину на еду и текущие расходы. То, что осталось (1/6 часть) - это на радости жизни и сбережения на всякий случай и на отпуск. Если не получается увидеть 1/6 зарплаты к моменту получения следующей- нужно что-то менять: больше зарабатывать или меньше тратить.
  13. Да бесполезна эта тема. Всех денег не заработать, а жизнь одна. Заниматься любимым делом- это кайф, а деньги сами тебя найдут если не самый плохой спец в том, чем занимаешься. Если хочется много денег и сегодня- тогда электроника пролетает мимо, тут может и можно много заработать, но и то только потом да и то если повезет.
  14. Я как-то тож перетаскивал с F0 на L4, вот тут немного про это: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=155963 При этом использовал конвертер от STM, он сделал львиную долю работы, потом медленно и печально довел новый сгенерированный им код до ума. Общие правила просты: проверить все ли переменные используемой структуры установлены куда надо. Перед этим вызвать инициализацию структуры, в библиотеках и это есть- причем оно не в {0} ставит, а в валидные дефолтовые значения.
  15. Теоретически я даже могу понять логику программиста- если нет симки, то какие еще установки "не отвечать на звонок" или "транслировать код ответа". Но (IMHO) доступ к регистру S0 ну никак не связан с тем есть у меня SIM карта или нет- зачем модему быть настолько умным? :) Хотя может быть все наоборот- это же стандартные команды, а оригинальный V.25TER я уже лет двадцать не смотрел, может оно так и должно быть, и лишь только китайцы следуют букве древнего закона... :) Upd: да не, там все просто написано:
  16. При чем тут это? Я написал в стартовом письме и одиночные команды тоже, именно так я выяснил на какую из команд он отвечает "ERROR". Опять же- какая мне разница, какая из команд на этапе инициализации "не отработала" - это в любом случае означает что что-то не так с модемом. В данном случае с модемом все в порядке, просто нужно по-другому строить инициализацию. Суть вопроса в том, что может еще какие-то подводные камни есть, и еще какие-то команды перестанут давать "OK" в каких-то режимах. И если это хоть где-то описано в документации, то я хочу это прочитать, а не рисовать карту Карно этого модема методом тыка.
  17. Здравствуйте! Есть модем SIM7600G и строка инициализации: "ATQ0 V1 E0 S0=0 &C1 &D2\r" Если SIM- карта присутствует, то все нормально, вижу ожидаемый "OK". А вот если SIM-карты нет- то возвращает "ERROR". Это нормально? Вот покомандно в режиме "без SIM карты": ATQ0 ERROR ATV1 OK ATE0 OK ATS0=0 ERROR AT&C1 OK AT&D2 OK
  18. Здравствуйте! В FatFs есть такое: #define MAX_DIR 0x200000 /* Max size of FAT directory */ Что это значит? Это действительно максимальный размер директории FAT? В байтах или секторах или кластерах ? В исходниках мне кажется что оно применимо к размерам сдвигов в байтах (проверяется выход за границу этого значения при работе с директориями). Но: на моем диске 64 GB /FAT32 WinHex пишет, что размер FAT 7'598'592 bytes, это 0x73F200. Явно больше чем "MAX_DIR" Кто-то разбирался, этот "MAX_DIR" в байтах или нет? И не нужно ли эту величину корректировать для больших дисков? В интернете на эту тему ничего не вижу, значит у народа нет проблем?
  19. Опыт есть такой: даже в старом и проверенном коде случаются ошибки. А что работало до сих пор- так просто звезды так сходились, а теперь вот по-другому сошлись. У меня бывало, что при переходе на другой уровень оптимизации или на другой компилятор код переставал работать- это явно косяк исходников. Еще версия- что-то изменилось в реализации камня, а Ваши исходники по-старинке это обрабатывают, и это "по старинке" уже не прокатывает. Кстати, про зайцев FIFO- это неактуально, DMA гораздо круче. В STM довольно гибкое конфигурирование DMA, можно многое туда переложить и не отвлекаться "по мелочам" на каждый байтик.
  20. Может кому поможет. Величина, установленная при выполнении команды "+CNMP", сбрасывается обратно в дефолтовое состояние (Automatic) после команды "AT+COPS=0". Может для кого-то это и очевидная связь, но я не сразу догадался. Да, "+COPS" имеет поле "Access technology selected", но возможных его вариантов меньше чем для команды "+CNMP", так что я думал что они не связаны.
  21. А зачем в плату 25 Ампер вводить? Может не надо? Я к тому, что дальше по дорожке столько пропускать я бы не стал: - если это в транзистор- так беруться транзисторы с болтовыми контактами, ну и напрямую к нему. - если в предохранитель или в любую другую ламочку- опять же напрямую к детали, а не через плату. Делал как-то на 40/80/100 Ампер устройство- так там механический дизайн часто важнее чем электроника: как кабель проложить и какие детали выбрать чтоб такой кабель подключить. подобных обсуждений тут было много, вот пример одного из них:
  22. Сделал еще проще: при старте программы замещаю все текстовые ключи в строках на однобайтовый код ключа, далее во время выполнения делаю парсинг через switch-case. получилось может и монстроидально в исходнике (сотня кейсов), но зато полностью читабельно. Результат- время выполнения сократилось до примерно 1 ms на парсинг строки, что в 18 раз быстрее чем было. Понимаю, что есть куда расти (например, перейти к упомянутым выше itoa/ftoa), но меня и этот получившийся результат абсолютно устраивает :) Кстати, как я и надеялся, этот длинный switch-case компилятор заменил на вычисляемый переход. На сайте кейла про это указано- нужно только соблюсти некоторые условия для такого результата. В case-switch в листинге ниже используются коды 1-101, но не все. ;;;798 switch (keyCode) 000d98 2865 CMP r0,#0x65 000d9a d25e BCS |L1.3674| 000d9c e8dff000 TBB [pc,r0] 000da0 fc33424e DCB 0xfc,0x33,0x42,0x4e 000da4 fdfaf9f8 DCB 0xfd,0xfa,0xf9,0xf8 000da8 f7f65df5 DCB 0xf7,0xf6,0x5d,0xf5 000dac f4f3f2f1 DCB 0xf4,0xf3,0xf2,0xf1 000db0 f0efeeed DCB 0xf0,0xef,0xee,0xed 000db4 ecebeae9 DCB 0xec,0xeb,0xea,0xe9 000db8 e8e7e6e5 DCB 0xe8,0xe7,0xe6,0xe5 000dbc e4e3e2e1 DCB 0xe4,0xe3,0xe2,0xe1 000dc0 e0dfdedd DCB 0xe0,0xdf,0xde,0xdd 000dc4 dcdbdad9 DCB 0xdc,0xdb,0xda,0xd9 000dc8 d8d7d6d5 DCB 0xd8,0xd7,0xd6,0xd5 000dcc d4d3d2d1 DCB 0xd4,0xd3,0xd2,0xd1 000dd0 d0cfcecd DCB 0xd0,0xcf,0xce,0xcd 000dd4 cccbcac9 DCB 0xcc,0xcb,0xca,0xc9 000dd8 c8c7c6c5 DCB 0xc8,0xc7,0xc6,0xc5 000ddc c4c3c2c1 DCB 0xc4,0xc3,0xc2,0xc1 000de0 c0bfbebd DCB 0xc0,0xbf,0xbe,0xbd 000de4 bcbbbab9 DCB 0xbc,0xbb,0xba,0xb9 000de8 b8b7b6b5 DCB 0xb8,0xb7,0xb6,0xb5 000dec b4b3b2b1 DCB 0xb4,0xb3,0xb2,0xb1 000df0 5d5d5d5d DCB 0x5d,0x5d,0x5d,0x5d 000df4 b0afaead DCB 0xb0,0xaf,0xae,0xad 000df8 acabaaa9 DCB 0xac,0xab,0xaa,0xa9 000dfc a85d5da7 DCB 0xa8,0x5d,0x5d,0xa7 000e00 a6a5a4a3 DCB 0xa6,0xa5,0xa4,0xa3 000e04 a200 DCB 0xa2,0x00
  23. Ниасилил. Сложно у меня va_list идет, хакерство какое-то непереносимое (я его хотел сохранять для использования потом). Сделаю "в лоб" сотня функций, в каждую из которых передается от 0 до 100 переменных: mystring_0arg(char* out, char* format, void* arg[]) { sprintf (out, format);} mystring_1arg(char* out, char* format, void* arg[]) { sprintf (out, format, *arg[0]);} mystring_2args(char* out, char* format, void* arg[]) { sprintf (out, format, *arg[0], *arg[1]);} mystring_3args(char* out, char* format, void* arg[]) { sprintf (out, format, *arg[0], *arg[1], *arg[2]);} , а при формировании строки буду использовать указатель на строку формата, указатель на вызываемую функцию (с нужным количеством аргументов), и указатель на расположение списка аргумантов (точнее, список указателей на величины). То есть парсинг по-минимуму: один раз в начале работы при просмотре конфигурации. Тогда же и определяю какая из функций вызывается. во время работы получаю максимальное быстродействие.
  24. Это очень важное занудство, спасибо за напоминание! :) И живет этот "псевдоуказатель" только между va_start() и va_end(). Вот нашел пример тут, как организуют независимую область памяти и хранят там va_list. Они через va_copy() создают копию, и делают проход два раза: первый раз для определения нужного размера памяти и потом, после malloc(), засовывают все в эту память. Получается char* на область памяти, в которой храниться va_list. char* vjoin(const char* delim, va_list ap) { va_list aq; va_copy(aq, ap); size_t dlen = strlen(delim); /* First pass. Use the copied va_list */ size_t needed = 1; /* NUL terminator */ const char* s = va_arg(aq, const char*); if (s) { needed += strlen(s); while ((s = va_arg(aq, const char*))) needed += dlen + strlen(s); } va_end(aq); /* Second pass. Use the original va_list */ char* rv = malloc(needed); size_t offset = 0; *rv = 0; s = va_arg(ap, const char*); if (s) { strcpy(rv, s); offset = strlen(s); while ((s = va_arg(ap, const char*))) { strcpy(rv + offset, delim); strcpy(rv + offset + dlen, s); offset += dlen + strlen(s); } } return rv; } char* join(const char* delim, ...) { va_list ap; va_start(ap, delim); char* rv = vjoin(delim, ap); va_end(ap); return rv; }
  25. Спасибо всем, буду думать в рабочее время. 1. если сделать как однажды сделанную функцию с установленным динамически числом аргументов- то все уже придумано до меня, это массив, созданный с помощью va_list() для vsprintf(). 2. Если упрощать "в лоб"- то отказаться от strstr(): переконвертировать строку, оставив признак ключа (у меня это '/') и после него один единственный байт, уникальный для каждого ключа. Метод работает для 253 ключей, что меня сейчас более чем устраивает. Тогда простым 'switch-case' решается. Первый метод быстрее, но посмотрю получится ли так как я хочу, и сколько занимает в памяти этот сформированный va_list массив: у меня строк много разных, и может быть критично если массив сильно (в дестки-сотни раз) больше чем сама оригинальная строка.
×
×
  • Создать...