打印
[其他]

华大MCU函数库中关于boolean类型值判断的建议

[复制链接]
865|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
lesheng002|  楼主 | 2020-7-3 16:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
最近用华大 HC32L176KATA开发过程中发现一个问题,
引脚PC11控制LED指示灯,调用函数Gpio_WriteOutputIO(GpioPortC, GpioPin11, x&0x80),
程序中用这个函数来驱动LED灯,结果亮了之后不灭,单步调试,用万用表量IO脚也是低电平,用示波器看波形也一直是低电平,我去,什么情况啊,做了N年的单片机,
就这么个简单的东西,也搞不定,奇了怪了。
然后看华大公司的DEMO,发现是用Gpio_SetIO()和Gpio_ClrIO()2个函数
将程序中的Gpio_WriteOutputIO换成这2个函数,指示灯显示正常。

虽然是解决问题了,但还是很奇怪,这3个函数最终都是操作管脚的输出寄存器,结果应该是一样的,那为什么我这里会不一样呢?
带着这个问题再调试时跟踪进入函数库中,当x = 0x80时,进入函数Gpio_WriteOutputIO后其值也是0x80,该函数调用
SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, bVal);
再进入SetBit函数中,
void SetBit(uint32_t addr, uint32_t offset, boolean_t bFlag)
{
    if(TRUE== bFlag)
    {
        *((volatile uint32_t *)(addr)) |= ((1UL)<<(offset));
    }
    else
    {
        *((volatile uint32_t *)(addr)) &= (~(1UL<<(offset)));
    }   
}

发现这个函数先判断表达式 (TRUE == bFlag),其中TRUE的定义是
  #define TRUE        ((boolean_t) 1u)

这就能理解了,传递给SetBit函数的第三个参数bFlag是0x80,这个值和TRUE(值为1)判断不等,因而执行的是else语句,结果是指示灯一直是亮着的

C99标准的定义boolean类型,有2个值,真和假,如果表达式求值是0,则该类型值为假,表达式求值非0则该类型值为真,
而华大库函数中,判断(TRUE==bFlag),TRUE的值是1,而bFlag值是0x80,不等,这个和C99标准就有些不同了
建议华大将库函数中的判断条件(TRUE==bFlag)改为(FALSE==bFlag),即
void SetBit(uint32_t addr, uint32_t offset, boolean_t bFlag)
{
    if(FALSE == bFlag)
    {
        *((volatile uint32_t *)(addr)) &= (~(1UL<<(offset)));
    }
    else
    {
        *((volatile uint32_t *)(addr)) |= ((1UL)<<(offset));
    }   
}


这样就和C99标准统一了,不会造成用户使用上的困惑。

使用特权

评论回复
评论
eelux 2020-7-13 13:52 回复TA
讲了这么多,说了很多正确的话,不过也都没错。 这个参数定义了TRUE、FALSE,就是可以让函数参数名见文知义,为什么非要传个数据呢? 
地板
lesheng002|  楼主 | 2020-7-4 16:06 | 只看该作者
caizhiwei 发表于 2020-7-4 11:19
这个问题严格来说,就是华大的驱动库的bug!
你调用方法完全是OK的

是啊,这个东西害的耽误了不少时间,还以为是自己的电路设计有问题,或者自己程序哪里写错了

使用特权

评论回复
评论
eelux 2020-7-13 14:26 回复TA
建议很好,但函数使用,传参也应该规范 
板凳
caizhiwei| | 2020-7-4 11:19 | 只看该作者
这个问题严格来说,就是华大的驱动库的bug!
你调用方法完全是OK的

使用特权

评论回复
评论
eelux 2020-7-13 14:02 回复TA
单IO的状态定义了TRUE和FALSE,其他数值是没有意义的。 C99的标准没有问题,但给单个IO赋值0x80是怎么样一个操作? 
沙发
caizhiwei| | 2020-7-4 11:19 | 只看该作者
我几年前在stm8单片机上遇到过,一样的

使用特权

评论回复
楼主
liaotian001| | 2020-7-3 22:59 | 只看该作者
软件人员需要好好学习一下

使用特权

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

本版积分规则

7

主题

88

帖子

0

粉丝