Jump to content

    

Сергей Борщ

Модераторы
  • Content Count

    9109
  • Joined

  • Last visited

Posts posted by Сергей Борщ


  1. 1 час назад, Arlleex сказал:

    Я бы ради интереса уже сам потестировал, будь у меня какая-нибудь борда с Linux-ой и свободное время.

    Virtualbox ставится за 15 минут вместе со скачиванием. Еще 15 минут туда ставится линух со скачанного образа установочного диска (из них 14 минут процесс идет сам по себе). Имеете практически полноценный комп с линухом в отдельном окне. В виртуальную машину пробрасывается либо "железный" последовательный порт компа, либо USB и воткнутый в него переходник USB-RS232. Экспериментируйте по самое "не хочу". В любой момент можно делать снимки работающей системы, чтобы при необходимости в любой момент откатиться к любому из них.

  2. 6 минут назад, rx3apf сказал:

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

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

     

    41 минуту назад, kovigor сказал:

    Можно ли такой рукав (с фиксацией) купить отдельно от лампы и как он правильно называется ?

    Можно. Вот только метровый сразу не нашелся.

  3. 8 часов назад, Eddy_Em сказал:

    Зло - в жутком оверхеде. Вместо 2кБ флеша твоя прошивка занимает 6. Да еще и содержит кучу лишних проверок.

    Телепат из вас, мягко говоря, хреновый. 4912 байт занимает USB CDC + загрузчик c шифрованием AES. Тот же загрузчик с UART вместо USB CDC занимает 2840. Вычтите сами? Вы видели мои исходники, чтобы утверждать, что там есть лишние проверки? Да еще и куча.

    8 часов назад, Eddy_Em сказал:

    Зачем делать 10 файлов по 100 строк, если можно все эти 1000 строк в один файл поместить?

    Да потому что в десяти файлах по 100 строк тупо проще ориентироваться, чем гонять туда-сюда простыню на 1000 строк.

    8 часов назад, Eddy_Em сказал:

    Полный CDC со всеми комментариями и пустыми строками занимает 1000 строк.

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

  4. 9 часов назад, Kabdim сказал:

    то при некоторых условиях, gcc к примеру может использовать байтовые операции вместо 32битных или игнорировать volatile

    Хотелось бы увидеть конкретный пример. Довольно часто работаю с регистрами, описанными как битовые поля и ни разу с подобным поведением gcc не сталкивался. Может я что-то делаю не так, или может что-то не так с вашими примерами?

    4 часа назад, jcxz сказал:

    регистры USB-контроллера определены структурами с битовыми полями

    А я их определяю как union из безымянной структуры с битовыми полями и целого соответствующего размера. Работаю и с полями и с битовыми масками - где как удобнее.

  5. 1 час назад, Eddy_Em сказал:

    В идеале USB должен состоять из одного сишного файлика и одного заголовочного

    Это "совет космического масштаба и космической же глупости"? У меня стек, реализующий только виртуальный COM-порт на USB device STM32x0x содержит семь .cpp и десять .h файлов в пяти директориях, не считая еще двух .cpp файлов в самом проекте, где этот стек используется (один - описание дескриптора и второй - работа со стеком). К тому же два заголовочных файла из этих семи у меня используются еще и в стеке для USB OTG STM32F2x/F4x, а две директории с двумя исходниками и тремя заголовочными файлами подменяются другими при компиляции загрузчика без ОС. Самый большой файл (заголовочный с описаниями структур дескрипторов) пока занимает 15 К, пять файлов по порядка 6 К, остальные 1-2 К.  Если я все это свалю в две большие кучи - там не только я, там сам черт ногу сломит. И, кстати, чтобы поднять какой-то другой USB класс, мне надо будет добавить в стек одну директорию с заголовочным файлом и, может быть, одним файлом исходного кода и это (о ужас) никак не повлияет на проекты, собирающиеся из этих же исходников без этого нового класса. Где зло?

  6. 8 часов назад, _lexa_ сказал:

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

    Компилятор не обладает телепатией. Он привык "джентельменам верить на слово". Вы ему сказали, что содержимое данной переменной не меняется? Сказали. Он имеет полное право не вычитывать ее каждый раз из памяти, а вставить ее значение в код команды, если посчитает это более эффективным. Более того, он не только имеет право, но и делает так (в свое время обжегся в такой же ситуации - объявил серийный номер устройства без volatile и программировал его в нужную ячейку на последнем этапе производства. Долго разбирался, почему устройство не отзывается на свой адрес).

    Добавлено: и volatile ничего никуда не размещает.

  7. 23 минуты назад, ViKo сказал:

    Адрес переменной - это константа?

    Да. Он не меняется в течении всего времени выполнения программы.

    23 минуты назад, ViKo сказал:

    То есть, могу ли я в шаблоне задать параметр - адрес переменной? 

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

  8. 1 час назад, T00T сказал:

    Далее жду кода бит сбросится

    А он должен? Честно говоря никогда не обращал внимания, просто записывал сначала 1, потом ноль и фразу "It will be automatically cleared after reset." воспринимал как "будет автоматически очищен после аппаратного сброса". Возможно вы и правы, логика в ваших рассуждениях мне понятна. Может у вас что-то напутано с адресацией? Попробуйте вычитать какой-либо регистр, в котором после сброса должно быть ненулевое значение, например, RCR - считаете из него 0x08? 

    Использовал Direct bus address mode, боюсь, мало чем смогу помочь.

  9. 1 час назад, _lexa_ сказал:

    почему бы не стирать не инициализируемые константы?

    Потому что они не "не инициализируемые". Они по-умолчанию проинициализированы нулем в соответствии со Стандартом языка. Не нравится - жалуйтесь в лигу сексуальных реформ коммитет по стандартизации языка C.

  10. В 11.02.2020 в 15:44, Aurochs сказал:

    И никакое другое исключение ... этот обработчик ПРЕРВАТЬ НЕ МОЖЕТ

    Reset и NMI могут и прерывают, ибо имеют еще более высокий приоритет.

    В 11.02.2020 в 15:44, Aurochs сказал:

    а команда BKPT генерирует исключение

    Какое именно? А то я ставлю точку останова в обработчике HardFault и она там срабатывает. Что я делаю не так?

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

  12. 16 часов назад, AHTOXA сказал:

    А в остальных 90% случаев - я не смотрю в дизассемблер. Потому что я знаю, что компилятор умеет делать свою работу.

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

    Но я не вижу никаких сложностей в просмотре листинга или дизассемблированного кода. Это как с иностранным языком - одно дело читать, другое писать, а говорить - вообще третье. Команд минимум, ADD, SUB, CMP, MOV, LD, ST и тому подобные понятны интуитивно, порядок операндов и типы адресации один раз в описании системы команд достаточно посмотреть, за подглядывание на незнакомые команды в описание системы команд не бьют.

  13. 14 минут назад, VladislavS сказал:

    там всё по другому.

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

  14. 33 минуты назад, POLL сказал:

    В следующий раз, когда пойдете в магазин, не забудьте

    Не учите других жить.

    31 минуту назад, POLL сказал:

    я сделаю как МНЕ нужно, а ни как ВАМ

    Делайте. CADiLO это как-нибудь переживет.

  15. 55 минут назад, Forger сказал:

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

    OBL_LAUNCH не для этого придуман?

    Цитата

    After the BSY1 bit is cleared, all new options are updated into the Flash memory, but not applied to the system. A read from the option registers will still return the last loaded option byte values, the new options will have effect on the system only after they are loaded.
    Option bytes loading is performed in two cases:
    – when OBL_LAUNCH bit of the FLASH control register (FLASH_CR) is set
    – after a power reset (exit from Standby/Shutdown modes)
    Option byte loader performs a read of the options block and stores the data into internal option registers. These internal registers configure the system and can be read by software. Setting OBL_LAUNCH generates a reset so the option byte loading is performed under
    system reset.

     

  16. В 02.12.2019 в 11:27, Forger сказал:

    Это позволит заложить в саму прошивку правильную конвертацию старого формата настроек и нового.

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

    В 02.12.2019 в 12:03, pokk сказал:

    А сам алгоритм конвертации примерно такой?

    В ОЗУ создаю образ новых настроек со значениями по-умолчанию. Таким образом, одним вызовом memcpy() или приваиванием структуры все новые настройки получают значения по-умолчанию. Потом, вычитывая настройки из блока старой версии, заменяю ими одноименные в новом блоке. Далее, записываю этот новый блок на свое место во флеш. В случае несовпадения контрольной суммы блока настроек точно так же создаю образ в ОЗУ, одним вызовом memcpy() заполняю весь блок значениями по-умолчанию, переписываю во флеш.

     

    Ой, блин. Опять вторую страницу не заметил.

  17. 26 минут назад, Hub сказал:

    аттач проверяется

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

  18. Ответ на вопрос в названии темы:

    Цитата

    — 63 significant initial characters in an internal identifier or a macro name (each
    universal character name or extended source character is considered a single
    character)
    — 31 significant initial characters in an external identifier (each universal character name
    specifying a short identifier of 0000FFFF or less is considered 6 characters, each
    universal character name specifying a short identifier of 00010000 or more is
    considered 10 characters, and each extended source character is considered the same
    number of characters as the corresponding universal character name, if any)

    Это из стандарта 99 года.