MS-RTOS 时间管理

更新时间:
2023-08-09
下载文档

MS-RTOS 时间管理

本章将介绍 MS-RTOS 时间管理接口的使用。

时间相关类型

类型描述
ms_timeval_t时间变量类型(1970 年 1 月 1 日 0 时 0 分 0 秒到现在的时间)
struct timevalposix 时间变量类型(1970 年 1 月 1 日 0 时 0 分 0 秒到现在的时间)
ms_tms_ttms 类型
struct tmsposix tms 类型
ms_tick_t32 位嘀嗒类型,一般用于表示等待的超时时间
ms_tick64_t64 位嘀嗒类型,一般用于表示内核心跳时间
ms_time_slice_t16 位的时间片类型,以嘀嗒为单位,有效范围 0 - 65534,0 为同优先级先来先服务调度策略,MS_TIME_SLICE_INVALID 为无效的时间片
ms_rtc_time_tRTC 时间类型
time_t1970 年 1 月 1 日 0 时 0 分 0 秒到现在的秒数

ms_timeval_t 与 struct timeval

时间变量类型:

typedef struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* and microseconds */
} ms_timeval_t;
参数说明
tv_sec秒数
tv_usec微秒数

ms_tms_t 与 struct tms

时间类型:

typedef struct tms {
    clock_t tms_utime;      /* user time */
    clock_t tms_stime;      /* system time */
    clock_t tms_cutime;     /* user time, children */
    clock_t tms_cstime;     /* system time, children */
} ms_tms_t;
参数说明
tms_utime在执行用户空间代码上的时间总量
tms_stime在执行内核空间代码上的时间总量
tms_cutime子进程在执行用户空间代码上的时间总量
tms_cstime子进程在执行内核空间代码上的时间总量

ms_tick_t

32 位嘀嗒类型一般用于表示等待的超时时间,等待的超时时间除了可以使用数值外,也可以使用以下的宏:

含义
MS_TIMEOUT_NO_WAIT0不等待
MS_TIMEOUT_FOREVER4294967295一直等待

一个嘀嗒的时间长度取决于 MS_CFG_KERN_TICK_HZ 配置项,如果 MS_CFG_KERN_TICK_HZ 为 100,则一个嘀嗒为 10 毫秒,如果 MS_CFG_KERN_TICK_HZ 为 1000,则一个嘀嗒为 1 毫秒。

ms_rtc_time_t

RTC 时间类型:

typedef struct {
#define MS_RTC_YEAR_BASE            2000U
    ms_uint8_t  year;       /* base 2000 */

#define MS_RTC_MONTH_JANUARY        1U
#define MS_RTC_MONTH_FEBRUARY       2U
#define MS_RTC_MONTH_MARCH          3U
#define MS_RTC_MONTH_APRIL          4U
#define MS_RTC_MONTH_MAY            5U
#define MS_RTC_MONTH_JUNE           6U
#define MS_RTC_MONTH_JULY           7U
#define MS_RTC_MONTH_AUGUST         8U
#define MS_RTC_MONTH_SEPTEMBER      9U
#define MS_RTC_MONTH_OCTOBER        10U
#define MS_RTC_MONTH_NOVEMBER       11U
#define MS_RTC_MONTH_DECEMBER       12U
    ms_uint8_t  month;

    ms_uint8_t  date;       /* 1-31 */

#define MS_RTC_WEEKDAY_MONDAY       1U
#define MS_RTC_WEEKDAY_TUESDAY      2U
#define MS_RTC_WEEKDAY_WEDNESDAY    3U
#define MS_RTC_WEEKDAY_THURSDAY     4U
#define MS_RTC_WEEKDAY_FRIDAY       5U
#define MS_RTC_WEEKDAY_SATURDAY     6U
#define MS_RTC_WEEKDAY_SUNDAY       7U
    ms_uint8_t  weekday;

    ms_uint8_t  hour;       /* 0-23 */
    ms_uint8_t  minute;     /* 0-59 */
    ms_uint8_t  second;     /* 0-59 */
} ms_rtc_time_t;

参数说明
year年,基于公元 2000 年,即 0 表示公元 2000 年,最大到公元 2255 年
month月, 1~12
date日, 1~31
weekday星期几,1~7
hour时,0-23
minute分,0~59
second秒,0~59

时间管理相关 API

下表展示了时间管理相关的 API 在两个权限空间下是否可用:

API用户空间内核空间
ms_time_get
ms_time_get_ms
ms_time_set
ms_time_tick_to_ms
ms_time_ms_to_tick
ms_time_tick_hz
ms_gettimeofday
ms_settimeofday
ms_is_leap_year
ms_hms_time_valid
ms_weekday_valid
ms_weekday_calc
ms_weekday_string
ms_rtc_time_valid
ms_rtc_time_to_timeval
ms_timeval_to_rtc_time

ms_time_get()

  • 描述 获得内核心跳时间(以嘀嗒为单位)

  • 函数原型

ms_tick64_t ms_time_get(void);
  • 参数

  • 返回值 内核心跳时间(以嘀嗒为单位)

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_tick64_t time_tick = ms_time_get();

    // do some thing

    return 0;
}

ms_time_get_ms()

  • 描述 获得内核心跳时间(以毫秒为单位)

  • 函数原型

ms_uint64_t ms_time_get_ms(void);
  • 参数

  • 返回值 内核心跳时间(以毫秒为单位)

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_uint64_t time_ms = ms_time_get_ms();

    // do some thing

    return 0;
}

ms_time_set()

  • 描述 设置内核心跳时间(以嘀嗒为单位)

  • 函数原型

void ms_time_set(ms_tick64_t tick);
  • 参数
输入/输出参数描述
[in]tick内核心跳时间(以嘀嗒为单位)
  • 返回值

  • 注意事项

  • 示例

void xxx(void)
{
    ms_time_set(600U);
}

ms_time_tick_to_ms()

  • 描述 嘀嗒数转毫秒数

  • 函数原型

ms_uint32_t ms_time_tick_to_ms(ms_tick_t tick);
  • 参数
输入/输出参数描述
[in]tick嘀嗒数
  • 返回值 毫秒数

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_uint32_t ms = ms_time_tick_to_ms(100U);

    // do some thing

    return 0;
}

ms_time_ms_to_tick()

  • 描述 毫秒数转嘀嗒数

  • 函数原型

ms_tick_t ms_time_ms_to_tick(ms_uint32_t ms);
  • 参数
输入/输出参数描述
[in]ms毫秒数
  • 返回值 嘀嗒数

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_tick_t tick = ms_time_ms_to_tick(100U);

    // do some thing

    return 0;
}

ms_time_tick_hz()

  • 描述 获得内核心跳的频率

  • 函数原型

ms_uint16_t ms_time_tick_hz(void);
  • 参数

  • 返回值 内核心跳的频率

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_uint16_t tick_hz = ms_time_tick_hz();

    // do some thing

    return 0;
}

ms_gettimeofday()

  • 描述 获得当前精确时间(1970 年 1 月 1 日到现在的时间)

  • 函数原型

ms_err_t ms_gettimeofday(ms_timeval_t *tv);
  • 参数
输入/输出参数描述
[out]tv当前精确时间
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_timeval_t tv;
    
    ms_gettimeofday(&tv);

    // do some thing

    return 0;
}

ms_settimeofday()

  • 描述 设置当前精确时间(1970 年 1 月 1 日到现在的时间)

  • 函数原型

ms_err_t ms_settimeofday(const ms_timeval_t *tv);
  • 参数
输入/输出参数描述
[in]tv当前精确时间
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_timeval_t tv;

    // do some thing
    
    ms_settimeofday(&tv);

    return 0;
}

ms_is_leap_year()

  • 描述 判断输入的年是否为闰年

  • 函数原型

ms_bool_t ms_is_leap_year(ms_uint16_t year);
  • 参数
输入/输出参数描述
[in]year年,基于 0
  • 返回值 MS_TRUE:是闰年,MS_FALSE:不是闰年

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_is_leap_year(2000U);

    return 0;
}

ms_hms_time_valid()

  • 描述 判断输入的时分秒是否有效

  • 函数原型

ms_bool_t ms_hms_time_valid(ms_uint8_t hour, ms_uint8_t min, ms_uint8_t sec);
  • 参数
输入/输出参数描述
[in]hour
[in]min
[in]sec
  • 返回值 MS_TRUE:有效,MS_FALSE:无效

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_hms_time_valid(10U, 10U, 10U);

    return 0;
}

ms_weekday_valid()

  • 描述 判断输入的星期几是否为有效

  • 函数原型

ms_bool_t ms_weekday_valid(ms_uint8_t weekday);
  • 参数
输入/输出参数描述
[in]weekday星期几数值
  • 返回值 MS_TRUE:有效,MS_FALSE:无效

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_weekday_valid(1U);

    return 0;
}

ms_weekday_calc()

  • 描述 计算某天是星期几

  • 函数原型

ms_uint8_t ms_weekday_calc(ms_uint16_t year, ms_uint8_t month, ms_uint8_t date);
  • 参数
输入/输出参数描述
[in]year年,基于 0,必须 >= 2000
[in]month
[in]date
  • 返回值 日期对应的星期几

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_weekday_calc(2000U, 1U, 1U);

    return 0;
}

ms_weekday_string()

  • 描述 获得星期几对应的字符串

  • 函数原型

const char *ms_weekday_string(ms_uint8_t weekday);
  • 参数
输入/输出参数描述
[in]weekday星期几
  • 返回值 星期几对应的字符串

  • 注意事项

  • 示例

int main(int argc, char *argv[])
{
    ms_printf(ms_weekday_string(1U));

    return 0;
}

ms_rtc_time_valid()

  • 描述 判断输入的 RTC 时间是否有效

  • 函数原型

ms_bool_t ms_rtc_time_valid(const ms_rtc_time_t *rtc_time);
  • 参数
输入/输出参数描述
[in]rtc_timeRTC 时间
  • 返回值 MS_TRUE:有效,MS_FALSE:无效

  • 注意事项

  • 示例

ms_rtc_time_to_timeval()

  • 描述 将 RTC 时间转换为 timeval 结构时间

  • 函数原型

ms_err_t ms_rtc_time_to_timeval(const ms_rtc_time_t *rtc_time, ms_timeval_t *tv);
  • 参数
输入/输出参数描述
[in]rtc_timeRTC 时间
[out]tvtimeval 结构时间
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

ms_timeval_to_rtc_time()

  • 描述 将 timeval 结构时间转换为 RTC 时间

  • 函数原型

ms_err_t ms_timeval_to_rtc_time(const ms_timeval_t *tv, ms_rtc_time_t *rtc_time);
  • 参数
输入/输出参数描述
[in]tvtimeval 结构时间
[out]rtc_timeRTC 时间
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 timeval 结构时间表示的时间必须大于 2000 年 1 月 1 日 0 时 0 分 0 秒

  • 示例

文档内容是否对您有所帮助?
有帮助
没帮助