野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15974|回复: 10

在书上看到了,断言 这个功能,貌似很好用。求知情者

[复制链接]
发表于 2013-11-9 20:12:19 | 显示全部楼层 |阅读模式
stm32f10x_conf.h这个文件还可配置是否使用“断言”编译选项,在开发时使用断言可由编译器检查库函数传入的参数是否正确,软件编写成功后,去掉“断言”编译选项可使程序全速运行。可通过定义USE_FULL_ASSERT或取消定义来配置是否使用断。


具体是什么功能,怎么用的?
回复

使用道具 举报

发表于 2013-11-9 20:47:35 | 显示全部楼层
关于断言的使用,从 林锐的《高质量 C 编程指南》里提取了一段断言的使用规则:
程序一般分为 Debug 版本和 Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。  
断言 assert 是仅在 Debug 版本起作用的宏,它用于检查“不应该”发生的情况。

【规则 6-5-1】使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
【规则 6-5-2】在函数的入口处,使用断言检查参数的有效性(合法性)。
【建议 6-5-1】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
【建议 6-5-2】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-9 21:16:27 | 显示全部楼层
fire 发表于 2013-11-9 20:47
关于断言的使用,从 林锐的《高质量 C 编程指南》里提取了一段断言的使用规则:
程序一般分为 Debug 版本 ...

那应该用起来很难吧?好复杂
回复 支持 反对

使用道具 举报

发表于 2013-11-9 22:06:06 | 显示全部楼层
有心人 发表于 2013-11-9 21:16
那应该用起来很难吧?好复杂

用起来 非常 简单。

断言的 目的是 现实中 不可能 或者 不应该发生的事情,却发生了,这就 错误了,加入断言,如果断言失败,就会 报错,从而 提醒 程序员 注意这个错误。

举个 例子,PWM 的占空比 不可能 超过 100% 的,而 有的 人 传递进去的 占空比 就是 超过 100% ,那么 设置PWM 占空比的 程序内部 断言 检测 占空比是否超过 100%,如果超过,就报错。
  1. ASSERT(断言条件);
复制代码
正常情况下 断言条件 是成立的,但如果断言条件不成立 ,就报错。

注意,断言是 一个安全检测,而不是 异常处理,例如 申请内存失败,这个就是 一个异常处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-11 18:22:32 | 显示全部楼层
fire 发表于 2013-11-9 22:06
用起来 非常 简单。

断言的 目的是 现实中 不可能 或者 不应该发生的事情,却发生了,这就 错误了,加 ...

哦,了解功能了,但怎么使用呢,有没有例程呢
回复 支持 反对

使用道具 举报

发表于 2013-11-11 19:26:34 | 显示全部楼层
有心人 发表于 2013-11-11 18:22
哦,了解功能了,但怎么使用呢,有没有例程呢

就是简简单单的:
  1. ASSERT(断言条件);
复制代码
断言条件 就是 判断的,断言条件必须为真,否则就会 执行断言失败函数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-15 00:21:15 | 显示全部楼层
fire 发表于 2013-11-11 19:26
就是简简单单的:断言条件 就是 判断的,断言条件必须为真,否则就会 执行断言失败函数

意思是懂了,怎么用具体什么语句,我相信书上可以看到的
回复 支持 反对

使用道具 举报

发表于 2014-2-26 21:01:27 | 显示全部楼层
我发现程序里的断言就第一次编译会提示
第二次就忽略了,是断言就这样么?还是IAR给忽略了,IAR忽略的话怎么让他不忽略呢?
回复 支持 反对

使用道具 举报

发表于 2014-2-26 21:34:34 | 显示全部楼层
hljchenxi 发表于 2014-2-26 21:01
我发现程序里的断言就第一次编译会提示
第二次就忽略了,是断言就这样么?还是IAR给忽略了,IAR忽略的话怎 ...

断言是运行中检测的,不是编译中检测。
警告是每次编译都提示,但如果之前已经编译好了,没修改过代码,那么第二次就不会进行编译,所以看不到警告
回复 支持 反对

使用道具 举报

发表于 2014-2-27 20:32:30 | 显示全部楼层
说不得 发表于 2014-2-26 21:34
断言是运行中检测的,不是编译中检测。
警告是每次编译都提示,但如果之前已经编译好了,没修改过代码, ...

噢,清楚了,非常感谢
回复 支持 反对

使用道具 举报

发表于 2015-7-12 17:58:54 | 显示全部楼层
火哥,断言判断如果没通过,通过什么形式能看到程序存在bug,是串口吗??@fire
       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-10-5 19:20 , Processed in 0.038957 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表