做一个小试验,安装了例外检查,结果发现官方库的一个例外。
stm32f407vetx,STM32Cube_FW_F4_V1.21.0/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c
的HAL_RTC_SetDate函数中,大约652行,应该是明显的错误。简化版本为:
- HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
- {
- uint32_t datetmpreg = 0U;
- 。。。
- if(Format == RTC_FORMAT_BIN)
- { 。。。
- }
- else
- {
- assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(sDate->Year)));
- assert_param(IS_RTC_MONTH(datetmpreg));
- assert_param(IS_RTC_DATE(datetmpreg));
- datetmpreg = ((((uint32_t)sDate->Year) << 16U) | \
- (((uint32_t)sDate->Month) << 8U) | \
- ((uint32_t)sDate->Date) | \
- (((uint32_t)sDate->WeekDay) << 13U));
- }
复制代码
此时,datetmpreg为0,会引发两次assert_param例外。
怀疑此处参数检查本意是检查传入的年月日是否正确,但意外检查了一个临时变量,因为月,日为0,不符合要求。
估计应该替换为
assert_param(IS_RTC_MONTH(sDate->Month));
assert_param(IS_RTC_DATE(sDate->Date));
之所以错误比较隐蔽,一般情况下,生成的void assert_failed(uint8_t* file, uint32_t line)函数是空白的,自动被忽略了。
恰巧我实现了该函数,导致引发了一系列异常输出才偶然发现。
|