> 文档中心 > HarmonyOS系统中内核定时器的实现

HarmonyOS系统中内核定时器的实现

    大家好,今天主要和大家聊一聊,如何使用HarmonyOS系统中的定时器

 

目录

第一:定时器基本简介

第二:Timer API函数分析

第三:软件设计

第四:编译与调试

第五:运行结果


第一:定时器基本简介

     内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 和 kernel/timer.c 文件中。被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中。

第二:Timer API函数分析

    osTimerNew()

osTimerId_t osTimerNew(osTimerFunc_t func,osTimerType_t type,void *argument,const osTimerAttr_t *attr)

    功能实现描述:

    函数osTimerNew创建一个一次性或周期性计时器,并将其与一个带参数的回调函数相关联。计时器在osTimerStart启动之前一直处于停止状态。可以在RTOS启动(调用osKernelStart)之前安全调用该函数,但不能在内核初始化 (调用 osKernelInitialize)之前调用该函数。

     注意:不能在中断服务中调用该函数

参数:

名字 描述
func 函数指针指向回调函数.
type 定时器类型,osTimerOnce表示单次定时器,osTimerPeriodic周期表示周期性定时器.
argument 定时器回调函数的参数
attr 计时器属性

    osTimerStart()

osStatus_t osTimerStart(osTimerId_t timer_id,uint32_t ticks)

    功能描述:

    函数osTimerStart启动或重新启动指定参数timer_id的计时器。参数ticks指定计时器的计数值。

    注意:不能在中断服务调用该函数

参数:

名字 描述
timer_id 由osTimerNew获得的计时器ID.
ticks 时间滴答计时器的值.

第三:软件设计

    主要代码分析

    在Timer_example函数中,通过osTimerNew()函数创建了回调函数为Timer1_Callback的定时器1,并通过osTimerStart()函数将该定时器设置为100个tick,因为hi3861默认10ms为一个tick,所以100个tick正好为1S钟,1S计时到后会触发Timer1_Callback()函数并打印日志。定时器2也同理为3S触发Timer2_Callback()函数并打印日志。

void Timer_example (void) {    osTimerId_t id1, id2;    // timer id    uint32_t    timerDelay;  // timer value    osStatus_t  status;      // function return status    // Create periodic timer    exec1 = 1U;    id1 = osTimerNew(Timer1_Callback, osTimerPeriodic, &exec1, NULL);    if (id1 != NULL)  { timerDelay = 100U;// Hi3861 1U=10ms,100U=1S status = osTimerStart(id1, timerDelay);// start timer if (status != osOK) { // Timer could not be started }    }    // Create periodic timer    exec2 = 1U;    id2 = osTimerNew(Timer2_Callback, osTimerPeriodic, &exec2, NULL);    if (id2 != NULL)  { timerDelay = 300U;// Hi3861 1U=10ms,300U=3S status = osTimerStart(id2, timerDelay);// start timer if (status != osOK) { // Timer could not be started }    }  }

第四:编译与调试

修改BUILD.gn文件

修改applications\BearPi\BearPi-HM_Nano\sample路径下 BUILD.gn 文件,指定 timer_example 参与编译。

#"A1_kernal_thread:thread_example","A2_kernel_timer:timer_example",#"A3_kernel_event:event_example",#"A4_kernel_mutex:mutex_example",#"A5_kernel_semaphore:semaphore_example",#"A6_kernel_message:message_example",

第五:运行结果

    示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,Timer1_Callback会1S打印一次数据,Timer2_Callback会3S打印一次数据。

This is BearPi Harmony Timer1_Callback!This is BearPi Harmony Timer1_Callback!This is BearPi Harmony Timer1_Callback!This is BearPi Harmony Timer2_Callback!This is BearPi Harmony Timer1_Callback!This is BearPi Harmony Timer1_Callback!This is BearPi Harmony Timer1_Callback!This is BearPi Harmony Timer2_Callback!

总结:HarmonyOS系统中的定时器使用方法和Linux系统中的定时器比较相似。