2016-08-21 209 views

回答

1

RAM是如何消耗的。如果是from the FreeRTOS heap,那麼在重新啓動或刪除任務之前,您需要手動釋放堆RAM。

當你說「重新啓動」任務時,你究竟是什麼意思?

1)刪除任務,然後再次創建它?如果是這樣,那麼你可以使用vTaskDelete()和xTaskCreateStatic API函數。然而,雖然人們很想做到這一點很常見,但實際上人們很少需要這樣做 - 更好地保持相同的任務並使任務結構化,以便可以循環回到其實施的頂部而不是重新創建。

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.cheap_5.c執行任務 良好的內存釋放(免費)。或使用heap_3.c將FreeRTOS mallocfree重定向到STL功能。如果要經常使用malloc/free或重新創建任務,請勿使用堆1和2。

您也可以在task2工作時創建互斥體來阻止task1,反之亦然。這將允許當時通過一項任務使用內存。

最後。你的問題很一般。答案也是如此。具體一點。描述更多細節。