Kesme içinde kesme

Başlatan Gökhan BEKEN, 11 Haziran 2014, 17:23:53

Gökhan BEKEN

Bugün farkettim stm32 ile bir kesme fonksiyonuna girince başka bir kesme olayı gerçekleşmiyor.
Uzun uzun uğraştıktan sonra yöntemimi değiştirerek sorunu çözdüm.

1.kesme: RTC alarm
2.kesme: Harici buton

Sorunlu versiyonda, alarm kesmesinin içinde, bir while döngüsünde sürekli harici buton kesmesinde set ettiğim bir bayrağın durumunu sorguluyorum, FALSE olduğu sürece burdan çıkma diyorum.
while(hariciKesmeBayragi==FALSE){}


Ancak butona bastığımda "hariciKesmeBayragi" adlı değişkenim bir türlü set olmuyor. Yani harici kesmeye girmiyordu.

Ben de RTC alarm kesmesinde işlem yapmak yerine, tıpkı harici kesmedeki gibi bayrak kullandım.
RTC kesmesine girdiği anda "alarmAktif" adlı bayrağımı TRUE yaptım.
main fonksiyonumdaki sonsuz döngümde sürekli, "alarmAktif" bayrağını sorguladım, TRUE ise şunları şunları yap dedim.(daha önce alarm kesmesi içinde yazdığım kodlar) Sorun bir şekilde çalıştı.

not: Bayrak değişkenlerimi volatile olarak tanımladım.
Özel mesaj okumuyorum, lütfen göndermeyin.

kimlenbu

#1
NVIC sayesinde kesme öncelikleri ayarlanabiliyor, denediniz mi ?

Misal harici kesmeye en düşük önceliği atamak için :

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;


ekleme :

bir de harici kesmeniz şu şekilde değil mi ?

void EXTI0_IRQHandler(void)
{

  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
//işlemler
    EXTI_ClearITPendingBit(EXTI_Line0);
  }

Gökhan BEKEN

Harici kesmem böyle:
void EXTI0_IRQHandler(){
hariciKesmeBayragi = !hariciKesmeBayragi;
   DelayMs(15);
   EXTI->PR=0x00000001; 
}


Öncelik ataması yapmamıştım. Hangi durumda hangisinin önce olabileceği değişebilir. Harici kesmeye öncelik verirsem, bu seferde harici kesmeye girdiğinde RTC alarm kesmesine girmeyecek. Gerçi öncelikleri de duruma göre değiştirilebilir ama denemedim.
Özel mesaj okumuyorum, lütfen göndermeyin.

Müh. müh.

Sorunu hicte guzel izah edememissiniz. Fakat eger dogru anladiysam,

Bir mcu nun ayni anda birkac interrupt vektorune gidememesi dogal degil mi?
Destiny of white is dirtied. Destiny of black is found guilty...

magnetron

biribirini kesen interruptlar için aşağıdaki satırın yazılması gerekiyor

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 

aşağıda USART1 düşük TIM4 yüksek öncelikli ( TIM4 USART1 'i keser )

  /* Enable the USARTx Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
//-------------------------------------------
  /* Enable the TIM4 gloabal Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


Tagli

Alıntı yapılan: meftun - 11 Haziran 2014, 17:50:39
Gerçi öncelikleri de duruma göre değiştirilebilir ama denemedim.
Benim de aklıma o geldi. Kesme kodu içinde diğer kesmenin önceliği değiştirilebiliyorsa sorun çözülür sanırım.

Alıntı yapılan: Müh. müh. - 11 Haziran 2014, 19:42:40
Bir mcu nun ayni anda birkac interrupt vektorune gidememesi dogal değil mi?
Aynı anda değil ama, bir kesme ile uğraşırken, onu yarım bırakıp bir başka kesmeye gidebilir.
Gökçe Tağlıoğlu

Müh. müh.

Alıntı yapılan: Tagli - 11 Haziran 2014, 19:51:51
Aynı anda değil ama, bir kesme ile uğraşırken, onu yarım bırakıp bir başka kesmeye gidebilir.

İşte buda kesme önceliğine göre olur ki,

Ondanda yukarıda bahsedilmiş.
Destiny of white is dirtied. Destiny of black is found guilty...