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
}
}
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.
zaten switch içinde default komutu kullanmak gerek. case lerin en altına mutlaka yazılması lazım.
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);
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.
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.
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.