MS-RTOS 时间管理
本章将介绍 MS-RTOS 时间管理接口的使用。
时间相关类型
类型 | 描述 |
---|---|
ms_timeval_t | 时间变量类型(1970 年 1 月 1 日 0 时 0 分 0 秒到现在的时间) |
struct timeval | posix 时间变量类型(1970 年 1 月 1 日 0 时 0 分 0 秒到现在的时间) |
ms_tms_t | tms 类型 |
struct tms | posix tms 类型 |
ms_tick_t | 32 位嘀嗒类型,一般用于表示等待的超时时间 |
ms_tick64_t | 64 位嘀嗒类型,一般用于表示内核心跳时间 |
ms_time_slice_t | 16 位的时间片类型,以嘀嗒为单位,有效范围 0 - 65534,0 为同优先级先来先服务调度策略,MS_TIME_SLICE_INVALID 为无效的时间片 |
ms_rtc_time_t | RTC 时间类型 |
time_t | 1970 年 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_WAIT | 0 | 不等待 |
MS_TIMEOUT_FOREVER | 4294967295 | 一直等待 |
一个嘀嗒的时间长度取决于 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_time | RTC 时间 |
返回值 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_time | RTC 时间 |
[out] | tv | timeval 结构时间 |
返回值 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] | tv | timeval 结构时间 |
[out] | rtc_time | RTC 时间 |
返回值 MS-RTOS 内核错误码
注意事项 timeval 结构时间表示的时间必须大于 2000 年 1 月 1 日 0 时 0 分 0 秒
示例 无