|
这bug,一般还发现不了,切换不同优化等级有异常了。
因为局部变量用的是栈空间,是个随机值,大部分应用没什么,如果是配置寄存器什么的,就要特别注意了。
就像CMSIS-Driver里面的这种操作就是个大坑:
局部变量val初始化为0是最保险的,因为这个操作val &= ~XXXX操作确实没啥用,会导致没有配置的bit整成随机值,非常危险。
很容易导致PHY工作异常。
- static int32_t PHY_SetMode (uint32_t mode) {
- uint16_t val;
- if ((ETH.Flags & ETH_POWER) == 0U) { return ARM_DRIVER_ERROR; }
- if (PHY_Read (LAN9220_PHY_ADDR, REG_PHY_BCONTROL, &val) != ARM_DRIVER_OK) {
- return ARM_DRIVER_ERROR;
- }
- val &= ~(PHY_BCR_SPEED_SELECT_Msk | PHY_BCR_DUPLEX_MODE_Msk |
- PHY_BCR_AN_ENABLE_Msk | PHY_BCR_LOOPBACK_Msk);
- switch (mode & ARM_ETH_PHY_SPEED_Msk) {
- case ARM_ETH_PHY_SPEED_10M:
- break;
- case ARM_ETH_PHY_SPEED_100M:
- val |= PHY_BCR_SPEED_SELECT_Msk;
- break;
- default:
- return ARM_DRIVER_ERROR_UNSUPPORTED;
- }
- switch (mode & ARM_ETH_PHY_DUPLEX_Msk) {
- case ARM_ETH_PHY_DUPLEX_HALF:
- break;
- case ARM_ETH_PHY_DUPLEX_FULL:
- val |= PHY_BCR_DUPLEX_MODE_Msk;
- break;
- }
- if (mode & ARM_ETH_PHY_AUTO_NEGOTIATE) {
- val |= PHY_BCR_AN_ENABLE_Msk;
- }
- if (mode & ARM_ETH_PHY_LOOPBACK) {
- val |= PHY_BCR_LOOPBACK_Msk;
- }
- if (mode & ARM_ETH_PHY_ISOLATE) {
- return ARM_DRIVER_ERROR_UNSUPPORTED;
- }
- /* Apply configured mode */
- return PHY_Write (LAN9220_PHY_ADDR, REG_PHY_BCONTROL, val);
- }
复制代码
|
|