本章代码仓库:
bash
git clone https://gitee.com/jumayusi/unit8-gd32-rtc.git
8.1 如何实现时间戳和日历之间的转换
RTC基本硬件结构

外设结构框图,与STM32F103系列一样,GD32F303没有影子寄存器,想要实现万年历功能只能通过软件转换。

Unix时间戳

C标准库的time.h中,提供了日历时间和时间戳相互转换的相关函数:

我们主要会用第三和第四个函数。
time_t是对uint32_t的重定义,tm的定义如下:

C语言回顾:

8.2 使用指针函数的注意事项
本节课讨论的要点是如何在指针函数中返回一个有效的内存地址给其他函数去使用。
cpp
struct tm *Test(void)
{
return (struct tm *)malloc(sizeof(struct tm));
}
struct tm *timeInfo=NULL;
timeInfo=Test();
printf("address of timeInfo is 0x%p\r\n",timeInfo);
timeInfo=Test();
printf("address of timeInfo is 0x%p\r\n",timeInfo);
思考上面两次打印的结果是否一致?答案肯定是不一致的。每次调用malloc函数时,堆管理器(Heap Manager)都会从系统的动态内存堆中分配一块新的、独立的内存空间。
cpp
timeInfo=gmtime(&timeStamp);
printf("address of timeInfo is 0x%p\r\n",timeInfo);
timeInfo=gmtime(&timeStamp);
printf("address of timeInfo is 0x%p\r\n",timeInfo);
对比gmtime函数的输出结果可知,gmtime内部使用了静态全局变量。
