liteos定时器回调时间过长造成死机问题解决思路

项目需求

原代码是稳定的,现我实现EMQ平台断开连接的时候,把HSL的模拟点位数据采集到网关,然后存入Flash,当EMQ平台连接的时候,把Flash里面的点位数据放在消息队列里面,不影响实时采集。
核心1:EMQ平台断开,保持存储稳定
核心2:不影响实时采集的前提下去把flash的数据读出来在空闲的时候发出去
核心3:进入断点续传的条件是连续5次发布失败进入断点续传

问题描述

核心1遇到了问题,就是EMQ断开20分钟左右会死机,没日志输出。

最后的日志,然后就一直在进行度队列操作,队列ID是垃圾值
初步分析
1.队列可能在使用的时候没有创建
2.队列的id存的地方被覆盖了

[2024-07-24 17:20:49.179]# RECV ASCII>
[INFO][556][Plc_s7_Task:1404] RDataCnt:30,RWarnCnt:0 CDataCnt:30,CWarnCnt:0 Tol:30,elaps: 251ms
[INFO][556][getNetSignalValue:1037] EC20 Get Net Signle: "25"
[INFO][556][print_memory_usage:594] m_aucSysMem0      2000d4f8 Memory Used:5992, Free:135072, Tol:141064, MallocCnt: 21082, FreeCnt: 20964, Malloc-Free: 118
[WARN]osSwTmrTask:111 timer_handler(080540fd) cost too many ms(5995)

在这里插入图片描述
在这里插入图片描述
代码

void point_timer_Callback(UINT32 arg)
{UINT32 uwReportRet = LOS_OK;UINT32 uwCollectRet = LOS_OK;uint16_t ep_resources[] = {RESOURCES_STATUS};char buff[64] = {0};char *buf[1] = {buff};LOS_SwtmrStop(point_pusSwTmrID);// 反写任务正在执行,跳过本次检查if (g_reverse_write_processing == true) {
//		 if (g_reverse_write_processing == true) {	//重新开启定时器,准备下一次检查LOS_SwtmrStart(point_pusSwTmrID);return;}if (!Get_Point_Status()){LOS_SwtmrStart(point_pusSwTmrID);	return;}//启动上报任务uwReportRet = start_report_task();if(LOS_OK != uwReportRet){	ATINY_LOG(LOG_ERR, "start_report_task Error!");stop_report_task();}//启动采集任务uwCollectRet = start_collect_task();if (LOS_OK != uwCollectRet){ATINY_LOG(LOG_ERR, "start_collect_task Error!");stop_collect_task();}if (LOS_OK != uwCollectRet || LOS_OK != uwReportRet){//检查是否绑定if(0 == read_resoures(LWM2M_EP_OBJECT_ID, 0, ep_resources, buf, 1, RESOURCES_POINT_SAVE_STRING_MAX)){if(0 == atoi(buf[0])){ATINY_LOG(LOG_INFO, "Wait Bing!");}else{ATINY_LOG(LOG_INFO, "Restart Report || Collect!");}}else{ATINY_LOG(LOG_ERR, "File System Error, Need Clean Config & Restart!");}}//检查系统异常//TODO:是否应该独立为一个检测线程,但上报通道依赖mqtt,mqtt又和数据点采集耦合在一起。应先解耦mqtt和数据采集if(LOS_OK == check_report_task()){check_sys_warning();}south_report_gateway();print_memory_usage();//重新开启定时器,准备下一次检查LOS_SwtmrStart(point_pusSwTmrID);	
}

解决方法

080540fd 地址定位到回调函数是void point_timer_Callback(UINT32 arg)
根据日志知道是这个回调时间有点长。
那为啥不是立即死而是过了几十分钟死呢?
代码优化等级从2调为0,进一步调试

LOS_SwtmrStop(point_pusSwTmrID);

他知道他自己耗时还在函数这里把定时器关了,怒。那为啥会调试的时候死在读队列(队列操作)里面呢?因为定时器的回调函数其实都是存在定时器回调队列里面的,如果一个回调过长,因为定时器的回调优先级0,其他高优先级任务都执行不下去。在实时性操作系统里会紊乱系统,加上屎山代码,就会死机。所以在liteos这种系统里面,多加日志输出,不可完全信调试。调试只是一瞬间的观察,调试可以判断这一段时间进而想一下自己的改动点和日志做分析得出怀疑点。

在这里插入图片描述

上面判断条件

if (g_reverse_write_processing == true )

改为

if (g_reverse_write_processing == true || BreakPoint_State == BreakPointSaveOnline)

OK,不要动不动在回调函数写耗时操作,一两次可能没问题,但是一直进行回调的话,会造成奇怪的紊乱。

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

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

相关文章

godot新建项目及设置外部编辑器为vscode

一、新建项目 初次打开界面如下所示,点击取消按钮先关闭掉默认弹出的框 点击①新建弹出中间的弹窗②中填入项目的名称 ③中设置项目的存储路径,点击箭头所指浏览按钮,会弹出如下所示窗口 根据图中所示可以选择或新建自己的游戏存储路径&…

鸿蒙(HarmonyOS)自定义Dialog实现时间选择控件

一、操作环境 操作系统: Windows 11 专业版、IDE:DevEco Studio 3.1.1 Release、SDK:HarmonyOS 3.1.0(API 9) 二、效果图 三、代码 SelectedDateDialog.ets文件/*** 时间选择*/ CustomDialog export struct SelectedDateDialog {State selectedDate:…

Linux系统上安装Redis

百度网盘: 通过网盘分享的文件:redis_linux 链接: https://pan.baidu.com/s/1ZcECygWA15pQWCuiVdjCtg?pwd8888 提取码: 8888 1.把安装包拖拽到/ruanjian/redis/文件夹中(自己选择) 2.进入压缩包所在文件夹,解压压缩…

ROM修改进阶教程------修改rom 开机自动安装指定apk 自启脚本完整步骤解析

rom修改的初期认识 在解包修改系统分区过程中。很多客户需求刷完rom后自动安装指定apk。这种与内置apk有区别。而且一些极个别apk无法内置。今天对这种修改rom刷入机型后第一次启动后自动安装指定apk的需求做个步骤解析。 在前期博文中我有做过说明。官方系统固件解…

按图搜索新体验:阿里巴巴拍立淘API返回值详解

阿里巴巴拍立淘API是一项基于图片搜索的商品搜索服务,它允许用户通过上传商品图片,系统自动识别图片中的商品信息,并返回与之相关的搜索结果。以下是对阿里巴巴拍立淘API返回值的详细解析: 一、主要返回值内容 商品信息 商品列表…

Java面试题(每日更新)

每日五道!学会就去面试! 本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。 目录 1.概述 2.Java 基础 2.1 JDK 和 JRE 有什么区别? 2.2 和 equals 的区别是什么? 2.3 两个对象的…

ECharts实现按月统计和MTBF统计

一、数据准备 下表是小明最近一年的旅游记录 create_datecity_namecost_money2023-10-10 10:10:10北京14992023-11-11 11:11:11上海29992023-12-12 12:12:12上海19992024-01-24 12:12:12北京1232024-01-24 12:12:12上海2232024-02-24 12:12:12广州5642024-02-24 12:12:12北京…

leetcode-148. 排序链表

题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3&#x…

react18+

主要是围绕函数式组件讲,18主要用就是函数式组件,学习前先熟悉下原生js的基本使用,主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则,只是放在一个方法里面返回而已,我们称这样的写法为函数式组件…

OrangePi Zero2 全志H616 开发初探

目录: 一、刷机和系统启动1、TF 卡格式化:2、镜像烧录:3、登录系统: 二、基于官方外设开发1、wiringPi 外设 SDK 安装:2、C 文件编译:3、基于官方外设的应用开发:① GPIO 输入输出:②…

【个人亲试最新】WSL2中的Ubuntu 22.04安装Docker

文章目录 Wsl2中的Ubuntu22.04安装Docker其他问题wsl中执行Ubuntu 报错:System has not been booted with systemd as init system (PID 1). Can‘t operate. 参考博客 😊点此到文末惊喜↩︎ Wsl2中的Ubuntu22.04安装Docker 确定为wsl2ubuntu22.04&#…

vue接入google map自定义marker教程

需求背景 由于客户需求,原来系统接入的高德地图,他们不接受,需要换成google地图。然后就各种百度,各种Google,却不能实现。----无语,就连google地图官方的api也是一坨S-H-I。所以才出现这篇文章。 google地…

【Python实战因果推断】56_因果推理概论6

目录 Causal Quantities: An Example Bias Causal Quantities: An Example 让我们看看在我们的商业问题中,你如何定义这些量。首先,你要注意到,你永远无法知道价格削减(即促销活动)对某个特定商家的确切影响&#xf…

AMEsim液压阀伯德图绘制方法

之前也在液压圈论坛里面发过类似的贴子,具体可以看这个网址🚪👉:如何得出说明书里面的伯德图曲线?,回复的人还是比较少,这个方法重要信息是参考百度文库这篇文章🚪👉&…

【系统架构设计师】计算机组成与体系结构 ⑯ ( 奇偶校验码 | CRC 循环冗余码 | 海明码 | 模 2 除法 )

文章目录 一、校验码1、校验码由来2、奇偶校验码3、CRC 循环冗余码 ( 重点考点 )4、海明码校验 ( 软考不经常考到 ) 二、CRC 循环冗余码 ( 重点考点 )1、模 2 除法概念2、模 2 除法步骤3、模 2 除法示例4、CRC 循环冗余码示例 15、CRC 循环冗余码示例 2 参考之前的博客 : 【计…

Webshell管理工具:AntSword(中国蚁剑)

中国蚁剑是一款开源的跨平台网站管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。 通俗的讲:中国蚁剑是 一 款比菜刀还牛的shell控制端软件。 一、中国蚁剑下载 1. 下载 AntSword-Loader https://github.com/AntSwordP…

面试前端实习常问的关于【ES6新特性】的问题

ES6新特性 日常前端代码开发中,有哪些值得用 ES6 去改进的编程优化或者规范? 常用箭头函数来取代有this指向的函数常用 let 取代 var 命令常用数组/对象的结构赋值来命名变量(结构更清晰,语义更明确,可读性更好)在长字…

【C语言报错已解决】“Undefined Reference”

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言: 在开发过程中,我们经常会遇到各种编译错误或运行时错误。其中,“Undefined Referenc…

Axure Web端元件库:从Quick UI到500+组件的飞跃

在快速变化的数字世界中,产品设计不仅仅是功能的堆砌,更是用户体验的精心雕琢。原型设计作为产品开发过程中的关键环节,其重要性不言而喻。Axure,作为业界领先的原型设计工具,凭借其强大的交互设计和丰富的功能&#x…

Rce漏洞复习(ctfshow29-50)

Rce漏洞简介思维导图 Web29 代码审计: if(!preg_match("/flag/i", $c)){ eval($c); 传参没有flag(大小写都没有出现) Payload: ?csystem("ls"); ?csystem("tac *lag.php"); Web30 代码…