2014-12-26 5 views
5

FreeRTOS를 배우기 시작했습니다. 그냥 지금은이 코드를 사용하여 인쇄 작업 기능을 만들려고 노력하고 있어요 :freertos vTaskDelete (NULL) 사용 가능한 메모리가 없습니다.

static void vTaskPrint(void *pvParameters) { 
    taskENTER_CRITICAL(); 
    printf("%s", (char *)pvParameters); 
    printf("xPortGetFreeHeapSize: %d\r\n", xPortGetFreeHeapSize()); 
    taskEXIT_CRITICAL(); 
    vTaskDelete(NULL); 
} 

그러나 14 호출 후 :

xTaskCreate(vTaskPrint, (char *)"vTaskPrint", configMINIMAL_STACK_SIZE, (void *)buffer, 3, (xTaskHandle *)NULL); 

M3 메모리가 부족 피질 :

************** TEST GPIO & LEDS FREERTOS OPEN103Z EVB ************** 
vTaskLeds 
xPortGetFreeHeapSize: 7832 
vTaskReadKeys 
xPortGetFreeHeapSize: 7232 
[INFO] vTaskPrint created successful 
Key pressed RIGHT 
xPortGetFreeHeapSize: 6632 
[INFO] vTaskPrint created successful 
Key pressed CENTER KEY 
xPortGetFreeHeapSize: 6032 
[INFO] vTaskPrint created successful 
Key pressed RIGHT 
xPortGetFreeHeapSize: 5432 
[INFO] vTaskPrint created successful 
Key pressed LEFT 
xPortGetFreeHeapSize: 4832 
[INFO] vTaskPrint created successful 
Key pressed RIGHT 
xPortGetFreeHeapSize: 4232 
[INFO] vTaskPrint created successful 
Key pressed LEFT 
xPortGetFreeHeapSize: 3632 
[INFO] vTaskPrint created successful 
Key pressed RIGHT 
xPortGetFreeHeapSize: 3032 
[INFO] vTaskPrint created successful 
Key pressed LEFT 
xPortGetFreeHeapSize: 2432 
[INFO] vTaskPrint created successful 
Key pressed RIGHT 
xPortGetFreeHeapSize: 1832 
[INFO] vTaskPrint created successful 
Key pressed LEFT 
xPortGetFreeHeapSize: 1232 
[INFO] vTaskPrint created successful 
Key pressed RIGHT 
xPortGetFreeHeapSize: 632 
[INFO] vTaskPrint created successful 
Key pressed LEFT 
xPortGetFreeHeapSize: 32 
[INFO] vTaskPrint created successful 
[ERROR] vTaskPrint not created successful 

어떻게 메모리를 비울 수 있습니까?

답변

4

작업에서 삭제하면 작업에 할당 된 메모리가 유휴 작업에서 해제됩니다. 따라서 유휴 작업을 어느 시점에서 실행해야합니다. 이것은 여러분이 호출하는 함수에 대한 문서에 분명하게 명시되어 있습니다 : http://www.freertos.org/a00126.html

대부분의 응용 프로그램에서 유휴 작업은 가장 많이 실행되는 작업이므로 테스트는 다소 인공적입니다.

제쳐두고 : 중요한 섹션에서 printf와 같은 긴 함수를 호출하는 것은 좋은 생각이 아니며 중요한 섹션에서 xPortGetFreeHeapSize()를 호출하여 FreeRTOS API 사용 규칙을 위반하고있는 것입니다 (물론 이 경우에 빠져 나가십시오. 일반적으로, 중요한 섹션에서 RTOS API 함수를 호출하지 않거나 스케줄러가 잠겨있을 때입니다. http://www.freertos.org/FAQHelp.html

많은 사람들이 FreeRTOS 웹 사이트에서 무료로 사용할 수 있도록 FreeRTOS 전문가가 대기하는 전용 지원 포럼에 더하여 많은 정보가 있습니다. 따라서 FreeRTOS에 대한 질문은 어디에서나 할 수 있습니다. 그밖에.

+0

죄송합니다. 괴롭혔다면 freertos.org에서 포럼의 존재를 알 수 없었습니다. 배우려고하는 작은 예제를 프로그래밍하고 있습니다. 그것은 xPortGetFreeHeapSize() 함수의 프린트를 만드는 더 정중 한 방법 일지는 중요하지 않지만 그 문제를 발견하는 데 도움이됩니다. 메모리가 부족합니다 ... vApplicationIdleHook (void) function하지만 우선 순위에 오류가 있습니다. 이제 모든 것이 잘 작동합니다. 정말 고마워요. – oscargomezf

관련 문제