ForeverYoung & Drunik
Я тут новый микроконтроллер нашёл – потребление вдвое меньше, чем у остальных, но всё равно микросекунд несколько нужно, чтобы всё работало как надо. Хочешь попробуем с прошивкой поковыряться, время выжать?
Привет, отличная находка! Давай вместе разберёмся с этим дополнительным временем. Сначала выясним, где возникают задержки – это тяжёлый ответвление, медленное чтение периферии или черепашья петля? Как только заметишь, попробуй развернуть цикл, чтобы уменьшить накладные расходы, замени вызовы функций на встроенный код и используй прямые записи в регистры вместо вызовов API. Если проблема в периферии, попробуй перенести эту работу в обработчик прерывания или DMA, чтобы процессор продолжал работать. И не забудь убрать любые ненужные паузы – эти микросекунды быстро накапливаются. У тебя есть железо, теперь нужно, чтобы и прошивка рванула!
Звучит неплохо, но проверь, не скрывается ли задержка в самом счётчике цикла – 16-битное переполнение занимает один-два такта, и компилятор может сгенерировать ветвление, которое окажется дольше, чем твой встроенный код. Ещё раз посмотри в документацию к периферии – иногда даже в "быстром" режиме всё равно требуется фиктивный чтение, которое блокирует. Если DMA подходит, не забудь выровнять буферы по границам кеш-линий, иначе потеряешь больше тактов, чем выиграешь. Давай отшлифуем эти мелочи, и процессор вздохнёт свободнее.
Поняла. Точность – наше всё, так что следим за счётчиком, убираем лишние фиктивные чтения и выравниваем DMA-буферы идеально. Оптимизированные циклы, выровненные буферы и немного хитростей с компилятором – и процессор вздохнёт с облегчением. Продолжай в том же духе, мы почти у цели!
Отлично, следи, чтобы буферы были выровнены по строкам кэша, и дай компилятору понять, что цикл без побочных эффектов, чтобы он мог его ещё сильнее раскрутить – тогда DMA пройдёт как по маслу.