2016-08-21 2 views

답변

1

RAM 소비량은 어떻게됩니까? from the FreeRTOS heap 인 경우 작업을 다시 시작하거나 삭제하기 전에 힙 RAM을 수동으로 해제해야합니다.

"다시 시작"이라고 말하면 정확히 무엇을 의미합니까?

1) 작업을 삭제 한 다음 다시 만드시겠습니까? 그렇다면 vTaskDelete() 및 xTaskCreateStatic API 함수를 사용할 수 있습니다. 그러나 사람들이이 작업을 수행하는 것이 일반적이지만, 사람들이 실제로이 작업을 수행해야하는 경우는 드뭅니다. 동일한 작업을 유지하고 구현 작업의 최상위로 되돌아 갈 수 있도록 작업을 구성하는 것이 훨씬 좋습니다 오히려 다시 만들어지기보다는.

2) 위의 (1) 지점의 두 번째 절반에 따라 작업의 시작부터 작업을 다시 시작한다는 뜻인 경우 다시 작업을 루프에 배치 할 수 있습니다. 루프, 당신은 정상으로 돌아가 신호가 다시 시작하기를 기다립니다.

절대적으로 작업을 삭제해야하는 경우 다시 자동으로 다시 시작한 다음 작업을 만드는 함수를 만든 다음 xTimerPendFunctionCall() API 함수를 사용하여 작업이 [vTaskDelete (NULL)을 호출하여] 삭제하기 직전에 함수를 보류합니다.

1

일반적으로 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.cheap_5.c 구현 작업 좋은 메모리 해제 (무료)을 생성합니다. 또는 heap_3.c을 사용하여 FreeRTOS mallocfree을 STL 기능으로 리디렉션하십시오. malloc/free를 자주 사용하거나 작업을 다시 만들고 싶다면 힙 1과 2를 사용하지 마십시오.

또한 task2가 작동하는 동안 mutex를 생성하여 task1을 차단할 수 있습니다. 그러면 한 번에 하나의 작업으로 메모리를 사용할 수 있습니다.

그리고 결국. 질문은 매우 일반적입니다. 대답은 너무. 콘크리트로. 자세한 내용을 설명하십시오.