<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qq_46635513的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_46635513</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_46635513]]></copyright><item><title><![CDATA[但是我看见newlib源码中有关于_sbrk_r和_sbrk的源码实现，我该链接什么库可以直接使用？]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150551406</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150551406</guid><author>qq_46635513</author><pubDate>Wed, 20 Aug 2025 12:38:47 +0800</pubDate><description><![CDATA[在newlib源码中，确实包含了_sbrk_r和_sbrk的实现，但这些实现通常是空的占位符或依赖于具体平台的底层支持（例如裸机环境或操作系统）。newlib是一个可移植的 C 库，设计上允许用户根据目标平台提供自定义实现，而不是直接提供一个通用的_sbrk实现。因此，即使源码中有相关代码，你不能直接链接某个库来“直接使用”_sbrk，而需要根据你的嵌入式环境（例如裸机 ARM Cortex-M）提供适当的实现或链接正确的对象文件。]]></description><category></category></item><item><title><![CDATA[想要将我自己写的用于嵌入式的c代码编译成可连接库，用什么arm-none-eabi-gcc命令？]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150536111</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150536111</guid><author>qq_46635513</author><pubDate>Tue, 19 Aug 2025 22:40:12 +0800</pubDate><description><![CDATA[mcpu=cortex-m4 \      # 指定MCU架构（按需替换）-mthumb \              # 启用Thumb指令集-O2 \                  # 优化级别（按需调整）-I./include            # 添加头文件路径• 关键选项：• -c：仅编译不链接，生成 .o 目标文件。• -mcpu：指定MCU型号（如 cortex-m3/cortex-m7）。• -mthumb：使用Thumb指令集（多数ARM必备）。]]></description><category></category></item><item><title><![CDATA[即使“overrideLaunchCommands“:中的最后命令是 “monitor reset halt“ ；但是“runToEntryPoint“ : “main“依然可以运行到main停止]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150504011</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150504011</guid><author>qq_46635513</author><pubDate>Mon, 18 Aug 2025 23:37:20 +0800</pubDate><description><![CDATA[回答你的问题的最后一个命令将设备复位并暂停 CPU（PC 停在 Flash 复位向量，例如0x08000004仍然可以执行到，因为 Cortex-Debug 会在后自动设置断点（break main）并继续运行（continue），让 CPU 从复位向量运行启动代码，最终到达main函数。为什么能工作确保设备在 Flash 写入后处于暂停状态，PC 指向复位向量。Cortex-Debug 的通过 GDB 命令（break maincontinue）让程序运行到main，启动代码会复制.data。]]></description><category></category></item><item><title><![CDATA[gdb的load命令和传给opeocd的monitor flash write_image erase命令的区别]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150502100</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150502100</guid><author>qq_46635513</author><pubDate>Mon, 18 Aug 2025 21:51:40 +0800</pubDate><description><![CDATA[区别总结OpenOCD 命令，专门将 ELF 文件写入 Flash（擦除后写入.text和.data初始值）。适合你的场景（程序过大，RAM 不足），直接将固件存储到 Flash，符合链接脚本（底层调用设备 Flash 驱动，效率高且可靠。load（结合GDB 命令，根据链接脚本的运行时地址加载（.text可能写入 Flash，.data写入 RAM）。不适合你的场景，因为.data加载到 RAM 会占用过多空间，且 Flash 写入可能不完整（无擦除步骤）。]]></description><category></category></item><item><title><![CDATA[ST官网上所有的SVD文件位置]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150488938</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150488938</guid><author>qq_46635513</author><pubDate>Mon, 18 Aug 2025 12:51:20 +0800</pubDate><description><![CDATA[https://github.com/Marus/cortex-debug/wiki/Specifying-SVD-Files
https://community.st.com/t5/stm32-mcus-products/how-does-st-manage-svd-files/m-p/336677

https://www.st.com/en/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html

此网页的顶部CAD资源中有]]></description><category></category></item><item><title><![CDATA[使用vscode的task.json来自动执行make命令，而不直接使用终端]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150474923</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150474923</guid><author>qq_46635513</author><pubDate>Sun, 17 Aug 2025 23:40:53 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[-nostartfiles参数官方解释，含义]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150464651</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150464651</guid><author>qq_46635513</author><pubDate>Sun, 17 Aug 2025 11:39:04 +0800</pubDate><description><![CDATA[问：-nostartfiles选项是在gcc前端定义的，可在gcc手册中找到解释；答：是的，您的理解完全正确。是的选项，因此它明确记录在中，而不是在 binutils 的ld链接器手册中。]]></description><category></category></item><item><title><![CDATA[gnu arm toolchain中的arm-none-eabi-gdb.exe的使用方法?]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150428345</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150428345</guid><author>qq_46635513</author><pubDate>Fri, 15 Aug 2025 17:51:45 +0800</pubDate><description><![CDATA[是 GNU ARM Toolchain 中的 GDB 调试器，用于调试基于 ARM 架构的嵌入式程序。它是一个命令行工具，通常与调试服务器（如 OpenOCD、J-Link）结合使用，支持设置断点、单步执行、查看变量和寄存器等功能。的使用方法，涵盖基本步骤、常用命令和与调试工具（如 OpenOCD）协同使用的配置。如果你有具体的芯片型号、调试适配器或遇到问题，提供更多细节，我可以进一步优化指导！如果你使用 VS Code 的 Cortex-Debug 扩展，会被自动调用，无需手动操作命令行。]]></description><category></category></item><item><title><![CDATA[Cortex-Debug和openocd之间的关系?如何协同工作？]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150421571</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150421571</guid><author>qq_46635513</author><pubDate>Fri, 15 Aug 2025 14:05:20 +0800</pubDate><description><![CDATA[Cortex-Debug 和 OpenOCD 是嵌入式开发中常用的调试工具，它们在调试基于 ARM Cortex 微控制器的程序时经常一起使用。要使 Cortex-Debug 和 OpenOCD 协同工作，需要正确配置两者。如果你有具体硬件或配置问题，可以提供更多细节，我可以进一步帮助你！在 VS Code 的。]]></description><category></category></item><item><title><![CDATA[make使用VPATH指定的目录去搜索源文件；它告诉 Make，当需要查找 .c 文件（如规则中的依赖文件）时，除了当前目录外，还应该在 vpath 指定的路径中搜索。]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150385818</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150385818</guid><author>qq_46635513</author><pubDate>Thu, 14 Aug 2025 11:09:39 +0800</pubDate><description><![CDATA[vpath %.c $(sort $(dir $(C_SOURCES))) 是Makefile中用于设置.c文件搜索路径的指令，其作用是为Make工具指定查找.c文件的目录位置。该语句首先提取$(C_SOURCES)变量中所有.c文件所在的目录，通过sort函数去除重复路径后，将这些路径设置为.c文件的搜索路径。当Make需要查找.c文件作为依赖项时，会自动在这些目录中进行搜索，而无需在规则中显式指定完整路径。这种方法特别适用于源代码分布在多个目录的项目，能有效简化Makefile规则，提高构建效率。注意路]]></description><category></category></item><item><title><![CDATA[Makefile 函数大全]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150346661</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150346661</guid><author>qq_46635513</author><pubDate>Wed, 13 Aug 2025 14:53:51 +0800</pubDate><description><![CDATA[Makefile 函数摘要 Makefile 提供强大的内置函数，主要分为7类： 文件名处理：提取目录(dir)、文件名(notdir)、后缀(suffix)等，以及路径转换(realpath)和通配(wildcard) 字符串操作：包括替换(subst/patsubst)、查找(findstring)、过滤(filter/filter-out)、排序(sort)和提取(word/wordlist) 条件判断：if/or/and 实现条件逻辑 流程控制：foreach循环处理列表，call调用自定义函数 动]]></description><category></category></item><item><title><![CDATA[使用一款新的型号的芯片是如何写c语言的启动文件中的向量表？以及如何声明向量表中的弱函数？]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150226615</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150226615</guid><author>qq_46635513</author><pubDate>Mon, 11 Aug 2025 21:52:58 +0800</pubDate><description><![CDATA[开源工程常将所有中断向量表项填满函数而非.word 0，主要基于四点考量：1）提升多芯片兼容性，统一采用默认处理函数防止误触发；2）避免跳转至地址0导致的硬件异常；3）满足工具链对完整中断表的强制要求；4）保持代码结构一致性。通过填充Default_Handler等安全处理函数，既确保系统稳定性又便于调试维护，是比留空更优的工程实践方案。（99字）]]></description><category></category></item><item><title><![CDATA[SystemInit()；函数末尾对向量表SCB-＞VTOR重定向的作用]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150212967</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150212967</guid><author>qq_46635513</author><pubDate>Mon, 11 Aug 2025 13:13:07 +0800</pubDate><description><![CDATA[在STM32微控制器中，VTOR设置需根据工程类型决定。无bootloader时，无需在Reset_Handler中修改VTOR，因为默认向量表位置正确；强行修改可能导致错误。有bootloader时，APP必须设置VTOR指向自身向量表地址，确保中断服务程序正确执行。VTOR设置应早于其他初始化，以保证中断安全。该分析正确，但需注意设置时机。]]></description><category></category></item><item><title><![CDATA[newlib库中malloc函数依赖_sbrk函数，该函数使用链接脚本中的_end符号作为堆的初始地址.]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150023061</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150023061</guid><author>qq_46635513</author><pubDate>Thu, 07 Aug 2025 21:01:19 +0800</pubDate><description><![CDATA[摘要： 在嵌入式系统中，newlib 通过链接脚本中的 end 符号（而非显式的 __heap_start）获取堆的起始地址。newlib 的 _sbrk 函数直接引用该符号管理堆内存，而 crt0.o 无需额外传递信息。链接脚本通过 ._user_heap_stack 节定义 end，动态内存分配由此开始。这种机制依赖于 end 的全局可见性，无需硬编码堆边界符号，确保高效内存管理。（150字）]]></description><category></category></item><item><title><![CDATA[.ld文件中使用_end来表示内存区域的结束地址，可用于newlib，用来确定堆（heap）或其他动态分配区的起始位置]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/150021934</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/150021934</guid><author>qq_46635513</author><pubDate>Thu, 07 Aug 2025 19:58:54 +0800</pubDate><description><![CDATA[链接脚本中是否必须使用 _end 表示内存结束地址？ 不一定。开发者可使用任意合法的符号名（如 heap_end、ram_end 等）标记内存区域结束，只需确保代码中引用的名称一致即可。虽然 _end 是行业常见命名（部分库默认引用），但自定义名称完全可行，特别是自主管理内存时。若使用第三方库（如newlib）可能需保留 _end 以满足其硬编码依赖。 （注：摘要严格控制在150字内，保留核心观点和技术细节）]]></description><category></category></item><item><title><![CDATA[对ff_sample源码，使用c语言写的起始文件中，主栈是如何分配的代码细节分析!]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/149986038</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/149986038</guid><author>qq_46635513</author><pubDate>Thu, 07 Aug 2025 00:03:07 +0800</pubDate><description><![CDATA[本文描述了嵌入式系统中栈内存的配置机制。当栈大小(STACK_SIZE)设置为0时，系统将栈顶指针(MSP)初始化为RAM的最高地址(_endof_sram)，此时栈向低地址方向增长。若栈大小非零，则创建指定大小的静态数组作为栈空间。该配置通过条件编译实现，确保栈指针正确初始化，为程序运行提供必要的存储空间。这种设计在嵌入式系统启动阶段尤为重要，直接影响程序的执行环境和内存使用效率。]]></description><category></category></item><item><title><![CDATA[cubemx生成的起始文件中，在进入main函数前调用__libc_init_array来初始化c库运行时环境，用来如stdlib库中的malloc来开辟堆空间需要在main之前先设置堆的起始地址！]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/149982510</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/149982510</guid><author>qq_46635513</author><pubDate>Wed, 06 Aug 2025 23:56:58 +0800</pubDate><description><![CDATA[在使用GNU ARM开发嵌入式软件时，如果要在堆中使用malloc开辟空间，需要在启动文件中调用bl __libc_init_array初始化newlib库的C运行时环境。该函数会设置堆的起始地址和大小，malloc将使用这些初始化后的堆空间进行内存分配。如果未调用此初始化函数，newlib无法正确管理堆空间，可能导致malloc无法正常工作或程序异常。因此，必须确保启动文件包含bl __libc_init_array调用。]]></description><category></category></item><item><title><![CDATA[.bss (NOLOAD) : ALIGN(4)我在链接脚本中写了(NOLOAD)，为什么.map仍然有.bss 0x20000004 0x1c08 load address 0x08014a4c？]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/149885992</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/149885992</guid><author>qq_46635513</author><pubDate>Sun, 03 Aug 2025 21:23:39 +0800</pubDate><description><![CDATA[简单来说，(NOLOAD)只是告诉链接器.bss不需要从可执行文件中加载数据，但它仍然需要在内存中有一个地址来安排布局和初始化。因此，.map文件中显示的加载地址是正常的，它并不意味着.bss真的会被加载，而是反映了内存映射的完整性。希望这个解释能解决你的疑问！]]></description><category></category></item><item><title><![CDATA[假如我不使用约定的TIM2_IRQHandler作为中断处理函数名，而使用其他的函数名并单独放在一个.c文件中，在编译时会对该函数加上push和pop吗？即使他是我们自己定义的中断处理函数名？]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/149867825</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/149867825</guid><author>qq_46635513</author><pubDate>Sun, 03 Aug 2025 21:16:22 +0800</pubDate><description><![CDATA[当你定义一个自定义的中断处理函数名（如。]]></description><category></category></item><item><title><![CDATA[.hex中05记录如(:0400000508001D6171)，是通过.ld链接脚本ENTRY(Reset_Handler)指明的，在.map中.text.Reset_Handler可找到所对应地址]]></title><link>https://blog.youkuaiyun.com/qq_46635513/article/details/149841728</link><guid>https://blog.youkuaiyun.com/qq_46635513/article/details/149841728</guid><author>qq_46635513</author><pubDate>Fri, 01 Aug 2025 22:34:37 +0800</pubDate><description><![CDATA[链接脚本的提供的是的实际地址0x08001d60。在向量表中，复位向量存储的是（即0x08001d61），以指示 Thumb 模式。当objcopy生成.hex文件时，类型 05 记录通常直接使用向量表中的复位向量值（0x08001D61），因为这是处理器实际读取的入口地址。]]></description><category></category></item></channel></rss>