Enteresan Bir Switch case Yapısı

Başlatan Erhan YILMAZ, 26 Mart 2014, 09:13:01

Erhan YILMAZ

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
  }
}

Burak B

#1
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.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

erhanmete

zaten switch içinde default komutu kullanmak gerek. case lerin en altına mutlaka yazılması lazım.

SpeedyX

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);

Erhan YILMAZ

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.

furkan.seker

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.

SpeedyX

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.