查看: 3596|回复: 0

[经验] 如何将SES工程从GNU工具链迁移到Segger工具链上?

[复制链接]
  • TA的每日心情
    开心
    2023-6-12 14:34
  • 签到天数: 165 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2021-4-21 15:12:41 | 显示全部楼层 |阅读模式
    分享到:
    #
    介绍背景
    Segger的编译器、链接器和实时运行库是专门针对嵌入式开发人员的需求而设计。特点:快速、灵活、使用简单并支持 Cortex-M微控制器。其链接程序脚本文件的指令和IAR的icf文件相似非常容易编写。SEGGER SES环境的编译器、链接器和实时运行库可以轻松地用于已有项目中,取代GNU编译器、链接器和实时运行库。我们以一个Embedded Studio 4.30上生成的STM32F401RE的GNU工具链项目为例,介绍如何将其迁移到Segger自己的工具链上。
    #
    迁移过程
    1、将链接器改成Segger
    选中项目文件名,按右键,选择Options,打开项目设置窗口,从左侧选择Code->Linker,然后在右侧选择Linker,点击下下拉键选择 Segger。
    1.png
    2、当你选中的SEGGER链接器生效以后,系统会显示和SEGGER链接器相关的选项,如下图:
    2.png
    3、将$(StudioDir)/samples/SEGGER_Flash
    .icf文件添加到项目目录中,选择Linker Script Flie链接脚本文件选项,点按Linker Script File右侧的“…”按钮, 在弹出的窗口中浏览项目目录,选择SEGGER_Flash.icf文件,添加 $(ProjectDir)/SEGGER_Flash.icf, 按 OK 即可。
    3.png
    4、选择Supply Memory Segments To Linker [segger-ld]选项,在最右侧点击“下拉键”选择Yes。
    *此选项用于选择 Linker Script Flie 中的 内存段(Memory Section) 或 Memory map File中的 内存段。
    5、从Options窗口的左侧,选择编译器Compiler,在右侧编译器栏的最右侧,点击,按下“下拉键”,在弹出的菜单中选择 Segger。
    4.png
    6、从Options窗口的左侧,选择库Libraries,在右侧实时运行库Rumtime Library栏的最右侧,点击“下拉键”,在弹出的菜单中,选择 Segger。
    5.png
    7、从STM32F401RE项目中,选中thumb_crt0.s,按右键,选择Exclude from Build,然后在项目中再添加$(StudioDir)/samples/SEGGER_THUMB_Startup.s文件。
    8、现在我们从Embedded Studio的菜单上选择 Build->Rebuild STM32F401RE进行构建。
    9、构建完成后,提示Flash重复定义:
    -------------------------------------------------------------------------
    1> D:/Users/jiang/Documents/SEGGER Embedded Studio for ARM Projects/STM32F401RE/SEGGER_Flash.icf:48:21: error: region 'FLASH' is already defined Build failed
    -------------------------------------------------------------------------
    10、查看文件SEGGER_Flash.icf,发现这个语句 define region FLASH = FLASH1;
    11、再查看项目目录中STM32F401RE_MemoryMap.xml文件,发现其中:
    -------------------------------------------------------------------------
    <!DOCTYPE Board_Memory_Definition_File>
    <root name="STM32F401RE">
      <MemorySegment name="FLASH" start="0x08000000" size="0x00080000" access="ReadOnly" />
      <MemorySegment name="RAM" start="0x20000000" size="0x00018000" access="Read/Write" />
    </root>
    -------------------------------------------------------------------------
    对比Embedded Studio 5.32a中新建的同类项目,发现其引用的中Memory Segments中的定义是FLASH1 RX 0x80000000 0x00040000; RAM1 RWX 0x20000000 0x00010000

    因此,我们就将STM32F401RE_MemoryMap.xml文件的FLASH和RAM改成了FLASH1和RAM1:
    -------------------------------------------------------------------------
    <!DOCTYPE Board_Memory_Definition_File>
    <root name="STM32F401RE">
      <MemorySegment name="FLASH1" start="0x08000000" size="0x00080000" access="ReadOnly" />
      <MemorySegment name="RAM1" start="0x20000000" size="0x00018000" access="Read/Write" />
    </root>
    -------------------------------------------------------------------------
    12、重新编译通过,下载,调试也都正常。
    #
    小结
    过几步操作,可以将一个简单工程的工具链迁移到Segger Embedded Studio的工具链,移植相对容易。我们在这个项目中使用的是GCC的汇编器、Segger的编译器、Seggerd 链接器和Segger的实时运行库。目前Segger的汇编器还在完善之中,因此暂时不推荐使用。

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 09:58 , Processed in 0.126377 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.