Embedded Studio V4移植项目到V5上要注意哪些呢?

浏览:592来源:本站时间:2021-12-09

随着 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_.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 的编译。

京ICP备:京ICP备05011254号-1 版权归北京麦克泰软件技术有限公司所有
北京麦克泰软件技术有限公司