[经验] Embedded Studio V4移植项目到V5要注意哪些?

MamoYU   2021-11-26 13:50 楼主

背景

       随着 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__ 。

  1. 新的运行时库

要使用新的 SEGGER 运行时库时,必须设置以下项目选项:Code->Library->Run Time Library ->SEGGER

 

如果您在应用程序中使用 RTT 源代码,请确保删除 SEGGER_RTT_Syscalls_<ToolChain>.c 文件。

 

还要确保在项目设置库 I/O 中为您的项目设置正确的 I/O 类型。

  1. 新的链接器文件

如果您使用基于 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.

  1. 汇编项目

当使用带有新的链接描述文件的汇编程序项目时,请确保在您的项目中包含以下文件/samples/SEGGER_crtinit.s 。

  1. 故障排除

       错误: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 的编译。

欢迎关注“麦克泰技术”

回复评论 (2)

也是基于llvm的吗

默认摸鱼,再摸鱼。2022、9、28
点赞  2021-11-26 17:10
引用: freebsder 发表于 2021-11-26 17:10 也是基于llvm的吗

segger公司自己提供的C编译器,类似于GNU组织的GCC编译器

欢迎关注“麦克泰技术”
点赞  2021-11-30 10:09
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复