Jump to content

    

pvPortMalloc

Можно ли вызывать pvPortMalloc/vPortFree внутри irq-прерывании?

Попытался и получил, что после его вызова в прерывании разрешается irq-прерывание в CPSR со всеми вытекающими печальными последствиями.

Данное прерывание проходит как обычно через сохранение/восстановление контекста задач.

Не нашел в документации, что pvPortMalloc нельзя вызывать из прерываний, или я что-то пропустил?

Edited by M0HAX

Share this post


Link to post
Share on other sites

А нельзя ли реализовать алгоритм работы например так?

1 - из прерывания отсылается сообщение задаче.

2 - задача, ожидающая это сообщение уже выделяет память.

В функциях pvPortMalloc/vPortFree используются функции vTaskSuspendAll() и xTaskResumeAll(), последняя разрешает прерывания, я думаю из-за этого могут возникнуть непредвиденные глюки.

Edited by aba

Share this post


Link to post
Share on other sites
vTaskSuspendAll() и xTaskResumeAll(), последняя разрешает прерывания, я думаю из-за этого могут возникнуть непредвиденные глюки.
Эти функции предназначены для врЕменной становки и последующего запуска планировщика задач соответственно. Запрещает прерывания макрос portEnterCritical(), разрешает - portExitCritical().

А идея по организации процесса правильная.

Share this post


Link to post
Share on other sites

Согласен, что так лучше - не надо будет в прерывании долго сидеть. Но если сделать внутри прерывания перед вызовом pvPortMalloc/vPortFree операцию

taskENTER_CRITICAL()

, а после вызова pvPortMalloc/vPortFree

if (ulCriticalNesting) ulCriticalNesting--;

, то все работает и внутри прерывания. Но это изврат, не спорю.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this