嵌入式开发调试优化:使用 Python 脚本提升效率

news/2024/11/30 12:47:42/

        嵌入式开发是一项复杂且具有挑战性的工作,尤其是在调试过程中,开发者需要面对各种硬件与软件的交互问题。为了有效提高调试效率,使用自动化工具和脚本可以大大简化流程。在这篇文章中,我将分享几种常见的 Python 脚本,它们能够帮助嵌入式开发者进行调试优化。我们将涵盖串口日志收集、内存监控、性能测试、日志分析等方面的内容。

一、功能分享:

1. 串口日志收集脚本

        在嵌入式系统开发中,串口通常用于输出调试信息。使用 Python 脚本可以自动化收集这些日志数据,实时监控并分析串口数据。

        ps:这个脚本通过 pyserial 库与嵌入式设备建立串口连接,实时读取串口输出的数据。如果发现包含 "ERROR" 的信息,脚本会停止并输出错误提示。此脚本适用于实时监控和自动化日志收集,帮助调试过程中捕捉异常

python">import serial
import timedef collect_uart_data(port='/dev/ttyUSB0', baudrate=115200, timeout=1):# 打开串口连接with serial.Serial(port, baudrate, timeout=timeout) as ser:print(f"Connected to {port} at {baudrate} baudrate.")while True:if ser.in_waiting > 0:data = ser.readline().decode('utf-8').strip()  # 读取串口数据print(f"Received: {data}")if "ERROR" in data:  # 判断是否有错误信息print("Error detected!")breaktime.sleep(0.1)if __name__ == "__main__":collect_uart_data()

2. 实时内存使用监控脚本

        在嵌入式系统中,内存使用情况对系统的稳定性至关重要。很多时候系统的崩溃无外乎就两个原因:第一是系统时序的紊乱;第二就是内存泄漏和过度使用可能会导致系统崩溃。实时监控系统内存使用情况,可以很大程度上改善这个现象。

        ps:使用 psutil 库实时监控系统内存的使用情况。如果内存使用超过设定的阈值(例如这里我设置的80%),则输出警告信息。可以帮助开发者避免因内存不足而导致的系统崩溃,尤其在内存紧张的嵌入式系统中。

python">import psutil
import timedef monitor_memory_usage():while True:memory = psutil.virtual_memory()  # 获取内存使用情况print(f"Memory Usage: {memory.percent}%")if memory.percent > 80:  # 如果内存使用超过80%print("Warning: Memory usage is too high!")time.sleep(1)if __name__ == "__main__":monitor_memory_usage()

3. 自动化日志分析

        随着嵌入式开发项目的推进,生成的日志文件往往会非常庞大。通过 Python 脚本,我们可以自动分析这些日志文件,快速筛选出错误、警告或其他重要信息,节省人工查找的时间。

        ps:该通过正则表达式查找日志文件中的错误信息(如 "ERROR")和警告信息(如 "WARNING")。开发者可以快速定位到日志中的问题,而无需手动逐行检查。

python">import redef analyze_log_file(log_file):with open(log_file, 'r') as file:logs = file.readlines()error_pattern = re.compile(r'ERROR')  # 查找错误日志warning_pattern = re.compile(r'WARNING')  # 查找警告日志error_logs = [line for line in logs if error_pattern.search(line)]warning_logs = [line for line in logs if warning_pattern.search(line)]if error_logs:print("Errors found in the log:")for error in error_logs:print(error.strip())else:print("No errors found.")if warning_logs:print("\nWarnings found in the log:")for warning in warning_logs:print(warning.strip())else:print("No warnings found.")if __name__ == "__main__":analyze_log_file('device_log.txt')  # 提供日志文件路径

4. 性能测试脚本

        性能是嵌入式系统中非常关键的一个方面。通过对代码执行时间的监测,开发者可以发现性能瓶颈并进行优化。以下 Python 脚本模拟了对某个函数的性能测试。

        ps:通过 time.time() 来测量函数执行的时间,帮助开发者发现函数执行的瓶颈。通过这种方式,可以对嵌入式系统中的关键代码进行性能评估和优化。

python">import timedef test_function():# 模拟耗时的任务total = 0for i in range(1000000):total += ireturn totaldef measure_performance(func):start_time = time.time()  # 获取当前时间result = func()end_time = time.time()  # 结束时间elapsed_time = end_time - start_time  # 计算时间差print(f"Function executed in {elapsed_time:.6f} seconds")return resultif __name__ == "__main__":measure_performance(test_function)

二、应用与迁移:

        为了方便可以直接迁移到不同的嵌入式项目中,进行实际应用。以下是一些建议,帮助调试脚本,使它们能够更好地适应各种嵌入式项目。(大佬忽略)

1. 模块化设计与功能封装

        将不同的调试任务功能封装成独立的模块(Python 类或函数),这样可以确保每个脚本只负责一个特定的任务。通过模块化设计,脚本可以方便地在不同的项目中调用和复用。

        例如,日志收集、内存监控、性能测试等功能可以分别封装成不同的 Python 模块。用户只需要根据项目需要导入相应的模块。

python"># uart_logger.pyimport serial
import timeclass UartLogger:def __init__(self, port='/dev/ttyUSB0', baudrate=115200, timeout=1):self.port = portself.baudrate = baudrateself.timeout = timeoutself.ser = Nonedef start_logging(self):self.ser = serial.Serial(self.port, self.baudrate, timeout=self.timeout)print(f"Connected to {self.port} at {self.baudrate} baudrate.")while True:if self.ser.in_waiting > 0:data = self.ser.readline().decode('utf-8').strip()  # 读取串口数据print(f"Received: {data}")if "ERROR" in data:  # 判断是否有错误信息print("Error detected!")breaktime.sleep(0.1)def stop_logging(self):if self.ser:self.ser.close()print("Connection closed.")

from uart_logger import UartLogger

logger = UartLogger(port='/dev/ttyUSB1', baudrate=9600)
logger.start_logging()

        直接使用UartLogger 类封装了串口日志收集功能,使用时只需创建该类的实例并调用 start_logging() 方法即可。stop_logging() 方法用于关闭串口连接 

2. 配置文件与参数化

        为了增强脚本的灵活性,可以通过配置文件(如 .ini.json 或 .yaml 格式的文件)来管理不同项目的配置参数。这样,可以通过修改配置文件而不需要改动代码本身,从而在不同的项目中快速适配。

示例:配置文件 (config.json)

{
    "uart": {
        "port": "/dev/ttyUSB0",
        "baudrate": 115200,
        "timeout": 1
    },
    "memory_monitor": {
        "threshold": 80
    }
}

python"># config.py
import jsondef load_config(config_file='config.json'):with open(config_file, 'r') as f:config = json.load(f)return config# uart_logger.py
from config import load_config
import serial
import timeclass UartLogger:def __init__(self, config):self.port = config['uart']['port']self.baudrate = config['uart']['baudrate']self.timeout = config['uart']['timeout']self.ser = Nonedef start_logging(self):self.ser = serial.Serial(self.port, self.baudrate, timeout=self.timeout)print(f"Connected to {self.port} at {self.baudrate} baudrate.")while True:if self.ser.in_waiting > 0:data = self.ser.readline().decode('utf-8').strip()  # 读取串口数据print(f"Received: {data}")if "ERROR" in data:  # 判断是否有错误信息print("Error detected!")breaktime.sleep(0.1)def stop_logging(self):if self.ser:self.ser.close()print("Connection closed.")if __name__ == "__main__":config = load_config()logger = UartLogger(config)logger.start_logging()

# main.py
from uart_logger import UartLogger
from config import load_config

config = load_config('config.json')
logger = UartLogger(config)
logger.start_logging()

解释:在这个例子中,config.json 文件用来存储串口连接的相关配置。通过 load_config 函数加载配置后,UartLogger 类可以使用这些配置参数,确保脚本能够在不同的项目中灵活配置和使用。


http://www.ppmy.cn/news/1551197.html

相关文章

基础入门-Web应用架构搭建域名源码站库分离MVC模型解析受限对应路径

知识点: 1、基础入门-Web应用-域名上的技术要点 2、基础入门-Web应用-源码上的技术要点 3、基础入门-Web应用-数据上的技术要点 4、基础入门-Web应用-解析上的技术要点 5、基础入门-Web应用-平台上的技术要点 一、演示案例-域名差异-主站&分站&端口站&…

Git 使用总结

下载 git bash:http://git-scm.com/download/win 从github仓库中下载项目到本地:git clone 项目网址,得到一个文件夹 … 修改文件 … 修改完成后,进行上传的过程: 文件夹右键通过 git bash 进入 初始化:g…

Springboot组合SpringSecurity安全插件基于密码的验证Demo

Springboot组合SpringSecurity安全插件基于密码的验证Demo!下面的案例&#xff0c;都是基于数据库mysql&#xff0c;用户密码&#xff0c;验证登录的策略demo。 1&#xff1b;引入maven仓库的坐标 <dependency><groupId>org.springframework.boot</groupId>…

com.alibaba.fastjson.JSONException: not close json text, token : error

今天遇到一个相当智障的问题&#xff0c;前端传参数到后端&#xff0c;后端直接报json解析错误&#xff0c;not close&#xff1f;&#xff1f; 听着就很奇怪&#xff0c;关键有的时候正常&#xff0c;有的时候不正常。于是先在浏览器中F12&#xff0c;看传的参数 感觉 没问题&…

vulnhub靶场之hackableⅢ

hackable3 前言 这里使用virtual box加载靶机 靶机&#xff1a;hackable3 攻击&#xff1a;kali 主机发现 使用arp-scan -l扫描 信息收集 使用nmap扫描 这里明显&#xff1a; 22端口ssh服务可能过滤了80端口开启apache的http服务 网站目录扫描 使用dirsearch扫描&…

渗透测试笔记—Windows基础和病毒制作

声明&#xff1a; 学习视频来自B站up主 【泷羽sec】有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&am…

数据采集中,除了IP池的IP被封,还有哪些常见问题?

在数据采集的过程中&#xff0c;代理IP池的使用无疑为我们打开了一扇通往信息宝库的大门。然而&#xff0c;除了IP被封禁这一常见问题外&#xff0c;还有许多其他问题可能影响数据采集的效果。本文将探讨在数据采集中&#xff0c;除了IP被封之外&#xff0c;还可能遇到的一些常…

深入探索Facebook的技术生态:社交网络背后的科技创新

Facebook&#xff08;现Meta&#xff09;作为全球领先的社交平台&#xff0c;其背后的技术生态是推动其不断创新与发展的关键。除了作为一个社交网络&#xff0c;Facebook通过深度融入人工智能、虚拟现实、增强现实等前沿技术&#xff0c;重塑了数字社交的未来。本文将简要探讨…