LiteOS使用不当导致软件定时器无响应问题

现象

系统最先创建的软件定时器无响应,但是任务可以正常调度。

解决

可能原因:

  1. 软件定时器初始化未正确完成。
  2. 软件定时器的创建或注册过程中出现错误。
  3. 软件定时器被错误地删除或释放。
  4. 系统中存在线程竞争问题,导致定时器列表在访问时出现不一致状态。
  5. 系统资源不足,无法为定时器分配必要的内存。

LiteOS使用链表管理软件定时器,其中m_pstSwtmrSortList为计数链表,用来记录已经创建或者处于运行中的软件定时器,m_pstSwtmrFreeList为空闲的软件定时器链表。

调试发现,m_pstSwtmrSortList在软件定时器计数未到达之前变成了NULL,导致osSwtmrScan函数没有正常执行,表现出来的就是软件定时器无响应。

通过跟踪m_pstSwtmrSortList的变化过程,发现问题代码如下:

UINT32 uwRet = LOS_OK,tick = 0;
uwRet = LOS_SwtmrTimeGet(xxx_Swtmr_Handle,&tick);
if((uwRet == LOS_OK) && (tick > 0))
{LOS_SwtmrDelete(AteSuspend_Swtmr_Handle);
}

xxx_Swtmr是一个单次定时器,本意是通过LOS_SwtmrTimeGet函数判断软件定时器是否处于运行状态,如果处于运行状态,那么就删除这个定时器。问题就出现在LOS_SwtmrTimeGet上面。xxx_Swtmr是在需要使用的时候才会使用LOS_SwtmrCreate创建同时使用LOS_SwtmrStart开始,句柄xxx_Swtmr_Handle定义的全局变量,会自动的被初始化为0。

系统最先创建的软件定时器句柄为0,当上面代码段被执行的时候xxx_Swtmr还没有创建,xxx_Swtmr_Handle的值为0,使用LOS_SwtmrTimeGet函数和LOS_SwtmrDelete函数的时候由于定时器句柄0有效,返回结果为LOS_OK,因此误的处理了另一个软件定时器。

综上,产生这种问题的原因是软件定时器被错误地删除或释放。

解决

在不改变LiteOS源码的情况下:

  1. 未创建的软件定时器句柄定义为大于LOSCFG_BASE_CORE_SWTMR_LIMIT的值,这样LOS_SwtmrTimeGet函数返回结果为LOS_ERRNO_SWTMR_ID_INVALID。
  2. 系统开始时创建一个周期性软件定时器,确保句柄0被占用。

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

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

相关文章

数据可视化案例

数据可视化案例 使用豆瓣电影中的数据来进行可视化,网址:豆瓣电影 Top 250 (douban.com) 一、网页数据分析 我们需要爬取的是豆瓣电影Top250网页每一页的电影名称、图片链接、导演、年份、国家、电影类型、电影评分这些数据。 在待爬取的网页中&#x…

通义千问调用笔记

如何使用通义千问API_模型服务灵积(DashScope)-阿里云帮助中心 package com.ruoyi.webapp.utils;import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationOutput; import com.alibaba.dashscope.aigc.generation.G…

移动硬盘打不开怎么办?原因解析!

移动硬盘是一种方便携带、快速传输大量数据的存储设备。但有时我们会遇到这样的问题:插上电脑后,移动硬盘无法打开,出现各种错误提示。这时候我们该怎么办呢? 以下是一些可能导致移动硬盘打不开的原因及解决方法: 1.硬…

初始-Nativefier

--无奈只能靠自己 Nativefier 是什么: Nativefier 是一个命令行工具,仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序,应用程序通过 Electron 打包成系统可执行文件(如.app, .exe 等),可以运行在…

AtomicInteger类介绍

文章目录 一、AtomicInteger的定义二、AtomicInteger的使用场景和作用1.使用场景2.作用 三、AtomicInteger的常用方法四、AtomicInteger的底层原理五、AtomicInteger和Integer的区别1.数据类型与线程安全性2.默认值与初始化3.常用方法与操作:4.内存模型与可见性5.使…

xx销售公司IT建设目标及IT规划方案(69页PPT)

方案介绍: 随着市场竞争的日益激烈,XX销售公司认识到信息化建设对于提升公司竞争力、优化业务流程、提高管理效率的重要性。次IT建设方案为XX销售公司带来了显著的业务效益和管理提升。我们将继续致力于推动公司的信息化建设,为公司的发展提…

Arthas线上环境问题排查定位工具

一、Arthas简介 Arthas是alibaba推出的一款JVM性能诊断调优的工具,也可以称之为是线上监控诊断产品,通过全局的视角可以实时的查看应用load、内存、GC、线程的状态信息,并且还可以在不修改应用代码的前提下,对业务问题进行诊断&a…

手把手教你如何在Windows11下安装Docker容器

文章的主要要点: 为什么使用Docker:Docker可以简化部署过程,特别适合新手或在学习新技能(如Redis、MySQL、消息队列、Nginx等)时使用。 安装前的准备:在安装Docker之前,需要在Windows中开启一些…

解析Java中1000个常用类:Runtime类,你学会了吗?

推荐一个我自己写的小报童专栏导航网站: http://xbt100.top 收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~复制URL可直达。 以下是正文。 在Java编程中,Runtime类是一个重要的工具,它为Java应用程序提供了与JVM(Java虚拟…

2024都市解压爆笑喜剧《脑洞大开》6月28日上映

随着暑期档的临近,电影市场迎来了一剂强心针——由何欢、王迅、克拉拉、卜钰、孙越、九孔等众多实力派笑星联袂主演的都市解压爆笑喜剧《脑洞大开》正式宣布定档,将于6月28日在全国各大影院欢乐上映,誓为观众带来今夏最畅快淋漓的笑声风暴。 …

代码随想录-Day32

122. 买卖股票的最佳时机 II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能…

Leetcode 3185. Count Pairs That Form a Complete Day II

Leetcode 3185. Count Pairs That Form a Complete Day II 1. 解题思路2. 代码实现 题目链接:3185. Count Pairs That Form a Complete Day II 1. 解题思路 要获得一个complete day的pair,我们只需要考察每个时间关于24h的余数,然后找到对…

MicroPython+ESP32 C3开发上云

传感器PinI/O状态D412输出1开0关D513输出1开0关 概述 MicroPython是python3编程语言的精简实现,能够在资源非常有限的硬件上运行,如MCU微控制器Micropython的网络功能和计算功能很强大,有非常多的库可以使用,它为嵌入式开发带来了…

FFmpeg编解码的那些事(3)-视频硬解码的基础知识

目录 前言: 1.iso/os x平台 2.windows平台 3.linux平台 4.Tips: 5.结论: 前言: 视频硬解码的过程就是把视频提取成图片变显示出来,就是播放器播放视频的过程,就可以理解为解码的过程。 在不同的系统…

ubuntu commands

重新安装全部软件,会全部刷新info目录 sudo apt-get --reinstall install dpkg --get-selections | grep [[:space:]]install | cut -f1 如何安装python sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update sudo apt install python3.11 sudo apt install…

【Android面试八股文】Java中有几种引用关系,它们的区别是什么?

在Java中,引用关系主要分为以下几种: 强引用(Strong Reference)软引用(Soft Reference)弱引用(Weak Reference)虚引用(Phantom Reference) 这些引用类型的区别在于它们对垃圾回收的影响程度。下面是对每种引用类型的详细解释及代码示例: 1. 强引用(Strong Referen…

什么是内存泄漏?如何避免?

内存泄漏(Memory Leak)指的是在程序中,已动态分配的堆内存由于某种原因未被程序释放或无法释放,造成系统内存的浪费。这种浪费会逐渐积累,进而降低系统整体性能,甚至在极端情况下可能导致系统崩溃。内存泄漏…

LabVIEW、Matlab与Python的比较:从多角度详解三大编程工具

LabVIEW、Matlab和Python是工程和科学领域中常用的编程工具,各具特色。本文将从开发效率、计算性能、应用场景、学习曲线、成本和社区支持等多个角度,详细比较这三者的优缺点,帮助读者选择最适合其项目需求的编程工具。 比较维度 开发效率 La…

扫地机LiDAR形态之美

石头扫地机V20 LiDAR: Flash光源和Spot光源切换 图来自 Robot森 LiDAR(Light Detection and Ranging,激光雷达)技术在扫地机器人中的应用,不仅提升了机器的智能性和实用性,还展现了一种科技与艺术的融合之美。 一、外观设计的精致性 紧凑与轻巧:扫地机器人的LiDAR传感器…

Vue引入做了什么

Vue.js 是一个功能强大且易于使用的 JavaScript 框架,今天的任务就是分析在 Vue 引入的过程中,都做了哪些处理 ! 流程讲解 首先会调用这几个方法,主要作用是在 Vue 原型上挂载了一系列的方法,让 Vue 实例具备一些核心…