
我的博客
文章平均质量分 64
小米人啊
这个作者很懒,什么都没留下…
展开
-
嵌入式rodata段
比如在某些架构中,访问Flash中的数据可能需要通过特定的指令,或者速度较慢,这时候如果频繁访问的数据可能需要考虑放在RAM中。还有,像配置参数,比如设备ID、默认设置等,如果这些参数在运行时不需要改变,放在rodata段可以防止被意外覆盖,同时节省RAM。再比如,数学用到的查找表,比如正弦波表,如果不需要修改,放在rodata段既安全又节省内存。另外,可能还有性能方面的考虑。只读的数据段可能在程序启动时就被加载到内存的某个固定位置,不需要在运行时进行写操作,这样可能会提高访问速度,或者减少内存的碎片化。原创 2025-04-06 22:48:57 · 364 阅读 · 0 评论 -
正则表达式和通配符
(Regular Expression)和通配符(Glob Pattern)是两种不同的模式匹配语法,虽然看起来相似(都使用。(如文件内容、字符串),功能强大且灵活,支持复杂逻辑(如分组、回溯、量词)。等符号),但它们的用途、规则和场景完全不同。默认用正则表达式,通配符需转义或通过其他参数实现。掌握两者的区别可以避免混淆,根据场景选择合适工具!),语法简单,主要用于文件操作。、Shell 的文件扩展(如。不保证中间字符的精确控制。、编程语言中的正则库。原创 2025-04-01 12:02:37 · 983 阅读 · 0 评论 -
嵌入式libc
(C标准库)的接口是预定义的函数集合,为开发者提供了底层硬件操作的抽象层。这些接口封装了常见任务(如内存管理、字符串操作、文件I/O等),使代码可移植且高效。),并注意硬件适配。开发者常需自定义底层驱动(如串口替代标准输出)或避免动态内存分配以确保可靠性。在没有OS的裸机系统中,文件操作接口可能无效,需替换为Flash读写等硬件驱动。接口是嵌入式开发的基础工具,但需根据资源限制选择合适的库(如。的理解需要结合其实现变体和应用场景。,去除非必要功能(如多线程、复杂文件系统)。,改用静态数组或内存池避免碎片。原创 2025-03-29 22:59:14 · 780 阅读 · 0 评论 -
Git回退文件到指定提交
此时文件已恢复到目标提交的版本,提交变更以保存这次回退操作。查看提交历史,找到你要回退到的目标提交的哈希值(例如。命令将某个文件回退到指定提交的版本。两种方法均可实现需求,选择你熟悉的命令即可。替换为你的目标提交哈希,原创 2025-03-27 15:56:53 · 492 阅读 · 0 评论 -
栈实现队列算法解析
我现在得用C语言写一个用栈实现队列的算法题。首先,我得先回忆一下队列和栈的特性。队列是先进先出(FIFO)的,而栈是后进先出(LIFO)的。所以,用栈来模拟队列的话,可能需要两个栈来配合,一个用来处理入队操作,另一个处理出队操作。那具体怎么实现呢?比如,假设有两个栈,一个输入栈s1,一个输出栈s2。当有元素入队的时候,就直接压入s1。当需要出队的时候,如果s2为空,就把s1里的所有元素依次弹出并压入s2,这样s2的栈顶元素就是队列的第一个元素,弹出即可。如果s2不为空,就直接弹出s2的栈顶。原创 2025-03-26 09:34:29 · 697 阅读 · 0 评论 -
Linux fority source和__builtin_xxx
启用 Fortify Source:通过条件编译和宏定义,替换标准库函数(如memcpystrcpy等)。安全检查:在编译时和运行时插入缓冲区大小检查,防止内存安全问题。兼容性处理:根据编译器版本和优化等级调整实现方式。典型应用场景是 Linux 内核或安全敏感项目,用于增强代码的安全性。这个宏的作用是为原始函数创建一个别名,使得在替换标准库函数(如memcpystrcpy等)时,仍能保留对原始函数的调用入口。这是 Fortify Source 实现安全检查的关键机制。__typeof__原创 2025-03-24 23:46:09 · 639 阅读 · 0 评论 -
yaffs
YAFFS通过日志式追加写、OOB元数据管理、动态垃圾回收和强健的崩溃恢复机制,高效应对NAND闪存的物理限制,广泛应用于嵌入式系统(如Linux设备),在资源受限环境下兼顾性能与可靠性。其设计思想深刻影响了后续闪存文件系统的发展。1. 写入(Write)和读取(Read)操作按页(Page)操作YAFFS的读写操作以页(Page)为最小单位。每个页通常为512字节(YAFFS1)或2KB(YAFFS2),具体大小取决于NAND闪存的规格。写入时:YAFFS采用追加写入(Append-Only)原创 2025-03-22 00:32:50 · 732 阅读 · 0 评论 -
Linux GDB print pretty
创建Python脚本(如'theme_id', ...)"在GDB中加载脚本:(gdb) source my_printers.py之后打印config时会自动应用自定义格式。开启漂亮打印直接解引用打印若类型不明确,强制转换注意:若字段值异常(如大整数、重复的魔数),需检查程序逻辑确认内存是否正确初始化,避免悬垂指针或内存越界问题。原创 2025-03-17 14:21:14 · 952 阅读 · 0 评论 -
Linux mount和SSD分区
挂载的本质是将存储设备的文件系统链接到 Linux 文件系统树的某个目录文件系统的元数据被正确初始化。用户可以通过目录路径安全访问文件。操作系统能够统一管理所有存储设备。如果不挂载,设备仅作为一个“未激活”的块设备存在,无法以文件系统的方式被访问。用户问的是为什么插入SSD后,系统在/dev目录下生成的是sdb1这样的设备文件,以及sdb1是什么的缩写。我需要解释清楚Linux中块设备命名的规则,还有sdb1各部分代表的意义。首先,用户可能已经知道设备文件在/dev下,但不太清楚命名规则。原创 2025-03-16 23:48:57 · 1288 阅读 · 0 评论 -
ARM SVC指令
SVC指令用于系统调用,允许用户程序请求操作系统服务。通过立即数传递参数,操作系统根据参数执行相应操作。原创 2025-03-11 20:12:05 · 505 阅读 · 0 评论 -
Linux losetup循环设备
(类似于硬盘或分区)。通过循环设备,你可以将一个文件当作一个磁盘分区来使用,并对其中的文件系统进行挂载和访问。你说得对,我确实没有详细解释**循环设备(loop device)**的概念。循环设备是 Linux 内核提供的一种虚拟设备,它的作用是将一个。设备关联,并以只读模式访问。原创 2025-03-10 18:06:14 · 868 阅读 · 0 评论 -
envsetup和python venv
了解!虽然你已熟悉基本用法,但我们可以更,结合嵌入式开发中可能的用例来深入探讨venv的作用。venv(虚拟环境)的核心是numpy 1.19numpy 1.21aptpytest直接全局安装会导致版本冲突,用venv在 Linux 系统中,许多系统工具(如aptansible)依赖系统自带的 Python。若全局安装第三方库(如requests)可能导致依赖冲突,甚至破坏系统工具。通过venv假设你编写了一个若你的工具需要兼容 Python 3.8 和 3.10,可通过venv假设你正在开发一个。原创 2025-03-09 15:32:14 · 442 阅读 · 0 评论 -
Linux hexdump命令
需要结合。原创 2025-03-08 10:52:00 · 561 阅读 · 0 评论 -
嵌入式nandless设计
Nandless” 设计通过移除NAND闪存,优化了系统的复杂度、成本和可靠性,但需要权衡存储容量和软件实现方式。作为开发者,需关注启动流程、存储管理和硬件限制,确保软件适配无NAND的架构。这一概念通常出现在嵌入式设备、微控制器(MCU)或特定硬件平台的开发场景中。NAND闪存常用于存储大量数据(如固件、操作系统、用户数据等),特点是容量大、成本低,但存在。(如FTL,Flash Translation Layer)的问题。在软件架构或嵌入式系统设计中,“nandless” 指的是。原创 2025-03-08 10:44:27 · 180 阅读 · 0 评论 -
Unix Domain Socket和eventfd
需要跨主机通信本地高性能IPC轻量级事件通知→ eventfd混合场景→ UDS + eventfd + epoll组合在 Linux 开发中,是一种特殊的进程间通信(IPC)机制,与和eventfd有显著区别。1. Socket Pair 是什么?定义:通过系统调用创建的一对已连接的匿名 Unix Domain Socket。特点无需绑定文件路径:直接创建一对已连接的 socket,没有文件系统路径。双向通信:两个 socket 可以互相读写(类似全双工管道)。原创 2025-03-02 14:08:54 · 879 阅读 · 0 评论 -
ARM MTE
MTE 通过硬件级内存标签显著提升安全性,适合对安全敏感或长期维护的项目。使用时需确保工具链和操作系统支持,性能开销较低,但需权衡兼容性限制。对于新项目或安全关键型代码(如加密模块、内核组件),强烈建议尝试集成。显著提升了 DSP 和机器学习性能,是边缘 AI 和实时控制场景的理想选择。是一项旨在提升内存安全性的硬件级技术,主要用于检测常见的内存安全问题(如缓冲区溢出、释放后使用等)。架构的处理器,专为机器学习(ML)和数字信号处理(DSP)优化,引入了。架构,是 Arm 针对微控制器(MCU)设计的。原创 2025-02-28 20:51:46 · 935 阅读 · 0 评论 -
CMake strings替换字符
makefile里的subset是什么语法,参考使用示例CFLAGS += $(subst ", $(CONFIG_LV_OPTLEVEL))好的,用户现在问的是Makefile中的subst语法,并给出了一个示例:CFLAGS += $(subst ", $(CONFIG_LV_OPTLEVEL))。我需要先理解subst函数的作用以及用户提供的示例的具体用途。原创 2025-02-26 10:05:22 · 668 阅读 · 0 评论 -
ARM Cortex-M处理器中的MSP和PSP
在ARM Cortex-M系列处理器中,MSP(主堆栈指针)和PSP(进程堆栈指针)是两种不同的堆栈指针,主要用于实现堆栈隔离和提升系统可靠性。通过合理使用MSP和PSP,可以显著提升嵌入式系统的稳定性和可维护性,尤其是在资源受限且要求高可靠性的场景中。不用直接操作MSP/PSP,就当它们不存在,除非你要解决某些“玄学”崩溃问题。必须掌握MSP/PSP,这是实现多任务、中断、内存隔离的核心机制。,取决于你的角色、开发场景和系统复杂度。(图中:在Keil调试器中查看寄存器的MSP和PSP值)原创 2025-02-25 11:12:44 · 1454 阅读 · 0 评论 -
Always on domain
AON(Always-On Domain)是嵌入式系统中一个低功耗但始终保持工作的电源域,主要用于维持基本功能,如 RTC 计时、外部事件检测、低功耗唤醒等。它在低功耗系统(如 IoT、可穿戴设备、智能手机等)中至关重要,可以有效延长设备的电池寿命。当 AON GPIO 检测到按键按下,或者 AON RTC 触发定时器超时,它就会发出唤醒信号,使整个芯片恢复正常工作。指的是芯片或微控制器(MCU)中一个特殊的电源域或功能模块,它即使在系统进入低功耗模式时仍然保持运行。原创 2025-02-23 16:03:11 · 327 阅读 · 0 评论 -
嵌入式0xDEADBEEF
0xDEADBEEF是一个在嵌入式开发中广泛使用的特殊值,主要用于调试和错误检测。它的独特性和易识别性使其成为开发者标记异常或未初始化内存的理想选择。原创 2025-02-19 22:04:17 · 643 阅读 · 0 评论 -
CMake 编译工具
工具链文件:推荐使用工具链文件来管理编译器设置。命令行指定:可以直接在命令行中指定编译器,但不推荐用于复杂项目。检查设置:配置完成后,检查编译器是否正确设置。通过这些步骤,你可以轻松地在 CMake 中设置编译器。在 CMake 中,默认的编译器取决于系统的环境变量(如PATH)和 CMake 的默认行为。原创 2025-02-17 21:08:48 · 1553 阅读 · 0 评论 -
CMake policy策略
这段代码的作用是启用并设置CMP0048和CMP0077策略为“NEW”行为,以确保项目在不同CMake版本下行为一致。机制用于解决CMake版本升级带来的行为变化问题,这些问题是由CMake开发者引入的,目的是改进功能或修复问题。通过显式设置策略,开发者可以更好地控制项目的构建行为。当然可以!以下是对上述10个CMake策略的详细说明和具体示例,帮助你更好地理解它们的作用和使用场景。通过以上示例,你可以清楚地看到每个策略的作用及其在不同行为下的表现。根据项目需求,选择合适的策略并设置为NEW。原创 2025-02-17 19:52:30 · 274 阅读 · 0 评论 -
CMake ALIAS
简化复杂目标名称:让代码更简洁。提升可读性:使代码更易理解。条件编译:简化条件逻辑。跨平台兼容性:统一引用不同平台的目标。通过这些示例,你可以看到别名在CMake中的实际应用及其带来的便利。这段代码是 CMake 中的一个常见用法,用于为目标MyLib创建一个带有命名空间(namespace)的别名。下面我将详细解释这段代码的含义,以及为什么使用两个冒号。:为目标MyLib创建一个带有命名空间的别名。双冒号:表示命名空间,用于明确目标的来源,避免命名冲突,并符合现代 CMake 的最佳实践。原创 2025-02-17 19:14:26 · 536 阅读 · 0 评论 -
CMake configure_file
是一个非常实用的 CMake 命令,特别适合在构建过程中生成配置文件或头文件。通过定义变量并使用,你可以轻松地将模板文件中的占位符替换为实际的值,从而生成所需的文件。当然可以!的用法不仅限于简单的变量替换,它还可以结合 CMake 的其他功能实现更高级的用法。# 定义变量# 指定输出路径# 使用 configure_file 生成文件生成的config.h文件会被放到目录中。是一个非常强大的工具,可以用于生成各种类型的文件(如头文件、脚本文件、配置文件等)。原创 2025-02-17 17:19:13 · 734 阅读 · 0 评论 -
C语言时间相关宏定义
在C语言中,预处理器提供了一些与时间相关的宏定义,用于在编译时获取日期、时间等信息。除了和__DATE____DATE__当前编译日期的字符串,格式为(例如__TIME__当前编译时间的字符串,格式为"hh:mm:ss"(例如"14:30:00"当前源文件的最后修改日期和时间,格式为(例如__FILE__当前源文件的文件名(字符串)。__LINE__当前代码行的行号(整数)。__func__(C99 标准引入)当前函数的名称(字符串)。__STDC__原创 2025-02-08 09:54:18 · 513 阅读 · 0 评论 -
芯片AON和NC
AON(Always-On Domain)是嵌入式系统中一个低功耗但始终保持工作的电源域,主要用于维持基本功能,如 RTC 计时、外部事件检测、低功耗唤醒等。当 AON GPIO 检测到按键按下,或者 AON RTC 触发定时器超时,它就会发出唤醒信号,使整个芯片恢复正常工作。AON是嵌入式系统中一个始终保持供电的独立电源域,即使在设备进入低功耗模式(如睡眠或关机状态)时,AON区域仍持续运行。指的是芯片或微控制器(MCU)中一个特殊的电源域或功能模块,它即使在系统进入低功耗模式时仍然保持运行。原创 2025-02-07 20:53:28 · 351 阅读 · 0 评论 -
vim modeline
Vim 模型行是嵌入在文件中的特殊注释行,用于告诉 Vim 编辑器如何配置编辑选项。原创 2025-02-05 11:10:31 · 425 阅读 · 0 评论 -
git submodules
当代码仓库中包含文件时,这意味着该仓库使用了 Git 子模块(Git Submodules)。文件记录了子模块的相关信息,如子模块的仓库地址、路径等。原创 2025-02-05 10:16:27 · 433 阅读 · 0 评论 -
ARM TEE
定义:ARM TEE是基于独立硬件,和主操作系统安全隔离的安全可信系统,与运行安卓、Windows等系统的富执行环境(REE)相对应,可看作是运行在同一个ARM芯片平台上的“双系统”。原理:以ARM TrustZone技术为例,它引入“安全模式”,将处理器的运行环境分为“安全世界(Secure World)”和“正常世界(Normal World)”。TEE运行在安全世界,REE运行在正常世界。原创 2025-02-02 17:44:39 · 667 阅读 · 0 评论 -
正则表达式
正则表达式,又称正规表示法、常规表示法(Regular Expression,在代码中常简写为regex、regexp或RE),是一种用于匹配和处理文本的强大工具,它使用特定的字符和符号组合来描述文本模式。原创 2025-01-26 14:07:59 · 1354 阅读 · 0 评论 -
CMake library path
这样一来,CMake 会在你指定的路径中查找库文件,并将其链接到生成的可执行文件中。这种方法更灵活,因为你可以将库文件的位置传递给 CMake,而不需要手动指定路径。或在链接目标时指定库名,CMake 会在一系列默认路径中搜索库文件。如果找到库,会显示库的路径;之前使用,并且该命令不推荐在现代 CMake 中使用,因为它可能会导致一些难以调试的问题。命令可以在指定的路径中搜索库文件,并将找到的库文件的完整路径存储在一个变量中。以上三种方法都可以用来添加库文件的搜索路径,你可以根据具体情况选择合适的方法。原创 2025-01-24 18:46:37 · 472 阅读 · 0 评论 -
CMake函数参数
在 CMake 中,当定义一个函数时,会自动创建一些特殊的变量来处理函数的参数,下面分别介绍 、、、、 等变量的含义,并给出相应的示例。、、 …代码解释函数定义: 函数定义了两个参数 和 。第一次调用:第二次调用:通过这个示例,你可以清楚地看到这些特殊变量在处理函数参数时的具体作用。原创 2025-01-24 11:14:27 · 220 阅读 · 0 评论 -
CMake execute_process
文件里出现,并且CMake解析到这一行时,就会执行其指定的命令。函数在CMake配置项目期间,只要解析到且满足相关条件(如果有条件控制)就会执行其指定的外部进程。在项目里,有时需要获取版本控制系统(如Git)中的版本号,然后将其嵌入到项目构建信息中。函数是在CMake配置项目的过程中被触发执行的,而不是在项目编译(如使用。函数所在的代码行,就会立即执行该函数所指定的外部进程。在构建项目时,可能需要生成一些中间文件,比如使用脚本生成头文件。若执行失败,会输出错误信息并终止CMake配置。原创 2025-01-23 17:42:37 · 318 阅读 · 0 评论 -
CMake string用法
是 CMake 中string命令结合正则表达式的用法。它的主要功能是在字符串${CONFIG}里查找符合指定正则表达式模式[^=]+的第一个匹配项,并把这个匹配结果存储到变量中。原创 2025-01-23 16:10:32 · 538 阅读 · 0 评论 -
cmakelang
【代码】cmakelang。原创 2025-01-18 17:31:37 · 185 阅读 · 0 评论 -
fd and rg
命令的现代替代品,具有更简单的语法、默认忽略隐藏文件和。适合日常快速文件搜索,复杂场景仍需。参数才能搜索到,但此处是要排除它,无需此参数。)是一个快速、用户友好的文件搜索工具,作为。) 是一个强大的命令行搜索工具,比传统的。的场景,同时保持高效和简洁。支持通过环境变量或配置文件(如。,可以创建一个自定义忽略文件(如。的搜索范围,避免在特定目录(如。)时,若想忽略特定目录(如。参数指定通配符模式,排除。会忽略所有忽略规则(包括。通过上述方法,可以灵活控制。原创 2025-01-14 20:31:38 · 189 阅读 · 0 评论 -
gdb调试插件
在实际开发中,Python 插件的易用性和动态扩展的高性能相辅相成,为调试带来了极大的便利。这条命令是一个完整的调试工作流,用于分析嵌入式系统的 core dump 文件,结合特定的目标程序文件和调试脚本,通过扩展 GDB 功能实现更高效的调试。通过动态插件,可以为特定的内核模块或架构增加额外的支持,例如调试 ARM 架构的特殊寄存器。调试一个特定的程序,并结合了内核转储文件和自定义调试脚本。加载后,GDB 的调试界面和功能将大幅增强,例如堆栈分析、内存检查等。这样的插件,为调试增加更多便利功能。原创 2025-01-10 15:28:18 · 989 阅读 · 0 评论 -
Linux卸载dpkg安装的.deb包
在 Linux 系统下,如果通过dpkg安装了.deb。原创 2025-01-08 12:01:25 · 1459 阅读 · 0 评论 -
cmake always build
确保宏每次都更新的核心是通过让编译系统认为你的.c文件发生了更改。你可以通过创建一个自定义的命令来更新文件的修改时间,或者使用一个中间的文件(如)来强制触发重新编译。原创 2024-12-31 23:28:03 · 465 阅读 · 0 评论 -
CMake function使用
定义一个打印消息的函数# 调用函数")在这个例子中,我们定义了一个名为的函数,它接收一个参数message,然后打印出来。当调用")时,CMake 会输出。原创 2024-12-21 22:46:14 · 530 阅读 · 0 评论