4. 软件设计中的可维护性

简介: 4. 软件设计中的可维护性

嵌入式软件调试技术

第1章 软件调试概述

1.1 什么是软件调试


1.2 软件调试的分类


1.2.1 静态调试和动态调试


1.2.2 机器级调试与源码级调试


1.2.3 任务级调试与系统级调试


1.2.4 本地调试与远程(交叉)调试


1.3 软件调试的关键技术·断点


1.3.1 软件断点


1.3.2 硬件断点


1.4 调试器应当遵循的原则


1.4.1 调试器必须反映真实信息


1.4.2 提供尽可能多的程序上下文信息


1.4.3 Heisenberg原则·尽可能减少对被测系统的影响


1.5 嵌入式软件调试手段


1.5.1 软件仿真调试·模拟器


1.5.2 ICE·早期手段


1.5.3 BDM·M68K系列及PowerPC等采用的技术


1.5.4 JTAG·调试领域的后起之秀


1.5.5 调试代理·嵌入式调试的基石


1.6 本章小结



第2章 边界扫描测试技术(JTAG)

2.1 JTAG的背景和原理


2.2 JTAG接口的结构


2.3 测试访问端口(TAP)


2.3.1 测试时钟输入TCK


2.3.2 测试模式输入TMS


2.3.3 测试数据输入TDI


2.3.4 测试数据输出TDO


2.3.5 测试复位输入TRST*


2.3.6 TAP的互联方式


2.4 测试访问端口控制器(TAP controller)


2.5 指令寄存器


2.6 JTAG指令


2.6.1 公共指令(public)与私有指令(private)


2.6.2 BYPASS指令


2.6.3 SAMPLE指令


2.6.4 PRELOAD指令


2.6.5 EXTEST指令


2.6.6 其他指令


2.7 数据寄存器组


2.7.1 BYPASS寄存器


2.7.2 边界扫描寄存器


2.7.3 设备ID寄存器


2.7.4 其他数据寄存器


2.8 ARM7TDMI的JTAG调试


2.8.1 调试架构


2.8.2 ARM7TDMI处理器结构


2.8.3 进入调试状态


2.8.4 JTAG指令


2.8.5 EmbeddedICE-RT逻辑


2.8.6 访问寄存器和存储器


2.9 本章小结



第3章 学习使用GDB调试器

3.1 GDB简介


3.1 1 GDB的启动和退出


3.1.2 GDB的启动步骤


3.1.3 GDB的多语言支持


3.2 在编译时加入调试信息


3.2.1 打开GCC的调试选项-g


3.2.2 代码优化对调试的影响


3.3 在GDB下运行程序


3.3.1 指定要运行的程序


3.3.2 设置程序的运行环境


3.3.3 停止运行


3.4 断点、监视点与捕捉点


3.4.1 断点、监视点与捕捉点的设置


3.4.2 断点的删除、禁用和使能


3.4.3 条件断点


3.4.4 断点命令列表


3.4.5 断点菜单·对函数重载的支持


3.5 继续(continuing)与单步(stepping)


3.5.1 继续运行


3.5.2 单步运行


3.5.3 与单步有关的命令


3.5.4 指令级单步命令


3.6 查看数据


3.6.1 用print命令查看数据


3.6.2 查看数据类型


3.6.3 人为数组·查看内存中的连续对象


3.6.4 查看存储器和寄存器


3.6.5 自动显示列表


3.6.6 使用快捷变量


(convenience variable)


3.6.7 处理C语言宏定义


3.6.8 产生转储文件


3.7 栈帧的回溯与选定


3.7.1 栈帧回溯(backtrace)


3.7.2 栈帧选定


3.7.3 栈帧状态


3.8 改变程序的执行流程


3.8.1 给变量赋值


3.8.2 使程序从另外的地址继续执行


3.8.3 向程序发送信号


3.8.4 调用函数


3.9 其他常用命令


3.9.1 源代码查看命令


3.9.2 反汇编命令


3.10 实例:Framebuffer与libjpeg混合编程


3.10.1 Framebuffer简介


3.10.2 libjpeg简介


3.10.3 程序说明


3.10.4 调试


3.11 GDB命令汇总


3.12 本章小结



第4章 GDB远程调试技术

4.1 目标平台简介


4.2 准备工作


4.2.1 minicom终端仿真程序


4.2.2 NFS文件系统


4.2.3 联合使用minicom和NFS


4.3 两种远程调试方式


4.3.1 gdbserver


4.3.2 远程插桩(stub)


4.4 编译arm-linux-gdb


4.5 编译gdbserver


4.6 连接到远程目标


4.6.1 启动gdbserver


4.6.2 串行连接方式


4.6.3 TCP连接方式


4.6.4 UDP连接方式


4.6.5 与远程目标断开连接


4.6.6 GDB的远程调试选项


4.7 实例:调试误用内存的程序


4.7.1 段错误


4.7.2 野指针


4.7.3 内存泄漏


4.7.4 处理内存问题的对策


4.8 实例:音频采集与回放程序的调试


4.8.1 Linux下的音频接口


4.8.2 OSS的编程接口


4.8.3 OSS的编程机制


4.8.4 OSS的一般框架


4.8.5 源程序SndKit.c说明


4.8.6 SndKit调试过程


4.9 本章小结



第5章 网络应用程序调试

5.1 套接口编程简介


5.1.1 基本TCP套接口编程


5.1.2 基本UDP套接口编程


5.2 网络调试和诊断工具


5.2.1 tcpdump


5.2.2 其他工具


5.3 实例:远程获取加速度


5.3.1 加速度传感器ADXL202JE简介


5.3.2 服务端程序


5.3.3 客户端程序


5.3.4 小结


5.4 实例:通过CDMA发送短消息


5.4.1 Linux串口编程概览


5.4.2 发送英文短消息


5.4.3 发送中文短消息


5.4.4 小结


5.5 本章小结



第6章 多进程与多线程调试

6.1 Linux下的多进程程序调试


6.1.1 进程的创建


6.1.2 GDB对多进程调试的支持


6.1.3 实例:调试simple_fork


6.2 Linux多线程程序调试


6.2.1 线程的创建、终止和取消


6.2.2 线程互斥锁


6.2.3 条件变量(condition variable)


6.2.4 线程的cleanup handler


6.2.5 线程特定数据


6.2.6 线程引入的问题


6.2.7 GDB对多线程调试的支持


6.2.8 实例:调试simple_thread


6.3 本章小结



第7章 静态库与动态库的调试

7.1 静态链接库的构建和调试


7.2 动态共享库的优点和代价


7.3 动态共享库的命名·soname


7.4 动态共享库的构建和安装


7.5 动态共享库的使用


7.6 动态共享库的调试方法


7.7 实例:解析AVI文件


7.7.1 AVI文件格式介绍


7.7.2 OpenDML所做之扩展


7.7.3 AVI解析之代码实现


7.7.4 编译共享库并安装到目标板


7.7.5 远程调试共享库


7.8 本章小结



第8章 MPEG-4视频播放器的设计及调试

8.1 概述


8.2 XviD与SDL的构建


8.3 XviD编程接口说明


8.3.1 版本


8.3.2 错误码


8.3.3 色场空间


8.3.4 profile和level定义


8.3.5 像素幅型比(Pixel Aspect Ration)


8.3.6 帧类型


8.3.7 xvid_global()函数


8.3.8 xvid_decore()函数


8.3.9 小结


8.4 SDL编程接口说明


8.4.1 SDL的初始化和退出


8.4.2 SDL视频子系统函数接口


8.4.3 SDL事件处理子系统函数接口


8.5 整体结构


8.6 辅助模块:event和ping/pong双缓冲区


8.7 解码模块设计


8.8 播放模块设计


8.9 驱动模块设计


8.10 本章小结



第9章 基于GPS的移动定位终端

9.1 功能概述


9.2 GPS介绍


9.2.1 GPS定位原理


9.2.2 GPS数据格式


9.3 MiniGUI介绍


9.3.1 MiniGUI体系结构与模型


9.3.2 交叉编译MiniGUI


9.3.3 为触摸屏编写IAL驱动层


9.3.4 改写MiniGUI服务器程序mginit


9.4 在单独的线程中读取和解析GPS数据


9.4.1 经纬度坐标到像素坐标的映射


9.4.2 双精度浮点数字节序的问题


9.4.3 通过异步串口读写GPS数据


9.4.4 解析GPS数据


9.4.5 计算归一化坐标


9.4.6 GPS线程


9.4.7 与GUI前端交换数据


9.4.8 GPS接收机模拟程序


9.5 用到的MiniGUI元素


9.5.1 主窗口


9.5.2 控件


9.5.3 静态框


9.5.4 按钮


9.5.5 编辑框


9.5.6 GDI接口与位图操作


9.5.7 定时器


9.5.8 消息处理过程


9.6 本章小结


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
6月前
|
人工智能 搜索推荐 数据可视化
用 Python 制作简单小游戏教程:手把手教你开发猜数字游戏
本教程详细讲解了用Python实现经典猜数字游戏的完整流程,涵盖从基础规则到高级功能的全方位开发。内容包括游戏逻辑设计、输入验证与错误处理、猜测次数统计、难度选择、彩色输出等核心功能,并提供完整代码示例。同时,介绍了开发环境搭建及调试方法,帮助初学者快速上手。最后还提出了图形界面、网络对战、成就系统等扩展方向,鼓励读者自主创新,打造个性化游戏版本。适合Python入门者实践与进阶学习。
790 1
|
7月前
|
人工智能 搜索推荐 前端开发
从代码到心灵对话:我的CodeBuddy升级体验之旅(个性化推荐微服务系统)
本文分享了使用CodeBuddy最新版本的深度体验,重点探讨了Craft智能体、MCP协议和DeepSeek V3三大功能。Craft实现从对话到代码的无缝转化,大幅提升开发效率;MCP协议打通全流程开发,促进团队协作;DeepSeek V3则将代码补全提升至新境界,显著减少Bug并优化跨语言开发。这些功能共同塑造了AI与程序员共生的未来模式,让编程更高效、自然。
736 15
|
12月前
|
机器学习/深度学习 算法 大数据
《特征工程:自动化浪潮下的坚守与变革》
特征工程在机器学习中至关重要,它将原始数据转化为模型可用的特征,提升模型性能。尽管自动化方法如自动编码器和特征选择算法逐渐兴起,能够在特定场景下高效处理数据,但人类专家的领域知识和直觉仍不可替代。未来,特征工程与自动化方法将融合共生,通过优势互补,共同推动机器学习技术的进步与发展。
241 15
|
9月前
|
Java Spring
Spring Boot的核心注解是哪个?他由哪几个注解组成的?
Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 : ● @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能; ● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项 ● @ComponentScan:Spring组件扫描
|
数据挖掘 BI 项目管理
哪些提醒软件最受欢迎?2024年5款高效工具评测与对比
随着工作节奏加快,人们越来越依赖提醒软件来管理任务和日程。本文推荐了5款2024年热门的提醒软件:板栗看板、Todoist、OmniFocus、Remember The Milk 和 Microsoft To Do。它们各自具备独特的功能,如看板管理、智能提醒、跨平台同步等,帮助用户提高工作效率。选择时需考虑平台支持、功能需求、界面设计及成本等因素。
1242 8
哪些提醒软件最受欢迎?2024年5款高效工具评测与对比
|
前端开发 JavaScript Android开发
移动端点击事件:原理、问题与解决方案
前端技术在移动端点击事件上的应用,涉及触屏交互、响应速度优化及用户体验提升,确保网页或应用在手机等移动设备上流畅运行。
|
SQL 存储 关系型数据库
京东面试:分库分表后,如何深度翻页?
在40岁老架构师尼恩的读者交流群中,有小伙伴在京东面试时遇到了MySQL分库分表后深度分页太慢的问题。本文详细分析了单表和分表场景下的性能问题及优化方法,包括索引覆盖、子查询分页、Join分页、禁止跳页查询、二次查询法等。此外,还介绍了使用ES+HBase的海量NOSQL架构方案。通过这些方法,可以显著提升分页查询的性能,帮助面试者在技术面试中脱颖而出。
京东面试:分库分表后,如何深度翻页?
|
JavaScript 应用服务中间件 Apache
获取客户端的IP地址
获取客户端的IP地址
|
应用服务中间件 Nacos nginx
nacos 2.3.2模式 standalone 使用nginx 反向代理之后访问nacos控制台静
nacos 2.3.2模式 standalone 使用nginx 反向代理之后访问nacos控制台静
|
Linux 虚拟化 Docker
深入了解Windows安装Docker
【8月更文挑战第22天】深入了解Windows安装Docker
774 0