分享因缺少 xPortSysTickHandler()函数而导致程序一直卡死在函数portTASK_FUNCTION的案例分析

今天来分享一个在学习freertos过程中遇到的一个小问题。就是发现程序跑不起来,但是debug调试时候发现也没有到while循环中,于是通过排查发现是因为缺少相应的SysTick中断服务函数导致的。话不多说,我们开始讲~

问题锁定:

首先这个问题在编译时候没有报错,是在程序执行时候发现程序会一直在空闲任务执行,当时是发现呼吸灯也不亮,通过debug调试发现,一开始任务创建好后,是会执行到led任务,但是每次执行到vTaskDelay后,任务调度到空闲任务后,就一直在portTASK_FUNCTION里面跑。

于是初步推测应该是vTaskDelay不生效,所以其他任务中有用到vTaskDelay的之后可能就一直在阻塞中,只剩下执行空闲任务了,所以跑到执行这个portTASK_FUNCTION函数。该函数可以看到,其注释为空闲函数的任务,如下图所示:

然后具体看了一下为什么函数vTaskDelay不生效,找到SysTick_Handler函数,发现应该是因为SysTick_Handler里面没有添加SysTick时钟中断服务xPortSysTickHandler函数导致的。其代码如下:

c 复制代码
extern void xPortSysTickHandler(void);    //这句很重要
void SysTick_Handler(void)
{
    //delay_decrement();
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
      {
    #endif  /* INCLUDE_xTaskGetSchedulerState */  
        xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      }
    #endif  /* INCLUDE_xTaskGetSchedulerState */
}

解决问题:

最后我尝试将上述代码替换原来的SysTick_Handler函数中的代码,然后编译再次debug,发现程序可以正常跑起来了,所以之前程序一直在空闲任务执行,可能就是因为vTaskDelay执行是阻塞了,但是时钟中断不进行延时唤醒判断,自然就不会将之前延时的任务唤醒,导致任务只能一直执行空闲任务,所以看不到led任务在跑。

所以如果有小伙伴在学习freertos时候也遇到过这种情况或者跟我的情况比较相似的话,可以参考我的例子来参考一下。解决方法也就是将相应的SysTick_Handler函数中的相应代码用上述代码替换一下。

好了,今天的分享就到这里了~

本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。

另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞和收藏,谢谢~

相关推荐
fengfuyao9859 小时前
STM32如何定位HardFault错误,一种实用方法
stm32·单片机·嵌入式硬件
爱学习的颖颖9 小时前
EXTI外部中断的执行逻辑|以对射式红外传感器计次为例
单片机·嵌入式硬件·exti中断
AI精钢11 小时前
H20芯片与中国的科技自立:一场隐形的博弈
人工智能·科技·stm32·单片机·物联网
Cx330❀11 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
郝学胜-神的一滴13 小时前
基于C++的词法分析器:使用正则表达式的实现
开发语言·c++·程序人生·正则表达式·stl
etcix14 小时前
implement copy file content to clipboard on Windows
windows·stm32·单片机
谱写秋天14 小时前
在STM32F103上进行FreeRTOS移植和配置(STM32CubeIDE)
c语言·stm32·单片机·freertos
程序员曦曦14 小时前
10:00开始面试,10:06就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展
globbo17 小时前
【嵌入式STM32】I2C总结
单片机·嵌入式硬件
玖別ԅ(¯﹃¯ԅ)18 小时前
SysTick寄存器(嘀嗒定时器实现延时)
stm32·单片机·嵌入式硬件