问题背景:项目过程中,为了防止I2c挂死,添加I2c防挂死机制,防挂死机制如下:
uint32_t I2cWriteData(uint32_t addr, uint8_t *regaddr, uint8_t *data, uint8_t datalen)
{
uint32_t ret = i2cwrite驱动(addr,regaddr,datalen);//中间又重试
if(ret != success)
{
1.将本芯片的SDA和SCL管脚配置成普通GPIO,并将SCL管脚拉高拉低9个周期
2.重新配置i2c功能
3.Reset 该次i2c失败的外设
4.初始化配置这个外设(里面有 I2cWriteData函数)
}
return ret;
}
问题就出现在上面的第4步,因为该操作里面又有I2cWriteData函数,势必就形成了函数递归,如果i2c能够恢复还好,若一直恢复不了,势必造成死循环,卡在这个函数出不来!
问题反思:慎用递归,如有递归,必有退出条件!!!