打印

STM32常用却难理解的一宏定义,高手请解释

[复制链接]
5531|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dosculler|  楼主 | 2011-5-27 18:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dosculler 于 2011-5-27 18:22 编辑

头文件"stc32f10x_conf.h"里最后一段是一个宏定义:assert_param如下,高手能花点时间解释下不?

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

/* Exported functions ------------------------------------------------------- */
  void assert_failed(u8* file, u32 line);

#else
  #define assert_param(expr) ((void)0)

#endif /* DEBUG */


发现这个宏定义经常用到,而且assert_failed也没看到在哪定义?
卡在这,麻烦前辈花点时间解释下
沙发
dosculler|  楼主 | 2011-5-27 18:12 | 只看该作者
本帖最后由 dosculler 于 2011-5-27 18:14 编辑

比如,定义GPIOC13输出高电平,我一步一步查找如下:
一、实现语句为:GPIO_SetBits(GPIOC, GPIO_Pin_13);  // PC13输出高电平

二、查找该函数定义如下:
    void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
      {
        /* Check the parameters */
        assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
        assert_param(IS_GPIO_PIN(GPIO_Pin));
  
        GPIOx->BSRR = GPIO_Pin;
      }

三、最后一步,查找asset_param定义就是题目发的那个定义了,我就郁闷了,这个怎么就能定义出GPIOC输出高电平呢?

谢谢!

使用特权

评论回复
板凳
lxyppc| | 2011-5-27 20:19 | 只看该作者
GPIOx->BSRR = GPIO_Pin; 这个才是输出高电平的语句

assert_param是检测 参数是否合法。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dosculler + 1
地板
airwill| | 2011-5-27 21:34 | 只看该作者
assert_param 是"断言", 关于这个的介绍很多哦

使用特权

评论回复
5
dosculler|  楼主 | 2011-5-30 13:49 | 只看该作者
这是断言机制。意思是在关闭断言的情况下,
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;意思是不执行任何操作。

在百度里查找到的,很不错

使用特权

评论回复
6
dosculler|  楼主 | 2011-5-30 14:23 | 只看该作者
本帖最后由 dosculler 于 2011-5-30 15:48 编辑

看了以上百度的,大概了解了这个过程,
依然谢谢!
最后一个问题:
DUBUG这个定义怎么没看到呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

329

帖子

1

粉丝