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

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

实验芯片:STM32L052

中断类型:SysTick 、LPTIM1(update)

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

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

 

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

 实验现象:

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

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

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

 

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

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

串口打印。

void LPTIM1_IRQHandler(void)
{
     HAL_LPTIM_IRQHandler(&hlptim1);
	 printf("LPTIM_interrupt\r\n");		  
}

 

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值