天天看点

SysTick中断是否能够无视一切外设中断?

针对STM32的SysTick中断,网上有很多说法,有人说SysTick是属于内核里面的中断,除了NMI等不可屏蔽中断,SysTick可以无视一切外设中断,即使外设中断的抢占优先级高于SysTick中断,对于这种说法,我本人的态度是半信半疑的,于是,我做了以下实验来进行验证。

实验芯片:STM32L052

中断类型:SysTick 、LPTIM1(update)

NVIC中断寄存器组:2(2位抢占优先级,2位子优先级,由于stm32L0不支持子优先级,故只有高2位有效) 

1.首先将SysTick中断优先级设置为最高(0),LPTIM1设置为最高(0)

SysTick中断是否能够无视一切外设中断?
SysTick中断是否能够无视一切外设中断?

SysTick中断服务函数: 

void SysTick_Handler(void)
{
  HAL_IncTick();
  printf("SysTick\r\n");	 
}
           

 LPTIM更新中断服务函数,里面有个while(1)用来判断其他任务是否能够抢占当前中断。

void LPTIM1_IRQHandler(void)
{

  HAL_LPTIM_IRQHandler(&hlptim1);
  while(1)
	{
	   unsigned int i=0xFFFFFF;
	   printf("LPTIM_interrupt\r\n");
	   for(;i>0;i--);
	}
}
           

 实验现象:

SysTick中断是否能够无视一切外设中断?

 仅仅有“LPTIM_interrupt”字符串打印,说明没有发生抢占行为,也就是说当外设中断优先级和systick中断优先级一致时,Systick中断并不能抢占其他的中断。

实际上在《Cortex-M0权威指南》中也有说明:

SysTick中断是否能够无视一切外设中断?

2.接下来,再进行第二个实验,将LPTIM中断优先级调低,保证SysTick>LPTIM

SysTick中断是否能够无视一切外设中断?

此时,LPTIM中断优先级已经被调到1 ,SysTick中断是可以抢占的。

但是还需要对LPTIM中断服务函数作些修改,否则,难以观察到LPTIM中的

串口打印。

void LPTIM1_IRQHandler(void)
{
     HAL_LPTIM_IRQHandler(&hlptim1);
	 printf("LPTIM_interrupt\r\n");		  
}
           
SysTick中断是否能够无视一切外设中断?

可以看到,SysTick已经抢占了LPTIM中断。

但是由于串口是查询方式发送,其在发送过程中发生了抢占,所以会发生上述情况。

继续阅读