Anlamlandıramadığım while() problemi

yucatar

Üye
Katılım
23 Ekim 2024
Mesajlar
20
Nuvoton işlemciler ile projeler yapmak için bir tane geliştirme kartı satın aldım. Freertos ekli örnek yazılımı kendime göre değiştirdim ve üzerinde denemeler yapıyorum işlemci while döngüsününden önceki işlemleri 1 kez yapıyor ve sonra bir daha yapmıyor, diğer task çalışmaya devam ediyor yani işlemci donmuyor.

İşlemci: M031SE3AE
Derleyici: KEIL
FreeRTOS versiyonu: V10.4.3
Not: MotorCounter değeri 10ms'lik bir timer ile azaltılıyor ve debug yaptığımda 0 olduğunu görebiliyorum.
*(Güncelleme)While içindeki normalde MotorPosition değil MotorCounter du buraya atarken yanlış yazmışım
Kod:
/*İşlemcinin takıldığı while döngüsü*/
Stepper.MotorDirection=0;
Stepper.MotorCounter=30;
while(Stepper.MotorCounter>0);

ama yazılımı aşağıdaki gibi 2 şekilde de yazınca sorun olmuyor.
Kod:
/*Bu şekilde çalışıyor*/
Stepper.MotorDirection=0;
Stepper.MotorCounter=30;
while(Stepper.MotorCounter>0){vTaskDelay(pdMS_TO_TICKS(1));};

F14 pinine lojik 1 uygulayınca işlemi tekrarlıyor
Kod:
/*Bu şekilde çalışıyor*/
Stepper.MotorDirection=0;
Stepper.MotorCounter=30;
while(!PF14);

Diğer task içindeki görev
Kod:
PB14=1;
vTaskDelay(pdMS_TO_TICKS(1000));
PB14=0;
vTaskDelay(pdMS_TO_TICKS(1000));
 
Son düzenleme:
Varsayılan ayarlarda bir FreeRTOS taskı, işlemciden feragat etmedikçe, veya daha yüksek öncelikli bir task olmadıkça çalışmaya devam eder. Eğer işlemcinin eşit öncelikli tasklar arasında peryodik olarak paylaşılmasını istiyorsan, configUSE_TIME_SLICING macrosunu 1 yapman lazım.

Ama genel tasarım olarak, bir taskın böyle sürekli olarak bir pini poll etmemesi lazım. Onun yerine bir timer tanımlayıp mesela 1 ms de bir ilgili pini test edersen işlemciyi daha verimli kullanmış olursun.
 
Varsayılan ayarlarda bir FreeRTOS taskı, işlemciden feragat etmedikçe, veya daha yüksek öncelikli bir task olmadıkça çalışmaya devam eder. Eğer işlemcinin eşit öncelikli tasklar arasında peryodik olarak paylaşılmasını istiyorsan, configUSE_TIME_SLICING macrosunu 1 yapman lazım.
Bu makro 1 olarak ayarlı.
Ama genel tasarım olarak, bir taskın böyle sürekli olarak bir pini poll etmemesi lazım. Onun yerine bir timer tanımlayıp mesela 1 ms de bir ilgili pini test edersen işlemciyi daha verimli kullanmış olursun.
İlk eklediğim while döngüsü çalışmayınca pini oraya deneme amaçlı ekledim.
St ile yaptığım bir projeye baktım ondada benzer while ile bekleme var ama onda şart sağlanmadığı zaman while döngüsünden çıkıyor ve devam ediyor.
Garip bir durum neyden kaynaklığını anlayamadım.
 
Tamam. O zaman sorun derleyicinin optimizasyon sonucu while döngüsünü tamamen kaldırması olabilir. Test edilen değişkenin hiçbir yerde değiştirilmediğini görüp while'ı tamamen kaldırıyor olabilir. Ama PF14 ü kaldıramaz çünkü o volatile olarak tanımlıdır.
 
Tamam. O zaman sorun derleyicinin optimizasyon sonucu while döngüsünü tamamen kaldırması olabilir. Test edilen değişkenin hiçbir yerde değiştirilmediğini görüp while'ı tamamen kaldırıyor olabilir. Ama PF14 ü kaldıramaz çünkü o volatile olarak tanımlıdır.
Değişkenimi volatile olarak tanımlayınca düzeldi. Hocam çok teşekkür ederim:tamam1
 
Optimizasyonları kapatmış oluyorsun -O0 ile. Bu durumda kod aynen derleniyor. Debug ederken de her zaman -O0 yapmayı unutma, yoksa adım adım giderken çok kafa karıştırır.
 

Forum istatistikleri

Konular
7,545
Mesajlar
126,376
Üyeler
3,059
Son üye
fb88gay

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
Back
Top