몇 가지 RAM을 소비하는 2 가지 작업을 만들고, 수행해야 할 작업이 완료되면 자동으로 다시 시작해야합니다. 그렇게 할 수도 있습니까? 나는 많은 기사를 읽었으며 여전히 답을 찾지 못했습니다. 제발 도와주세요.FreeRTOS에서 작업을 다시 시작하는 방법은 무엇입니까?
답변
RAM 소비량은 어떻게됩니까? from the FreeRTOS heap 인 경우 작업을 다시 시작하거나 삭제하기 전에 힙 RAM을 수동으로 해제해야합니다.
"다시 시작"이라고 말하면 정확히 무엇을 의미합니까?
1) 작업을 삭제 한 다음 다시 만드시겠습니까? 그렇다면 vTaskDelete() 및 xTaskCreateStatic API 함수를 사용할 수 있습니다. 그러나 사람들이이 작업을 수행하는 것이 일반적이지만, 사람들이 실제로이 작업을 수행해야하는 경우는 드뭅니다. 동일한 작업을 유지하고 구현 작업의 최상위로 되돌아 갈 수 있도록 작업을 구성하는 것이 훨씬 좋습니다 오히려 다시 만들어지기보다는.
2) 위의 (1) 지점의 두 번째 절반에 따라 작업의 시작부터 작업을 다시 시작한다는 뜻인 경우 다시 작업을 루프에 배치 할 수 있습니다. 루프, 당신은 정상으로 돌아가 신호가 다시 시작하기를 기다립니다.
절대적으로 작업을 삭제해야하는 경우 다시 자동으로 다시 시작한 다음 작업을 만드는 함수를 만든 다음 xTimerPendFunctionCall() API 함수를 사용하여 작업이 [vTaskDelete (NULL)을 호출하여] 삭제하기 직전에 함수를 보류합니다.
일반적으로 U는 작업을 다시 시작하면 안됩니다. 그건 좋은 생각이 아니야. 무한 루프에서 실행하십시오. 최소한의 stacksize로 생성하고 작업하는 동안 메모리를 할당하고 해제하십시오.
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 기능으로 리디렉션하십시오. malloc/free를 자주 사용하거나 작업을 다시 만들고 싶다면 힙 1과 2를 사용하지 마십시오.
또한 task2가 작동하는 동안 mutex를 생성하여 task1을 차단할 수 있습니다. 그러면 한 번에 하나의 작업으로 메모리를 사용할 수 있습니다.
그리고 결국. 질문은 매우 일반적입니다. 대답은 너무. 콘크리트로. 자세한 내용을 설명하십시오.
실제로 할 수 없습니다. –