FreeRtos xTaskCreate

Başlatan mr.engineer, 18 Haziran 2020, 21:22:23

mr.engineer

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
uint16_t usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask );


Merhaba,

Yukarıda paylaştığım xTaskCreate fonksiyonu ile ilgili bir problemim var. usStackDepth parametresi ile ilgili sorun yaşadım.
Yaptığım bir uygulamada iki task varken bu parametreyi her task için 300 ayarlamıştım ve sorunsuz çalışmıştı. Üçüncü bir task ekleyince sorun çıktı, sorunun buradan çıktığıyla ilgili bir uyarı almadım fakat bu değeri düşürünce doğru çalışmaya başladı. Kullandığım MCU 16 Kbyte RAM'e sahip ve cihaz 32 bitlik.

Task'ın stack boyutu için verilen hesap 300*4=1200 byte. (Doğru anladıysam 32 bir işlemci için böyle olacak)
3 adet task için 3600 byte yere ihtiyaç var. RAM boyutunun çok altında. Neden çalışmıyor acaba?

FreeRtos için bu parametre nasıl ayarlanıyor birkaç yerde kompleks deyip geçmişler.

Tagli

FreeRTOSConfig.h dosyası içinde TOTAL_HEAP_SIZE diye bir parametre var. İşletim sisteminin kullandığı tüm yer açmalar bu alan içinde gerçekleşiyor (statik bellek yönetimi kullanılmıyorsa). Bu bölge de zaten bellekte statik boş bir dizi olarak oluşuyor sanırım. Yani bu değeri arttırıp derleme yaparsan RAM kullanımı artıyor gibi gözükecektir ama aslında RTOS'a ayırdığın yer artmış olacak.

Task'lere ne kadar alan ayırmak gerektiğini belirlemek gerçekten de zor olabilir. Nasıl yapıldığını ben de bilmiyorum. Ama sanki watermark diye bir özellik vardı, çalışma anında kullanılan azami bellek miktarını kaydediyordu. Bu değere göre birkaç deneme yanılmadan sonra task'lere ihtiyaç duydukları kadar bellek atamak mümkün olabilir belki.
Gökçe Tağlıoğlu

MrDarK

Debug esnasında taskların ne kadar stack derinliği kullandığını gözlemleyebilirsin.
Picproje Eğitim Gönüllüleri ~ MrDarK

mr.engineer

Teşekkürler hocam dediğiniz gibi TOTAL_HEAP_SIZE bende 3072 olarak ayarlanmış. Ben burayı düşünmemiştim.

uxTaskGetStackHighWaterMark böyle bir fonksiyon buldum. Kullanılmayan stack boyutunu veriyor. Task alanını bununla ayarlarız o zaman zor bir tarafı yokmuş.

mr.engineer

Alıntı yapılan: MrDarK - 18 Haziran 2020, 23:45:59Debug esnasında taskların ne kadar stack derinliği kullandığını gözlemleyebilirsin.

Teşekkürler buradan bakmamıştım buna da bakayım.

volkanunal

Ek olarak şurada bazı hooklar tanımlı, config.h üzerinden set edilerek bazı hookları aktif edebilirsiniz.

Bende şu şekilde bir olay olmuştu, mallocfailed veriyormuş fakat farkında değildim. Çok tecrübe değilim konu ilgili.

Daha sonra configUSE_MALLOC_FAILED_HOOK set ettiğimde anlamıştım. Fonksiyonlar extern olarak tanımlı olduğu için kendiniz fonksiyonu yazmanız gerekiyor.

https://www.freertos.org/a00016.html
Primum nil nocere