当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 拓扑排序与有向无环图 -- Kahn算法和深度优先搜索
  • Redis - SpringDataRedis - RedisTemplate
  • QT Creator下载安装详细教程(保姆级教程)
  • NCRE3 2-1 网络总体设计基本方法
  • 如何使用 API 查看极狐GitLab 镜像仓库中的镜像?
  • Flutter Geocoding插件使用指南:简化地理编码与逆地理编码
  • Redis与MySQL数据一致性问题的策略模式及解决方案
  • 如何从网站获取表格数据
  • 第四十八天 第十章 单调栈part01 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II
  • TypeScript通过MsgPack发送数组到C++反序列化失败
  • 前端播放rtsp视频流(最后使用WebRtc)
  • MySQL环境的配置文件json
  • Redis zset 共享对象
  • OpenSNN推文:百度沈抖:深度拥抱人工智能+,加速发展新质生产力,共创智能时代新未来
  • 故障诊断 | 基于Transformer故障诊断分类预测(Matlab)
  • ----------
  • 【391天】每日项目总结系列128(2018.03.03)
  • download使用浅析
  • hadoop集群管理系统搭建规划说明
  • Java 最常见的 200+ 面试题:面试必备
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • PHP那些事儿
  • vue--为什么data属性必须是一个函数
  • XML已死 ?
  • 利用jquery编写加法运算验证码
  • 每天一个设计模式之命令模式
  • 全栈开发——Linux
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 【云吞铺子】性能抖动剖析(二)
  • # dbt source dbt source freshness命令详解
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Java)【深基9.例1】选举学生会
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (南京观海微电子)——示波器使用介绍
  • (七)理解angular中的module和injector,即依赖注入
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET 8.0 中有哪些新的变化?
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 的程序集加载上下文
  • .net 简单实现MD5
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net反编译的九款神器
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限