鸿蒙小车之软件定时器实验

说到鸿蒙我们都会想到华为mate60:遥遥领先!我们一直领先!

我们这个小车也是采用的是鸿蒙操作系统,学习鸿蒙小车,让你遥遥领先于你的同学。

文章目录

前言


一、什么是软件定时器?

软件定时器就是"闹钟",你可以设置闹钟:

在30分钟后让你起床工作。

每隔1小时让你例行检查机器运行情况。

软件定时器也可以完成两类事情:

  1. 在"未来"某个时间点,运行函数。
  2. 周期性地运行函数。

日常生活中我们可以定无数个"闹钟",这无数的"闹钟"要基于一个真实的闹钟。

在鸿蒙操作系统里,我们也可以设置很多个"软件定时器",它们都是基于系统滴答中断(Tick

Interrupt)。

二、软件定时器的特性

我们在手机上添加闹钟时,需要指定时间、指定类型(一次性的,还是周期性的)、指定做什么事;还有一些过时的、不再使用的闹钟。如下图所示:

使用定时器跟使用手机闹钟是类似的,例如:

指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期(period)。

指定类型,定时器有两种类型

  1. 一次性(One-shot timers):

    这类定时器启动后,它的回调函数只会被调用一次;可以手工再次启动它,但是不会自动启动它。

  2. 自动加载定时器(Auto-reload timers ):

    这类定时器启动后,时间到之后它会自动启动它;这使得回调函数被周期性地调用。(指定要做什么事,就是指定回调函数)

实际的闹钟分为:有效、无效两类。软件定时器也是类似的,它由两种状态

  1. 运行(Running、Active):运行态的定时器,当指定时间到达之后,它的回调函数会被调用。
  2. 冬眠(Dormant):冬眠态的定时器还可以通过句柄来访问它,但是它不再运行,它的回调函数不会被调用。

定时器运行情况示例如下:

  • Timer1:它是一次性的定时器,在t1启动,周期是6个Tick。经过6个tick后,在t7执行回调函数。
    它的回调函数只会被执行一次,然后该定时器进入冬眠状态。
  • Timer2:它是自动加载的定时器,在t1启动,周期是5个Tick。每经过5个tick它的回调函数都被执行,比如在t6、t11、t16都会执行。

三、软件定时器相关函数用法

1. 创建软件定时器

c 复制代码
osTimerId_t osTimerNew(osTimerFunc_t func, osTimerType_t type, void *argument,
const osTimerAttr_t *attr);

相关参数:

  • osTimerFunc_t func :这是一个函数指针,用于指定要在定时器到期时执行的回调函数。当定时器触发时,操作系统将调用此函数来执行特定的操作。你可以将要执行的函数的名称传递给这个参数。
  • osTimerType_t type :这是一个枚举值,用于指定定时器的类型。在不同的操作系统中,可能会支持不同类型的定时器。通常,可以选择单次触发或循环触发。例如, osTimerOnce 表示单次触发, osTimerPeriodic 表示循环触发。
  • void * argument :这是一个指向传递给回调函数的参数的指针。当定时器到期时,回调函数将接收此参数,以便在执行函数时使用。这可以是任何数据类型的指针,根据需要传递给回调函数的数据。
  • const osTimerAttr_t * attr :这是一个指向定时器属性的指针,通常用于指定特定的定时器属性。属性可以包括定时器的名称、优先级等信息,具体取决于操作系统的支持和需求。如果不需要指定额外的属性,可以将此参数设置为NULL。
  • osTimerId_t :这是一个定时器对象的标识符,用于在以后的操作中引用该定时器。你可以使用这个标识符来操作和管理定时器,如启动、停止、删除等。

2. 开启软件定时器

c 复制代码
osStatus_t osTimerStart(osTimerId_t timer_id, uint32_t millisec);

相关参数:

  • osTimerId_t timer_id :这是一个定时器对象的标识符,用于指定要启动的定时器。通常,你需要先使用 osTimerNew 函数创建一个定时器对象,然后将其标识符传递给这个参数。
  • uint32_t millisec :这是一个指定的时间间隔。它表示在多少时间后定时器应该触发回调函数。一旦定时器启动,将开始计时,经过指定的时间后触发回调函数。

在 Hi3861 中,1U=10ms,100U=1S。

  • osStatus_t :这是一个枚举值,表示函数的执行状态。通常,它可以是以下之一:
    osOK :定时器成功启动。
    osError :发生错误,导致定时器未能成功启动。
    osErrorTimeout :超时错误。

四、软件定时器实验

该实验代码会创建一个周期性定时器和一个一次性定时器:

c 复制代码
//包含头文件,头文件中有需要使用到的函数
#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);//声明入口函数

总结

下一篇文章继续为大家介绍 鸿蒙小车内核的互斥锁和信号量实验。

相关推荐
Damon小智6 小时前
HarmonyOS NEXT 技术实践-基于基础视觉服务的多目标识别
华为·harmonyos
匹马夕阳9 小时前
华为笔记本之糟糕的体验
华为·笔记本电脑
egekm_sefg9 小时前
华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数
网络·华为
岳不谢1 天前
华为DHCP高级配置学习笔记
网络·笔记·网络协议·学习·华为
爱笑的眼睛111 天前
uniapp 极速上手鸿蒙开发
华为·uni-app·harmonyos
K.P1 天前
鸿蒙元服务从0到上架【第三篇】(第二招有捷径)
华为·harmonyos·鸿蒙系统
K.P1 天前
鸿蒙元服务从0到上架【第二篇】
华为·harmonyos·鸿蒙系统
敲代码的小强1 天前
Flutter项目兼容鸿蒙Next系统
flutter·华为·harmonyos
程序猿会指北1 天前
纯血鸿蒙APP实战开发——Text实现部分文本高亮和超链接样式
移动开发·harmonyos·arkts·openharmony·arkui·组件化·鸿蒙开发
鸿蒙自习室1 天前
鸿蒙开发——关系型数据库的基本使用与跨设备同步
前端·数据库·华为·harmonyos·鸿蒙