Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: pvPortMalloc
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
M0HAX
Можно ли вызывать pvPortMalloc/vPortFree внутри irq-прерывании?
Попытался и получил, что после его вызова в прерывании разрешается irq-прерывание в CPSR со всеми вытекающими печальными последствиями.
Данное прерывание проходит как обычно через сохранение/восстановление контекста задач.
Не нашел в документации, что pvPortMalloc нельзя вызывать из прерываний, или я что-то пропустил?
aba
А нельзя ли реализовать алгоритм работы например так?
1 - из прерывания отсылается сообщение задаче.
2 - задача, ожидающая это сообщение уже выделяет память.
В функциях pvPortMalloc/vPortFree используются функции vTaskSuspendAll() и xTaskResumeAll(), последняя разрешает прерывания, я думаю из-за этого могут возникнуть непредвиденные глюки.
BSV
Цитата(aba @ Nov 11 2011, 19:57) *
vTaskSuspendAll() и xTaskResumeAll(), последняя разрешает прерывания, я думаю из-за этого могут возникнуть непредвиденные глюки.
Эти функции предназначены для врЕменной становки и последующего запуска планировщика задач соответственно. Запрещает прерывания макрос portEnterCritical(), разрешает - portExitCritical().
А идея по организации процесса правильная.
M0HAX
Согласен, что так лучше - не надо будет в прерывании долго сидеть. Но если сделать внутри прерывания перед вызовом pvPortMalloc/vPortFree операцию
Код
taskENTER_CRITICAL()
, а после вызова pvPortMalloc/vPortFree
Код
if (ulCriticalNesting) ulCriticalNesting--;
, то все работает и внутри прерывания. Но это изврат, не спорю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.