已解决【RT-Thread】断言:Function[rt_mutex_take]: scheduler is not available (0)

【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 结论

因此,事件集、信号量和互斥量的创建应放在进入临界期之前,而线程任务的创建可以正常放在进入临界区中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值