OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3698|回复: 4

assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler));看不太懂,求指教~~

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-10-10
在线时间
0 小时
发表于 2015-10-10 14:54:23 | 显示全部楼层 |阅读模式
5金钱
#define assert_param(expr) ((void)0)  这是assert_param按f12后看到的
#define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4)  || \
                                      ((PRESCALER) == IWDG_Prescaler_8)  || \
                                      ((PRESCALER) == IWDG_Prescaler_16) || \
                                      ((PRESCALER) == IWDG_Prescaler_32) || \
                                      ((PRESCALER) == IWDG_Prescaler_64) || \
                                      ((PRESCALER) == IWDG_Prescaler_128)|| \
                                      ((PRESCALER) == IWDG_Prescaler_256))
IS_IWDG_PRESCALER是一个宏。
该怎么理解这行代码啊,谢谢大家!

最佳答案

查看完整内容[请看2#楼]

你看英文名字就知道了啊 ,IS_IWDG_PRESCALER ......,就是查看一下你设置的预分频参数是不是在正确的。你也可以随便搞个参数进去,编译一下,看会不会报错。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-10-16
在线时间
31 小时
发表于 2015-10-10 14:54:24 | 显示全部楼层
你看英文名字就知道了啊 ,IS_IWDG_PRESCALER ......,就是查看一下你设置的预分频参数是不是在正确的。你也可以随便搞个参数进去,编译一下,看会不会报错。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-10 14:54:24 | 显示全部楼层
回复【3楼】银银无敌:
---------------------------------
百度找到的答案:

这是断言机制。意思是在关闭断言的情况下,
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset)
{
assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
assert_param(IS_NVIC_OFFSET(Offset));
SCB->VTOR=NVIC_VectTab|(Offset&(u32)0x1FFFFF80);
}
就相当于:
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset)
{
(void)0; // 不执行任何操作,对程序也没有副作用
(void)0; // 不执行任何操作,对程序也没有副作用
SCB->VTOR=NVIC_VectTab|(Offset&(u32)0x1FFFFF80);
}
由于你的这个断言没贴完整,我就拿VC++6.0下的断言来说明把。
在VC++6.0下的assert.h中:
#ifdef NDEBUG 
#define assert(exp) ((void)0)
#else
#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
如果你写的代码中使用了断言,比如:
assert(i>=0);
那么这句的在程序中的作用分两种情况:
1. 若果在assert.h被包含之前NDEBUG这个宏未定义,assert(exp) 就被定义为(void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )。这样当i<0时,i>=0这个表达式为假,所以程序就会终止。并通知程序员发生错误的文件位置和代码行。但是错误信息仅仅对程序员有用。对用户来说,程序异常终止就显得不是那么友好了(用户此时需要的是挽回错误)。所以在发布给用户的程序中,assert(断言)要关闭。在VC++6.0下这是通过在包含assert.h头文件之前定义NDEBUG实现的。
2.在定义了NDEBUG的情况下,断言不应该给程序带来副作用。这样断言就被定义为:
#define assert(exp) ((void)0)
此时,assert(i>=0);不管括号中表达式为真还是为假,这一行代码其实相当于:
NULL;意思是不执行任何操作。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-10-10
在线时间
0 小时
 楼主| 发表于 2015-10-10 16:08:56 | 显示全部楼层
回复【2楼】okyihu:
---------------------------------
哦哦,好像明白点了,还有就是如果出错了#define assert_param(expr) ((void)0)这行代码是怎么发现的,或者说是怎么报错的?
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-10-10
在线时间
0 小时
 楼主| 发表于 2015-10-12 15:20:47 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢原子大哥!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 23:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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