针对RTC驱动中出现3处警告的问题,原因是函数指针类型不兼容。以下是详细解决方案:
新版drv_rtc框架要求rt_rtc_ops结构体中的函数指针具有特定参数类型,而当前实现的函数参数类型不匹配:
// 旧版错误定义(引发警告)
static rt_err_t stm32_rtc_get_secs(void *args);
static rt_err_t stm32_rtc_set_secs(void *args);
static rt_err_t stm32_rtc_get_timeval(void *args); // 您已修复此函数修改drv_rtc.c中的三个函数定义及调用方式:
// 修改函数参数为具体类型指针
static rt_err_t stm32_rtc_get_secs(rt_time_t *sec)
{
*sec = (rt_time_t)(RTC_DateToTimeStamp() / 1000);
return RT_EOK;
}static rt_err_t stm32_rtc_set_secs(rt_time_t sec)
{
// 将秒数转换为日期时间并写入RTC
RTC_TimeStampToDate(sec * 1000);
return RT_EOK;
}
// 您已修正的部分(保持如下)
static rt_err_t stm32_rtc_get_timeval(struct timeval *tv)
{
uint64_t ns = RTC_DateToTimeStamp();
tv->tv_sec = ns / 1000000000;
tv->tv_usec = (ns % 1000000000) / 1000;
return RT_EOK;
}
2. **检查rt_rtc_ops结构体赋值**
确保结构体成员指向修正后的函数:
```c
static const struct rt_rtc_ops stm32_rtc_ops = {
.init = stm32_rtc_init,
.get_secs = stm32_rtc_get_secs, // 指向新修正函数
.set_secs = stm32_rtc_set_secs, // 指向新修正函数
.get_timeval = stm32_rtc_get_timeval // 指向您已修正的函数
};| 函数名 | 旧参数类型 | 新参数类型 | 作用 |
|---|---|---|---|
stm32_rtc_get_secs | void * | rt_time_t * | 获取秒级时间戳 |
stm32_rtc_set_secs | void * | rt_time_t * | 设置秒级时间戳 |
stm32_rtc_get_timeval | void * | struct timeval * | 获取微秒级时间(您已修复) |
-Wincompatible-pointer-types警告消失date命令测试RTC时间读取/设置功能get_timeval的微秒级精度
开发者建议:此类问题通常源于RT-Thread驱动框架升级时的接口变更。建议定期同步官方最新驱动实现,并关注
rt_rtc_ops结构体的类型定义(位于rt-thread/components/drivers/include/drivers/rtc.h)。
通过以上修改即可彻底解决警告问题,同时确保RTC功能的兼容性和稳定性。
举报
更多回帖