具体的定义和用法在下面
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)
{}
}
你可以按照自己使用的环境需求,添加适当的语句输出错误的信息提示,或修改这个函数做出适当的错误处理。