说到鸿蒙我们都会想到华为mate60:遥遥领先!我们一直领先!
我们这个小车也是采用的是鸿蒙操作系统,学习鸿蒙小车,让你遥遥领先于你的同学。
软件定时器就是"闹钟",你可以设置闹钟:
在30分钟后让你起床工作。
每隔1小时让你例行检查机器运行情况。
软件定时器也可以完成两类事情:
日常生活中我们可以定无数个"闹钟",这无数的"闹钟"要基于一个真实的闹钟。
在鸿蒙操作系统里,我们也可以设置很多个"软件定时器",它们都是基于系统滴答中断(Tick
Interrupt)。
我们在手机上添加闹钟时,需要指定时间、指定类型(一次性的,还是周期性的)、指定做什么事;还有一些过时的、不再使用的闹钟。如下图所示:
使用定时器跟使用手机闹钟是类似的,例如:
指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期(period)。
指定类型,定时器有两种类型:
一次性
(One-shot timers):
这类定时器启动后,它的回调函数只会被调用一次;可以手工再次启动它,但是不会自动启动它。
自动加载定时器
(Auto-reload timers ):
这类定时器启动后,时间到之后它会自动启动它;这使得回调函数被周期性地调用。(指定要做什么事,就是指定回调函数)
实际的闹钟分为:有效、无效两类。软件定时器也是类似的,它由两种状态:
运行
(Running、Active):运行态的定时器,当指定时间到达之后,它的回调函数会被调用。冬眠
(Dormant):冬眠态的定时器还可以通过句柄来访问它,但是它不再运行,它的回调函数不会被调用。定时器运行情况示例如下:
osTimerId_t osTimerNew(osTimerFunc_t func, osTimerType_t type, void *argument,
const osTimerAttr_t *attr);
相关参数:
osStatus_t osTimerStart(osTimerId_t timer_id, uint32_t millisec);
相关参数:
在 Hi3861 中,1U=10ms,100U=1S。
该实验代码会创建一个周期性定时器和一个一次性定时器:
//包含头文件,头文件中有需要使用到的函数
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
osTimerId_t TimerPeriod_ID;//周期性定时器ID
osTimerId_t TimerOnce_ID;//一次性定时器ID
//周期定时器回调函数
void TimerPeriodFun (void *argument)
{
printf("entry TimerPeriod callback\n");
}
//一次性定时器回调函数
void TimerOnceFun (void *argument)
{
printf("entry TimerOnce callback\n");
}
// 入口函数
static void entry(void)
{
//创建周期性定时器
TimerPeriod_ID = osTimerNew(TimerPeriodFun, osTimerPeriodic, NULL, NULL);
//创建一次性定时器
TimerOnce_ID = osTimerNew(TimerOnceFun, osTimerOnce, NULL, NULL);
//开启周期性定时器,每间隔3s调用一次回调函数
osTimerStart(TimerPeriod_ID, 300U);
//开启一次性定时器,间隔1s调用一次回调函数,后续不再调用
osTimerStart(TimerOnce_ID, 100U);
}
SYS_RUN(entry);//声明入口函数
下一篇文章继续为大家介绍 鸿蒙小车内核的互斥锁和信号量实验。