FreeRTOS断言"freertos\portable\rvds\arm_cm3\port.c,244"的解决方法
这两天刚上手FreeRTOS,写程序的时候,中途编译烧录调试,代码很简单,我也感觉没啥问题,但是在串口中打印了断言freertos\portable\rvds\arm_cm3\port.c,244
,检查代码多次未能解决问题,网上也只有一篇文章提到这个问题,最终我在正点原子的论坛上找到了答案。
代码的内容就是:
两个定时器中断TIM3和TIM5。TIM3优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY
,即该中断不能被FreeRTOS的portDISABLE_INTERRUPTS()
函数停止;TIM5优先级则低于configMAX_SYSCALL_INTERRUPT_PRIORITY
,即它可以被停止。
每隔1s向串口打印信息,然后在任务中调用portDISABLE_INTERRUPTS()
关闭中断,那么TIM3应该能继续输出,而TIM5则不能。
在代码中,建立了两个任务,一个是开始任务startTask()
,一个是关中断的任务intrruptTask()
,在开始任务中创建关中断的任务。
重点来了,我写到一半的时候,直接写了个intrruptTask()
的空函数放那了,里面没有写死循环。这时烧录上去,串口就会打印断言freertos\portable\rvds\arm_cm3\port.c,244
,在intrruptTask()
里写一个while(1)
即可解决。
问题解决了,可是为什么会这样?
先放出我的代码:
/*********************任务设置区*********************/
#define startTask_STK_SIZE 120 //开始任务的堆栈大小,实际大小为120*4
#define startTask_PRIO 1 //空闲任务的优先级为0,一般不用0,数字越大,优先级越高
void startTask(void *pvParameters); //任务函数
TaskHandle_t startTask_Handler; //任务句柄,别的任务通过句柄调用该任务
#define intrruptTask_STK_SIZE 120 //开始任务的堆栈大小,实际大小为120*4
#define intrruptTask_PRIO 2 //空闲任务的优先级为0,一般不用0,数字越大,优先级越高
void intrruptTask(