开放原子训练营(第四季)TobudOs--TobudOs基础内核学习(二)软件定时器与时间管理

在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");
		
		}
}

实验现象

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值