lmaks 0 1 марта, 2015 Опубликовано 1 марта, 2015 · Жалоба Использую высокоприоритетные прерывания (выше configMAX_SYSCALL_INTERRUPT_PRIORITY) для аппаратуры. Однако после завершения приема данных (несколько прерываний) требуется активировать задачу обработки. Из высокоприоритетных прерываний нельзя пользоваться системными API (fromISR). Есть какие-нибудь мысли как это сделать красиво. Думал побаловаться с программным прерыванием SV CALL - но оно уже используется системой. Остались только кривые мысли типа активировать какой-нибудь таймер на минимуме - чтобы тот выдал прерывание уже с приоритетом ниже configMAX_SYSCALL_INTERRUPT_PRIORITY и далее уже активировать семафор задачи. Думал даже задействовать ножку под EXT interrupt - но они все уже заняты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
seniorandre 0 1 марта, 2015 Опубликовано 1 марта, 2015 · Жалоба Использую высокоприоритетные прерывания (выше configMAX_SYSCALL_INTERRUPT_PRIORITY) для аппаратуры. Ну типа, если нельзя, но очень хочется, то можно? Чем продиктовано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lmaks 0 2 марта, 2015 Опубликовано 2 марта, 2015 · Жалоба Ну типа, если нельзя, но очень хочется, то можно? Чем продиктовано? Зачем же кто-то придумывал критические секции и мьютексы всякие. Зачем себе грабли подкладывать. Нашел варитант. В ExtI прерываниях есть возможность активизации их программно. EXTI_GenerateSWInterrupt(EXTI_Line22); В теле прерывания необходимо проверить флаг программного прерывания if(EXTI->SWIER & EXTI_Line22) К примеру линия 22 подключена на RTC - то же не проблема. RTC проверяет свои флаги if(RTC_GetITStatus(RTC_IT_WUT) != RESET) Аккуратно надо только сбрасывать Pending бит. EXTI_ClearITPendingBit(EXTI_Line22); (т.е. сначала надо проверять программное прерывание, а потом RTC.) иначе сброс бита в RTC - сбросит и бит программного прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 5 марта, 2015 Опубликовано 5 марта, 2015 · Жалоба А нельзя планку configMAX_SYSCALL_INTERRUPT_PRIORITY поднять? Или все прерывания опустить ниже configMAX_SYSCALL_INTERRUPT_PRIORITY? Не те, что требуют после приема активировать задачу, а вообще все. были прерывания с приоритетами 1,2,4,13,15..... станнут 10, 11, 12, 13,15 (ну или 1,2,4,5, 6 порядок приоритетов другой, не помню с ходу). При этом приоритет не поменяется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LightElf 0 7 марта, 2015 Опубликовано 7 марта, 2015 · Жалоба Остались только кривые мысли типа активировать какой-нибудь таймер на минимуме - чтобы тот выдал прерывание уже с приоритетом ниже configMAX_SYSCALL_INTERRUPT_PRIORITY и далее уже активировать семафор задачи. Думал даже задействовать ножку под EXT interrupt - но они все уже заняты. Какой процессор/ядро? У кортексов через NVIC можно программно вызвать любое прерывание. Я такое делал, использовал незадействованный вектор в таблице прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_3m 9 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба В 07.03.2015 в 09:22, LightElf сказал: Какой процессор/ядро? У кортексов через NVIC можно программно вызвать любое прерывание. Я такое делал, использовал незадействованный вектор в таблице прерываний. Подниму тему. Возникла точно такая же задача. (опустить приоритет ниже configMAX_SYSCALL_INTERRUPT_PRIORITY НЕ ПРЕДЛАГАТЬ!) Более красивого решения чем задействовать неиспользуемый вектор так и не найдено ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба Насколько быстро надо обработать? Ну раз нельзя приоритеты перестраивать, то можно активировать IdleHook(), в нем смотреть некий глобальный volatile-флажок, который будет подниматься в нужном быстром прерывании. Как только поднялся - сбрасываем и активируем задачу уже средствами RTOS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба On 3/2/2015 at 4:29 AM, lmaks said: SV CALL - но оно уже используется системой Оно используется однажды при запуске планировщика. Далее оно, насколько я знаю, не используется. В любом случае, SVC прерывание может принимать аргументы при вызове. Может быть Вам это поможет? On 3/2/2015 at 4:29 AM, lmaks said: Думал даже задействовать ножку под EXT interrupt - но они все уже заняты. Через контроллер прерываний NVIC Вы можете программно инициировать любой! обработчик прерывания. Естественно, делать это нужно (в общем случае) для свободного, незанятого вектора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба 3 минуты назад, haker_fox сказал: Оно используется однажды при запуске планировщика. Далее оно, насколько я знаю, не используется. С SVC надо быть весьма осторожным, если текущий приоритет выполнения > приоритета SVC, то получим HF. А у вопрошающего явное желание задрать приоритеты каких-то прерываний в наивысшие. P.S. На самом деле вариант с фиктивным программным прерыванием (любым) не так уж плох. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба Высокоприоритетные прерывания выше приоритета API RTOS призваны работать как не-RTOS функционал. Поэтому, задача, которая инициирует возможность таких прерываний, и должна работать с ними. Поэтому, задача инициирующая обмен данными, должна быть активной в течение времени ожидания результатов и иметь наивысший системный приоритет исполнения. После получения результатов, эта задача запускает задачу обработки результатов и понижает свой собственный системный приоритет исполнения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба 13 минут назад, EdgeAligned сказал: После получения результатов, эта задача запускает задачу обработки результатов и понижает свой собственный системный приоритет исполнения. По крайней мере, если это тормозной FreeRTOS, то там еще вечность может пройти между выдачей семафора и снятием его задачей. Даже при явном запросе на решедулинг на выходе из прерывания. Думаю, плюс минус будет так же, как выше озвученные способы в среднем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба Нет, не обязательно семафор, можно через vTaskResume(). Или же, согласно идеологии RTOS, полученные данные дожны передаваться в другую задачу именно через очередь, а задача и будет разблокирована при непустой очереди. Тормознуто? Но такова концепция RTOS - псевдопараллельное исполнение задач ценой накладных расходов. И грамотное построение взаимодействия в рамках RTOS - это отдельное искусство, так сказать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба 7 hours ago, Arlleex said: если это тормозной FreeRTOS Почему это он тормозной? Какая альтернатива?😀 On 3/2/2015 at 4:29 AM, lmaks said: Однако после завершения приема данных (несколько прерываний) требуется активировать задачу обработки. Мне подумалось, а насколько быстро нужно разбудить задачу после готовности данных? Всё может свестись к банальному опросу volatile-флага поллингом этой же задачей. Да, знаю, что поллинг и ОСРВ - обычно вещи несовместимые. Но иногда так приходится делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 25 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба Сделать еще одно программное прерывание в котором уже вызывать FromISR функции это правильное и быстрое решение. Если RTOS находится в критической секции в момент выполнения приоритетного прерывания, то программное прерывание поставится в очередь до выхода из критической секции. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба 5 часов назад, haker_fox сказал: Почему это он тормозной? Какая альтернатива? Средства синхронизации в нем написаны примитивно "в лоб" без какой-то оптимизации, а соотв. (весьма длинные) функции оборачиваются в критические секции практически со входа до выхода. Ну и всякие другие моменты, связанные с универсальностью ОС - например, поиск задач, готовых к выполнению - через проход по спискам, когда на том же Cortex-M есть замечательная аппаратная однотактная CLZ. Итого, вместо одного такта на принятие решения о следующей выполняемой задаче получаем (вставьте любое большое кол-во) тактов на пробег по спискам задач и т.д. То же самое касается и постановки задачи на ожидание/готовность - один такт против вороха. Альтернативы - если прямо нужны - всегда найдутся uCOS, например. Хотя и там все не совсем радужно местами. Универсальные ОС == тормозные, но они хороши для академического изучения и там, где юзеру вполне хватает. P.S. Именно поэтому я из средств ОС пользуюсь малой частью того, что там наделали на текущий момент. Семафоры да рекурсивные мьютексы (редко). Всякие очереди - всегда свои, типа точка-точка, ибо лично мне в разработке мало пригождались широкодоступные (всем задачам) очереди, блокирующие прерывания. К тому же, очереди типа точка-многоточка (один писатель - много читателей) тоже можно реализовать без запрета прерываний. Все остальные вариации упрощаются применением GetKeeperTask(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться