Как перезапустить задачи в FreeRTOS?

Я создаю 2 задачи, которые потребляют некоторое количество оперативной памяти, и когда они заканчивают делать то, что должны, мне нужно автоматически перезапустить их, возможно ли это сделать? Я прочитал много статей и до сих пор не нашел ответ, пожалуйста, помогите.

0

Решение

Как расходуется оперативная память. Если это из кучи FreeRTOS затем вам нужно будет вручную освободить кучу оперативной памяти перед перезапуском или удалением задач.

Когда вы говорите «перезапустить» задачу, что именно вы имеете в виду?

1) Удалить задачу и создать ее заново? Если это так, то вы можете использовать функции API vTaskDelete () и xTaskCreateStatic. Тем не менее, хотя люди часто хотят это делать, они редко НУЖДАЮТСЯ в этом — гораздо лучше оставить ту же задачу и структурировать задачу так, чтобы она могла вернуться к началу своей реализации. а не быть воссозданным.

2) В соответствии со второй половиной пункта (1) выше, если вы просто имеете в виду, что задача начинается с начала ее реализации снова, вы можете просто поместить задачу в цикл, который, когда вы достигнете нижней части цикла, вы вернитесь наверх и дождитесь сигнала, чтобы начать снова.

Если вам абсолютно необходимо удалить задачу, затем автоматически перезапустить ее снова, затем создать функцию, которая создает задачу, а затем использовать xTimerPendFunctionCall () Функция API для ожидания функции непосредственно перед тем, как задача удаляет себя [путем вызова vTaskDelete (NULL)].

1

Другие решения

Обычно U не должен перезапускать задачи. Это не очень хорошая идея. Лучше запустить их в бесконечный цикл. Создавайте с минимальным размером стека, выделяйте и освобождайте память во время работы.

void* create_taskX()
{
xTaskCreate( ..., configMINIMAL_STACK_SIZE, ...);
}

void taskX(void*arg)
{
// Do not create big variables on stack to prevent overflow
while(1)
{
void *resource = malloc(resource_size);  // Allocate resources before job
// Do the work. Repeat with delay
free(resource); // Free resources after job
vTaskDelay(timeout_ticks);
// or xSemaphoreTake();  // Wait for event from another task or interrupt
// There are many other ways to block task, make it wait some event
}
}

Когда вы создаете задачу
Хорошее освобождение памяти (бесплатно) реализовано в heap_4.c а также heap_5.c, Или использовать heap_3.c перенаправить FreeRTOS malloc а также free к функциям STL. Не используйте кучи 1 и 2, если вы хотите часто использовать malloc / free или воссоздавать задачи.

Вы также можете создать мьютекс, чтобы блокировать задачу 1, пока задача 2 работает, и наоборот. Это позволит использовать память одной задачей за раз.

И в конце. Ваш вопрос очень общий. Ответ тоже. Будь конкретным. Опиши подробнее.

1

По вопросам рекламы [email protected]