Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Texas Instruments => MSP430 Serisi => Konuyu başlatan: Erhan YILMAZ - 26 Mart 2014, 09:13:01

Başlık: Enteresan Bir Switch case Yapısı
Gönderen: Erhan YILMAZ - 26 Mart 2014, 09:13:01
Msp430 örnekleri incelerken buldum. Switch içerisine 2 tane parametre geçiliyor. Biraz araştırınca anladım ki biri switch edilecek değer diğeri de izin verilen değer aralığıymış. Daha verimli kod üretimi için derleyiciye yardımcı olan bir olaymış. Standart C kodu değilmiş zaten. Kesmelere hızlı müdahale etmek için yapılmış bir işlem heralde. Sabah sabah C bilip bilmediğimi sorguladım.

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  switch (TAIV, 10)        // Efficient switch-implementation
  {
    case  2:                                // TACCR1
      P1OUT ^= 0x01;                        // Toggle P1.0
      TACCR1 += 50000;                      // Add Offset to TACCR1
      break;
    case  4: break;                         // TACCR2 not used
    case 10: break;                         // Overflow not used
  }
}
Başlık: Ynt: Enteresan Bir Switch case Yapısı
Gönderen: Burak B - 26 Mart 2014, 09:30:13
Endüstriyel standartlara uyuyorsa; çok problem olmaz. Ama uymuyorsa portability ve güvenlik açısından sorunlu bir kod. Bu şekilde değerlendirmek gerek.

Şu şekilde tanımlanmış olabilir;

#define switch(a,b) switch(a<<4|b)


....
...
uint8_t a=1;
uint8_t b=2;
.....
    switch(a,b)
    {
        case 0x12:
            break;
       ....
    }


Ama bu durumda o dosya içindeki tüm switch bloklarının bu kurala uyması gerekiyor.
Başlık: Ynt: Enteresan Bir Switch case Yapısı
Gönderen: erhanmete - 26 Mart 2014, 10:34:11
zaten switch içinde default komutu kullanmak gerek. case lerin en altına mutlaka yazılması lazım.
Başlık: Ynt: Enteresan Bir Switch case Yapısı
Gönderen: SpeedyX - 26 Mart 2014, 10:41:30
Merhaba,

MSP430 da o kod genelde aşağıdaki şekilde kullanılır. Switch içinde 2 parametre yazılmaz.

#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR(void)
{
  switch(__even_in_range(TA1IV,4))
  {
    case  2: // TA1-CCR1
    {
.
.


Macronun, ilgili .h dosyasındaki prototipi de şu şekilde:
  /*
   * Support for efficient switch:es. E.g. switch(__even_in_range(x, 10))
   *
   * Note that the value must be even and in the range from 0 to
   * __bound, inclusive. No code will be generated that checks this.
   *
   * This is typically used inside interrupt dispatch functions, to
   * switch on special processor registers like TAIV.
   */

  __intrinsic unsigned short __even_in_range(unsigned short __value,
                                             unsigned short __bound);
Başlık: Ynt: Enteresan Bir Switch case Yapısı
Gönderen: Erhan YILMAZ - 26 Mart 2014, 13:04:46
Code composerde yazılıyor hocam hatada vermiyor fakat çalışmıyor. Msp430'un kendi örneklerinden buldum. Belki IAR'da çalışıyordur. switch(__even_in_range(TA1IV,4)) yazınca çalışıyor istediğim gibi.
Başlık: Ynt: Enteresan Bir Switch case Yapısı
Gönderen: furkan.seker - 26 Mart 2014, 13:47:36
bu bir compiler intristic, yani derleyiciye özel fonksiyon diyebiliriz. dolayısı ile IAR'da çalışacağını zannetmiyorum. daha doğrusu, code composer'ın derleyecisi haricinde bir derleyicide hata verecektir.
Başlık: Ynt: Enteresan Bir Switch case Yapısı
Gönderen: SpeedyX - 26 Mart 2014, 13:50:21
Alıntı yapılan: furkan.seker - 26 Mart 2014, 13:47:36
bu bir compiler intristic, yani derleyiciye özel fonksiyon diyebiliriz. dolayısı ile IAR'da çalışacağını zannetmiyorum. daha doğrusu, code composer'ın derleyecisi haricinde bir derleyicide hata verecektir.
IAR'da çalışıyor.