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

AVI-crak

Участник
  • Постов

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

  • Посещение

Весь контент AVI-crak


  1. Дык в этом проблема, алгоритмы распознавания лица по сохранённой векторной маске - не умещаются в обычный контролёр чисто физически. Хотя их и можно утрамбовать - мало кто этим начнёт заниматься. С момента когда эти алгоритмы уже стали выдавать вменяемые данные - в них было внесено огромное количество дублирующего кода. Те самые полупустые библиотеки, фреймворки, куски кода на разных языках и наречиях и так далее. Вполне безобидная операция сложения может занимать килобайты кода - проверки на условия и ограничения под всеми углами. И такая фигня на каждой странице кода. Удачи самоубийце, я пас.
  2. DMA и FreeRTOS

    У spi есть два режима cs - Motorola и TI режим, и я их постоянно путаю. Один из них может активировать cs, но не может его снять - предназначен для работы с потоком. Второй дёргает ногу cs с каждой 4-16 битной одноразовой передачей данных. Размер данных задаётся отдельно. Меня другое волнует, они уже давно придумали fifo буфер и ещё кучу полезностей, но отчего-то размер данных ограничен в 16 бит...
  3. DMA и FreeRTOS

    Тут важнее второй раз его не пнуть на передачу, пока он нормально работает (а это вполне возможно). Для этого нужно сначала выиграть арбитраж на конкретную линию дма, то-есть добиться монопольной работы с дма из одной задачи. А дальше можно использовать эту линию как хочется, и освободить когда будет не нужна.
  4. Ну значит вырезано. Подсчитывать байты в пользовательской функции - это как землю руками вращать.
  5. Вроде-бы lwIp работает точно так-же как терминал - учитывает управляющий символ строки. Если конечно это не вырезано с корнем.
  6. Библиотеки

    Ви таки не поверите, почти все собранные библиотеки имеют политику частичного объявления. Это связанно с тем что они имеют внутренние, не публичные функции, предназначенные для собственной корректной работы.
  7. Библиотеки

    Это имеет смысл когда к библиотеке есть документация, полный набор файлов для быстрого поиска функций, или когда библиотека твоя личная. Но вот использовать жирную чужую библиотеку без возможности заглянуть в её содержимое - уже явный перебор. Кстати насчёт пересборки проекта - gcc следит за изменениями в файлах, если кеш *.a разрешен - то он его не собирает каждый раз, а использует уже имеющиеся. Это работает даже при переключении проектов. Файлы *.a остаются в папке сборки, и используются по мере надобности. Устаревшая версия уничтожается автоматически. Так-что насчёт жирных проектов - не всё столь однозначно.
  8. Библиотеки

    *.a готовое - часто используется для защиты интеллектуальной собственности. В том виде как есть - очень сложно заглянуть в сам контейнер. Имеющийся публичная декларация может быть не полной, с использованием множества перекрёстных ссылок в тени. В таком случае добавляя всего одну функцию из подобной библиотеки - получаешь весь табор цыган, которые и память сожрут, и коня уведут. Особым извращением считается переключение типа процессора в теле *.a библиотеки, ну потому-что нишмогла, а может и просто знаний не хватило, а может и очередной костыль чтоб работало везде... Посему - брось эту каку, и больше не наступай - измажься весь, и от запаха уже не избавишься.
  9. Кхм... хотел скорости, а получил звон на линии... GPIO_Speed_100MHz - это скорость нарастания напряжения на ноге, показатель того - какой ток чип вдувает во внешнюю линию.
  10. stm32 SPI

    Всё очень просто. Использование предсказания поведения внешней системы с использованием таймера - намного уменьшает гибкость общего алгоритма. То-есть если-бы внешней системой было железо, механика или нечто подобное - то реализация предсказаний оправдывается. Но в связке двух процессоров - это наличие недостатка в алгоритме.
  11. stm32 SPI

    Плавали, знаем... Всё это будет работать до очередной хотелки клиента. После чего придётся переписывать почти весь проект, причём на оба чипа, и почти с нуля. Мне лень убеждать, но посмотреть со стороны всегда приятно. И всё-же: разделяйте уровень железа и программной части, уровень интерфейса и протокола пакетной связи, а также разумно используйте абстракции данных на уровне приложения (алгоритма). При использовании подобного разделения - ваш проект можно масштабировать практически бесконечно (в разумных пределах), а так-же использовать части и даже целые куски в новых проектах - без подгонки напильником. Реальный пример существующего проекта. На ПП несколько чипов, в том числе и слабенький st для работы с сенсорным экраном (не я придумывал). Изначально алгоритм этого чипа был очень простым: получить координаты нажатия экрана, и в режиме слейва отдать главному чипу. Потом ему добавили работы в определении нажатия иконок - протокол связи стал намного сложнее и обрёл множество садового инструментария. Количество изменений в проекте между этими двумя точками - просто безумное. Переписывалось даже то, что имеет лишь косвенное влияние. А потом хозяин проекта узнал что существуют готовые железные контролёры сенсорных экранов, в которых эти функции реализованы изначально. Такого количества подстановок я не встречал даже у индусов. Количество изменений равнялось общему объёму проекта. Поле чего автор проекта решил пристрелить больное бешенством животное, и начать с нового листа. И с первых строчек прострелил себе ногу в трёх местах. Я к тому что уровень адруино не лечится, если уже заразились - то постарайтесь не распространять заразу.
  12. Назовите такой продвинутый редактор, в котором можно посмотреть состояние проекта неделю назад?
  13. Это как???? Один драйвер - много физики, одна физика с миксом на внешние каналы, или фулл эмуляция на железе не предназначенном для этих целей?
  14. Скорми проект бешеной лошади. Уверен что она найдёт огромное количество ошибок. Потому как проектов без ошибок не существует. (Если проект не содержит ошибок - значит сам проект ошибка.)
  15. Размер BKRAM 4к. Размер сектора флеша может быть 32к-128к-256к-512к-1м - зависит от жирности и параллельности архитектуры чипа. Оно туда не влезет. Хотя для внешней памяти 25-той серии - весь сектор стирать не обязательно, и такой вариант защиты вполне приемлем.
  16. stm32 SPI

    Неужели так важна нулевая задержка между сообщениями? По сути, если не гоняться за минимальной задержкой - она сама по себе уменьшится, как-бы глупо это не звучало. Просто не нужно вот так кровь из носу отдавать или принимать сообщения, всё гораздо проще. Два кольцевых буфера на каждой стороне. И по два указателя голова/хвост. На стороне мастера: буфер на передачу с разрешением записи в него, указатель головы для него с разрешением записи, указатель хвоста для буфера приёма - с разрешением записи, сам буфер приёма - только чтение, хвост буфера передачи - только чтение, голова буфера приёма - только чтение. На стороне слейва такая-же структура, с небольшими изменениями. А теперь запускаем мастер через таймер, с выхлопом на ногу ce, на максимально допустимой скорости, и просто пользуемся кольцевыми буферами - что может быть проще? Ну да, кольцевые буферы будут постоянно перезаписываться и обновляться. Но при сохранении целостности алгоритма - изменения будут только в свободной области. То-есть сначала проверка возможности записи, потом обновление инфы (которая возможно улетит в неполном варианте), потом обновление указателя. Пока приёмная сторона не обновит указатель хвоста - вся эта область считается занятой. Размеры кольцевых буферов нет смысла делать больше 512 байт, будет только медленнее. При таких условиях задержка получается меньше 1мс. Ошибки могут возникнуть по вине дма на очень высокой скорости и общем напряге системы. Но такое ещё нужно додуматься нагородить - не каждому под силу.
  17. Для arm можно собирать независимый от адреса код, но для одного проекта это будет две независимых настройки компиляции - и целый океан боли. Сначала собирается статический код - максимально возможно без ошибок, даже самых незначительных. И уже поверх статики - компилируется перемещаемый код. Бользаключаетсявследующем, когда вам нужно чуть-чуть изменить уровень железа - придётся откатываться почти на самое начало, и проходить весь путь заново. В этом процессе появляются новые ошибки, в самых непредсказуемых местах. Есть хорошие ошибки - которые видит сам компилятор, и есть скрытые, которые имеют зависимость от интерфейса пользователя или от внешнего воздействия. Вот тут начинается самое весёлое. Отладка в реальном времени с использованием логов - очень сильно отличается по оперативности от внутрисистемного отладчика. Для перемещаемого кода есть один большой бонус - этого кода может быть безумно много. Почти весь он связан с графикой, звуком и пост_обработкой данных. Процессы связанные с реальным временем запускать таким способом глупо, они будут гораздо медленнее исполняться из-за двойного преобразования адресов статики. То-есть в статике те-же функции реального времени будут почти в два раза меньше весить и работать в два и более раз быстрее.
  18. Ещё можно купить MT48LC32M16A2P-75, всё остальное кануло в лету.
  19. STM32F4 Discovery + SD micro

    На STM32F4-Discovery стоит немощный стаб 3,3в, и отвратительная разводка силовых цепей. Эта плата годится для мигания светодиодом, и не более. Хотите получить нечто работающее -делайте собственную плату, со всеми плюшками. Помехи в цифровых системах почти всегда проходят по линии земли, вам просто необходимо выбрать точку подключения земли - чтобы не возникало токовой петли. Проще всего это выглядит на бумаге: одна точка для всех, линия с поочерёдным подключением нагрузки, изолированная земля. Как рисуется - так и должно проектироваться, в этом нет ничего сложного. Главное вовремя вспомнить товарища Кирхгофа.
  20. проблемы с SDHC

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

    https://www.lijingquan.net/wp-content/uploa...icationV6.0.pdf Страница 35. Переходы межу операциями чтения и записи - должны подтверждаться сменой статуса режима карты. Через определённое время бездействия (зависит от карты) - алгоритм сам переходит в состояние Stand-by State, даже без проверки статуса. Но это время не нормированное, почти лотерея. И да, писать драйвер для SD - это наверное второе по увлекательности занятие.
  22. JTAG + STM32

    Я тоже так думал, пока не открыл доки на используемые чипы в программаторе. Подозрения подтвердились, когда захотелось полной скорости usb на собственной отладочной плате. Без внешнего трансивера - исключительно программная поддержка usb2. Вроде бы как подключение usb2 - а скорости нет... Интерфейс JTAG (на качественном программаторе) способен работать на частотах внешнего клока в 60 МГц, что в сочетании с шестнадцатью линиями трассы - даёт скорость опроса чипа в 80 мбайт/сек. Такой поток не имеет смысла гнать напрямую, по этой причине в программаторе есть собственная память для триггеров - в комп сливаются данные которые успели измениться. Хочу сделать акцент - JTAG предназначен для очень быстрого опроса чипа в режиме отладки, скорости программирования не являются приоритетом. Нормальный JTAG - подключается почти ко всему что шевелится, он достаточно простой по протоколу, фактически стандарт. Чего нельзя сказать о программаторе на единственном чипе st - там буквально всё программное. На всех чипах st выше 100 ног - JTAG включен по умолчанию, и он таки работает. Но только не с китайскими программаторами.
  23. JTAG + STM32

    Насчёт JTAG. Если чип посредник в программаторе не имеет полноценной аппаратной поддержки usb2 - то у вас программный эмулятор JTAG, с чем вас и поздравляю.
  24. Вариант практического использования для регистров часов и даты stm32f4-7. Устанавливает дату и время на момент сборки прошивки, макрос сокращается до одиночной записи в регистр. RTC->TR = ((__TIME__[0]-'0') << 20) // hour 10 | ((__TIME__[1]-'0') << 16) // hour 1 | ((__TIME__[3]-'0') << 12) // minutes 10 | ((__TIME__[4]-'0') << 8) // minutes 1 | ((__TIME__[6]-'0') << 4) // seconds 10 | (__TIME__[7]-'0'); // seconds 1 RTC->DR = ((__DATE__[9]-'0') << 20) // year 10 | ((__DATE__[10]-'0') << 16) // year 1 | ((__TIMESTAMP__[2]=='e'?2:__TIMESTAMP__[2]=='d'?3 \ :__TIMESTAMP__[2]=='u'?4:__TIMESTAMP__[2]=='i'?5 \ :__TIMESTAMP__[2]=='t'?6:__TIMESTAMP__[0]=='M'?1:7) << 13) // Week day | ((((__DATE__[2]=='n'?(__DATE__[1]=='a'?0:5):__DATE__[2]=='b'?1 \ :__DATE__[2]=='r'?(__DATE__[0]=='M'?2:3):__DATE__[2]=='y'?4 \ :__DATE__[2]=='l'?6:__DATE__[2]=='g'?7:__DATE__[2]=='p'?8 \ :__DATE__[2] =='t'?9:__DATE__[2]=='v'?10:11)+1)/10) << 12) // Month 10 | ((((__DATE__[2]=='n'?(__DATE__[1]=='a'?0:5):__DATE__[2]=='b'?1 \ :__DATE__[2]=='r'?(__DATE__[0]=='M'?2:3):__DATE__[2]=='y'?4 \ :__DATE__[2]=='l'?6:__DATE__[2]=='g'?7:__DATE__[2]=='p'?8 \ :__DATE__[2] =='t'?9:__DATE__[2]=='v'?10:11)+1)%10) << 8) // Month 1 | ((__DATE__[4]==' ' ? 0 : __DATE__[4]-'0') << 4) // day 10 | (__DATE__[5]-'0'); // day 1
×
×
  • Создать...