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

freeRTOS:基于(信号量+线程)的日志系统设计

1.日志的重要性

  1. 故障排查与调试:嵌入式系统通常运行在资源有限的环境中,故障排查和调试变得尤为复杂。日志系统可以记录系统在运行过程中的各种操作、状态和事件信息,方便开发人员追踪和定位问题所在。通过分析日志,可以快速找到故障源,并进行相应的修复和调试。

  2. 系统性能优化:嵌入式系统的资源有限,因此性能优化尤为关键。日志系统可以记录系统运行过程中的性能指标,如任务执行时间、资源利用率等。通过分析这些日志,可以发现系统性能瓶颈,进行性能优化和资源管理,提高系统的响应速度和资源利用效率。

  3. 资源监控与管理:嵌入式系统可能包含多个任务或模块并发运行,而每个任务和模块都可能占用不同的资源。日志系统可以记录各个任务和模块的资源使用情况,如内存分配情况、任务运行状态等。通过分析日志,可以进行资源的动态监控和管理,以确保嵌入式系统的稳定运行。

  4. 安全审计与故障恢复:嵌入式系统在一些关键领域,如工业控制、医疗设备等,安全性和可靠性要求很高。日志系统可以记录系统的操作行为、故障事件、安全事件等,方便进行安全审计和故障恢复。通过分析日志,可以快速发现安全漏洞和故障点,并采取相应的措施进行修复和恢复。

  5. 协助产品迭代和升级:通过收集和分析日志数据,可以了解用户的使用习惯、问题反馈和需求变化。这些信息可以用于产品的迭代和升级,提供更好的用户体验和功能优化。

2.代码设计 

#ifndef _CJ_LOG_H_
#define _CJ_LOG_H_#include <stdbool.h>#define MAX_LOG_QUEUE_CNT 10typedef enum _LogType
{LT_DEBUG   = 0,LT_INFO    = 1,LT_WARNING = 2,LT_ERROR   = 3,
}LogType;typedef struct _CjLog
{unsigned int timestamp;      //时间戳LogType type;                //类别unsigned char para1;         //参数1unsigned char para2;         //参数2unsigned char para3;         //参数3unsigned char para4;         //参数4int checkSum;                //校验和
}CjLog;void clog_Init();
int clog_addlog(CjLog *log);
int clog_getLog(unsigned int startTime, unsigned int endTime, unsigned char *buf);
bool clog_getLog(unsigned int index, unsigned char *buf);
int clog_getCnt();
void clog_clear();#endif
#include "cjlog.h"
#include "freertos/queue.h"/* 创建一个日志队列 */
static QueueHandle_t log_queue;static void clog_write_thread(void)
{uart_event_t event;CjLog receivedLog;int len = 0;printf("clog_write_thread start !\n");while (1){BaseType_t xStatus = xQueueReceive(log_queue, &receivedLog, portMAX_DELAY);if (xStatus == pdPASS) {printf("Get a new log!\n");/* 写日志函数(需校验checkSum) 具体根据实际平台去实现 */if(flash_writeLog(receivedLog) == false)printf("Write log failed!\n");} else {}}return;
}void clog_Init()
{log_queue = xQueueCreate(MAX_LOG_QUEUE_CNT, sizeof(CjLog));/* 创建一个接收线程 */xTaskCreate(clog_write_thread, "log_thread", 2048, NULL, configMAX_PRIORITIES, NULL);
}void clog_addlog(CjLog *log)
{xQueueSend(log_queue, &log, portMAX_DELAY);
}int clog_getLog(unsigned int startTime, unsigned int endTime, unsigned char *buf)
{if(endTime == 0)endTime = 0xffffffff;/* 读取当前日志数量 具体根据实际平台去实现 */const int logCount = readLogCnt();int cnt = 0;//从最新的日志扫描至最旧的for(int i = 0; i < logCount; i++){/* 读取当前日志 也需要根据平台去实现 */CjLog *log = flash_readLog(i);if(log){if(log->timestamp <= endTime && log->timestamp >= startTime){*buf++ = (unsigned char)(log->timestamp >> 24);*buf++ = (unsigned char)(log->timestamp >> 16);*buf++ = (unsigned char)(log->timestamp >> 8);*buf++ = (unsigned char)(log->timestamp);*buf++ = (unsigned char)log->type;*buf++ = log->para1;*buf++ = log->para2;*buf++ = log->para3;*buf++ = log->para4;cnt ++;}else{if(log->timestamp < startTime)   break;}}elsebreak;}return cnt;
}bool clog_getLog(unsigned int index, unsigned char *buf)
{/* 读取当前日志数量 具体根据实际平台去实现 */const int logCount = flash_readLogCnt();if(index > logCount){return false;}/* 读取当前日志 也需要根据平台去实现 */CjLog *log = flash_readLog(index);if(log){*buf++ = (unsigned char)(log->timestamp >> 24);*buf++ = (unsigned char)(log->timestamp >> 16);*buf++ = (unsigned char)(log->timestamp >> 8);*buf++ = (unsigned char)(log->timestamp);*buf++ = (unsigned char)log->type;*buf++ = log->para1;*buf++ = log->para2;*buf++ = log->para3;*buf++ = log->para4;return true;}elsereturn false;}int clog_getCnt()
{/* 读取当前日志数量 具体根据实际平台去实现 */return flash_readLogCnt();
}void clog_clear()
{/* 清空也需要根据平台去实现 */flash_clearAllLog();
}

3.注意事项

1.与flash有关的函数的实现需要与实际情况结合。

2.flash读的时候要进行校验。

3.日志结构体可以根据实际的flash芯片设计大小,字节对齐等。

/* 4字节对齐 这里刚好是 4个 4字节 */
typedef struct _CjLog
{unsigned int timestamp;      //时间戳LogType type;                //类别unsigned char para1;         //参数1unsigned char para2;         //参数2unsigned char para3;         //参数3unsigned char para4;         //参数4int checkSum;                //校验和
}CjLog;

相关文章:

freeRTOS:基于(信号量+线程)的日志系统设计

1.日志的重要性 故障排查与调试&#xff1a;嵌入式系统通常运行在资源有限的环境中&#xff0c;故障排查和调试变得尤为复杂。日志系统可以记录系统在运行过程中的各种操作、状态和事件信息&#xff0c;方便开发人员追踪和定位问题所在。通过分析日志&#xff0c;可以快速找到故…...

数据可视化(1)

使用python带的matplotlib库进行简单的绘图。使用之前先进行安装&#xff0c;pip install matplotlib。如果安装了Anaconda,则无需安装matplotlib。 1.简单折线图 #绘制简单图表 import matplotlib.pyplot as plt plt.plot([1,2,3,4,5]) plt.show() import matplotlib.pyp…...

Llama 2: Open Foundation and Fine-Tuned Chat Models

文章目录 TL;DRIntroduction背景本文方案 实现方式预训练预训练数据训练细节训练硬件支持预训练碳足迹 微调SFTSFT 训练细节 RLHF人类偏好数据收集奖励模型迭代式微调&#xff08;RLHF&#xff09;拒绝采样&#xff08;Rejection Sampling&#xff09;PPO多轮一致性的系统消息&…...

BTY-DNS AMA回顾:致力于创建Web3领域中的去中心化身份(DID)

传统域名系统 (DNS) 是一个分层的分散信息存储&#xff0c;用于将用户在网络浏览器中输入可读名称&#xff08;例如www.baidu.com&#xff09;解析为IP地址&#xff0c;来访问互联网上的计算机。传统域名系统存在一些例如过于集中化管理、效率并不高等局限性问题。而去中心化域…...

【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

生活案例 咖啡厅 咖啡定制案例 在咖啡厅中&#xff0c;有多种不同类型的咖啡&#xff0c;客户在预定了咖啡之后&#xff0c;还可以选择添加不同的调料来调整咖啡的口味&#xff0c;当客户点了咖啡添加了不同的调料&#xff0c;咖啡的价格需要做出相应的改变。 要求&#xff…...

《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

文章目录 1. 概述1.1 目的1.2 实现方式 2. 代码示例2.1 设计2.2 代码 1. 概述 1.1 目的 保证类只有一个实例有方法能让外部访问到该实例 1.2 实现方式 懒汉式 在第一次调用单例对象时创建该对象&#xff0c;这样可以避免不必要的资源浪费 饿汉式 在程序启动时就创建单例对象…...

若依微服务整合activiti7.1.0.M6

若依微服务3.6.3版本整合activiti7&#xff08;7.1.0.M6&#xff09; 目前有两种办法集成activiti7 放弃activiti7新版本封装的API&#xff0c;使用老版本的API&#xff0c;这种方式只需要直接集成即可&#xff0c;在7.1.0.M6版本中甚至不需要去除security的依赖。不多介绍&a…...

Ubuntu 下安装软件,卸载,查看已经安装的软件

参考网址&#xff1a;http://wiki.ubuntu.org.cn/UbuntuSkills 一般的安装程序用三种&#xff1a; .deb 和.rpm 这两种安装文件 .bundle 这是二进制的安装文件  而 tar.gz 这类的只是压缩包&#xff08;相当于 .rar,.zip 压缩包一样&#xff09;,如果此类文件是程序的话&a…...

微信小程序导入微信地址

获取用户收货地址。调起用户编辑收货地址原生界面&#xff0c;并在编辑完成后返回用户选择的地址。 1&#xff1a;原生微信小程序接口使用API&#xff1a;wx.chooseAddress(OBJECT) wx.chooseAddress({success (res) {console.log(res.userName)console.log(res.postalCode)c…...

如何在Debian中配置代理服务器?

开始搭建代理服务器 首先我参考如下文章进行搭建代理服务器&#xff0c;步骤每一个命令都执行过报了各种错&#xff0c;找了博客 目前尚未开始&#xff0c;我已经知道我的路很长&#xff0c;很难走呀&#xff0c;加油&#xff0c;go&#xff01;go&#xff01;go&#xff01; …...

在外远程NAS群晖Drive - 群晖Drive挂载电脑磁盘同步备份【无需公网IP】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...

[SQL挖掘机] - 标量子查询

介绍: 标量子查询&#xff08;Scalar Subquery&#xff09;是一种特殊类型的子查询&#xff0c;它返回单个值作为结果&#xff0c;而不是结果集。标量子查询通常嵌套在另一个查询的选择列表、条件或表达式中&#xff0c;并提供单个值来完成计算、比较或作为查询结果的一部分。…...

MTK 进META的两种方式

1. Preloader进meta&#xff1a; 开机情况下&#xff1a;先发adb reboot meta进入Preloader&#xff0c;然后再进META 2. 开机后直接进meta...

AutoSAR系列讲解(实践篇)9.2-信息发送的Filter机制

再强调一遍哈,这几节的内容大家看不懂没关系。都属于不常用的知识,仅作了解,假如用到了可以再挖出来看看。还有一点,很多的英文不太好翻译,比如这里的Filter,翻译成滤波,筛选我感觉都不太贴切,干脆就直接叫Filter了,之后应该会出现类似的英文,博主尽量想办法让大家理…...

JVM详解(超详细)

目录 JVM 的简介 JVM 执行流程 JVM 运行时数据区 由五部分组成 JVM 的类加载机制 类加载的过程(五个) 双亲委派模型 类加载器 双亲委派模型的优点 JVM 中的垃圾回收策略 GC GC 中主要分成两个阶段 死亡对象的判断算法 引用计数算法 可达性分析算法 垃圾回收算…...

Vue学习Day3——生命周期\组件化

一、Vue生命周期 Vue生命周期&#xff1a;就是一个Vue实例从创建 到 销毁 的整个过程。 生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段&#xff1a;创建响应式数据 2.挂载阶段&#xff1a;渲染模板 3.更新阶段&#xff1a;修改数据&#xff0c;更…...

Rust vs Go:常用语法对比(八)

题目来自 Golang vs. Rust: Which Programming Language To Choose in 2023?[1] 141. Iterate in sequence over two lists Iterate in sequence over the elements of the list items1 then items2. For each iteration print the element. 依次迭代两个列表 依次迭代列表项1…...

pytorch学习-线性神经网络——softmax回归+损失函数+图片分类数据集

1.softmax回归 Softmax回归&#xff08;Softmax Regression&#xff09;是一种常见的多分类模型&#xff0c;可以用于将输入变量映射到多个类别的概率分布中。softmax回归是机器学习中非常重要并且经典的模型&#xff0c;虽然叫回归&#xff0c;实际上是一个分类问题 1.1分类与…...

Docker compose(容器编排)

Docker compose&#xff08;容器编排&#xff09; 一、安装Docker compose 1.安装Docker compose Docker Compose 环境安装 Docker Compose 是 Docker 的独立产品&#xff0c;因此需要安装 Docker 之后在单独安装 Docker Compose#下载 curl -L https://github.com/docker/co…...

xmind latex【记录备忘】

xmind latex 换行 换行必须要有\begin{align}和\end{align}&#xff0c;此时再在里面用\才能换行&#xff0c;如果只写112\224是不能换行的...

整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模 整流器模型预测控制mpc仿真三相...

整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模型预测控制fcs-mps&#xff0c;控制目标为跟踪电流和中点电位平衡&#xff0c;有参考文献文章&#xff1a;标题&#xff1a;整流器模型预测控制&#xff08;MPC…...

如何用Excel实现3D打印GCode的完全控制:FullControl GCode Designer终极指南

如何用Excel实现3D打印GCode的完全控制&#xff1a;FullControl GCode Designer终极指南 【免费下载链接】FullControl-GCode-Designer Software for designing GCODE for 3D printing 项目地址: https://gitcode.com/gh_mirrors/fu/FullControl-GCode-Designer 想要真正…...

Blender 3MF插件:让3D打印设计流程更智能的5个关键步骤

Blender 3MF插件&#xff1a;让3D打印设计流程更智能的5个关键步骤 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为3D打印文件格式转换而烦恼吗&#xff1f;想象一…...

GetQzonehistory:时光魔法盒,一键找回遗失的QQ空间青春记忆

GetQzonehistory&#xff1a;时光魔法盒&#xff0c;一键找回遗失的QQ空间青春记忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否还记得十年前在QQ空间写下的第一条说说&#x…...

Matlab含新能源(风电光伏)和多类型电动汽车配电网风险评估 软件:matpower+Mat...

Matlab含新能源&#xff08;风电光伏&#xff09;和多类型电动汽车配电网风险评估 软件&#xff1a;matpowerMatlab&#xff1a; 关键词&#xff1a;蒙特卡洛、时序、电网风险、风险评估、风光不确定性 介绍&#xff1a;由于电动汽车负荷与风电光伏出力的不确定性&#xff0c;造…...

ai辅助开发:构想未来,用快马生成鸿蒙pc版智能桌面助手原型

今天想和大家分享一个有趣的开发尝试——用AI辅助快速构建鸿蒙PC版的智能桌面助手原型。这个想法源于对鸿蒙系统多设备协同能力的兴趣&#xff0c;特别是看到官网展示的PC版生态愿景后&#xff0c;想探索如何用AI加速这类创新应用的开发。 项目构思 智能桌面助手的核心是自然语…...

YimMenu:守护GTA V体验的安全增强工具

YimMenu&#xff1a;守护GTA V体验的安全增强工具 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu 一、价…...

[Python3高阶编程] - 高阶函数一:常见的高阶函数

一、常见的高阶函数Python 中的高阶函数&#xff08;Higher-Order Function&#xff09;是指接收函数作为参数或返回一个函数的函数。Python 内置了大量高阶函数&#xff0c;下面按来源分类尽量列全&#xff1a;1. 内置高阶函数函数作用map(func, *iterables)将函数逐个作用于可…...

Amlogic设备启动失败解决方案:从兼容性诊断到系统部署的全流程方法论

Amlogic设备启动失败解决方案&#xff1a;从兼容性诊断到系统部署的全流程方法论 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s…...

告别重复造轮子:用快马平台ai一键生成lstm异常检测项目,效率提升百分之三百

今天想和大家分享一个用LSTM做智能家居异常用电检测的实战项目。这个项目特别适合家庭或小型商业场景&#xff0c;能帮我们及时发现电器故障、异常耗电等情况。传统开发这种系统要花很多时间在环境搭建和代码编写上&#xff0c;但借助InsCode(快马)平台的AI辅助功能&#xff0c…...