{ rt_enter_critical(); LOG_D("hello"); rt_exit_critical();}
{
rt_enter_critical();
LOG_D("hello");
rt_exit_critical();
}
执行报错如下:
Function[rt_mutex_take]: scheduler is not available(0) assertion failed at function:rt_mutex_take, line number:921
Function[rt_mutex_take]: scheduler is not available
(0) assertion failed at function:rt_mutex_take, line number:921
查看更多
进临界区使用log_d之前调用ulog_output_lock_enabled(RT_FALSE),退出临界区之前调用ulog_output_lock_enabled(RT_TRUE)
ulog_output_lock_enabled(RT_FALSE)
ulog_output_lock_enabled(RT_TRUE)
因为ulog的同步机制rt_mutex_take检测RT_DEBUG_SCHEDULER_AVAILABLE(RT_TRUE);时报错,啥什么要检查scheduler 不明白
RT_DEBUG_SCHEDULER_AVAILABLE(RT_TRUE);
void ulog_voutput(rt_uint32_t level, const char *tag, rt_bool_t newline, const char *format, va_list args){output_lock();//rt_mutex_take(&ulog.output_locker, RT_WAITING_FOREVER);output_unlock();}
void ulog_voutput(rt_uint32_t level, const char *tag, rt_bool_t newline, const char *format, va_list args)
output_lock();//rt_mutex_take(&ulog.output_locker, RT_WAITING_FOREVER);
output_unlock();
因为 LOG_D 中里面有用到信号量,调用前使用了 rt_enter_critical() 触发断言,解决方法是去掉 rt_enter_critical()
rt_enter_critical()
不允许这么用,进入临界区后用rt_kprintf代码log接口。
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
老哥,在临界区使用 rt_kprintf 替代 ulog 打印可以吗,应该不会出现断言吧。
@Shane
看具体使用场景,一般用串口控制台,printf都是要耗很多时间的呀。ulog开异步的话是把日志字符串放到缓冲区里等到低优先级的ulog线程执行的时候才打印的。