STM32 HAL_Deleay() 函数 导致程序卡死
 
 出现问题场景: 出现问题场景:
  
  我的程序有RTOS操作系统。使用的驱动库是STM32官方最新的HAL库。 我的程序有RTOS操作系统。使用的驱动库是STM32官方最新的HAL库。
 
  移植好LwIP以太网协议后,在初始化网卡阶段程序卡死。 移植好LwIP以太网协议后,在初始化网卡阶段程序卡死。
  
 
 出现问题原因: 出现问题原因:
  
  后经过蠢笨的printf打印调试,不断缩小问题范围,定位了问题卡死在了这里: 后经过蠢笨的printf打印调试,不断缩小问题范围,定位了问题卡死在了这里:
   
  在HAL_Delay(PHY_RESET_DELAY);之前的调试信息能打印出来,它之后的就打印不出来了。把该延时函数注释,又能正常运行,直到遇到下一个HAL_Delay函数。 在HAL_Delay(PHY_RESET_DELAY);之前的调试信息能打印出来,它之后的就打印不出来了。把该延时函数注释,又能正常运行,直到遇到下一个HAL_Delay函数。
  
  这里可以确定是HAL_Delay();延时函数导致卡死在这里了。 这里可以确定是HAL_Delay();延时函数导致卡死在这里了。
  
  但是很不解,一个通用的HAL_Delay();函数,怎么就成了元凶?! 但是很不解,一个通用的HAL_Delay();函数,怎么就成了元凶?!
  
  这里我查阅了官方的HAL库函数说明,其中有这么一段需要注意的话: 这里我查阅了官方的HAL库函数说明,其中有这么一段需要注意的话:
   
  这段话的意思是:HAL_Delay函数是基于系统滴答定时器中断来累增计数产生延时效果。这表明如果该函数被调用在外设的中断处理函数里,系统滴答定时器的中断就必须比这个外设中断的优先级高,否则这个外设中断将被阻塞。 这段话的意思是:HAL_Delay函数是基于系统滴答定时器中断来累增计数产生延时效果。这表明如果该函数被调用在外设的中断处理函数里,系统滴答定时器的中断就必须比这个外设中断的优先级高,否则这个外设中断将被阻塞。
  
  我这里只能找到这个资料。 我这里只能找到这个资料。
  
 
 解决办法: 解决办法:
  
  我的优先级组是全部抢占式优先级。 我的优先级组是全部抢占式优先级。
 
  原来的滴答定时器优先级在抢占式里最低 原来的滴答定时器优先级在抢占式里最低
   
  将优先级设置成最高: 将优先级设置成最高:
   
  问题暂时解决。 问题暂时解决。
				       
			          上一篇:
			            通过多线程提高代码的执行效率例子 
			          
			          下一篇:
			            技术分享:Setoolkit克隆网站 
			          
			        