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克隆网站