RT-Thread 断言:assertion failed at function:rt_mutex_take 等

断言

断言是什么?https://www.cnblogs.com/thisway/p/5558914.html

“ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。”

 问题描述

1、互斥量获取时-断言

2、信号量释放时-断言

assertion failed at function:rt_sem_release

3、事件集获取时-断言

(rt_object_get_type(&event->parent.parent) == RT_Object_Class_Event) assertion failed at function:rt_event_recv

4、Timer脱离时-断言

(rt_object_get_type(&timer->parent) == RT_Object_Class_Timer) assertion failed at function:rt_timer_detach

..........

原因

1、可能使用的对象可能未进行初始化或创建 。如 信号量、互斥量、事件集........等。

比如 错误用法:

//错误用法:未初创建信号量,直接 释放/获取 该信号量,此时就会发生断言
static rt_sem_t dynamic_sem = RT_NULL;

rt_sem_release(dynamic_sem);
result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);

正确用法:

/* ok用法:创建信号量后,再 释放/获取 该信号量 */ 
static rt_sem_t dynamic_sem = RT_NULL;
dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_FIFO);   //创建

rt_sem_release(dynamic_sem);
result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);

有时候明明已经初始化或者创建了,依旧断言错误,这种原因,极有可能是初始化或者创建的动作 晚于 使用的动作了,检查下裸机顺序就没问题。

2、内存越界、内存溢出

如果并非第一种原因,那么很有可能就是内存越界/内存溢出,就需要当事人自己调试检查了

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nameless-Y

文章帮助到我了!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值