21 鸿蒙LiteOS软件定时器实战:多定时器周期性任务完整示例(源码+解析)
鸿蒙LiteOS软件定时器实战多定时器周期性任务完整示例源码解析一、前言在嵌入式鸿蒙OpenHarmony LiteOS开发中软件定时器是实现周期性任务、延时任务、定时触发逻辑的核心内核工具无需占用硬件定时器资源支持创建多个定时器同时运行。本文基于LiteOS内核API手把手讲解软件定时器创建、启动、周期性运行的完整流程提供可直接编译运行的标准源码适合鸿蒙单片机开发入门学习。哔站视频《06RK2206 OpenHarmonyOS 鸿蒙 软件定时器与硬件定时器区别 软件定时器与任务区别 软件定时器实战》https://www.bilibili.com/video/BV1w3546DEBS/?vd_source3a9dd7a328acafb09dd1b8d05f3e2bf7哔站视频《05RK2206 OpenHarmonyOS 鸿蒙 什么是信号量 为什么需要信号量 代码演示》https://www.bilibili.com/video/BV1to5W6pETF/?vd_source3a9dd7a328acafb09dd1b8d05f3e2bf7哔站视频《04RK2206 OpenHarmonyOS 鸿蒙 任务实战》https://www.bilibili.com/video/BV15R5E6JEHy/哔站视频《03RK2206 鸿蒙 LiteOS 如何通过控制编译选项编译不同案例》https://www.bilibili.com/video/BV15e5J6QEGY/?spm_id_from333.1387.homepage.video_card.clickvd_source3a9dd7a328acafb09dd1b8d05f3e2bf7哔站视频《02RK2206 鸿蒙 LiteOS bin 文件 烧写》https://www.bilibili.com/video/BV1pcRdBaEAt/?spm_id_from333.1387.homepage.video_card.clickvd_source3a9dd7a328acafb09dd1b8d05f3e2bf7哔站视频《01RK2206 鸿蒙 LiteOS ubuntu 开发环境 全程 安装配置》https://www.bilibili.com/video/BV1nrRkBoEMR/?spm_id_from333.1387.homepage.video_card.clickvd_source3a9dd7a328acafb09dd1b8d05f3e2bf7二、LiteOS软件定时器核心概念1. 什么是软件定时器软件定时器是基于系统时钟节拍实现的定时服务由LiteOS内核提供不依赖硬件外设可创建多个独立定时器分别设置不同超时时间和回调函数。2. 软件定时器主要作用实现周期性任务每隔1s、2s执行一段逻辑实现延时触发功能替代硬件定时器节省硬件资源多任务定时调度简化业务逻辑3. 核心工作模式本文使用LOS_SWTMR_MODE_PERIOD周期性模式定时器超时后自动重启循环执行回调函数直到手动停止/删除。三、软件定时器核心API函数API函数功能说明LOS_SwtmrCreate创建软件定时器指定超时时间、模式、回调函数LOS_SwtmrStart启动已创建的定时器LOS_SwtmrStop停止正在运行的定时器LOS_SwtmrDelete删除定时器释放内核资源API参数说明LOS_SwtmrCreate(timeout,// 超时时间单位TickLiteOS默认1Tick1msmode,// 模式单次/周期callback,// 超时回调函数timerID,// 定时器ID输出arg// 回调函数参数)四、完整可运行源码#includelos_swtmr.h#includeohos_init.hvoidtimer1_timeout(void*arg){printf(This is Timer1 Timeout function\n);}voidtimer2_timeout(void*arg){printf(This is Timer2 Timeout function\n);}voidtimer_example(){unsignedinttimer_id1,timer_id2;unsignedintret;/* 创建定时器11000ms 1s 周期性执行 */retLOS_SwtmrCreate(1000,LOS_SWTMR_MODE_PERIOD,timer1_timeout,timer_id1,NULL);if(retLOS_OK){retLOS_SwtmrStart(timer_id1);if(ret!LOS_OK){printf(start timer1 fail ret:0x%x\n,ret);return;}}else{printf(create timer1 fail ret:0x%x\n,ret);return;}/* 创建定时器22000ms 2s 周期性执行 */retLOS_SwtmrCreate(2000,LOS_SWTMR_MODE_PERIOD,timer2_timeout,timer_id2,NULL);if(retLOS_OK){retLOS_SwtmrStart(timer_id2);if(ret!LOS_OK){printf(start timer2 fail ret:0x%x\n,ret);return;}}else{printf(create timer2 fail ret:0x%x\n,ret);return;}}/* 系统自动初始化入口 */APP_FEATURE_INIT(timer_example);五、代码逻辑逐行解析1. 头文件los_swtmr.hLiteOS软件定时器内核头文件ohos_init.h鸿蒙自动初始化模块头文件2. 定时器回调函数timer1_timeout定时器1超时执行函数1s执行一次timer2_timeout定时器2超时执行函数2s执行一次3. 定时器创建与启动流程调用LOS_SwtmrCreate创建定时器判断创建是否成功返回LOS_OK调用LOS_SwtmrStart启动定时器两个定时器独立运行互不干扰4. 自动初始化APP_FEATURE_INIT(timer_example);系统启动时自动执行定时器初始化无需手动调用。六、串口运行打印效果Timer1每隔1s打印一次Timer2每隔2s打印一次两个定时器周期性并发运行七、常见注意事项回调函数不能阻塞不能在定时器回调里使用延时、死循环、阻塞API回调函数要简洁只处理快速逻辑避免占用系统时钟单位是毫秒LiteOS默认配置 1 Tick 1ms多定时器互不影响可同时创建N个软件定时器并行运行必须先创建、再启动否则定时器不会运行八、对比分析 任务 与 软件定时器对比项任务Task / 线程软件定时器Software Timer运行方式独立循环执行只在超时时刻触发一次回调能否阻塞可以延时、等待信号量、休眠绝对不能一阻塞系统就崩溃优先级可设置独立优先级共享定时器任务优先级不可单独设置资源占用较高需要独立栈极低共用栈执行时长可长可短必须极短几ms内完成使用场景大循环逻辑、复杂业务定时计数、定时打印、定时触发标志能否等待信号量✅ 可以❌ 不可以能否延时✅ LOS_Msleep 可以❌ 绝对不可以定时器回调函数绝对不能做不能延时LOS_Msleep不能死循环不能等待信号量/消息队列不能执行耗时操作超过10ms都危险任务可以随便做可以循环可以阻塞可以等待可以运行复杂业务九、什么时候用定时器什么时候用任务✅ 用定时器的场景定时1秒打印一次日志定时刷新LED定时更新计数器定时设置一个标志位功能简单、时间短、到点触发一下✅ 用任务的场景需要大循环需要等待信号量需要处理复杂逻辑需要阻塞、延时、休眠需要处理串口、网络、文件系统
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2631866.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!