ESP32移植Openharmony设备开发---(4)Timer定时器

Timer内核定时器

官方文档:OpenAtom OpenHarmony

所需头文件:los_swtmr.h

头文件所在位置:

基本概念:

软件定时器

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

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

软件定时器功能上支持:

  • 静态裁剪:能通过宏关闭软件定时器功能。
  • 软件定时器创建。
  • 软件定时器启动。
  • 软件定时器停止。
  • 软件定时器删除。
  • 软件定时器剩余Tick数获取。
定时器状态
  • OS_SWTMR_STATUS_UNUSED(未使用) 系统在定时器模块初始化的时候将系统中所有定时器资源初始化成该状态。
  • OS_SWTMR_STATUS_CREATED(创建未启动/停止) 在未使用状态下调用LOS_SwtmrCreate接口或者启动后调用LOS_SwtmrStop接口后,定时器将变成该状态。
  • OS_SWTMR_STATUS_TICKING(计数) 在定时器创建后调用LOS_SwtmrStart接口,定时器将变成该状态,表示定时器运行时的状态。
定时器模式

OpenHarmony LiteOS-M内核的软件定时器提供三类定时器机制:

  • 第一类是单次触发定时器,这类定时器在启动后只会触发一次定时器事件,然后定时器自动删除。
  • 第二类是周期触发定时器,这类定时器会周期性的触发定时器事件,直到用户手动地停止定时器,否则将永远持续执行下去。
  • 第三类也是单次触发定时器,但与第一类不同之处在于这类定时器超时后不会自动删除,需要调用定时器删除接口删除定时器。

BUILD.gn

因为用到了liteos-m的软件定时器,所以需要引用liteos-m内核库,具体可以参考上节课程中的BUILD.gn

LOS_Timer_example.c

#include "los_swtmr.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "los_task.h"
#include "ohos_run.h"void Timer1_Callback(uint32_t arg);
void Timer2_Callback(uint32_t arg);#define LOSCFG_BASE_CORE_SWTMR_ALIGN = 1
#define TASK_PRIO 5UINT32 g_timercount1 = 0;
UINT32 g_timercount2 = 0;
UINT32 g_testTaskId01;void Timer1_Callback(uint32_t arg) // 回调函数1
{unsigned long tick_last1;g_timercount1++;tick_last1=(UINT32)LOS_TickCountGet(); // 获取当前Tick数printf("g_timercount1=%d\n",g_timercount1);printf("tick_last1=%d\n",tick_last1);
}void Timer2_Callback(uint32_t arg) // 回调函数2
{unsigned long tick_last2;tick_last2=(UINT32)LOS_TickCountGet();g_timercount2 ++;printf("g_timercount2=%d\n",g_timercount2);printf("tick_last2=%d\n",tick_last2);
}void Timer_example(void)
{UINT32 id1;UINT32 id2; // timer idUINT32 uwTick;/* 创建单次软件定时器,Tick数为1000,启动到1000Tick数时执行回调函数1 */LOS_SwtmrCreate (1000, LOS_SWTMR_MODE_ONCE, Timer1_Callback, &id1, 1, OS_SWTMR_ROUSES_ALLOW, OS_SWTMR_ALIGN_INSENSITIVE);/* 创建周期性软件定时器,每100Tick数执行回调函数2 */LOS_SwtmrCreate(100, LOS_SWTMR_MODE_PERIOD, Timer2_Callback, &id2, 1, OS_SWTMR_ROUSES_ALLOW, OS_SWTMR_ALIGN_INSENSITIVE);printf("create Timer1 success\n");LOS_SwtmrStart (id1); //启动单次软件定时器printf("start Timer1 success\n");LOS_TaskDelay(200); // 延时200Tick数LOS_SwtmrTimeGet(id1, &uwTick); // 获得单次软件定时器剩余Tick数printf("uwTick =%d\n", uwTick);LOS_SwtmrStop(id1); // 停止软件定时器printf("stop Timer1 success\n");LOS_SwtmrStart(id1);LOS_TaskDelay(1000);LOS_SwtmrDelete(id1); // 删除软件定时器printf("delete Timer1 success\n");LOS_SwtmrStart(id2); // 启动周期性软件定时器printf("start Timer2\n");LOS_TaskDelay(1000);LOS_SwtmrStop(id2);LOS_SwtmrDelete(id2);
}UINT32 Example_TaskEntry(VOID)
{UINT32 ret;TSK_INIT_PARAM_S task1;/* 锁任务调度 */LOS_TaskLock();/* 创建任务1 */ret = memset_s(&task1, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));if (ret != 0) {printf("memset_s fail!\r\n");}task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Timer_example;task1.pcName = "TimerTsk";task1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;task1.usTaskPrio = TASK_PRIO;ret = LOS_TaskCreate(&g_testTaskId01, &task1);if (ret != LOS_OK) {printf("TimerTsk create failed.\n");return LOS_NOK;}/* 解锁任务调度 */LOS_TaskUnlock();return LOS_OK;
}OHOS_APP_RUN(Example_TaskEntry);

代码分析:

  • 首先定义了用于保存定时器ID的变量id1id2,以及用于获取定时器剩余时间的变量uwTick
  • 接下来,创建了一个单次运行的软件定时器(id1),设置其在1000个时钟滴答后触发Timer1_Callback
  • 创建了一个周期性运行的软件定时器(id2),设置其每隔100个时钟滴答就触发Timer2_Callback
  • 启动定时器id1并延时200个时钟滴答后获取其剩余时间,并打印出来。
  • 停止并重新启动定时器id1,等待1000个时钟滴答后删除定时器id1
  • 启动周期性定时器id2,等待1000个时钟滴答后停止并删除定时器id2

编译并烧录

修改工作文件夹级的BUILD.gn文件,将编译的文件夹指定为新建的003_LOS_Timer

在源码根目录下使用hb工具对写好的代码进行编译

选择mini级系统

同理 产品选择esp公司下的esp32

选择完毕后在源码根目录下执行hb build -f 进行编译

编译完成后会有如下界面,并且编译后的代码固件位于:out\esp32\esp32

验证结果

打开串口工具->选择COM5->打开串口

按下ESP32开发板上的EN键,即可观察到实验现象:

API参考

LOS_SwtmrCreate()

LOS_SwtmrCreate(UINT32 interval,UINT8 mode,SWTMR_PROC_FUNC handler,UINT32 *swtmrID,UINT32 arg);

描述:

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

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

参数:

名字

描述

interval

要创建的软件计时器的定时时长,单位ms

mode

定时器类型,课参考EnSwTmrType,包括单次定时器、周期性定时器以及单次定时器但不删除定时器三种类型

handler

函数指针指向回调函数

swtmrID

定时器ID

argument

定时器回调函数的参数

arg

回调函数handler的入参

LOS_SwtmrStart()

UINT32 LOS_SwtmrStart(UINT32 swtmrID);

描述:

启动或重新启动指定参数swtmrID的计时器。

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

参数:

名字

描述

swtmrID

由osTimerNew获得的计时器ID

LOS_SwtmrStop()

UINT32 LOS_SwtmrStop(UINT32 swtmrID);

描述:

暂停指定参数swtmrID的计时器。

参数:

名字

描述

swtmrID

由LOS_SwtmrCreate获得的计时器ID

LOS_SwtmrDelete()

UINT32 LOS_SwtmrDelete(UINT32 swtmrID);

描述:

删除指定参数swtmrID的计时器。

参数:

名字

描述

swtmrID

由LOS_SwtmrCreate获得的计时器ID

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451097.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫分鱼干 -算法题解

题目 假如有一群猫排成一行&#xff0c;要分配鱼干&#xff0c;每一只猫都有一个等级值。你作为管理员有很多鱼干但是需要按下边的分配制度分配&#xff1a; 1. 每一只猫至少要分配一斤鱼干&#xff0c;鱼干分配最小单位是斤&#xff0c;必须保证是整数。 2. 猫比他们邻居有更高…

大语言模型训练

大语言模型训练 1.两大问题2.并行训练2.1数据并行2.2模型并行2.3张量并行2.4混合并行 3.权重计算3.1浮点数3.2混合精度训练3.3deepspeed&#xff08;微软&#xff09;3.3.1 ZeRO3.3.2ZeRO-offload 3.3总结 4.PEFT4.1Prompt TuningPrefix-tuning4.2P-tuning & P-tuning v2 5…

数字图像处理:图像去噪

图像去噪–总变差去噪&#xff08;TV&#xff09; 引用资料&#xff1a; 1.全变分图像去噪算法&#xff08;TV&#xff09; 2.TV去噪的理解 总变差去噪 (Total Variation Denoising) 是一种经典的图像去噪方法&#xff0c;能够有效减少噪声&#xff0c;同时保留图像的边缘细节…

10.15.2024刷华为OD C题型(二)

10.15.2024刷华为OD C题型&#xff08;二&#xff09; 密码输入检测智能成绩表 如果是目标院校150分能过&#xff0c;而且这道题是两百分的话我就阿弥陀佛了。 这类简单类型的字符串处理题目一看就有思路&#xff0c;起码能做&#xff0c;遇到那种稍微加点数学的&#xff0c;感…

【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波

【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波 前言MPU6050寄存器代码详解mpu6050.cmpu6050.h 使用说明 前言 本篇文章基于卡尔曼滤波的原理详解与公式推导&#xff0c;来详细的解释下如何使用卡尔曼滤波来解算MPU6050的姿态 参考资料&#xff1a;Github_mpu6050 MPU6050寄存器…

C语言中的文件操作:从基础到深入底层原理

文件操作是几乎所有应用程序的重要组成部分&#xff0c;特别是在系统级编程中。C语言因其高效、灵活以及接近硬件的特点&#xff0c;成为了文件操作的理想选择。本文将全面深入地探讨C语言中的文件操作&#xff0c;从文件系统的概念到具体的文件操作函数&#xff0c;再到底层的…

外包干了2年,技术原地踏步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

020 elasticsearch7.10.2 elasticsearch-head kibana安装

文章目录 全文检索流程ElasticSearch介绍ElasticSearch应用场景elasticsearch安装允许远程访问设置vm.max_map_count 的值 elasticsearch-head允许跨域 kibana 商品数量超千万&#xff0c;数据库无法使用索引 如何使用全文检索&#xff1a; 使用lucene&#xff0c;在java中唯一…

Nginx(Linux):启动停止Nginx

目录 1、理解Nginx后台进程2、停止Nginx(方式一&#xff1a;使用信号源)2.1 获取master进程号2.1 设置信号源 3、停止Nginx(方式二&#xff1a;使用命令行) 1、理解Nginx后台进程 Nginx后台进程包含master和worker两类进程。 master进程&#xff1a;主要用来管理worker进程&am…

鸿蒙学习笔记--搭建开发环境及Hello World

文章目录 一、概述二、开发工具下载安装2.1 下载开发工具DevEco Studio NEXT2.2 安装DevEco Studio 三、启动软件四、第一个应用Hello World4.1 创建应用4.2 创建模拟器4.3 开启Hyper-v功能4.4 启动虚拟机 剑子仙迹 诗号&#xff1a;何须剑道争锋&#xff1f;千人指&#xff0c…

【Linux】:线程概念

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来线程概念相关代码和知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中&#xff0c;存储过程是一种预先编写好的SQL代码集合&#xff0c;它被保存在数据库服务器上&#xff0c;可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句&#xff0c;如IF条件语句、WHILE循环等&#xff0c;使…

智能汽车制造:海康NVR管理平台/工具EasyNVR多品牌NVR管理工具/设备实现无插件视频监控直播方案

一、背景介绍 近年来&#xff0c;随着网络在我国的普及和深化发展&#xff0c;企业的信息化建设不断深入&#xff0c;各行各业都加快了信息网络平台的建设&#xff0c;大多数单位已经或者正在铺设企业内部的计算机局域网。与此同时&#xff0c;网络也成为先进的新兴应用提供了…

【Git】基本操作+分支管理

Git基本操作 Git仓库创建 Git仓库的基本认知 Git仓库就是一个用来跟踪和管理项目文件变化的地方&#xff0c;其记录了所有的修改历史&#xff0c;可以回退到之前的任何一个历史版本 工作区&#xff1a;正在进行实际操作的文件夹暂存区&#xff1a;临时保存想要提交修改的区域…

【LeetCode:349. 两个数组的交集 + 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

鸿蒙原生应用扬帆起航

就在2024年6月21日华为在开发者大会上发布了全新操作的系统HarmonyOS Next开发测试版&#xff0c;网友们把它称之为“称之为纯血鸿蒙”。因为在此之前鸿蒙系统底层式有两套基础架构的&#xff0c;一套是是Android的AOSP&#xff0c;一套是鸿蒙的Open Harmony&#xff0c;因为早…

计算机毕业设计 基于Python的毕业生去向反馈调查平台的设计与实现 Python毕业设计选题 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

物联网IoT平台 | 物联网IoT平台的定义

物联网IoT平台&#xff1a;定义、发展与应用在当今信息化时代&#xff0c;物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;已经成为推动社会进步和产业升级的重要力量。物联网IoT平台&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;正逐步改变…

Docker安装Nginx

前提&#xff1a;Docker已安装好&#xff0c;本人使用的为自带docker的云服务器&#xff0c;docker常用命令已掌握&#xff0c;yjj为在根目录创建的一个文件夹&#xff0c;可自行修改对应的目录。 1、安装镜像&#xff0c;可去dockerhub上面找&#xff0c;一般都是组件名称。do…

双十一值得购买超声波清洗机吗?双十一超声波清洗机好物品牌推荐

随着双十一购物狂欢节即将拉开序幕&#xff0c;越来越多的消费者开始关注这个一年一度的购物盛宴。超声波清洗机作为近年来备受关注的家用电器&#xff0c;以其高效、便捷的清洁能力赢得了众多家庭的喜爱。在双十一期间&#xff0c;各大品牌纷纷推出优惠活动&#xff0c;让不少…