[uquote="a5021",url="/forum/viewtopic.php?p=3447078#p3447078"]Как часто? Со скоростью "несколько десятков МГц" / 8 ? А не слишком ли это дофига даже для ваших фантастических примеров?
Пусть эта "быстрая" через DMA работает и будет помедленнее. Умельцы тут на форуме динамическую индикацию демонстрировали. Молотит через SPI+DMA во весь опор, не то, что без прерываний, а и вовсе полностью аппаратно. Говорю же, как процесс организовать.[/uquote]
Ну вот в одном из моих проектов есть FOC (векторное управление моторчиком) с частотой ШИМа (и прерываний) == 20кГц. И кроме него в проекте ещё куча периферии, с которой одновременно идёт работа: две группы АЦП-каналов (скан (сэмплирование = почти 900кГц) и инжектированные (частота много меньше), на паре каналов DMA), 3 UART-а (1 из них через DMA на 921600бод), гироскоп на I2C (2 DMA) 400кГц, 2-3 слэйва на SPI (2 DMA) SCLK=30МГц, датчики Холла со своей кучкой прерываний, радиоприёмник (пара таймерных прерываний). Всё это прекрасно работает одновременно.
А теперь расскажите как Вы всё это разложите в Ваш суперцикл?? Учитывая что для FOC нужны такие довольно тяжёлые вычисления на каждом периоде ШИМ, для интерполяции д.Холла нужны тоже непростые вычисления (не реже частоты главного ШИМ), для обработки данных гироскопа нужна тоже довольно тяжёлая математика.
Куда Вы всунете WFI чтобы не потерять данные и успеть всё обработать?
И это ещё относительно простой проект. Есть и более сложный - там примерно то же самое, но периферии ещё больше - добавляются несколько каналов CAN, Ethernet-драйвер с работающим поверх него TCP-стеком, HTTP-сервером, SNTP- и прочей кухней; кучка датчиков температуры с ШИМ-модулированным выходом и драйверами под них на прерываниях и пр.. И HTTP у меня вполне себе нормально работает даже когда моторчик крутится и векторное управление работает. На суперцикле Вы бы уже давно приплыли.
[uquote="a5021",url="/forum/viewtopic.php?p=3447078#p3447078"]
У меня то WFE во всех проектах есть. А куда Вы его будете в свой суперцикл впендюривать, позвольте узнать?
В начало или конец, а что?
Давайте я проведу вам маленький ликбез, а то чувствую, вы еще долго в глупостях упражняться будете. Картина с этими событиями такая: если прерывание разрешить в периферии, но не разрешить в контроллере прерываний NVIC, то каждый раз, когда периферия будет "генерировать" прерывание, вызова обработчика происходить не будет, но будет взведение флага в регистре NVIC->ISPR. Вот этот регистр и надлежит мониторить на предмет смены значения. А мониторить его не просто, а очень просто:[/uquote]
Вы приведите пример своего суперцикла, в котором "WFE в начале или конце". И если сами не можете понять, то наглядно покажем Вам какие баги будут в Вашем суперцикле. Какая разница где Вы там флаги собираетесь опрашивать - в NVIC или в конкретной периферии, ущербен сам подход. Он обладает огромными недостатками, в том числе - огромными затратами на обработку одного события во много раз превышающими те 12 тактов что так боитесь.
Итак вот ваш цикл:
while (1) {
__WFE();
if (flag0) {...}
if (flag1) {...}
if (flag2) {...}
...
if (flagN) {...}
}
Вы как бы совсем не видите тут проблем и недостатков?
А расскажите как нам, сколько тактов потребуется CPU если он находится внутри WFE и тут пришло событие flagN?
А что будет если пришло такое событие, процессор пошёл выполнять эту портянку, дошёл до flag2, и тут случилось flag0? Что будет?
А что будет если скажем одно из событий требует реакции за время не более 1/20кГц (FOC), а в это время мы надолго застряли с обработкой HTTP-запроса?
Вы как бы совсем не видите очевидных вещей??? Тогда видимо абдуринизация зашла уже слишком далеко и уже ничем не помочь.....
[uquote="a5021",url="/forum/viewtopic.php?p=3447078#p3447078"]
Без разницы, что он там в себе содержал. Обработка точно такая же, как и для любых данных, принятых по любому интерфейсу.[/uquote]
А сколько эта обработка времени займёт? А что будет с другими событиями от другой периферии, которые не могут ждать пока в ответ на GET-запрос Вы упакуете gzip-ом отправляемый файл? Не задумывались?
Добавлено after 8 minutes 37 seconds:
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3447084#p3447084"][uquote="jcxz",url="/forum/viewtopic.php?p=3447071#p3447071"]Десятки источников прерываний - обычная ситуация в
любом более-менее серьёзном устройстве сложнее абдурины.[/uquote]к слову, большая часть промавтоматики, на которой заводы работают, имеет примерно три источника прерываний - АЦП, таймер и изменение уровня на ноге aka EXTI. Ну пусть еще RXNE для модбаса.[/uquote]
Ни в одном из проектов над которыми я работал последние >10лет, не было менее 10 источников прерываний. А обычно - гораздо больше. Мало источников было только в проектах на DSP, но там другая специфика.
И то что Вы пишете - это наверное справедливо было устройства для позапрошлого века. В современных устройствах заказчик хочет кучу плюшек сразу. Если это счётчик электроэнергии, то это уже только UART-ов будет штук 5: оптопорт, RS-485 (1 или 2), GSM, ZigBee, PLC, радиомодуль, сервисный порт (каждый UART - 3 источника прерываний), ... не считая прочих Ethernet и др. И кучка других прерываний от FRAM/FLASH, вычислителя параметров сети и кучки других датчиков.
PS: У меня складывается впечатление что тут мало кто работает с серьёзными проектами. А больше с игрушками только и мигалками.....