- 博客(67)
- 收藏
- 关注
原创 软件调试基础(四【断点和单步执行】4.1)
bash# 1. 在WinDBG中设置软件断点bp 地址bp 函数名bp 模块名!函数名# 2. 设置带条件的断点bp 地址 "条件表达式"# 3. 设置一次性断点ba e1 地址 # 执行时中断一次。
2025-12-20 13:50:10
441
原创 软件调试基础(三【中断和异常】3.4-3.7)
架构核心机制主要特点x86 32位IDT + 门描述符支持任务门、硬件任务切换x86 64位IDT + IST机制取消任务门,引入IST栈切换ARM异常向量表 + VBAR统一异常模型,指令跳转方式。
2025-12-08 09:21:38
605
原创 软件调试基础(三【中断和异常】3.1-3.3)
中断是外部异步事件,异常是内部同步事件。中断机制使 CPU 能高效响应外设,异常机制处理指令执行中的错误或特殊行为。理解二者的区别与联系是掌握 CPU 工作机制和操作系统设计的基础。分类报告时间保存的CS和EIP指针可恢复性典型例子错误(Fault)开始执行导致异常的指令时导致异常的指令通常可恢复缺页异常、除零错误陷阱(Trap)执行完导致异常的指令时下一条指令可以恢复INT 3断点、INT n指令中止(Abort)不确定不确定不可以恢复硬件错误、系统表错误。
2025-10-27 09:27:42
464
原创 软件调试基础(二【CPU基础】2.9-2.10)
最初为Acorn RISC Machine(Acorn计算机公司的RISC芯片项目),后改为Advanced RISC Machines(1990年成立的公司名称)。:Architecture Reference Manual(架构参考手册),类似于英特尔的SDM,是ARM架构的权威参考资料。(2011年):引入64位支持(AArch64/AArch32状态),增强NEON和密码处理指令。(Application):面向复杂通用应用,支持基于MMU的虚拟内存系统,用于智能手机等设备。
2025-10-09 09:15:07
851
原创 软件调试基础(二【CPU基础】2.7-2.8)
分页机制的核心是页表,每个进程都有自己独立的页表,进程空间的切换实质上就是页表的切换,由CR3寄存器记录当前任务的页表位置。页目录表存放页目录表项(PDE),每个PDE长度为32位(4字节),每个页目录包含1024个PDE。页表存放页表项(PTE),每个PTE长度为32位,指向4KB内存页的起始物理地址(高20位,低12位为0)。每张页目录和页表包含512个表项(9位索引),大小仍为4KB。指向4MB内存页的PDE格式类似,但高10位代表4MB内存页的起始物理地址的高10位(低22位为0)。
2025-09-23 09:03:53
587
原创 软件调试基础(二【CPU基础】2.5-2.6)
简化内存管理,多进程共享相同段描述符(如CS=0x001B, DS=0x0023)→ 特权级分层(Ring 0~3) + 权限检查(DPL/CPL/RPL)。:段描述符(Segment Descriptor)定义段的基址、边界和访问属性。(Paging):线性地址 → 物理地址(详见2.6、2.7节)。:CPU调度的独立程序单位(操作系统视角:进程/线程)。高特权级(内核)可访问低特权级(应用),反之触发异常(如。(任务寄存器):存储当前任务TSS(任务状态段)的选择子。
2025-08-18 09:14:09
896
原创 软件调试基础(二【CPU基础】2.3-2.4)
IA-32处理器为兼容早期8086程序,定义了5种操作模式(见图2-2),确保现代CPU能执行不同时代的软件。注:调试寄存器(DR0~DR7)、性能监视寄存器等将在后续章节详述(第 4、5 章)。:R8~R15(可通过 R8D/R8W/R8B 访问低 32/16/8 位)。:由通用寄存器的位数决定(如 32 位 CPU 的寄存器宽度为 32 位)。:默认 64 位,通过 ID(地址)访问(如 EFER 寄存器 ID=应用程序可兼容32位(在兼容模式执行)或64位(在64位模式执行)。
2025-08-06 09:30:03
1014
原创 软件调试基础(二【CPU基础】2.1-2.2)
现代融合趋势:x86内部将CISC指令转为RISC微操作(μops);动态调度指令池中的μops → 分发到执行单元(ALU/FPU等)→ 结果写回指令池。内存控制器入片(Nehalem)→ GPU 单晶片集成(Sandy Bridge)检查指令状态 → 将临时结果永久化(写寄存器/内存)→ 保证逻辑正确性。:16位(8086)→32位(386)→64位(P4 EM64T)多核设计:Core 2 Duo(双核)/Quad(四核):系统编程指南(保护模式/虚拟化/APIC/缓存管理)
2025-07-14 09:39:12
927
原创 软件调试基础(一【6】)
软件调试是软件工程的核心环节,贯穿软件全生命周期(需求分析→维护支持)。本节系统解析软件问题的核心概念、责任归属、生命周期及经济成本,为软件调试提供理论基础。:临近发布时,调试能力直接决定项目能否按期交付(60%延期因未及时修复Bug导致)。:早期调试可避免后期指数级修复成本(需求阶段修复成本仅为运行阶段的1/75)。:提升代码可调试性(Debuggability)是高质量软件的关键指标。+------------------→ 软件生命周期阶段。:提升可调试性设计,将Bug拦截在需求阶段。
2025-06-09 10:31:31
499
原创 软件调试基础(一【5】)
单步执行是调试中用于逐条跟踪程序执行过程的核心技术,通过精细控制程序执行流程,帮助开发者观察代码动态行为。调试器利用符号文件中的行号信息,判断程序指针(IP)是否跨越语句边界,自动重复触发汇编级单步。保存中断时程序的状态(寄存器值、指令指针、标志位等),是分析问题的关键依据。:在代码中插入调试语句,将变量值、执行路径等信息输出至控制台、文件或调试器。断点的特殊形式,触发后自动执行预设动作(如打印变量值、记录日志),(后续章节展开):如内存分析、单步执行、日志调试等。
2025-06-03 09:46:59
883
原创 ARM 链接文件.sct【Image$$<Region_Name>$$<Base/Limit>】
在嵌入式系统中,符号 和 是由链接器自动生成的关键地址标识符,用于精确访问和管理特定内存区域的起始与结束地址。以下是其详细解析和应用总结:命名规则: 表示内存区域 起始地址, 表示内存区域 结束地址的下一个字节。 其中 是链接脚本中定义的内存区域名称(如 )。生成来源: 由 ARM 链接器(如 )在链接过程中根据 分散加载文件( 文件) 自动生成。GCC 链接器( 文件)则使用类似 和 的符号。内存区域定位: 提供代码中直接访问特定内存区域的物理地址,无需硬编码地址值,增强可移植性和灵活
2025-03-22 11:33:56
1325
原创 CmBacktrace的cmb_cfg.h
核心目标:通过合理配置,使 CmBacktrace 库适配目标硬件和操作系统,实现故障诊断功能。关键配置:打印输出适配硬件。CPU 和 OS 类型的正确声明。按需启用堆栈转储和语言支持。调试建议:结合 HardFault 异常处理,利用库输出的信息分析崩溃原因(如非法内存访问、栈溢出)。通过此配置文件,开发者可以灵活地将 CmBacktrace 集成到不同嵌入式平台中,显著提升系统调试效率。
2025-03-16 12:48:03
433
原创 FATFS学习(3.3):ff.c(f_write)
函数,FATFS 实现了高效可靠的文件写入机制,兼顾性能与资源效率,满足嵌入式系统对存储操作的严苛要求。在部分写入场景下,若目标扇区不在缓存中,需先读取原扇区内容,避免覆盖未修改数据。对小数据或非对齐写入,先写入文件对象或全局缓存,延迟写回磁盘,减少碎片化操作。:动态扩展文件簇链(分配新簇),处理大文件和跨簇写入。:当剩余数据超过扇区大小时,直接写入连续扇区。:若为部分扇区写入,标记缓存为脏,延迟写回。:直接写入新簇的连续扇区,更新文件大小。:剩余数据写入新簇的扇区,更新。:写入部分数据至当前簇末尾。
2025-03-13 21:59:51
1156
原创 FATFS学习(3.2):ff.c(f_open)
例如,`DIR dj` 用于目录操作,`FATFS *fs` 指向文件系统对象,还有一些条件编译的宏(如 `FF_FS_READONLY`、`FF_FS_EXFAT` 等),这些宏会影响代码的编译路径,需要特别注意。在分析过程中,可能会遇到一些不熟悉的函数或宏,例如 `DEF_NAMBUF`、`INIT_NAMBUF`、`FREE_NAMBUF`,这些可能与长文件名支持相关,需要结合FATFS的文档或源码其他部分来理解其作用。这里会根据访问模式 `mode` 进行相应的挂载操作,可能涉及权限检查。
2025-03-13 09:53:11
1240
原创 CmBacktrace的学习跟移植思路
CmBacktrace是针对ARM Cortex-M系列MCU的错误追踪库,支持自动诊断HardFault、Bus Fault等异常原因,并输出函数调用栈信息,帮助快速定位代码错误。核心功能包括:故障寄存器解析、堆栈回溯、多语言错误信息输出、支持裸机和RTOS(如FreeRTOS、RT-Thread)。熟悉IDE(如Keil、GCC)的调试配置和链接脚本(Linker Script)的修改方法。学习HardFault等异常的触发条件及寄存器(如SCB->CFSR、LR、PC)的作用。
2025-03-09 14:27:15
1075
原创 FATFS学习(3.4):ff.c(f_read)
在分析过程中,需要注意FATFS的条件编译选项,如FF_USE_FASTSEEK、FF_FS_READONLY、FF_FS_TINY等,这些宏定义会影响代码的执行路径。可能遇到的疑问点包括:簇和扇区的转换逻辑、快速查找(CLMT)的实现细节、缓存脏数据的处理流程,以及不同配置(如Tiny模式)对缓存管理的影响。然后,处理部分扇区数据的读取。通过这样的逐步分析,可以深入理解`f_read`函数的实现机制,掌握FATFS库在嵌入式系统中高效读取文件数据的方法,以及如何处理各种边界条件和错误情况。
2025-03-05 15:37:17
1261
原创 FATFS学习(2.4):ff.h
直接转发数据流 | 避免中间缓冲,适合内存受限系统 | 网络数据传输到文件 || 立即写入缓存数据 | 确保关键数据落盘(如断电前调用) | 实时数据保护 |: 分配模式(立即填充0或延迟分配) | 视频录制预分配大文件 || 预分配连续空间 |
2025-02-24 10:08:03
980
原创 FATFS学习(2.3):ff.h
MKFS_PARM是一个高度面向文件系统底层细节的结构体,通过精确控制格式化参数,开发者可以适配不同硬件特性和应用需求。其设计体现了对 FAT 家族文件系统的历史兼容性和现代存储需求的平衡。在实际使用中,需结合具体文件系统规范和硬件特性选择参数。
2025-02-24 09:33:41
1236
原创 FATFS学习(2.2):ff.h
是 FatFs 库中用于管理文件或目录对象的元数据结构体,记录对象在文件系统中的存储位置、状态、属性及并发控制信息。其成员变量根据配置选项(如。
2025-02-18 20:57:03
1128
原创 FATFS学习(1):ffconf.h
FF_LBA64 用于控制是否支持 64 位 LBA,以访问大于 2 TB 的存储设备。启用 64 位 LBA 需同时启用 exFAT 文件系统(FF_FS_EXFAT == 1)。底层驱动需支持 64 位地址操作,确保功能正常。
2025-02-13 21:00:16
1537
原创 Service框架设计
背景随着 IOT 设备的快速发展,用户对于高效,安全,可扩展的服务框架需求越来越强烈,Service 技术框架应运而生,Service 技术框架是一种基于服务架构,它将应用程序划分为服务,这些服务可以用过设备环境网络通信并组合在一起形成应用程序,Service 技术框架可以提供多种服务,例如数据访问服务,安全服务,剥离数据显示交互,实现 MVC 或 MVVM 的技术基础。MVC是一种久经考验的经典架构模式,专为用户界面设计与构建而生,旨在实现各组件间的低耦合度。
2024-11-29 09:56:55
1206
原创 lvgl: 示例--样式(1)
注: /*Shift the gradient to the bottom*/开始渐变的位置在128,在192的位置结束渐变。
2024-11-13 13:40:00
979
原创 lvgl:简介(1)
LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。
2024-11-05 21:28:03
1248
原创 lvgl 模拟器移植(V9)
github链接:GitHub - lvgl/lv_port_pc_visual_studio: Visual Studio projects for LVGL embedded graphics library. Recommended on Windows. Linux support with Wayland is work in progress.https://github.com/lvgl/lv_port_pc_visual_studio 一步到位下载主仓代码跟所有子模块:
2024-10-30 15:46:31
1031
原创 代码整洁之道(第5章节)--格式
当有人查看底层代码实现时,我们希望他们为其整洁、一致及所感知到的对细节的关注而震惊。我们希望他们高高扬起眉毛,一路看下去。我们希望他们感受到那些为之劳作的专业人士们。但若他们看到的只是一堆像是由酒醉的水手写出的鬼画符,那他们多半会得出结论,认为项目其他任何部分也同样对细节漠不关心。你应该保持良好的代码格式。你应该选用一套管理代码格式的简单规则,然后贯彻这些规则。如果你在团队中工作,则团队应该一致同意采用一套简单的格式规则,所有成员都要遵从。使用能帮你应用这些格式规则的自动化工具会很有帮助。
2024-10-26 11:23:29
1051
原创 代码整洁之道(第3章节)--注释
别给糟糕的代码加注释一重新写吧。什么也比不上放置良好的注释来得有用。什么也不会比乱七八糟的注释更有本事搞乱一个模块。什么也不会比陈旧、提供错误信息的注释更有破坏性。注释并不像辛德勒的名单。它们并不“纯然地好”。实际上,注释最多也就是一种必须的恶。若编程语言足够有表达力,或者我们长于用这些语言来表达意图,就不那么需要注释一也许根本不需要。
2024-10-22 09:32:34
978
原创 代码整洁之道(第3章节)--函数
函数的第一规则是要短小。第二条规则是还要更短小。我无法证明这个断言。我给不出任何证实了小函数更好的研究结果。我能说的是,近40年来,我写过各种不同大小的函数。我写过令人憎恶的长达3000行的厌物,也写过许多100行到300行的函数,我还写过20行到30行的。经过漫长的试错,经验告诉我,函数就该小。在20世纪80年代,我们常说函数不该长于一屏。当然,说这话的时候,VT100屏幕只有24行、80列,而编辑器就得先占去4行空间放菜单。
2024-09-05 20:08:51
738
原创 代码整洁之道(第2章节)--有意义的命名
软件中随处可见命名。我们给变量、函数、参数、类和封包命名。我们给源代码及源代码所在目录命名。我们给jar文件、war文件和ear文件命名。我们命名、命名,不断命名。既然有这么多命名要做,不妨做好它。下文列出了取个好名字的几条简单规则。取好名字最难的地方在于需要良好的描述技巧和共有文化背景。与其说这是一种技术、商业或管理问题,还不如说是一种教学问题。其结果是,这个领域内的许多人都没能学会做得很好。我们有时会怕其他开发者反对重命名。如果讨论一下就知道,如果名称改得更好,那大家真的会感激你。
2024-08-26 09:32:07
1168
原创 代码整洁之道(第1章节)--整洁代码
优雅和高效的代码。代码逻辑应当直截了当,叫缺陷难以隐:尽量减少依赖关系,使之便于维护:依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。整洁的代码简单直接。整洁的代码如同优美的散文。整洁的代码从不隐藏设计者的意图,充满了干净利落的抽象和直戴了当的控制语句。能通过所有测试;没有重复代码;体现系统中的全部设计理念;包括尽量少的实体,比如类、方法、函数等。
2024-08-22 09:14:16
981
原创 menuconfig+Kconfig的简单配置
在module_enable_config.h文件中定义宏,配置值为1或者0。#endif在main中进行代码宏控制。#else#endif优点:直白一目了然,打开module_enable_config.h文件修改重新编译即可缺点:每次需要使能或者关闭通知功能的时候都需要打开module_enable_config.h文件进行修改,修改完成然后再使用IDE(脚本)进行编译,这样比较麻烦。
2024-08-06 20:08:40
1490
原创 嵌入式:简单的UI框架
除了服务框架外,我们还需要对外显示UI,所以我们就需要一个UI的框架,跟服务框架一样,不用这个UI框架我们也是可以实现,但是这样每个人写的UI都会有差异,需要的事件,数据都是独立的,重复的代码也多。但是有UI框架之后就比较方便;例如每个界面都是识别到按键(以手表为例子)有框架直接 case:SINGLE_CLICK,即可,需要什么事件叫框架帮忙统一添加处理即可。除了负责事件的分发、还有就是UI界面的切换、动效等。
2024-08-03 16:21:40
3419
原创 敏捷开发笔记(第15章节)--FACADE模式和MEDIATOR模式
尊贵的符号外表下,隐藏着卑劣的梦想。本章中论述的两个模式有着共同的目的。它们都把某种策略(pocy)施加到另外一组对象上。FACADE模式从上面施加策略,而MEDIATOR模式则从下面施加策略。FACADE模式的使用是明显且受限的,而MEDIATOR模式的使用则是不明显且不受限制的。
2024-08-02 09:26:06
943
原创 敏捷开发笔记(第14章节)--TEMPLATE METHOD模式和STRATEGY模式:继承与委托
业精于勒”。一中国谚语早在20世纪90年代初期一也就是面向对象发展的初期一人们就非常看重继承这个概念。继承关系蕴涵的意义是非常深远的。使用继承我们可以基于差异编程(program by difference)!也就是说,对于某个满足了我们大部分需要的类,可以创建一Jerrilee M.Koheke个它的子类,并只改变其中我们不期望的部分。只是继承一个类,就可以重用该类的代码!通过继承,我们可以建立完整的软件结构分类,其中每一层都可以重用该层次以上的代码。这是一个美丽的新世界。
2024-08-01 09:36:55
694
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅