Bir programda çalışma zamanı hatası varsa ne olur? Programın yürütülmesi duracak mı? Arduino'nun hatanın ne olduğunu söylemesini sağlamanın bir yolu var mı?
Bir programda çalışma zamanı hatası varsa ne olur? Programın yürütülmesi duracak mı? Arduino'nun hatanın ne olduğunu söylemesini sağlamanın bir yolu var mı?
Yanıtlar:
İlk olarak, neyin yanlış gidebileceğine dair birkaç örnek görelim.
void setup() {
int status;
pinMode(13, OUTPUT);
digitalWrite(13, status);
}
Yorumlarda Edgar Bonet tarafından belirtildiği gibi status
, yukarıdaki koddaki gibi yerel değişkenler C ++ derleyicisi tarafından örtük olarak başlatılmaz. Dolayısıyla, yukarıdaki kodun sonucu belirsizdir. Bundan kaçınmak için her zaman yerel değişkenlerinize değer atadığınızdan emin olun.
Küresel ve statik değişkenlerle işler biraz farklı:
Global ve statik değişkenlerin C standardı ile 0 olarak başlatılması garanti edilir.
Kaynak: AVR Libc Başvuru Kılavuzu - Sık Sorulan Sorular - Tüm değişkenlerimi başlatmamalı mıyım?
Bu, kodunuzda 0 olarak başlatma konusunda endişelenmemeniz gerektiği anlamına gelir. Başlangıçta bellek israfına neden olabileceğinden, aslında bundan kaçınmalısınız. Bunları yalnızca 0 dışındaki değerlere sıfırlayın.
int array[10];
int v = array[100];
array[-100] = 10;
Buradaki ilk sorun, v'ye neyin atanacağını bilmemenizdir, ancak daha da kötüsü, -100 konumunun atamasıyla ne karıştırdığınızı bilmemenizdir array
.
void doSomething( void ) {
for (int i = 0; i < 1000; i++);
}
void setup ()
{
void (*funcPtr)( void );
funcPtr = &doSomething;
funcPtr(); // calls doSomething();
funcPtr = NULL;
funcPtr(); // undefined behavior
}
İlk çağrı funcPtr()
aslında bir çağrı olacaktır doSomething()
. İkincisi gibi çağrılar tanımlanmamış davranışa yol açabilir.
Örneğin, RAM'iniz tükenebilir. Başka. Her durumda, programınızın çalışmaya devam edeceğini düşünüyorum, muhtemelen istediğiniz gibi değil.
Bilgisayar sistemlerinde, bunlar gibi sorunlar genellikle çeşitli düzeylerde ele alınır:
Arduino'ların sadece derleyici koruması sınırlıdır ve muhtemelen başka hiçbir şey yoktur. İyi haber, çok görevli olmamalarıdır, bu yüzden etkilenen tek program sizindir. Her durumda, bu hatalardan herhangi biri düzensiz davranışlara yol açacaktır.
Varsayımlar yukarıda bahsettiğim sorunların tümü çalışma zamanı sorunudur.
Bir programda çalışma zamanı hatası varsa ne olur?
Program devam edecek ve ne olacağı çalışma zamanı hatasının yan etkilerine bağlı olacaktır. Null fonksiyon işaretçisine yapılan bir çağrı muhtemelen programın bilinmeyen bir konuma atlamasını sağlayacaktır.
Programın yürütülmesi duracak mı?
Hayır, sanki olağanüstü bir şey olmamış gibi devam edecek, muhtemelen yapmayı istemediğiniz şeyi yapıyor olacak. Sıfırlanabilir veya düzensiz hareket edebilir. Bazı girişleri çıkışlara dönüştürebilir ve bir veya iki sensör yakabilir (ancak bu pek olası değildir ).
Arduino'nun hatanın ne olduğunu söylemesini sağlamanın bir yolu var mı?
Ben öyle düşünmüyorum. Daha önce söylediğim gibi, koruma mekanizmaları orada değil. Dilden çalışma zamanı desteği yok, işletim sistemi yok, sınır dışı bellek erişimi için donanım kontrolü yok (önyükleyici de sayılmaz). Programınıza dikkat etmeniz ve muhtemelen kendi güvenlik ağlarınızı ayarlamanız gerekir.
Koruma eksikliğinin nedeni muhtemelen Arduino denetleyicilerinin çok ucuz olması, çok az belleğe sahip olması ve çok önemli bir şey çalıştırmaması gerektiğidir (evet, AVR tarafından normalde kullanılan MCU'ları kullanmamanız için bir yerde bir feragat var gibi görünüyor. Yaşam destek sistemlerinde Arduino).
Çalışma zamanı istisnası yoktur. Yalnızca tanımlanmamış davranış var.
Gerçekten, hiçbir istisnası yoktur hiç . Geçersiz bir işlem gerçekleştirmeye çalışırsanız, sonuçları bilinmeyecektir.
Ne dışında hiç kontrol yok çalışma zamanı yoktur sen uygulamak. Programınız çıplak metal donanım üzerinde çalışıyor. Her zaman ring-0'da koşmanın Masaüstü eşdeğeri , çünkü ATmega'nın halkaları yok .
MCU'yu düzensiz durumdan alabilen bir mekanizma vardır ve bu gözlemci zamanlayıcıdır . Bir döngüde tekrar tekrar çalışacak, sabit bir süreden daha uzun sürmeyecek bir kod uyguluyorsanız, bu süreyi bekçi dönemi olarak ayarlayabilir ve zamanlayıcıyı etkinleştirebilirsiniz.
Ardından, döngüdeki zamanlayıcıyı tekrar tekrar sıfırlamanız gerekir. Kodunuz hiç bitmeyecek bir durum döngüsünde donarsa, gözlemci sıfıra kadar sayar ve sonunda MCU'yu sıfırlar.
Bu şekilde veri kaybedersiniz, ancak AVR WDT'yi kesme modunda çalıştırırsanız, MCU'yu sıfırlamadan önce bazı verileri saklayabilirsiniz.
Böylece bekçi zamanlayıcısı, kodunuzu zaman zaman istenmeyen sonsuz döngülerden koruyabilir.
Belgeler: AVR132: Geliştirilmiş Gözcü Zamanlayıcısını Kullanma
Böyle bir şey için bir donanım hata ayıklayıcısına ihtiyacınız olacak. Ancak genellikle programın beklediğiniz gibi davranmadığını görürsünüz ve sorunu tanımlamak için kodun bu bölümüne bakmanız gerekir.
Bunu yapmanın yaygın / hızlı / kolay bir yolu, değişkenlerin değerlerini veya sadece herhangi bir şeyi yazdırmak için yazdırma ifadeleri eklemektir, böylece program kodda o noktaya sorunsuz bir şekilde ulaşır. Bu, sorunu daha fazla izole etmenize yardımcı olacaktır.
VisualMicro'nun yerleşik bazı hata ayıklama işlevleri olduğuna inanıyorum .
AVR CPU'nun herhangi bir hata algılama veya kurtarma aracı olmadığını varsayarım. Sadece durabilir veya hatayı ve sonuçlarını görmezden gelebilir. Sachleen'in dediği gibi, programınıza bir işlemin ortasında çalışıp çalışmadığını test etmek için bazı hata ayıklama ifadeleri eklemelisiniz. Bir emulaor kullanır ve kesme noktaları ayarlarsanız, kolayca bir sorun bulabilirsiniz.
Arduino yeniden başlatılacak (yani yeniden başlatılacak setup()
ve loop()
).