随着 Embedded Studio更新到第5版,您可以使用新的SEGGER编译器、SEGGER运行时库和新的 SEGGER 链接器以获取更小、更快的代码。 因此,如果您有一个 Embedded Studio V4或更早版本创建的旧项目需要移植到Embedded Studio V5时,必须考虑以下事项并且确保移植时不要有遗漏。本文所需要使用的文件都可以在 Embedded Studio 安装目录中找到。
1. 新的启动文件由于SEGGER工具链处理目标启动代码的方式进行了更改,必须更新Cortex_M_Startup.s和SEGGER_THUMB_Startup.s。 您可以在Embedded Studio 安装目录 /samples/Cortex_M_Startup.s 和 /samples/SEGGER_THUMB_Startup.s 中找到此文件的最新版本。
注意:使用 CPU 支持包提供的源代码设置 RAM 调试配置时,请注意 VTOR 配置的预处理器定义已更改为 __VTOR_CONFIG。
注意:预处理器定义 MEMORY_INIT 已更改为 __MEMORY_INIT。
注意:通常不设置初始堆栈指针,因为这通常由硬件完成。 但是如果你想设置一个 RAM 调试项目,你可以手动设置它。 为此,只需按照源注释中的说明编辑 Startup.s 文件。 另外将项目选项“起始堆栈指针值Starting Stack Pointer Value”设置为 __stack_end__ 。
2. 新的运行时库要使用新的 SEGGER 运行时库时,必须设置以下项目选项:Code->Library->Run Time Library ->SEGGER
如果您在应用程序中使用 RTT 源代码,请确保删除 SEGGER_RTT_Syscalls_<ToolChain>.c 文件。
还要确保在项目设置库 I/O 中为您的项目设置正确的 I/O 类型。
3. 新的链接器文件如果您使用基于 Flash 或RAM的项目,可以在目录 /samples/SEGGER_Flash.icf 或 /samples/SEGGER_RAM.icf中找到新的链接器脚本。
最重要的变化是需要在初始化块中添加下面两行:
initialize by symbol __SEGGER_init_heap { block heap }; // Init the heap if there is one
initialize by symbol __SEGGER_init_ctors { block ctors }; // Call constructors for global objects which need to be constructed before reaching main (if any). Make sure this is done after setting up heap.
4. 汇编项目当使用带有新的链接描述文件的汇编程序项目时,请确保在您的项目中包含以下文件/samples/SEGGER_crtinit.s 。
5. 故障排除错误:unsupported relocation on symbol
原始错误消息可能类似于:
--------------------------------------------------------------------------------------------
<inline asm>:1:2: error: unsupported relocation on symbol
movs r1, $1
^
SEGGER_RTT.c:730:3: error: unsupported relocation on symbol
SEGGER_RTT_Conf.h:158:73: note: expanded from macro 'SEGGER_RTT_LOCK'
<inline asm>:2:2: note: instantiated into assembly here
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: segger-cc -cc1 [...]
1. <eof> parser at end of file
2. Code generation
--------------------------------------------------------------------------------------------
这个错误信息比较隐晦,但其原因和解决方法如下:
一些遗留代码使用 '$' 而不是 '#' 来表示内联汇编中的立即数。 虽然在 i386 asm 中使用了“$”,但 arm 汇编语法仅定义了“#”的使用。 旧版本的 GCC 和 clang 都支持。 clang-11 和 segger-cc 11(包含在 Embedded Studio V5.20 中)不再支持使用“$”。
使用它的源代码必须更改才能通过 Embedded Studio V5 的编译。