【RT-Thread】断言:Function[rt_mutex_take]: scheduler is not available (0)
1 问题描述
最近在使用RT-Thread进行开发时,写好程序板子上电后,发现Finsh调试窗口出现如下断言错误并且程序进入死循环:
Function[rt_mutex_take]: scheduler is not available
(0) assertion failed at function:rt_mutex_take, line number:921
奇怪的点就在于,我的代码中并没有创建互斥锁,怎么会报互斥锁的断言?
2 解决方案
最终排查到问题是在临界区中创建了事件集、信号量导致的:
int main(void)
{
rt_base_t level;
rt_enter_critical(); // 进入调度临界区
level = rt_hw_interrupt_disable(); // 屏蔽中断
// rtk配置事件集创建
// rtk_config_event = rt_event_create("eventTest", RT_IPC_FLAG_FIFO);
// 创建串口1信号量
// sem_ack = rt_sem_create("uart1ack", 0, RT_IPC_FLAG_FIFO);
rt_hw_interrupt_enable(level); // 中断使能
rt_exit_critical(); // 退出调度临界区
}
我起初在main中加入了进入临界区,如果在这中间创建了事件集或者信号量(以上代码注释部分),就会出现死锁的现象进而产生断言错误,修改后如下,程序正常运行:
int main(void)
{
rt_base_t level;
// rtk配置事件集创建
rtk_config_event = rt_event_create("eventTest", RT_IPC_FLAG_FIFO);
// 创建串口1信号量
sem_ack = rt_sem_create("uart1ack", 0, RT_IPC_FLAG_FIFO);
rt_enter_critical(); // 进入调度临界区
level = rt_hw_interrupt_disable(); // 屏蔽中断
/**** 线程创建 *****/
/******************/
rt_hw_interrupt_enable(level); // 中断使能
rt_exit_critical(); // 退出调度临界区
}
3 结论
因此,事件集、信号量和互斥量的创建应放在进入临界期之前,而线程任务的创建可以正常放在进入临界区中。