по поводу заданного мной вопроса о DMA и альтернативах, я так ничего полезного и не извлек из написанного.
Ок, я не видел, где всего много, но я отлично видел, где всего МЕНЬШЕ - например, AVR. если сравнивать с тем, что было для меня основным, то в STM32 просто изобилие для голодного.jcxz писал(а):очень мало разных режимов работы. Очень примитивная периферия. Не видели вы периферии, в которой всего много....
вот я как рассуждаю? кто-то сделал DMA и горя не знает. я не сделал DMA и тоже горя не знаю. есть ли тут подвох? и если есть, то где? то есть где та грань, за которой меня ждут боль и страдания? рассуждения про коней в вакууме интересны, но не несут полезной информации начинающему, т.к. его заботит не работоспособность его кода в случае нашествия марсиан, а работоспособность его конкретного поделия. и очень хотелось бы получать советы/ответы по конктерно поднятой теме, а не "вообще абстрактно", чем, извините, вы, jcxz, очень стратадете - ваша любовь вспоминать о архитектуре ARM вообще и свойствах ядра "аналогичного" МК крайне занимательна, но для начинающего бесполезна. меня меньше всего беспокоит архитектура ядра, поскольку я просто не вижу (и еще большой вопрос, плохо ли это) связи моих частных, относительно "высокоуровневых" вопросов с "низкоуровневыми проблемами" шин, арбитражей и т.п. "ядрёных" фич. как минимум, без дополнительных пояснений...jcxz писал(а):Не переписывая каждый раз. Вот и вся логика. Это лучше, чем под каждый проект ваять и отлаживать заново.
а я почему-то думал, что есть... если уж в AVR 2 байта есть во многих МК, неужто в STM32 нет даже 2 байт?!jcxz писал(а):Если речь о STM32 с их примитивным UART, в котором даже нет FIFO
меня пока что DMA немного напрягает. ведь это требует достаточно непрозрачной (сноска здесь и далее - для меня, новичка) инициализации режима DMA всякий раз после приема чего-то там (см. "лучше 2 дня потерять, зато потом за полчаса долететь"). Например, конкретно по модбасу - длина RTU-пакета не известна до момента его полного приема, или, как минимум, до приема четвертого или седьмого байта (по памяти, могу ошибиться). так как мне DMA тут может помочь? как его настроить, чтобы по прерыванию от DMA иметь готовый пакет в буфере? у моего предшественника сделано так (если я верно расшифровал его коды), что прерывание DMA вызывается и начинается анализ "сырых" байтов в буфере. то есть у меня сильное подозрение, что он тупо принимет N байт при помощи DMA и потом колдует с принятым массивом, выискивая в нем признаки пакета модбас и собирая пакет по кусочкам, если необходимо. по-моему, это намного худшее решение, чем тупое по прерываниям каждого байта... но есть ли лучшее - я пока не знаю...jcxz писал(а):Если будете работать без DMA. А DMA спасёт от этого.
а теперь цепочка моих рассуждений.tonyk писал(а):Применительно к МК уровня STM32 как раз нетрадиционным способом является приём-отправка одного байта с генерацией прерывания
1. разработчики ARM (в частности, STM32) явно не глупее вас (и вообще всех тут присутствующих)
2. они зачем-то предусмотрели режим работы USART с прерываними, хотя это крайне тупо и неэффективно
вопрос: нет ли тут какого-то подвоха?
Добавлено after 9 minutes 33 seconds:
[uquote="a5021",url="/forum/viewtopic.php?p=4711061#p4711061"]так же можно можно переработать инициализацию и привести ее к виду:
Код: Выделить всё
T1.CR1 = (T1_CR1_t){.DIR=1, .OPM=1, .CEN=1}.r;
Код: Выделить всё
TIM1->CR1 = TIM_CR1_DIR | TIM_CR_OPM | TIM_CR1_CEN;чисто теоретически модуль main.c может состоять (помимо списка инклюдов) из единственной строки go; - короче не придумать. но есть ли во всем этом смысл? в частности: куда вы потратили ту уйму времени, которую сэкономили на записи T1.CR1 = (T1_CR1_t){.DIR=1, .OPM=1, .CEN=1}.r; вместо TIM1->CR1 = TIM_CR1_DIR | TIM_CR_OPM | TIM_CR1_CEN;, которая, обратите внимание, аж на 5 (!!!) символов длинее?
Добавлено after 9 minutes 20 seconds:
да, еще в догонку к ранее сказанному... известно огромное количество промышленных modbus-устройств на 8-битных PIC и AVR (у которых нет DMA по определению), работающих на в 2-10 раз меньшей тактовой частоте, и прекрасно всё успевающих... где зарыта проблема вероятного "не успевания" STM32 при "неприличном" подходе по прерываниям USART?


