在tos_time.h中给我们提供了一些获取系统时间,修改系统时间以及tick转换毫秒,日期转换tick的函数
/**
* @brief Get system tick.
*/
__API__ k_tick_t tos_systick_get(void);//获取系统时间
/**
* @brief Set system tick.
*/
__API__ void tos_systick_set(k_tick_t tick);//设置系统时间
/**
* @brief Convert ticks to milliseconds.
* @return milliseconds equals to the ticks.
*/
__API__ k_time_t tos_tick2millisec(k_tick_t tick);//tick转换毫秒
/**
* @brief Convert milliseconds to ticks.
* Convert milliseconds to ticks.
* @return ticks equals to the millisecond.
*/
__API__ k_tick_t tos_millisec2tick(k_time_t millisec);//毫秒转换tick
/**
* @brief Sleep current task.
* Sleep for a specified amount of milliseconds.
*/
__API__ k_err_t tos_sleep_ms(k_time_t millisec);//让当前任务休眠Nms
/**
* @brief Sleep current task.
* Sleep for a specified amount of time.
*
* @attention None
*
* @param[in] hour amount of hours.
* @param[in] minute amount of minutes.
* @param[in] second amount of seconds.
* @param[in] millisec amount of milliseconds.
*
* @return errcode
* @retval #K_ERR_DELAY_ZERO time is zero.
* @retval #K_ERR_NONE return successfully.
*/
__API__ k_err_t tos_sleep_hmsm(k_time_t hour, k_time_t minute, k_time_t second, k_time_t millisec);//休眠具体时间
测试案例
void task1_handler(void* arg)
{
while(1)
{
printf("当前系统时间%llu \n",tos_systick_get());
tos_systick_set(1000);
printf("修改后系统时间%llu \n",tos_systick_get());
printf("1000tick为:%dms\n",tos_tick2millisec(1000));
printf("100ms为:%llutick\n",tos_millisec2tick(100));
printf("当前系统时间 %llu\n",tos_systick_get());
printf("休息1s\n");
tos_sleep_ms(1000);
printf("当前系统时间 %llu\n",tos_systick_get());
printf("休息10m\ns");
tos_sleep_hmsm(0,0,0,10);
printf("当前系统时间 %llu\n",tos_systick_get());
}
}
实验结果
在tos_timer.h提供了软件定时器功能在tos_config.h中使能并控制其上下文环境是中断还是任务;
#define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否开启软件定时器模块
#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式
常用定时器函数
/**
* @brief Create a timer.
* Create a timer.
*
* @attention I dont't think a timer need a name. If you do, help yourself.
*
* @param[in] tmr pointer to the handler of the timer.
* @param[in] delay time interval for a timer to run.
* @param[in] period period for a timer to restart to run.
* @param[in] callback callback function called when the timer expires.
* @param[in] cb_arg argument for the callback.
* @param[in] opt option for the function call.
*
* @return errcode
* @retval #K_ERR_TIMER_INVALID_PERIOD period is invalid.
* @retval #K_ERR_TIMER_INVALID_DELAY delay is invalid.
* @retval #K_ERR_NONE return successfully.
*/
__API__ k_err_t tos_timer_create(k_timer_t *tmr, k_tick_t delay, k_tick_t period,
k_timer_callback_t callback, void *cb_arg, k_opt_t opt)//静态创建定时器
__API__ k_err_t tos_timer_destroy(k_timer_t *tmr);//销毁静态定时器
__API__ k_err_t tos_timer_start(k_timer_t *tmr);
__API__ k_err_t tos_timer_stop(k_timer_t *tmr);
__API__ k_err_t tos_timer_period_change(k_timer_t *tmr, k_tick_t period);//修改定时器周期
还有一组动态创建,可以自己去源文件查看;
定时器参数 delay与 period的区别在于delay是第一次启动的延时period是循环的周期
使用案例
void timer1_hanlder(void* arg)
{
printf("timer1 running\n");
}
void timer2_hanlder(void* arg)
{
printf("timer2 running\n");
}
void task1_handler(void* arg)
{
k_timer_t timer1;
k_timer_t timer2;
tos_timer_create(&timer1,1000,0,timer1_hanlder,NULL,TOS_OPT_TIMER_ONESHOT);
tos_timer_create(&timer1,2000,500,timer2_hanlder,NULL,TOS_OPT_TIMER_PERIODIC);
tos_timer_start(&timer1);
tos_timer_start(&timer2);
while(1)
{
tos_task_delay(1000);
printf("task1 running\n");
}
}
实验现象