Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
assert_断言
关于RT_ASSERT()
发布于 2011-12-23 16:46:08 浏览:14332
订阅该版
在RTT内核代码里随处可见`RT_ASSERT(...)`这个宏,我觉得这样不是太好 [s:170] 。 刚才测试lwip代码,在未连接的情况下不小心调用了`lwip_send()` [s:193] ,代码立即被停在`RT_ASSERT(sem != RT_NULL)`处,原因很明显,调用`rt_sem_take(sem, t);`里传进了NULL参数, 但不至于给ASSERT了吧 [s:166] ,这样整个系统都死掉了 [s:185] ,不是把小问题扩大化了吗 [s:184] ? 最多给我返回个错误代码就是了 [s:179] 。 在ucos里就是这样的: ```c if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */ return (OS_ERR_PEVENT_NULL); } ``` 如果参数有问题,返回错误代码,不至于让整个系统崩溃。 在ucos里的所有函数都没有出现ASSERT之类的。 如果关掉RTT里RT_DEBUG是可以解决ASSERT,但这样传进非法参数都没错误值返回了。
查看更多
15
个回答
默认排序
按发布时间排序
aozima
2011-12-23
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
你是希望调试时死在 ASSERT 上,还是希望设备在服役时死在未知错误上面?
zyb
2011-12-23
这家伙很懒,什么也没写!
有时候发生错误的机率很小很小,以至于开发时发现不了。 我认为,一个键状的函数,就是不管你传什么进去,能成功的成功,不能成功的返回信息让用户处理,总不能死在里面不返回了吧。呵呵。。 我看其它RTOS都是返回错误,不会代码停里面。。
bernard
2011-12-23
这家伙很懒,什么也没写!
assert是非常精简而高效的做法,推荐开发人员多学习下,因为出现问题后定位也非常迅速,并且能够push开发人员不放弃任何一个小错误。
StevenChen526
2011-12-24
这家伙很懒,什么也没写!
rt_assert是比较专业的做法,作为一款rtOS我们应尽量推崇。当然这和在中国做工程项目是有些矛盾的,中国的产品走完测试流程再上市的很少。带着己知问题就卖出去了(总不能比对手慢)。然后通过销售人员喝酒喝来现场二次开发的机会。我想对rtt来说,专业修为远比争先一时重要。。。
prife
2012-01-05
这家伙很懒,什么也没写!
众口难调。不过ASSERT 断言本来用于这种功能的啊。打印出错文件的编号然后死在那个地方。这种方式是标准实现,不信你去看《C和指针》。
bernard
2011-12-23
这家伙很懒,什么也没写!
关于这块,我的看法是, 实时系统是一类稳定性要求极为严格的系统,如果参数不对,那么应该在开发调试阶段就应该排除掉,而不应该遗留到产品阶段。所以对于参数的检查应该在调用系统函数前就应该保证它是好的,而不应该遗留到OS系统运行阶段才去考虑。而添加上RT_ASSERT以后,如果参数错误,在开发阶段就能够在串口上给出极为清晰的提示信息以让开发人员去修正它。
zyb
2011-12-23
这家伙很懒,什么也没写!
我都不想,我的意思是优雅的返回一个错误,而不是罢工不干了。既然国外成熟的OS都选择返回,肯定是有道理的吧。 我上面也提到了,有的错误可能调试时很难碰到,比如另一个贴子提到的timer的32位tick溢出的问题,这种错误可能在调试时永远发现不了,因为要运行一年才会出现。 而且就算运行时碰到了问题,也不应系统整个挂掉,若内核不给assert掉,可能这问题只会导致很小的损失,比如一个数据没发成功,或一个LED没闪等等,而现在,一个很小的问题就会导致整个系统挂掉。
aozima
2011-12-23
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
难道你的产品release时assert还在? 不用assert也要检查参数。但有时参数不能检查太多。 所以,看情况去处理参数合法性和assert。 所以,虽然assert在release时没了,但有些参数还是要检查, 此时,就返回如您所说的调用失败。
bernard
2011-12-23
这家伙很懒,什么也没写!
timer溢出不会造成assert,并且也不会溢出。 出错后返回只会造成更多未知的事件。
zyb
2011-12-23
这家伙很懒,什么也没写!
>难道你的产品release时assert还在? 我看代码中Release后assert是没了,但函数内部也没有检查参数了。这启不导致更多的未知事件? 那么,可以这么说,要在调试时祈祷能发现所有的错误,哪怕有一个没发现,那它就注定会在产品正式运行现场导致系统崩溃(当然,有WDOG存在也不能照成太大的问题,这里只是讨论而已)
撰写答案
登录
注册新账号
关注者
0
被浏览
14.3k
关于作者
zyb
这家伙很懒,什么也没写!
提问
4
回答
27
被采纳
0
关注TA
发私信
相关问题
1
rt_object_init中报assertion failed错误?
2
串口中断读取信号量释放函数断言失败问题
3
请问在新建工程并且添加MAX30102的组件之后编译下载怎么为什么会报这种错呢
4
运行 tls_test 出现错误,这个是什么原因
5
使用ringbuffer时,自检到thread的type不匹配
6
webnet cgi 回调 出现assert
7
keil里面移植RT系统之后,上电直接assertation
8
使用max30102软件包时出现线程断言错误
9
进入到assert后,软看门狗仍在喂狗的问题
10
shall not be used in ISR
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-thred的stm32h723对应bsp包CubeMX添加其他外设报错
2
RT-Thread中的time溢出问题,时间戳溢出,解决方法
3
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
4
SystemView线程名字不显示
5
只用网页也能跑RT-Smart 无门槛腾讯Cloud studio + smart-build快速构建
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
8
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
3
次点赞
YZRD
1
篇文章
2
次点赞
Days
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部