嵌入式软件:通过串口进行调试的一些思考和实践

2023-05-16

    最近的工作还是改那坨代码……维护这摊东西也快要2年了,好几次想重构它,顺便整理一下,不过我还是缺乏那种毅力。在这段时间里我还加了一些功能模块,估计如果以后有新人接手这摊东西,会抱怨这么多垃圾,呵呵。但不管量产有多少垃圾,我还是有些“经验”需要总结一下。
    先说下目标系统的特点:一,硬件资源丰富:对于我们简单的应用来说,处理器的频率够快了,内存够大了,FlashROM也有富余;二,对外接口简单:多数情况下,只有一两个串口与外设交互。目前,我们的目标系统的开发和使用有几个问题:软件需求变动比较频繁、软件bug很多;平时我们是通过仿真器调试和下载程序,对于结构和线路紧凑的设备,频繁连接仿真器对设备的状态有不利影响。所以,通过串口进行软件在线升级以及进行在线调试可以大大方便了开发和维护,提高效率。
    现时我们已有不少设备具备串口软件在线升级功能;但串口在线调试还没有,针对我们目标系统的硬件环境和使用情况,串口在线调试功能的可行性和实用性还是挺大的。经过简单的调研,用仿真器进行调试是处理器芯片提供硬件级的支持,而用串口在线调试则是在软件内提供对外调试接口这种“插桩式”的软件级支持,显然性能相比用串口会差很远,而且前提是串口部分代码要正常工作,不过从易用性来说用串口还是很有优势的。
    我打算分几步实现串口在线调试。首先是对变量内存数据的读取。例如输入x 0x400,输出0xFACEDEAD这样。由于我们的目标系统用的是平坦的内存模型,这样很好办,读取内存变量都不需要权限、不需要重定位等,直接把指定地址开始的一定数量字节从串口送出来,唯一需要注意的是串口传输速率一般都不高,读大数据可能会有延时,这里可能会影响程序实时性和有同步问题。
    第二步是对指定地址内存的修改。其实这和读内存的实现差不多,就是data=*addr和*addr=data的差别;但因为如果操作不慎,会影响程序正常运行,如果和固件存储相关甚至会影响设备配置(即不但影响了这次程序的运行,还影响到关机重启以后的程序运行)。所以如何实现好这个接口的确挺费脑筋的。
    第三步就是对程序的运行控制了,模拟仿真器设断点、暂停、恢复等调试功能。这个我原理上还没弄懂,不知道实现方法;大概的方向就是以第二步为基础,把断点对应代码的内存数据改成会使CPU停下来的指令,例如中断/异常/死循环等等,涉及到寄存器的修改,好像挺麻烦的。
    第四步就是实现单步、连续。。。等等其他常用调试功能。此外,除了目标系统软件要提供接口实现,上位机(调试主机)利用这些接口开发辅助程序也很有必要,尤其是对于第三第四步,需要保存/恢复断点位置内容,纯手工效率太低。
    目前,第一步目标系统基本的接口已经实现,上位机方面我打算写个小程序,从可执行文件或者映射文件把符号翻译成地址,从工程头文件获得结构体信息,从而使内存数据意义的可读性更好。此外,我还留了几个“功能强大”的接口,其一是uCOS的OSQPost %addr %msg,在我们的那坨代码里很多消息传递,这个可以改变软件的执行流程;其二是更一般的%func_addr %arg1 %arg2 ...,这个可以直接执行任意函数,其中参数传递方面我还研究得不多,似乎多数函数都是用寄存器传参数而不是通过栈,所以我直接传int型,具体函数的具体参数会根据类型截取长度,可能这种做法通用性欠缺,超过8个参数会有问题,不过一般参数太多的函数不太好吧。当然,这两个接口危险性都很大,调用不慎都会崩掉。不过,现在我用这几个接口调试感觉很爽。
    总而言之,我的这些所谓“经验”,可说是公司的制度、开发水平和具体应用需求的产物,可能换了个环境就会变成“鸡肋”,又或者有更科学的方法我还没接触到。不过无论如何,这都是我工作中一个实实在在的脚印,是我在开发的思路的一种体现,务必整理好记录下来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式软件:通过串口进行调试的一些思考和实践 的相关文章

  • JDK和SDK的区别

    JDK和SDK的区别如下 xff1a 1 SDK是Software Development Kit的缩写 xff0c 中文意思是 软件开发工具包 这是一个覆盖面相当广泛的名词 xff0c 可以这么说 xff1a 辅助开发某一类软件的相关文档
  • 【无标题】

    GANimator Neural Motion Synthesis from a Single Sequence This repository provides a library for novel motion synthesis f
  • Effective C++(一):让自己习惯C++

    个人读书记录 xff0c 不适用教学内容 目录 条款01 xff1a 视C 43 43 为一个语言联邦 条款02 xff1a 尽量以const xff0c enum xff0c inline替换 define 条款03 xff1a 尽可能使
  • Effective C++(二):构造/析构/赋值运算

    个人读书记录 xff0c 不适用教学内容 目录 条款05 xff1a 了解C 43 43 默默编写并调用了哪些函数 条款06 xff1a 若不想使用编译器自动生成的函数 xff0c 就该明确拒绝 条款07 xff1a 为多态基类声明virt
  • Effective C++(三):资源管理

    个人读书记录 xff0c 不适用教学内容 目录 条款13 xff1a 以对象管理资源 条款14 xff1a 在资源管理类中小心copying行为 条款15 xff1a 在资源管理类中提供对原始资源的访问 条款16 xff1a 成对使用new
  • Unreal Engine工程项目目录及对应作用

    目录 vs Binaries xff1a 编译文件 Config xff1a 配置文件 Content xff1a 资产文件 DerivedDataCache xff1a UE针对平台特化的资源版本 Intermediate xff1a 中
  • Unreal Engine中的UHT和UBT

    UBT xff1a 附加在引擎之外的一个自定义工具 xff0c 用于管理跨各种构建配置 xff0c 来配置和构建 UE源码的过程 UHT xff1a 一个支持UObject系统的自定义解析和代码生成工具 目录 UBT xff08 Unrea
  • Unreal Engine项目目录结构

    目录 Engine 引擎源码文件 Games 项目工程文件 Visualizer VS编辑器配置文件 之前说的是工程目录结构 xff0c 这次来说项目目录结构 这里只是举了个例子 xff0c 实际请根据不同的UE版本自行分析 Engine
  • Unreal Engine的编译类型和命名规则

    目录 编译类型 命名规则 资源命名规则 文件夹命名规则 编译类型 debug game只能调试你的项目 xff0c 不能调试编辑器项目 多加了一个editor xff0c 就可以调试编辑器了 不同的编译类型可以理解为引擎在不同的类型下的监管
  • 面向对象设计的一些原则

    人很懒惰 xff0c 不愿意多写代码 xff0c 即便是Ctrl C 43 Ctrl V 也不愿意把别人的代码改来改去 xff0c 由此产生了各种复用的方法和设计原则 目录 单一职责原则 里氏转换原则 依赖倒置原则 迪米特原则 接口隔离原则
  • Unreal Engine中的Actor:理解、生成与消亡

    目录 谈谈Actor 生成 xff08 实例化 xff09 Acotr StaticClass UClass xff1a 类模板 类的快照 Actor的生命周期 Actor的消亡 Destroy xff1a 标记删除 SetLifeSpan
  • Android5.0网络之ipv6

    移动设备的大量兴起势必进一步加强ip地址不足的危机 ipv6或许成为一种比較好的选择方案 ipv6地址的获取分为两种方式 xff1a 无状态 xff1b 有状态 无状态 xff1a 通过接收路由公告 RA 来设置自己的ipv6地址 有状态
  • Unreal Engine中调试常用方法

    目录 常用调试方法 AddOnScreenDebugMessage UE LOG xff1a 在控制台看调试信息 在蓝图中直接调用PrintString 自定义日志分类 声明 定义 简化日志输出的宏 日志格式化输出 常用调试方法 在虚幻引擎
  • UE中的FString操作

    此篇是指单纯记录 xff0c 方便之后查阅 目录 创建 转型到FString FString转型到其他类型 字符串中是否包含指定串 查找给定串在其中是什么位置 字符串比较 读文件 裁剪字符串 编码解决的是文字问题 稍微细致一些的可以看 xf
  • 关于UE4/UE5的LogProperty: Warning: Serialized Class XXX for a property的尝试解决方案

    Warning reference will be nullptred Development Programming amp Scripting Epic Developer Community Forums unrealengine c
  • UE中的宏GENERATED_BODY()做了什么?

    宏GENERATED BODY做了什么 xff1f 阿佑001 博客园 cnblogs com 添加了一个静态函数static void StaticRegisterNativeUMyObject 声明结构体struct Z Constru
  • Unreal Engine 网络系统(一):网络模型及网络视角下的Gameplay框架

    个人学习记录 xff0c 如有错误请及时联系我 xff01 欢迎交流 xff01 1 客户端 服务器模型 服务器 xff1a 有一个客户端担当游戏状态的主控者 作用 xff1a 做出所有重要决定 xff0c 保证公平性 xff0c 包含所有
  • Unreal Engine 网络系统(二):网络对象同步、网络身份

    目录 网络身份 行为同步和属性同步 Actor网络身份 区分Client amp Server 身份授权类别 划分终端所在用途 思考几个问题 xff1a 什么是同步 xff1f 网络游戏中 xff0c 什么内容需要同步 xff1f 虚幻中的
  • Unreal Engine 网络系统(三):RPC同步

    目录 RPC RPC执行分三种形式 修改所有权 RPC 全称Remote Procedure Call xff0c 远端调用 指在本机上调用函数 xff0c 但在其他机器上远程执行的函数 RPC函数可以允许Client或Server通过网络
  • Unreal Engine 网络系统(四):UEC++的RPC

    目录 行为同步 On Server xff1a 服务端的RPC代码 On Client xff1a 客户端的RPC代码 NetMulticast xff1a 广播的RPC代码 属性同步 行为同步 借助UFUNCTION进行函数标记 UFUN

随机推荐

  • Unreal Engine 网络系统(五):带宽管理(相关性及优先级)

    目录 相关性 优先级 创建 查找 加入房间 xff08 Session xff09 网络游戏是通过计算机硬件通信方案将多台终端连接 xff0c 组建的玩家沟通环境 xff0c 从而使得玩家连接到一起游戏 受限于网络传输环境的影响 xff0c
  • 字串起始位置最大值

    给定两个字符串s1和s2 xff0c 如果s1删除若干个字符后变成s2 xff0c 则称s2为s1的子串 xff0c 求s2在s1中的起始位置的最大值 输入描述 xff1a 只有一行 s1 xff0c s2 xff0c s1和s2用空格隔开
  • 【c++】的作用域 (局部域,类域,名字命名空间,文件域)

    这里写目录标题 局部域类域类修饰指针由类限制修饰指向变量的指针由类修饰指向函数的指针 命名空间背景 xff1a 文件域 c 43 43 支持四个域 xff1a 局部域 xff0c 类域 xff0c 名字空间域 xff0c 文件域 局部域 函
  • Java变量名规则

    给大家简单介绍一下java中的变量名规则 和实用的起名工具 记忆变量名起名规则小技巧 变量名开头可用的类型 字下美人 字母 下划线 美元符号 人民币符号 变量名开头后面可用的类型 字下美人数非 字母 下划线 美元符号 人民币符号 数字 非关
  • Linux中的字符串和字节序列处理函数

    花了两天的时间总结了Linux编程时的字符串操作函数和字节序列操作函数 xff0c 以便后续查阅 这些函数大都不会去检查传入的参数是否为NULL xff0c 因此在使用之前要自己做检查 xff0c 否则后果你懂的 一个基本知识点 xff1a
  • extern "c"用法解析

    引言 C 43 43 保留了一部分过程式语言的特点 xff0c 因而它可以定义不属于任何类的全局变量和函数 但是 xff0c C 43 43 毕竟是一种面向对象的程序设计语言 xff0c 为了支持函数的重载 xff0c C 43 43 对全
  • 解决树莓派Unbuntu mate 使用VNC连接灰屏报错“Could not acquire name on session bus”问题

    修改 vnc xstartup 文件 打开 vnc xstartup 文件 1 添加两行 unset SESSION MANAGER unset DBUS SESSION BUS ADDRESS 2 查看桌面环境是什么 xff1a 先查看系
  • python:isinstance用法

    isinstance xff08 object xff0c type xff09 只要object是type类型 xff0c 返回True xff1b 否则返回False 作用 xff1a 来判断一个对象是否是一个已知的类型 其第一个参数
  • windows下开启Qemu串口调试

    1 EDKII 包编译 如果要在 windows 下启用串口信息打印 xff0c 需要在 build 时加 D DEBUG ON SERIAL PORT 选项 需要注意的是 xff0c 在 target txt 中 TARGET 只能是 D
  • 关于深度学习主机的一些选配问题

    作为一个深度学习的初学者 xff0c 你可能会遇到这样的问题 xff1a 我该如何训练我自己或者别人的Model xff1f 我该如何配置一台合适的主机 xff1f 目前有哪几种训练模型的方式 xff1f 接下来 xff0c 我将会对此进行
  • FreeRTOS中两个同等级无阻塞打印任务,只有一个能正常打印

    环境 xff1a STM32CubeMX 43 MDK5 printf重定向用的是官方例子 ifdef GNUC With GCC small printf option LD Linker gt Libraries gt Small pr
  • putty 连接Debian linux 报错Connection refused

    ubuntu默认并没有安装ssh服务 xff0c 如果通过ssh链接ubuntu xff0c 需要自己手动安装ssh server 判断是否安装ssh服务 xff0c 可以通过如下命令进行 xff1a xjj 64 xjj desktop
  • python 使用playsound模块出现编码问题。

    Error 259 for command play sound zhou mp3 wait 驱动程序无法识别指定的命令参数 Error 263 for command close sound zhou mp3 指定的设备未打开 xff0c
  • C/C++ 编程推荐学习顺序和书籍

    自学或者学习C C 43 43 编程不知道怎么办 xff1f 那么恭喜你看到本文 xff0c 本文将会为你提供C C 43 43 编程的学习书籍顺序推荐 xff0c 希望对大家有帮助 xff01 C C 43 43 语言基础入门书籍 xff
  • Android Studio 控制台中文乱码,解决方案都在这里了,完美解决

    前言 Android Studio 如果不进行配置的话 xff0c 运行程序时控制台中文乱码问题会非常严重 xff0c 甚至影响我们对信息的获取和程序的跟踪 通过历年的开发经验 xff0c 在本文中我总结出四点用于解决控制台中文乱码问题的方
  • 【C/C++】中的__FILE__、__LINE__、#line、__func__关键字(预定义宏)

    c 43 43 11预先定义了一些标识符 xff0c 其实也就是宏 现在简单说几个 xff1a 1 FILE 用于指示本行语句所在源文件的文件名 xff0c 如下 xff08 test c xff09 xff1a include lt st
  • 视觉SLAM入门十四讲

    视觉SLAM入门十四讲 写在前面的话什么是视觉SLAM视觉SLAM中所使用的摄像头传感器单目摄像头双目摄像头深度摄像头 经典视觉SLAM框架 写在前面的话 考研期间迷上了SLAM xff0c 买来了高翔 张涛等著的 视觉SLAM十四讲 从理
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • 敏捷开发:做一个合格的Scrum Master

    图片来源于网络 Scrum Master Beauty and Beast 在Scrum敏捷开发中有三种主要的角色 xff1a Product Owner xff08 产品负责人 xff0c 简称 34 PO 34 xff09 Scrum
  • 嵌入式软件:通过串口进行调试的一些思考和实践

    最近的工作还是改那坨代码 维护这摊东西也快要2年了 xff0c 好几次想重构它 xff0c 顺便整理一下 xff0c 不过我还是缺乏那种毅力 在这段时间里我还加了一些功能模块 xff0c 估计如果以后有新人接手这摊东西 xff0c 会抱怨这