打印
[APM32F1]

C标准库time.h可以在单片机上面使用吗?

[复制链接]
468|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Bowclad|  楼主 | 2022-9-14 20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到c的标准库里有这个函数,不知道能不能用在上面?

使用特权

评论回复
沙发
编号10086| | 2022-9-15 10:07 | 只看该作者
/** 
* @author: FlyyingPiggy2020
* @data: 2022-09-08 09:33:10
* @last_author: FlyyingPiggy2020 154562451@qq.com
* @last_time: 2022-09-08 16:26:32
* @brief: 和应用代码无关的函数,用于数学计算等。
* @copyright: copyright(c) 2022 by FlyyingPiggy2020, All Rights Reserved.
*/
#include "fp.h"
#include "fp_user_lib.h"


/**
* [url=home.php?mod=space&uid=247401]@brief[/url] 获取从1970年1月1日0时0分0秒至今的秒数
* @param {tm} tm_now
* [url=home.php?mod=space&uid=266161]@return[/url] {*}
*/
uint32_t fp_mktime(tm_t tm_now)
{
    uint16_t year = tm_now.tm_year;
    int16_t mon = tm_now.tm_mon;
    uint16_t day = tm_now.tm_mday;
    uint16_t hour = tm_now.tm_hour;
    uint16_t min = tm_now.tm_min;
    uint16_t sec = tm_now.tm_sec;
       
        mon = mon - 2;
    if ( mon <= 0)
        {
        mon += 12;
        year -= 1;
    }
    return (((
             (uint32_t) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
             year*365 - 719499
          )*24 + hour /* now have hours */
       )*60 + min /* now have minutes */
    )*60 + sec; /* finally seconds */
};

/**
* @brief 从1970年1月1日0时0分0秒至今的秒数 转换成 年月日 具体格式参考 struct tm
* @param {tm} tm_time  {uint32_t} timestamp
* @return {*}
*/
void fp_gmtime(struct tm *tm_time, uint32_t timestamp)
{
        uint16_t four_year_num; /* 有多少个四年 */
        uint16_t one_year_hours;/* 一年的小时数 */
       
        const static uint8_t days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};/* 非闰年每月天数 */
        const static uint16_t ONE_YEAR_HOURS = 8760; /* 非闰年的小时数 365 * 24 */
        const static uint16_t FOUR_YEAR_HOURS = 35064;/* 四年的小时数(365 * 3 + 366)* 24  */
       
        if (timestamp >= 0X7FFFFFFF)
        {
                return;
        }
       
        tm_time->tm_isdst  = 0;
        tm_time->tm_sec = (int32_t)(timestamp % 60); /* 秒 */
        timestamp /= 60;
       
        tm_time->tm_min = (int32_t)(timestamp % 60); /* 分 */
        timestamp /= 60;
       
        tm_time->tm_wday = (int32_t)(timestamp/24 + 4) % 7; /* 计算星期 1970年1月1日是星期四 */
       
        four_year_num = timestamp / FOUR_YEAR_HOURS;
       
        tm_time->tm_year = (four_year_num << 2) + 1970; /* 计算年 */
       
        timestamp %= FOUR_YEAR_HOURS; /* 不足四年的小时数 */
       
        while(1)
        {
                one_year_hours = ONE_YEAR_HOURS;
                if ((tm_time->tm_year & 3) == 0)
                {
                        one_year_hours += 24;
                }
               
                if (timestamp < one_year_hours)
                {
                        break;
                }
               
                tm_time->tm_year++;
                timestamp -= one_year_hours;
        }       
        tm_time->tm_hour = (int32_t)(timestamp % 24); /* 计算时 */
       
        timestamp /=  24; /* 一年中剩下的天数 */
        timestamp++;
       
        tm_time->tm_yday = timestamp - 1; /* 计算天  */
       
        if ((tm_time->tm_year & 3) == 0)
        {
                if (timestamp > 60)
                {
                        timestamp--;
                }
                else if (timestamp == 60)
                {
                        tm_time->tm_mon = 1;
                        tm_time->tm_mday = 29;
                        return;
                }
        }
       
        for (tm_time->tm_mon = 0;  days[tm_time->tm_mon] < timestamp; tm_time->tm_mon++)
        {
                timestamp -= days[tm_time->tm_mon];
        }
        tm_time->tm_mon++;
        tm_time->tm_yday++;
        tm_time->tm_mday = (int32_t)(timestamp);
       
}

/* 测试例程 */
void fp_time_test_demo(void)
{
    tm_t tm_now,tm_test;
    uint32_t time;
   
    tm_now.tm_year = 2022;
    tm_now.tm_mon = 9;
    tm_now.tm_mday = 8;
    tm_now.tm_hour = 15;
    tm_now.tm_min = 12;
    tm_now.tm_sec = 0;

    time = fp_mktime(tm_now);
        fp_gmtime(&tm_test,time);
}

使用特权

评论回复
板凳
编号10086| | 2022-9-15 10:08 | 只看该作者
主要是mktime和gmtime两个函数,可以自己写。

/** 
* @author: FlyyingPiggy2020
* @data: 2022-09-08 09:33:10
* @last_author: FlyyingPiggy2020 154562451@qq.com
* @last_time: 2022-09-08 14:22:47
* @brief:
* @copyright: copyright(c) 2022 by FlyyingPiggy2020, All Rights Reserved.
*/
#ifndef __FP_USER_LIB_H__
#define __FP_USER_LIB_H__

#include <stdint.h>
typedef struct tm
{
    int16_t tm_sec;         /* 秒 – 取值区间为[0,59] */
    int16_t tm_min;         /* 分 - 取值区间为[0,59] */
    int16_t tm_hour;        /* 时 - 取值区间为[0,23] */
    int16_t tm_mday;        /* 一个月中的日期 - 取值区间为[1,31] */
    int16_t tm_mon;         /* 月份(从一月开始,1代表一月) - 取值区间为[1,12] */
    int16_t tm_year;        /* 年份 */
    int16_t tm_wday;        /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一 */
    int16_t tm_yday;        /* 从每年1月1日开始的天数– 取值区间[1,366],其中1代表1月1日 */
    int16_t tm_isdst;       /* 夏令时标识符,夏令时tm_isdst为正;不实行夏令时tm_isdst为0 */   
}tm_t;

uint32_t fp_mktime(tm_t tm_now);

void fp_gmtime(struct tm *tm_time, uint32_t timestamp);
#endif

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

130

主题

2281

帖子

1

粉丝