04 Ağustos 2020, 08:08:02
► FreeRtos xTaskCreate
Başlatan mr.engineer, 19 Haziran 2020, 00:22:23
19 Haziran 2020, 00:22:23
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.
Ynt: FreeRtos xTaskCreate
19 Haziran 2020, 02:25:06 #1
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.
19 Haziran 2020, 02:45:59 #2
Debug esnasında taskların ne kadar stack derinliği kullandığını gözlemleyebilirsin.
19 Haziran 2020, 02:53:56 #3
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ş.
19 Haziran 2020, 03:02:00 #4
Alıntı yapılan: MrDarK - 19 Haziran 2020, 02:45:59 Debug esnasında taskların ne kadar stack derinliği kullandığını gözlemleyebilirsin.
Teşekkürler buradan bakmamıştım buna da bakayım.
19 Haziran 2020, 20:05:25 #5
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.