Kesmeler(Interrupts) in programming

Herhangi gömülü uygulama genellikle fonksiyonları bir dizi içerir. Hatta basit bir sıcaklık kontrol uygulaması, örneğin, kullanıcı girişi okurken bir LCD veri görüntüleme, sıcaklık sensörü / ADC çıkışı okuma ve fan / ısıtıcı çıkışını kontrol gibi görevleri bir dizi içerir. Kontrolörün bant genişliği bir son kullanıcıya, fonksiyonlar paralel olarak yürütülecek görünüyor, böyle bir şekilde tüm bu görevleri arasında bölünmüş olmaktır. Yani, kontrolör için ana süreci - - ve tüm diğer görevler için düzenli aralıklarla kontrolörü kesintiye bu Tasarımı bir arka plan işlemi karar gerektirir. Böyle bir şekilde ihtiyaç duyulan bazda köle denetleyicisi ile iletişim kurmaya çalışıyor master yanı sıra asenkron kesmeler, orada olabileceğini unutmayın. Uygun kesme işleme ve böylece kritik bir görev haline gelir.

Dikkatsizce yazılan kesmeler bazı gizemli çalışma zamanı hataları neden olabilir başlıca nedeni kesmeler, dikkatli ve tedbirli ele olmalıdır. Bu hatalar ortaya çıkarmak ve denetleyici tanımlanmamış bir duruma girebilir çünkü anlıyorum, geçersiz veri, durdurmak rapor, sıfırlama, ya da başka bir anlaşılmaz bir şekilde davranmaya zordur. Bazı basit kesme işleme uygulamalarının farkında olmak bizi bu tür olayları önlemeye yardımcı olabilir.

Bu yazı dizisinde, biz ilgili örnekler, bu tür hataları da dahil olmak üzere önlemeye yardımcı aşağıdaki basit ama önemli kesme işleme Nuggets ile görüşmek:

Bir arka plan / ana süreci karar
Düzgün kesmeleri öncelik
Kısa tutun - kullanım bayrakları
Basit tutun - Devlet makineleri kullanmak
Global değişkenler - modifiye ne zaman biliyor
Yerel değişkenler - derleyici biliyorum
Veri tamponlar kullanılması - aşılır dikkatli olmak
Paylaşılan hafıza - kerede tam okunan
Tamponlar daha küçük
Multi-Byte Tamponlar - endianness'ın biliyorum
Yapılandırılmış tamponlar - yapı doldurma anlıyorum
Bir ISR işlevleri çağırma - dikkatli olmak
Zaman kritik görevler - gecikme anlıyorum
LVD Interrupt- o engelleme yapmak
Bir arka plan / ana süreci karar

Bu kolay gözükmesine rağmen, yine de önemli. Bir denetleyici işlemek için görevleri bir numarası vardır, o "main ()" fonksiyonu sadece arka plan süreç olduğunu anlamak önemlidir. Aynı zamanda herhangi bir kesme anacı ziyade kesme rutinini çalıştırmak için CPU neden kırma, yürütme akışını bozabilir anlamda, en az önceliğe sahiptir.

Acil bir STOP anahtarı bir kesme olmak zorunda, oysa Örneğin, bir araya koymak tüm diğer kesmeleri kaynaklanan gecikmeler bir kullanıcının tahmini anahtar tutma süresinden daha az olan arka planda, bir matris klavye tarama olabilir.

Düzgün kesmeleri öncelik
İki veya daha fazla kesme aynı anda ortaya çıktığında Kesme önceliklendirme yürütme sırasını belirlemede önemlidir. Burada öncelik karar görevlerin önemi, aciliyeti ve frekans var.

Örneğin, düşünün, bir d.a.c. (DAC) ve I2C köle kullanan bir kontrolör ile bir sistem. Iki şekl vardır:
I2C ana denetleyicisi ile bağımsız iletişim sırasında kontrolör çıkışına sabit bir frekans dalga formu DAC kullanır. Çıktı dalga formu şekli ne olursa olsun denetleyici I2C usta ya da değil iletişim olup olmadığı, aynı kalır, böylece bu durumda, DAC sabit aralıklarla güncelleştirilmesi gerekmektedir. Böylece, DAC I2C kesme üzerine öncelik olmalıdır.
Kontrolör frekans I2C usta tarafından karar edilmesiyle, değişken frekanslı çıkışa bir dalga formu DAC kullanır. Bu durumda, I2C kesme kendileri I2C komutları tarafından kontrol edilir DAC çıkışı zamanlamaları beri öncelik alabilir.

Tüm kesme istekleri hizmet böylece sık görülen kesmeler yüksek öncelik verilmelidir. Aksi takdirde, çoklu kesme istekleri sadece bir kez birden fazla istekleri hizmet sonucu bir olasılığı vardır. İlk istek hizmet önce kesmeleri ikinci, üçüncü ya da bir numara oluşursa bu oluşabilir.

Kısa tutun - kullanım bayrakları
Bir iyi anlaşılmış ve sık sık tartışılan uygulama kesme kod mümkün olduğunca kısa olması gerektiğidir. Bu işlemci zamanında ana görevi dönebilirsiniz garanti eder.

Kesme hizmet yordamı yalnızca kritik kod yürütmesine gerekir; Görevin geri kalanı bir bayrak değişkeni ayarlayarak anacı küme edilebilir. Bayraklar genellikle ikili değerleri (0 veya 1) almak beri, bu mümkün olduğunca (8051 gibi) bitsel bellekte ilan edilmesi gerektiğini unutmayın. Bu itme / pop yükü ve yürütme süresini azaltır. Örnek:

bit bayrağı;

# Pragma interrupt_handler ISR

void ISR (void)
{
   flag = 1;
}

) (void main
{
   -
   -
   while (1)
   {
      -
      -
      / * ISR ayarlamak için bekleyin
      * Bayrak; önce sıfırlamak
      * Herhangi bir eylemde. * /
      if (flag)
      {
         bayrak = 0;
         / * Burada gerekli eylemi gerçekleştirme * /
      }
   }
}

Basit tutun - Kullanım Durum Makineleri
Devlet makineleri görünüşte büyük hizmet rutinleri kısa ve yürütmek için kolay hale getirmek. Kararlar ISR tarafından yapılacak bir kesme hizmet yordamı (ISR) ve işlevi içinde yapılması gereken ne durumlarda bir dizi vardır kesme tetiklenir önce başvurunun durumuna bağlıdır. Bir zamanlayıcı ISR o sipariş 10ms, 14ms, 19ms içinde zamanlamalarını oluşturur ve döngü devam etmesi gerektiğini bir şekilde uygulanacak olan, örneğin, aşağıdaki varsayımsal durum düşünün. Aşağıdaki gibi basit bir yolu olabilir bir ISR içinde dönemini değiştirmek için:

#define PERIOD_10ms 0x01
#define PERIOD_14ms 0x02
#define PERIOD_19ms 0x03

void Timer_ISR (void)
{
   static char Devlet = PERIOD_10ms;

   anahtarı (Eyalet)
   {
      Olgu PERIOD_10ms:
      {
         Pin Toggle //;
         // Timer Dur;
         14ms dönemini değiştirin //;
         // Timer Başlangıç;
         break;
      }
      Olgu PERIOD_14ms:
      {
         Pin Toggle //;
         // Timer Dur;
         19ms dönemini değiştirin //;
         // Timer Başlangıç;
         break;
      }
      Olgu PERIOD_19ms:
      {
         Pin Toggle //;
         // Timer Dur;
         10ms dönemini değiştirin //;
         // Timer Başlangıç;
         break;
      }
      default:
      {
         / * Timer_ISR tanımsız durumuna girdi * /
         Varsayılan süresi 10ms olun //
         break;
      }
   }
}

Herhangi bir anahtar durumda varsayılan bir bildirimde bulunmamış kodlama C iyi bir uygulama olduğunu burada unutmayın. Bu kolayca herhangi tanımlanmamış durumdan CPU kurtarmak için yardımcı olur.
Yapıları kısa kod oluşturabilir if-else bazı durumlarda çok az devletleri (2 ila 3 devletler) içeren. Ancak, daha büyük devlet makineleri, if-else yapıları switch deyimi tarafından oluşturulan atlama tablo uygulanması çok daha büyük bir montaj liste oluşturmak. Bu nedenle, herhangi bir karmaşıklık kodu için genel kural anahtar deyimi kullanmaktır.

Şimdiye kadar, doğru şekilde ISRS yapılandırılmasında bize yardımcı olmak için bazı genel kesme işleme uygulamaları ele aldık. Bu makalenin sonraki bölümünde, ISRS ve bellekle ilgili yönleri ile gidersiniz. Biz Biz de kesme zamanlama / gecikmeleri, bir ISR içinde bir C işlevini çağırarak etkileri ve LVD bahsedeceğiz küresel / yerel değişkenler, veri tamponlar, paylaşımlı bellek, vb liberal kullanımı etkilerini tartışacağız (düşük voltaj tespit ) keser.

Comments