|
大家在做单片机开发时估计都用过printf()函数吧。这对于向上位机输出一条日志或者调试信息都是非常方便的。它在STM32 RealView开发环境下的使用前提是在工程中启用MicroLib,然后实现int fputc(int ch, FILE *f)函数。这个fputc()函数的定义就是在<stdio.h>中定义的,它属于C标准库的内容,其实标准库中还有很多其他类似的函数,比如说我下面要提到的<time.h>中的一些函数。
因为是标准库的函数,所以它与android,linux,windows等时髦操作系统下的同名函数的使用方法和意义是完全一样的。这就方便了我们代码移植,更重要的是在某些情况下方便了单片机与其它系统之间传递数据,比如说我马上要提到的时间数据。
在此先补充说明下,计算机操作系统中所使用的时间是UNIX时间戳。所谓UNIX时间戳是指从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix系统、类Unix系统中,也在许多其他操作系统中被广泛采用。当前世界大部分使用UNIX的系统都是用有符号32位表示的(即stm32中的int类型),它最多只能表示到2038年1月19日3时14分07秒,超过这个时间数据会因溢出而出现问题,这就是所谓的2038问题。关于这个问题要到2038年以后才会发作,所以我现在也不想操那个心,感兴趣的朋友可以上网了解下更详细的说明。但是用32位的UNIX时间作为系统间的时间数据进行传递确实是非常方便的,因为它数据量小,系统兼容性非常好,不需要进行任何转换工作。接下来我就一个一个介绍相关的函数,稍后我会把代码贴出来供大家讨论,如果发现有问题还希望大家反馈给我。
首先是bsp驱动,包括初始化函数RTC_Init()和设置时间函数RTC_Set()。
接下来就是<time.h>中的相关函数,我只实现了我认为最重要的函数
time_t time(time_t *time);
time_t mktime(struct tm *timeptr);
struct tm *gmtime(const time_t *timer);
以及辅助函数
static int getTotalDays(int year, int month, int day);
因为gmtime函数需要用到<stdlib.h>中的malloc函数,有时不希望使用该函数,所以我还实现了一个他的变体函数
UINT8 gmtime2(struct tm *time, const time_t *timer); |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|