【鸿蒙开发】Hi3861学习笔记- 软件定时器示例

00. 目录

文章目录

    • [00. 目录](#00. 目录)
    • [01. 定时器概述](#01. 定时器概述)
    • [02. 定时器API](#02. 定时器API)
    • [03. 定时器常用API](#03. 定时器常用API)
      • [3.1 osTimerNew](#3.1 osTimerNew)
      • [3.2 osTimerDelete](#3.2 osTimerDelete)
      • [3.3 osTimerStart](#3.3 osTimerStart)
      • [3.4 osTimerStop](#3.4 osTimerStop)
    • [04. 程序示例](#04. 程序示例)
    • [05. 附录](#05. 附录)

01. 定时器概述

软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数。定时精度与系统Tick时钟的周期有关。

硬件定时器受硬件的限制,数量上不足以满足用户的实际需求,因此为了满足用户需求,提供更多的定时器,OpenHarmony LiteOS-M内核提供软件定时器功能。软件定时器扩展了定时器的数量,允许创建更多的定时业务。

软件定时器功能上支持:

  • 静态裁剪:能通过宏关闭软件定时器功能。
  • 软件定时器创建。
  • 软件定时器启动。
  • 软件定时器停止。
  • 软件定时器删除。
  • 软件定时器剩余Tick数获取。

02. 定时器API

(1) osTimerNew

功能:创建并初始化一个新的软件定时器。

参数:

func:定时器到期时的回调函数。

type:定时器的类型,可以是 osTimerOnce(一次性定时器)或osTimerPeriodic(周期性定时器)。

argument:传递给定时器回调函数的参数。

attr:指向定时器属性的指针,通常可以设置为 NULL 以使用默认属性。

返回值:返回一个 osTimerId_t 类型的定时器 ID,用于后续操作定时器。如果创建失败,则返回 NULL。

(2) osTimerStart

功能:启动或重启定时器。

参数:

timer_id:通过 osTimerNew 获得的定时器 ID。

ticks:定时器超时前的 Tick 数(以 RTOS 的 Tick 周期为单位)。

返回值:返回 osStatus_t 类型的状态码,表示操作结果。成功时返回 osOK,失败时返回相应的错误码。

(3) osTimerStop

功能:停止定时器。

参数:

timer_id:通过 osTimerNew 获得的定时器 ID。

返回值:返回 osStatus_t 类型的状态码,表示操作结果。成功时返回 osOK,失败时返回相应的错误码。

(4) osTimerDelete

功能:删除定时器,释放其占用的资源。

参数:

timer_id:通过 osTimerNew 获得的定时器 ID。

返回值:返回 osStatus_t 类型的状态码,表示操作结果。成功时返回 osOK,失败时返回相应的错误码。

(5) osTimerGetName

功能:获取定时器的名称。

参数:

timer_id:通过 osTimerNew 获得的定时器 ID。

返回值:返回定时器的名称字符串。如果定时器没有设置名称,则可能返回空字符串或默认名称。

(6)其他相关函数

osTimerIsRunning:检查定时器是否正在运行。

osTimerGetRemainingTicks:获取定时器剩余的 Tick 数(可选,具体取决于 RTOS 实现)。

03. 定时器常用API

3.1 osTimerNew

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

描述:

定时器创建函数。

用于创建一个定时器,定时器osTimerStart启动之前处于停止状态。

参数:

Name 描述
func 定时器回调函数。
type 定时器类型,仅限于osTimerOnce或osTimerPeriodic。
argument 定时器回调函数参数。
attr 定时器属性,当前不支持该参数,参数可为NULL。

返回:

返回创建的定时器ID。

NULL,表示执行失败或在中断中调用该函数。

3.2 osTimerDelete

c 复制代码
osStatus_t osTimerDelete (osTimerId_t timer_id)

描述:

定时器删除函数。

参数:

Name 描述
timer_id 定时器ID(由osTimerNew创建)。

返回:

osOK,表示执行成功。

osErrorParameter,表示参数错误。

osErrorResource,表示其他错误。

osErrorISR,表示在中断中调用本函数。

3.3 osTimerStart

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

描述:

定时器开始运行函数。

参数:

Name 描述
timer_id 定时器ID(由osTimerNew创建)。
ticks 定时器颗粒度。

返回:

osOK,表示执行成功。

osErrorParameter,表示参数错误。

osErrorResource,表示其他错误。

osErrorISR,表示在中断中调用本函数。

3.4 osTimerStop

c 复制代码
osStatus_t osTimerStop (osTimerId_t timer_id)

描述:

定时器停止运行函数。

参数:

Name 描述
timer_id 定时器ID(由osTimerNew创建)。

返回:

osOK,表示执行成功。

osErrorParameter,表示参数错误。

osErrorResource,表示其他错误。

osErrorISR,表示在中断中调用本函数。

04. 程序示例

创建 1 个任务和 1 个软件定时器,任务 1 间隔 1S 输出信息,定时器间隔 3S输出信息。

template.c

c 复制代码
/**
 ****************************************************************************************************
 * @file        template.c
 ****************************************************************************************************
 * 实验现象:打开串口助手,任务1间隔1S输出信息,定时器间隔3S输出信息
 *
 ****************************************************************************************************
 */

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"


osThreadId_t Task1_ID; //  任务1 ID
osTimerId_t Timer_ID;  // 定时器ID
#define TASK_STACK_SIZE 1024
#define TASK1_DELAY_TIME 1 // s


/**
 * @description: 任务1
 * @param {*}
 * @return {*}
 */
void Task1(void)
{
    while (1) {
        printf("enter Task 1.......\n");
        sleep(TASK1_DELAY_TIME); // 1秒
    }
}
/**
 * @description: 定时器1回调函数
 * @param {*}
 * @return {*}
 */
void timer1_Callback(void)
{
    printf("enter timer1_Callback.......\n");
}

/**
 * @description: 初始化并创建任务
 * @param {*}
 * @return {*}
 */
static void template_demo(void)
{
    printf("-Hi3861开发板--LiteOS软件定时器\r\n");

    Timer_ID = osTimerNew(timer1_Callback, osTimerPeriodic, NULL, NULL);       // 创建定时器
    if (Timer_ID != NULL) 
    {
        printf("ID = %d, Create Timer_ID is OK!\n", Timer_ID);

        osStatus_t timerStatus = osTimerStart(Timer_ID, 300U);      // 开始定时器, 并赋予定时器的定时值(在Hi3861中,1U=10ms,100U=1S)
        if (timerStatus != osOK) 
        {
            printf("timer is not startRun !\n");
        }
    }

    osThreadAttr_t taskOptions;
    taskOptions.name = "Task1";              // 任务的名字
    taskOptions.attr_bits = 0;               // 属性位
    taskOptions.cb_mem = NULL;               // 堆空间地址
    taskOptions.cb_size = 0;                 // 堆空间大小
    taskOptions.stack_mem = NULL;            // 栈空间地址
    taskOptions.stack_size = TASK_STACK_SIZE;           // 栈空间大小 单位:字节
    taskOptions.priority = osPriorityNormal; // 任务的优先级

    Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &taskOptions); // 创建任务1
    if (Task1_ID != NULL)
    {
        printf("ID = %d, Create Task1_ID is OK!\n", Task1_ID);
    }

}
SYS_RUN(template_demo);

运行结果

05. 附录

相关推荐
whysqwhw1 小时前
鸿蒙分布式投屏
harmonyos
whysqwhw2 小时前
鸿蒙AVSession Kit
harmonyos
whysqwhw4 小时前
鸿蒙各种生命周期
harmonyos
whysqwhw5 小时前
鸿蒙音频编码
harmonyos
whysqwhw5 小时前
鸿蒙音频解码
harmonyos
whysqwhw5 小时前
鸿蒙视频解码
harmonyos
whysqwhw6 小时前
鸿蒙视频编码
harmonyos
ajassi20006 小时前
开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器
华为·开源·harmonyos
前端世界7 小时前
在鸿蒙应用中快速接入地图功能:从配置到实战案例全解析
华为·harmonyos
江拥羡橙9 小时前
【基础-判断】HarmonyOS提供了基础的应用加固安全能力,包括混淆、加密和代码签名能力
安全·华为·typescript·harmonyos