硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2352|回复: 3
收起左侧

[CMSIS-Driver] CMSIS-Driver的ETH驱动的局部变量不初始化是一个隐形bug

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2020-5-13 15:31:05 | 显示全部楼层 |阅读模式


这bug,一般还发现不了,切换不同优化等级有异常了。

因为局部变量用的是栈空间,是个随机值,大部分应用没什么,如果是配置寄存器什么的,就要特别注意了。

就像CMSIS-Driver里面的这种操作就是个大坑:

局部变量val初始化为0是最保险的,因为这个操作val &= ~XXXX操作确实没啥用,会导致没有配置的bit整成随机值,非常危险。

很容易导致PHY工作异常。
  1. static int32_t PHY_SetMode (uint32_t mode) {
  2.   uint16_t val;

  3.   if ((ETH.Flags & ETH_POWER) == 0U) { return ARM_DRIVER_ERROR; }

  4.   if (PHY_Read (LAN9220_PHY_ADDR, REG_PHY_BCONTROL, &val) != ARM_DRIVER_OK) {
  5.     return ARM_DRIVER_ERROR;
  6.   }

  7.   val &= ~(PHY_BCR_SPEED_SELECT_Msk | PHY_BCR_DUPLEX_MODE_Msk |
  8.            PHY_BCR_AN_ENABLE_Msk    | PHY_BCR_LOOPBACK_Msk);

  9.   switch (mode & ARM_ETH_PHY_SPEED_Msk) {
  10.     case ARM_ETH_PHY_SPEED_10M:
  11.       break;
  12.     case ARM_ETH_PHY_SPEED_100M:
  13.       val |= PHY_BCR_SPEED_SELECT_Msk;
  14.       break;
  15.     default:
  16.       return ARM_DRIVER_ERROR_UNSUPPORTED;
  17.   }

  18.   switch (mode & ARM_ETH_PHY_DUPLEX_Msk) {
  19.     case ARM_ETH_PHY_DUPLEX_HALF:
  20.       break;
  21.     case ARM_ETH_PHY_DUPLEX_FULL:
  22.       val |= PHY_BCR_DUPLEX_MODE_Msk;
  23.       break;
  24.   }

  25.   if (mode & ARM_ETH_PHY_AUTO_NEGOTIATE) {
  26.     val |= PHY_BCR_AN_ENABLE_Msk;
  27.   }

  28.   if (mode & ARM_ETH_PHY_LOOPBACK) {
  29.     val |= PHY_BCR_LOOPBACK_Msk;
  30.   }

  31.   if (mode & ARM_ETH_PHY_ISOLATE) {
  32.     return ARM_DRIVER_ERROR_UNSUPPORTED;
  33.   }

  34.   /* Apply configured mode */
  35.   return PHY_Write (LAN9220_PHY_ADDR, REG_PHY_BCONTROL, val);
  36. }
复制代码





回复

使用道具 举报

0

主题

34

回帖

34

积分

新手上路

积分
34
发表于 2020-5-13 18:37:48 | 显示全部楼层
吃过亏,在配置FSMC的时候,FSMC里面的配置项有13项,有11项需要配置,2项不需要配置的。然后定义fsmc结构体的时候没有={0},然后就出现BUG,找了好久。
回复

使用道具 举报

44

主题

562

回帖

699

积分

金牌会员

积分
699
发表于 2020-5-13 20:22:19 | 显示全部楼层
这局部变量这个bug很多地方都有着坑,被坑过,现在但凡自己写的都全部初始化赋值
回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
发表于 2020-5-14 09:31:17 | 显示全部楼层
登云钓月 发表于 2020-5-13 18:37
吃过亏,在配置FSMC的时候,FSMC里面的配置项有13项,有11项需要配置,2项不需要配置的。然后定义fsmc结构 ...

对的 我也遇到过 lcd用的fsmc lcd初始化函数放的位置不一样 有些时候就会跑飞 最后发现结构体一个成员没有赋值
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 17:34 , Processed in 0.191461 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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