- 博客(73)
- 收藏
- 关注
原创 lv_obj_create 创建
按类分配对象内存并挂到父对象(或屏幕)→ 运行构造函数链 → 应用主题 → 刷新样式与尺寸 → 通知父对象并触发重绘。
2026-02-26 21:33:34
670
原创 软件调试基础(四【断点和单步执行】4.5【反调试示例】)
反调试:软件为防止被调试分析而采取的技术手段主要目的保护知识产权和商业机密防止逆向工程增加软件破解难度保护安全敏感代码TF标志的作用:不仅是单步调试的基础,也是反调试的检测点异常分发机制:理解Windows异常处理流程是化解反调试的关键SEH链操作:反调试代码通过修改SEH链改变异常处理流程。
2026-02-02 09:24:40
579
原创 软件调试基础(四【断点和单步执行】4.4【实模式调试器例析】)
直接性:调试器可直接操作所有系统资源简单性:无需操作系统复杂的调试支持教育价值:适合学习CPU和调试的基本原理。
2026-01-26 21:29:03
905
原创 LVGL[display]
LV_DISPLAY_ROTATION_0 = 0, /**< 不旋转(0度)*/LV_DISPLAY_ROTATION_90, /**< 顺时针旋转90度 */LV_DISPLAY_ROTATION_180, /**< 顺时针旋转180度 */LV_DISPLAY_ROTATION_270 /**< 顺时针旋转270度 *//*** 使用缓冲区渲染屏幕的较小部分。* 这样缓冲区可以比显示器小以节省RAM。建议至少使用1/10屏幕大小的缓冲区。*//**
2026-01-24 15:27:20
373
原创 软件调试基础(四【断点和单步执行】4.3【陷阱标志】)
跳转类型说明是否触发停止无条件跳转JMP指令是条件跳转(条件满足)JE、JNE等(条件成立)是条件跳转(条件不满足)JE、JNE等(条件不成立)否中断发生硬件中断、异常是函数调用/返回CALL、RET是顺序执行正常指令流否特性单步标志(TF)任务陷阱标志(TSS.T)分支单步标志(BTF)引入时间8086386位置EFLAGS寄存器TSS段MSR寄存器触发条件每执行完一条指令切换到该任务时发生分支/中断/异常时异常类型陷阱类陷阱类。
2026-01-17 15:54:09
1054
原创 软件调试基础(四【断点和单步执行】4.2【硬件断点】)
寄存器位数功能描述特殊说明DR0-DR332位(32位模式)64位(64位模式)调试地址寄存器,存储断点地址最多支持4个硬件断点DR4-DR5保留当CR4.DE=1时,访问会导致#UD异常CR4.DE=0时是DR6-DR7的别名DR6调试状态寄存器记录断点命中的详细信息区分不同断点命中原因DR7调试控制寄存器控制断点类型、长度、启用状态关键配置寄存器不修改代码:无需插入INT 3指令支持ROM调试:可用于只读存储器数据监控:支持数据访问断点I/O监控。
2026-01-12 11:49:20
1072
原创 软件调试基础(四【断点和单步执行】4.1)
bash# 1. 在WinDBG中设置软件断点bp 地址bp 函数名bp 模块名!函数名# 2. 设置带条件的断点bp 地址 "条件表达式"# 3. 设置一次性断点ba e1 地址 # 执行时中断一次。
2025-12-20 13:50:10
565
原创 软件调试基础(三【中断和异常】3.4-3.7)
架构核心机制主要特点x86 32位IDT + 门描述符支持任务门、硬件任务切换x86 64位IDT + IST机制取消任务门,引入IST栈切换ARM异常向量表 + VBAR统一异常模型,指令跳转方式。
2025-12-08 09:21:38
688
原创 软件调试基础(三【中断和异常】3.1-3.3)
中断是外部异步事件,异常是内部同步事件。中断机制使 CPU 能高效响应外设,异常机制处理指令执行中的错误或特殊行为。理解二者的区别与联系是掌握 CPU 工作机制和操作系统设计的基础。分类报告时间保存的CS和EIP指针可恢复性典型例子错误(Fault)开始执行导致异常的指令时导致异常的指令通常可恢复缺页异常、除零错误陷阱(Trap)执行完导致异常的指令时下一条指令可以恢复INT 3断点、INT n指令中止(Abort)不确定不确定不可以恢复硬件错误、系统表错误。
2025-10-27 09:27:42
552
原创 软件调试基础(二【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
905
原创 软件调试基础(二【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
685
原创 软件调试基础(二【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
953
原创 软件调试基础(二【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
1109
原创 软件调试基础(二【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
1035
原创 软件调试基础(一【6】)
软件调试是软件工程的核心环节,贯穿软件全生命周期(需求分析→维护支持)。本节系统解析软件问题的核心概念、责任归属、生命周期及经济成本,为软件调试提供理论基础。:临近发布时,调试能力直接决定项目能否按期交付(60%延期因未及时修复Bug导致)。:早期调试可避免后期指数级修复成本(需求阶段修复成本仅为运行阶段的1/75)。:提升代码可调试性(Debuggability)是高质量软件的关键指标。+------------------→ 软件生命周期阶段。:提升可调试性设计,将Bug拦截在需求阶段。
2025-06-09 10:31:31
553
原创 软件调试基础(一【5】)
单步执行是调试中用于逐条跟踪程序执行过程的核心技术,通过精细控制程序执行流程,帮助开发者观察代码动态行为。调试器利用符号文件中的行号信息,判断程序指针(IP)是否跨越语句边界,自动重复触发汇编级单步。保存中断时程序的状态(寄存器值、指令指针、标志位等),是分析问题的关键依据。:在代码中插入调试语句,将变量值、执行路径等信息输出至控制台、文件或调试器。断点的特殊形式,触发后自动执行预设动作(如打印变量值、记录日志),(后续章节展开):如内存分析、单步执行、日志调试等。
2025-06-03 09:46:59
960
原创 ARM 链接文件.sct【Image$$<Region_Name>$$<Base/Limit>】
在嵌入式系统中,符号 和 是由链接器自动生成的关键地址标识符,用于精确访问和管理特定内存区域的起始与结束地址。以下是其详细解析和应用总结:命名规则: 表示内存区域 起始地址, 表示内存区域 结束地址的下一个字节。 其中 是链接脚本中定义的内存区域名称(如 )。生成来源: 由 ARM 链接器(如 )在链接过程中根据 分散加载文件( 文件) 自动生成。GCC 链接器( 文件)则使用类似 和 的符号。内存区域定位: 提供代码中直接访问特定内存区域的物理地址,无需硬编码地址值,增强可移植性和灵活
2025-03-22 11:33:56
1411
原创 CmBacktrace的cmb_cfg.h
核心目标:通过合理配置,使 CmBacktrace 库适配目标硬件和操作系统,实现故障诊断功能。关键配置:打印输出适配硬件。CPU 和 OS 类型的正确声明。按需启用堆栈转储和语言支持。调试建议:结合 HardFault 异常处理,利用库输出的信息分析崩溃原因(如非法内存访问、栈溢出)。通过此配置文件,开发者可以灵活地将 CmBacktrace 集成到不同嵌入式平台中,显著提升系统调试效率。
2025-03-16 12:48:03
491
原创 FATFS学习(3.3):ff.c(f_write)
函数,FATFS 实现了高效可靠的文件写入机制,兼顾性能与资源效率,满足嵌入式系统对存储操作的严苛要求。在部分写入场景下,若目标扇区不在缓存中,需先读取原扇区内容,避免覆盖未修改数据。对小数据或非对齐写入,先写入文件对象或全局缓存,延迟写回磁盘,减少碎片化操作。:动态扩展文件簇链(分配新簇),处理大文件和跨簇写入。:当剩余数据超过扇区大小时,直接写入连续扇区。:若为部分扇区写入,标记缓存为脏,延迟写回。:直接写入新簇的连续扇区,更新文件大小。:剩余数据写入新簇的扇区,更新。:写入部分数据至当前簇末尾。
2025-03-13 21:59:51
1241
原创 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
1414
原创 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
1171
原创 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
1350
原创 FATFS学习(2.4):ff.h
直接转发数据流 | 避免中间缓冲,适合内存受限系统 | 网络数据传输到文件 || 立即写入缓存数据 | 确保关键数据落盘(如断电前调用) | 实时数据保护 |: 分配模式(立即填充0或延迟分配) | 视频录制预分配大文件 || 预分配连续空间 |
2025-02-24 10:08:03
1019
原创 FATFS学习(2.3):ff.h
MKFS_PARM是一个高度面向文件系统底层细节的结构体,通过精确控制格式化参数,开发者可以适配不同硬件特性和应用需求。其设计体现了对 FAT 家族文件系统的历史兼容性和现代存储需求的平衡。在实际使用中,需结合具体文件系统规范和硬件特性选择参数。
2025-02-24 09:33:41
1339
原创 FATFS学习(2.2):ff.h
是 FatFs 库中用于管理文件或目录对象的元数据结构体,记录对象在文件系统中的存储位置、状态、属性及并发控制信息。其成员变量根据配置选项(如。
2025-02-18 20:57:03
1168
原创 FATFS学习(1):ffconf.h
FF_LBA64 用于控制是否支持 64 位 LBA,以访问大于 2 TB 的存储设备。启用 64 位 LBA 需同时启用 exFAT 文件系统(FF_FS_EXFAT == 1)。底层驱动需支持 64 位地址操作,确保功能正常。
2025-02-13 21:00:16
1657
原创 Service框架设计
背景随着 IOT 设备的快速发展,用户对于高效,安全,可扩展的服务框架需求越来越强烈,Service 技术框架应运而生,Service 技术框架是一种基于服务架构,它将应用程序划分为服务,这些服务可以用过设备环境网络通信并组合在一起形成应用程序,Service 技术框架可以提供多种服务,例如数据访问服务,安全服务,剥离数据显示交互,实现 MVC 或 MVVM 的技术基础。MVC是一种久经考验的经典架构模式,专为用户界面设计与构建而生,旨在实现各组件间的低耦合度。
2024-11-29 09:56:55
1253
原创 lvgl: 示例--样式(1)
注: /*Shift the gradient to the bottom*/开始渐变的位置在128,在192的位置结束渐变。
2024-11-13 13:40:00
1085
原创 lvgl:简介(1)
LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。
2024-11-05 21:28:03
1390
原创 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
1288
原创 代码整洁之道(第5章节)--格式
当有人查看底层代码实现时,我们希望他们为其整洁、一致及所感知到的对细节的关注而震惊。我们希望他们高高扬起眉毛,一路看下去。我们希望他们感受到那些为之劳作的专业人士们。但若他们看到的只是一堆像是由酒醉的水手写出的鬼画符,那他们多半会得出结论,认为项目其他任何部分也同样对细节漠不关心。你应该保持良好的代码格式。你应该选用一套管理代码格式的简单规则,然后贯彻这些规则。如果你在团队中工作,则团队应该一致同意采用一套简单的格式规则,所有成员都要遵从。使用能帮你应用这些格式规则的自动化工具会很有帮助。
2024-10-26 11:23:29
1090
原创 代码整洁之道(第3章节)--注释
别给糟糕的代码加注释一重新写吧。什么也比不上放置良好的注释来得有用。什么也不会比乱七八糟的注释更有本事搞乱一个模块。什么也不会比陈旧、提供错误信息的注释更有破坏性。注释并不像辛德勒的名单。它们并不“纯然地好”。实际上,注释最多也就是一种必须的恶。若编程语言足够有表达力,或者我们长于用这些语言来表达意图,就不那么需要注释一也许根本不需要。
2024-10-22 09:32:34
1006
原创 代码整洁之道(第3章节)--函数
函数的第一规则是要短小。第二条规则是还要更短小。我无法证明这个断言。我给不出任何证实了小函数更好的研究结果。我能说的是,近40年来,我写过各种不同大小的函数。我写过令人憎恶的长达3000行的厌物,也写过许多100行到300行的函数,我还写过20行到30行的。经过漫长的试错,经验告诉我,函数就该小。在20世纪80年代,我们常说函数不该长于一屏。当然,说这话的时候,VT100屏幕只有24行、80列,而编辑器就得先占去4行空间放菜单。
2024-09-05 20:08:51
780
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅