Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Активировать задачу из не системного прерывания
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
lmaks
Использую высокоприоритетные прерывания (выше configMAX_SYSCALL_INTERRUPT_PRIORITY) для аппаратуры. Однако после завершения приема данных (несколько прерываний) требуется активировать задачу обработки.
Из высокоприоритетных прерываний нельзя пользоваться системными API (fromISR). Есть какие-нибудь мысли как это сделать красиво. Думал побаловаться с программным прерыванием SV CALL - но оно уже используется системой. Остались только кривые мысли типа активировать какой-нибудь таймер на минимуме - чтобы тот выдал прерывание уже с приоритетом ниже configMAX_SYSCALL_INTERRUPT_PRIORITY и далее уже активировать семафор задачи. Думал даже задействовать ножку под EXT interrupt - но они все уже заняты.
seniorandre
Цитата(lmaks @ Mar 1 2015, 23:29) *
Использую высокоприоритетные прерывания (выше configMAX_SYSCALL_INTERRUPT_PRIORITY) для аппаратуры.

Ну типа, если нельзя, но очень хочется, то можно? Чем продиктовано?
lmaks
Цитата(seniorandre @ Mar 2 2015, 00:52) *
Ну типа, если нельзя, но очень хочется, то можно? Чем продиктовано?

Зачем же кто-то придумывал критические секции и мьютексы всякие. Зачем себе грабли подкладывать.
Нашел варитант. В 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
А нельзя планку configMAX_SYSCALL_INTERRUPT_PRIORITY поднять? Или все прерывания опустить ниже configMAX_SYSCALL_INTERRUPT_PRIORITY? Не те, что требуют после приема активировать задачу, а вообще все. были прерывания с приоритетами 1,2,4,13,15..... станнут 10, 11, 12, 13,15 (ну или 1,2,4,5, 6 порядок приоритетов другой, не помню с ходу). При этом приоритет не поменяется.
LightElf
QUOTE (lmaks @ Mar 2 2015, 00:29) *
Остались только кривые мысли типа активировать какой-нибудь таймер на минимуме - чтобы тот выдал прерывание уже с приоритетом ниже configMAX_SYSCALL_INTERRUPT_PRIORITY и далее уже активировать семафор задачи. Думал даже задействовать ножку под EXT interrupt - но они все уже заняты.

Какой процессор/ядро? У кортексов через NVIC можно программно вызвать любое прерывание. Я такое делал, использовал незадействованный вектор в таблице прерываний.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.