2014-12-26 21 views
5

FreeRTOS'u öğrenmeye başladım. Sadece şimdi ben bu kodla bir yazdırma görevi işlevini yapmaya çalışıyorum:freertos vTaskDelete (NULL) boş bellek yok

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

Ama 14 çağrıları sonra:

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

M3 bellek tükendi korteks:

************** 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 

Hafızayı nasıl alabilirim?

cevap

4

Görev sırasında sildiğinizde, göreve atanan bellek Boşta olan görevden kurtarılır. Bu nedenle boştaki görevin belli bir noktada çalışmasına izin vermelisiniz. Bu, çağıran işlevin belgelerinde açıkça belirtilmiştir: http://www.freertos.org/a00126.html

Çoğu uygulamada, boşta kalan görev en çok çalışan görev olacaktır, bu nedenle testiniz biraz yapaydır.

Bir kenara göre: Kritik bir bölümden printf gibi uzun işlevleri çağırmak gerçekten iyi bir fikir değildir ve önemli bir bölümden xPortGetFreeHeapSize() yöntemini çağırarak FreeRTOS API kullanım kurallarını ihlal ediyorsunuz (muhtemelen Bu durumda, başparmağın genel kuralı, kritik bir bölümden veya programlayıcı kilitlendiğinde RTOS API işlevlerini çağırmamaktır). Bu sayfayı kapsayan SSS sayfası: http://www.freertos.org/FAQHelp.html

FreeRTOS web sitesindeki ücretsiz kullanımınız için hazır bekleyen FreeRTOS uzmanları ile özel bir destek forumu ve çok sayıda bilgi var. Bu yüzden, insanların neden her yerden FreeRTOS'a sorular sorduğunu asla anlayamıyorum Başka.

+0

Üzgünüm Eğer seni rahatsız ettiysem ama forumun varlığını freertos.org adresinden bilmiyordum. Öğrenmeye çalışmak için çok az örnek programlıyorum. Bunun için xPortGetFreeHeapSize() işlevini yazdırmak için daha kibar bir yol olup olmadığını sorun değil, ancak sorunu bulmak için bana yardımcı: Bellek yetersiz çalışıyordu ... Kullanmaya çalışacağız vApplicationIdleHook (void) işlevi ancak öncelikleriyle bir hata yaptım. Şimdi her şey iyi çalışıyor. Çok teşekkür ederim. – oscargomezf

İlgili konular