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

说到鸿蒙我们都会想到华为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);//声明入口函数

总结

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

相关推荐
小冷爱学习!7 小时前
华为动态路由-OSPF-完全末梢区域
服务器·网络·华为
2501_904447748 小时前
华为发力中端,上半年nova14下半年nova15,大力普及原生鸿蒙
华为·智能手机·django·scikit-learn·pygame
MarkHD8 小时前
第十八天 WebView深度优化指南
华为·harmonyos
塞尔维亚大汉9 小时前
OpenHarmony(鸿蒙南向)——平台驱动开发【MIPI CSI】
harmonyos·领域驱动设计
别说我什么都不会9 小时前
鸿蒙轻内核M核源码分析系列十五 CPU使用率CPUP
操作系统·harmonyos
feiniao865110 小时前
2025年华为手机解锁BL的方法
华为·智能手机
塞尔维亚大汉11 小时前
OpenHarmony(鸿蒙南向)——平台驱动开发【I3C】
harmonyos·领域驱动设计
VVVVWeiYee11 小时前
BGP配置华为——路径优选验证
运维·网络·华为·信息与通信
今阳13 小时前
鸿蒙开发笔记-6-装饰器之@Require装饰器,@Reusable装饰器
android·app·harmonyos
余多多_zZ13 小时前
鸿蒙初学者学习手册(HarmonyOSNext_API14)_组件截图(@ohos.arkui.componentSnapshot (组件截图) )
学习·华为·harmonyos·鸿蒙·鸿蒙系统