Bir Arduino çiziminde nasıl hata ayıklayabilirim?


10

Arduino için kodlamaya çok yakın zamanda başladım. Koddaki bu hatalar beni öldürüyor. Arduino'da donanım hata ayıklayıcısı olmadığından serial.print () benim tek çarem. Arduino kodunda hata ayıklamak için uyguladığınız yöntemler / uygulamalar nelerdir?


lütfen playground.arduino.cc/Main/DevelopmentTools'a bir göz atın IDE ve hata ayıklayıcı araçları için araçlar
Dallo

Yanıtlar:


8

Modülerlik senin arkadaşın. Fonksiyonlarınızı basitleştirecek seviyeye kadar, fonksiyonları çağıran fonksiyonları çağırarak işinizi yapmak için ana döngünüzü yazın. Ana döngü ile başlayın ve bir sonraki seviye aşağı, saplama fonksiyonları yapın; boş:

function foo(){
    ;
}

veya sahte:

function read_temperature(){
    return(95);
}

, arama seviyesinin devam edebilmesi için gereken her şeyi döndürmekten başka bir şey yapmaz. Bu düzey çalıştığında, bir düzey aşağı gidin ve benzer şekilde saplama işlevlerini çağıran basit bir kod doldurmaya başlayın. Çalışan bir uygulamanız olana kadar bir seferde bir işlevi yavaş yavaş iptal edin.

Hatalı bir değer döndüren bir işlevde hata ayıklamak veya uygulamanızın geri kalanından herhangi bir etki yaratmadan bir işlev oluşturmak için, iskele oluşturabilirsiniz - işlevi yalnızca bazı örnek değerleri besleyen basit bir çizim ve işlev içinde parametre değerleri yazdırın ve fonksiyonun hangi kısmının başarısız olduğuna dair fikir edene kadar bazı ara değerler. Hatta bir değer geri dönmek için terminalde beni yönlendiren sahte işlevler bile yaptım. (Açıkçası bu teknik sadece sistem insanların nispeten buzul hızını tolere edebiliyorsa işe yarayabilir! İskele için başka bir kullanım.)

Stubbing özellikle donanıma arayüz fonksiyonları için ayakta durmak için iyi çalışır, veri sayfalarına, zamanlama sorunlarına ve aksi takdirde durabilecek diğer minutialara (örneğin, parçalara sahip olmama!) Senin ilerlemen.

Zamanlama sorunlarından bahsetmek, bir çıkış pinini programınızdaki bir ISR'ye giriş ve bir ISR'den çıkmak gibi değiştirmek, size Arduino pininde frekansı veya görev döngüsü size dahili zamanlama hakkında bir fikir verebilecek kare bir dalga verir. program. Doğrudan bağlantı noktası I / O formu, ör.

PORTC ^= 0x01;

, zamanlamayı aramadan daha az bozar digitalWrite(). Kullanışlı bir kapsamınız veya frekans ve / veya görev döngüsünü ölçme yeteneğine sahip DMM'lerden biri varsa kullanışlıdır.

Benzer şekilde, zamanlamayı fazla bozmadan veya seri I / O işlevleriyle kodu şişirmeden programınızın içinden ölçüm cihazınıza sayısal bir değer çıkarmak için bir analog çıkış pini kullanabilirsiniz. Doğrudan I / O formlarını da burada kullanın.


6

Serial.print () kullanıyorum ve LED'leri yanıp sönüyor.

Yapabileceğiniz hemen hemen hepsi bu.

Ayrıca, kodun okunabilir ve anlaşılması kolay olduğundan emin olun. Olayları basit adımlara ayırın ve her adım için işlevler oluşturun, böylece olayların tam sırasını görebilirsiniz.


5

3 Diğer Teknikler:

  • Her aşamada yavaşça test ederek bir programın işlevselliğini geliştirin, böylece bir seferde yalnızca küçük bir hata kümesiyle karşılaşırsınız.

  • Programı bir komut yorumlayıcı etrafında oluşturun, böylece burada olduğu gibi bölümlerle aynı anda çalışabilirsiniz .

  • Önemli zamanlarda atım yapın ve bir kapsam kullanın.


3

Görsel Mikro Visual Studio için eklenti sağlar Arduino Debug . Kaynak kodu izlemeyi ve kesmeyi içerir, ifadelerin ve değişkenlerin "izlenmesine" ve / veya değiştirilmesine izin verir.

resim açıklamasını buraya girin


1
Bunun, kodunuza eklenen otomatik olarak oluşturulan seri baskılar yoluyla yapıldığını unutmayın.
per1234

Seri veya wifi baskıları ve okumaları, gerçek kodun değil, kodun geçici bir kopyasına eklenmesi dışında doğru! Her şey visualmicro.com belgelerinde açıkça açıklanmıştır ve donanım hata ayıklayıcıları (genellikle Uno için değil) olan birkaç kişi için de desteklenmektedir. Her yöntemin kendine özgü avantajları ve dezavantajları vardır.
Visual Micro

Gönderen Arduino için Debugger'daki : "Bu kodu atlama destek vermedi ve debugger ile iletişim kurmak için yapı önce programa eklenen gizli kod dayanıyordu."
Peter Mortensen

Doğru. Kullanıcıların seri baskı ekleme ihtiyacını ortadan kaldırır, cpu çalışırken adlandırılmış değişkenlerin güncellenmesine izin verir, grafikler ve dijital pinler vb. Gösterir. Bir donanım hata ayıklayıcıdan farklıdır, ancak hızlı ve kolaydır ve başka faydaları vardır. Bunların hepsi visualmicro.com'da iyi belgelenmiştir, bu yüzden lütfen bir okuma yapın. Eğer tahta gdb'yi destekliyorsa veya atmel stüdyosu kullanıyorsanız elbette başka hata ayıklama seçenekleri de vardır. Her şey uzmanlığınıza ve sahip olduğunuz donanıma bağlıdır. Orijinal Arduino'nuz varsa, Atmel stüdyosunda arduino'yu atmel hata ayıklama veya sim ile birleştirebilirsiniz.
Görsel Mikro

2

ARM veya diğer platformlar gibi lüks araçlardan (AVR, iyi araçlara sahip PIC) geçerek Arduino hata ayıklama olanaklarının çok sınırlı olduğunu kabul ediyorum. Ancak düşük girişli bir başlangıç ​​aracıdır.

Serial.print () arkadaşın. Benim özel projeme (kolej), bağlı hiçbir LED yoktu, bu yüzden Serial.print () öyle. Kod ifadeleri ile düzgün çalışıp çalışmadığını test etmek istiyorum, genellikle Serial.print ("A"); , sonra hata ayıklama bölümünden B, C, vb. Hata ayıklama harflerini yapmasını beklediğim ile karşılaştırırım.

Bunun dışında kesme noktası veya kod adımı yoktur. Arduino, bir AVR atmega çip, bir bootloader + geliştirme ortamı ve bir ton yazılım kütüphanesine sahip bir tahtadan başka bir şey değildir. Ne yazık ki, bir önyükleyici ile çalışmak hata ayıklama özelliklerini sınırlar.


0

serial.printDaha kontrollü kullanmak için hata ayıklamayı açmak ve kapatmak için genel bir boole değişkeni tanımlayabilirsiniz. Öğesinin tüm satırları, yalnızca hata ayıklama bayrağı AÇIK olduğunda yürütülecek serial.printbir ififadenin içine sarılır . Bu şekilde, işiniz bittiğinde bile hata ayıklama satırlarını kodda bırakabilirsiniz, ancak daha sonra hata ayıklama bayrağını KAPALI olarak ayarladığınızdan emin olun.


0

Doğrudan serial.print'ten daha iyi, makroları kullanın. Misal:

#ifdef TRACE1
#define trace1(s) serial.print(s)
#define traceln1(s) serial.println(s)
#else
#define trace1(s)
#define traceln1(s)
#endif

Şöyle kullanın:

function doIt(param1, param2) {
    trace1("->doIt("); trace1("param1: "); trace1(param1); trace1(" param2: "); trace1(param2); traceln1(")");

    ...

    traceln1("<-doIt");
}

Daha (#ifdef TRACE2 ...)fazla ayrıntı içeren farklı izleme düzeyleriniz olabilir .

Ve "F" makrosunu kullanabilirsiniz (trace1(F("param1"));). "F" makrosu, dizenin çok sınırlı miktarda SRAM kullanmasını önler.


0

Yanıp sönen LED'ler, seri bağlantı noktasına bir şeyler yazdırın ve bir kerede küçük kod bölümlerini yazın ve hatalarını ayıklayın, bazen sadece birkaç satır.

Modülerleştirebileceğiniz zamanlar vardır. Örneğin C'de, örneğin bir ana bilgisayardaki, başka bir işlemcideki donanıma dokunmayan bir hesaplama işlevi geliştirebilir ve test edebilir, girişleri beslemek ve çıkışları kontrol etmek için işlevi bir test tezgahı ile sarabilirsiniz.

Başka bir benzer yol, bir erişiminiz varsa bir talimat seti simülatörü kullanmak olabilir (eğer değilse, çok eğitici ve ödüllendirici bir projedir, birkaçını yaptıktan sonra bir hafta sonu veya iki haftada bir tane patlatabilirsiniz). Birisi işlemcinin Verilog veya VHDL klonuna ( örneğin OpenCores ) sahipse, GHDL , Verilator veya Icarus Verilog'u deneyebilirsiniz . İlgilendiğiniz çevre birimlerini dahil etmek için yeterince yakın olabilir ve içeride olup bitenler hakkında sinyal düzeyinde görünürlük elde edebilirsiniz.

Muhtemelen mükemmel bir klon değil, ama yeterince iyi olabilir. Verilator, C / C ++ 'da çevre birimleri oluşturmayı gerçekten kolaylaştırır, böylece AVR cihazınızı bağladığınız her şeyi simüle edebilirsiniz.

UART çıkışı ve yanıp sönen LED'ler ve / veya yanıp sönen GPIO hatları ve bir osiloskop veya voltmetre kullanarak. Deli olmamanın anahtarı, kodun küçük bölümlerini yazmak ve hata ayıklamaktır. Bir seferde 10 satır yazmak ve 1000 satırdan 100 test yapmak ve hepsini tek seferde hata ayıklamaya çalışmak daha iyidir. Özellikle çoğu veri sayfasını ve programcıyı bulduğunuzda, donanım için referans kılavuzları her zaman doğru değildir. Her zaman bir bilgisayar korsanlığı gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.