断言机制assert_param的使用

具体的定义和用法在下面
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)
{
  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;意思是不执行任何操作。

在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。
所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,
则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。

这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。

它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。

当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
。。。

assert_param(IS_ADC_ALL_PERIPH(ADCx));
。。。

在执行assert_param()的检验时,如果发现参数出错,它会调用函数assert_failed()向程序员报告错误,在任何一个例程中的main.c中都有这个函数的模板,如下:

void assert_failed(uint8_t* file, uint32_t line)
{


while (1)
{}
}

你可以按照自己使用的环境需求,添加适当的语句输出错误的信息提示,或修改这个函数做出适当的错误处理。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值