[IAR笔记] - 自动生成编译时间 - 宏定义

文章介绍了如何使用IAR编译器的__DATE__和__TIME__宏定义来生成编译时的日期和时间,并通过宏转换将其转化为可读的格式,包括年、月、日、小时、分钟和秒。这种方法避免了手动修改版本信息的繁琐过程。
摘要由CSDN通过智能技术生成

[IAR笔记] - 自动生成编译时间 - 宏定义

  • 关于编程时, 总是需要有个更改版本号, 用来标识最新修改时间和修改内容; 或者,设定日期时间时,需要一个初始默认值;
  • 因为太过频繁手动修改, 感觉很不方便, 想让iar自动生成一个编译日期并写入程序中.
  • 百度查到确实有这么2个宏定义 __DATE____TIME__ , 不过这2个都是字符串形式, 需要额外的转换.
  • 如果还需要在程序上电后自行转换, 就很多余了. 我看到有人使用宏定义转换, 这样编译后就能得到想要的数据格式.
  • 我加以修改了一下, 得出下面的代码. 留作笔记, 日后有需要直接拿来用;

#ifndef _SYSTEM_TIME_H_
#define _SYSTEM_TIME_H_

// 年份 四个字符
#define BUILD_YEAR_CH0 (__DATE__[ 7 ])
#define BUILD_YEAR_CH1 (__DATE__[ 8 ])
#define BUILD_YEAR_CH2 (__DATE__[ 9 ])
#define BUILD_YEAR_CH3 (__DATE__[10 ])

// 月份 三个字符
#define BUILD_MONTH_IS_JAN (__DATE__[ 0 ] == 'J' && __DATE__[ 1 ] == 'a' && __DATE__[ 2 ] == 'n')
#define BUILD_MONTH_IS_FEB (__DATE__[ 0 ] == 'F')
#define BUILD_MONTH_IS_MAR (__DATE__[ 0 ] == 'M' && __DATE__[ 1 ] == 'a' && __DATE__[ 2 ] == 'r')
#define BUILD_MONTH_IS_APR (__DATE__[ 0 ] == 'A' && __DATE__[ 1 ] == 'p')
#define BUILD_MONTH_IS_MAY (__DATE__[ 0 ] == 'M' && __DATE__[ 1 ] == 'a' && __DATE__[ 2 ] == 'y')
#define BUILD_MONTH_IS_JUN (__DATE__[ 0 ] == 'J' && __DATE__[ 1 ] == 'u' && __DATE__[ 2 ] == 'n')
#define BUILD_MONTH_IS_JUL (__DATE__[ 0 ] == 'J' && __DATE__[ 1 ] == 'u' && __DATE__[ 2 ] == 'l')
#define BUILD_MONTH_IS_AUG (__DATE__[ 0 ] == 'A' && __DATE__[ 1 ] == 'u')
#define BUILD_MONTH_IS_SEP (__DATE__[ 0 ] == 'S')
#define BUILD_MONTH_IS_OCT (__DATE__[ 0 ] == 'O')
#define BUILD_MONTH_IS_NOV (__DATE__[ 0 ] == 'N')
#define BUILD_MONTH_IS_DEC (__DATE__[ 0 ] == 'D')

// 月份 第一个字符
#define BUILD_MONTH_CH0 \
        ((BUILD_MONTH_IS_OCT || BUILD_MONTH_IS_NOV || BUILD_MONTH_IS_DEC) ? '1' : '0')

// 月份 第二个字符
#define BUILD_MONTH_CH1 \
        ( \
          ( BUILD_MONTH_IS_JAN ) ? '1' : \
          ( BUILD_MONTH_IS_FEB ) ? '2' : \
          ( BUILD_MONTH_IS_MAR ) ? '3' : \
          ( BUILD_MONTH_IS_APR ) ? '4' : \
          ( BUILD_MONTH_IS_MAY ) ? '5' : \
          ( BUILD_MONTH_IS_JUN ) ? '6' : \
          ( BUILD_MONTH_IS_JUL ) ? '7' : \
          ( BUILD_MONTH_IS_AUG ) ? '8' : \
          ( BUILD_MONTH_IS_SEP ) ? '9' : \
          ( BUILD_MONTH_IS_OCT ) ? '0' : \
          ( BUILD_MONTH_IS_NOV ) ? '1' : \
          ( BUILD_MONTH_IS_DEC ) ? '2' : \
          /* error default */    '?' \
        )

// 天数 二个字符
#define BUILD_DAY_CH0 ((__DATE__[ 4 ] >= '0') ? (__DATE__[ 4 ]) : '0')
#define BUILD_DAY_CH1 (__DATE__[ 5 ])

// 小时 二个字符
#define BUILD_HOUR_CH0 (__TIME__[ 0 ])
#define BUILD_HOUR_CH1 (__TIME__[ 1 ])

// 分钟 二个字符
#define BUILD_MIN_CH0 (__TIME__[ 3 ])
#define BUILD_MIN_CH1 (__TIME__[ 4 ])

// 秒数 二个字符
#define BUILD_SEC_CH0 (__TIME__[ 6 ])
#define BUILD_SEC_CH1 (__TIME__[ 7 ])

// 合成一个字符串
#define BUILD_TIME_STRING   {\
        BUILD_YEAR_CH0,     BUILD_YEAR_CH1,     BUILD_YEAR_CH2,     BUILD_YEAR_CH3, \
        BUILD_MONTH_CH0,    BUILD_MONTH_CH1,    \
        BUILD_DAY_CH0,      BUILD_DAY_CH1,      \
        BUILD_HOUR_CH0,     BUILD_HOUR_CH1,     \
        BUILD_MIN_CH0,      BUILD_MIN_CH1,      \
        BUILD_SEC_CH0,      BUILD_SEC_CH1,      }


// 年份 四个字符
#define BUILD_YEAR_CH0_N    (BUILD_YEAR_CH0 - '0')
#define BUILD_YEAR_CH1_N    (BUILD_YEAR_CH1 - '0')
#define BUILD_YEAR_CH2_N    (BUILD_YEAR_CH2 - '0')
#define BUILD_YEAR_CH3_N    (BUILD_YEAR_CH3 - '0')
#define BUILD_YEAR_N        (BUILD_YEAR_CH0_N * 1000 + BUILD_YEAR_CH1_N * 100 + BUILD_YEAR_CH2_N * 10 + BUILD_YEAR_CH3_N * 1)
#define BUILD_YEAR2_N       (BUILD_YEAR_CH2_N * 10 + BUILD_YEAR_CH3_N * 1)

// 月份 二个字符
#define BUILD_MONTH_CH0_N   (BUILD_MONTH_CH0 - '0')
#define BUILD_MONTH_CH1_N   (BUILD_MONTH_CH1 - '0')
#define BUILD_MONTH_N       (BUILD_MONTH_CH0_N * 10 + BUILD_MONTH_CH1_N * 1)

// 天数 二个字符
#define BUILD_DAY_CH0_N     (BUILD_DAY_CH0 - '0')
#define BUILD_DAY_CH1_N     (BUILD_DAY_CH1 - '0')
#define BUILD_DAY_N         (BUILD_DAY_CH0_N * 10 + BUILD_DAY_CH1_N * 1)

// 小时 二个字符
#define BUILD_HOUR_CH0_N    (BUILD_HOUR_CH0 - '0')
#define BUILD_HOUR_CH1_N    (BUILD_HOUR_CH1 - '0')
#define BUILD_HOUR_N        (BUILD_HOUR_CH0_N * 10 + BUILD_HOUR_CH1_N * 1)

// 分钟 二个字符
#define BUILD_MIN_CH0_N     (BUILD_MIN_CH0 - '0')
#define BUILD_MIN_CH1_N     (BUILD_MIN_CH1 - '0')
#define BUILD_MIN_N         (BUILD_MIN_CH0_N * 10 + BUILD_MIN_CH1_N * 1)

// 秒数 二个字符
#define BUILD_SEC_CH0_N     (BUILD_SEC_CH0 - '0')
#define BUILD_SEC_CH1_N     (BUILD_SEC_CH1 - '0')
#define BUILD_SEC_N         (BUILD_SEC_CH0_N * 10 + BUILD_SEC_CH1_N * 1)

// 日期 32位的 十六进制显示
#define BUILD_DATE_HEX     ((BUILD_DAY_CH1_N   << 4*0) | (BUILD_DAY_CH0_N   << 4*1) | \
                            (BUILD_MONTH_CH1_N << 4*2) | (BUILD_MONTH_CH0_N << 4*3) | \
                            (BUILD_YEAR_CH3_N  << 4*4) | (BUILD_YEAR_CH2_N  << 4*5) )

// 时间 32位的 十六进制显示
#define BUILD_TIME_HEX     ((BUILD_SEC_CH1_N   << 4*0) | (BUILD_SEC_CH0_N   << 4*1) | \
                            (BUILD_MIN_CH1_N   << 4*2) | (BUILD_MIN_CH0_N   << 4*3) | \
                            (BUILD_HOUR_CH1_N  << 4*4) | (BUILD_HOUR_CH0_N  << 4*5) )

// 年月 16位的 十六进制显示
#define BUILD_YM_HEX       ((BUILD_MONTH_CH1_N << 4*0) | (BUILD_MONTH_CH0_N << 4*1) | \
                            (BUILD_YEAR_CH3_N  << 4*2) | (BUILD_YEAR_CH2_N  << 4*3) )

// 日时 16位的 十六进制显示
#define BUILD_DH_HEX       ((BUILD_HOUR_CH1_N  << 4*0) | (BUILD_HOUR_CH0_N  << 4*1) | \
                            (BUILD_DAY_CH1_N   << 4*2) | (BUILD_DAY_CH0_N   << 4*3) )

// 分秒 16位的 十六进制显示
#define BUILD_MS_HEX       ((BUILD_SEC_CH1_N   << 4*0) | (BUILD_SEC_CH0_N   << 4*1) | \
                            (BUILD_MIN_CH1_N   << 4*2) | (BUILD_MIN_CH0_N   << 4*3) )


#endif /* _SYSTEM_TIME_H_ */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值