在ARM平台上使用多任务操作系统时,因为程序设计存在缺陷,容易导致进入hard fault,网上对此有很多的资料介绍。在实际的程序调试中,我们也经常遇到另外一个问题。即想要执行的任务被挂起,CPU 在idle task 里面运行,这个问题同样也会困扰我们的功能调试。以下将结合一个简单的例子来分析如何找到任务被挂起的位置。
在freeRTOS 创建任务时,会创建一个任务控制块(TCB),并且该信息会通过指针进行返回。如下图所示
在本示例中,该参数传入了一个NULL值,因此该函数后不能直接得到这个“vLEDTask”的任务控制块信息。但也不需要着急,实际创建任务时,肯定会有相关的信息的存在。
继续进入该创建任务xTaskGenericCreate的函数内部,发现该函数动态创建了一个TCB的结构体,在本例中该结构体的地址为0x20000130。我们需要记录该地址,因为该结构体被一个局部变量保存,在退出该函数后,局部变量将被释放。
跳出该任务创建函数。将上述步骤中记录的0x20000130 添加到变量监视区。