Segger Embedded Studio IDE使用体验之一——默认的Section和Linker的设置
- 一、简介
- 二、操作
- 2.1 编译后代码分析
- 2.1.1 符号浏览器
- 2.1.2 读取elf文件和map文件
- 2.2 调试
- 2.2.1 查看变量
- 2.2.2 设置供电
- 2.3 运行环境设置
- 2.3.1 编译器
- 2.3.2 汇编器
- 2.3.3 包含其他文件
- 2.3.4 .bss和.data段的地址分配
- 三、总结
一、简介
作为一名靠固件手艺吃饭的人,我一直是比较在意手头上的工具是否是趁手的。所以一直愿意尝试不同的IDE。一直是用的Keil。IAR没玩明白。最近Keil出了6,但是听说变成了依托于vscode的存在了。也不知道为什么,笔者对vscode天然就是反感。所以这两天尝试了一下Segger的Embedded Studio,感觉比Keil和ST的那个IDE来讲,还是有很多差异性的。
- 快。编译链接、下载、调试、退出调试和运行都比较流畅。尤其是相比那些基于ecilips的IDE。
- 支持性好。基本上ARM、RICS-V所有的大厂都有。
- 工业设计还是不错的。字体、布局看着比较舒服。这个因人而异吧。
- 可以直接查看elf、map文件。这点比KEIL和ST CUBE强。
- 调试可视的东西比较多。比如可以直接看SCB、NVIC等core peripherals。这点比KEIL强。
- 代码分析功能也还不错。比如可以直接看到符号定义。
但是关于这个IDE的使用,笔者打算把一些使用心得还有操作体验记录下来。以便未来万一用到有想不起来,可以回来查阅。
二、操作
2.1 编译后代码分析
这里笔者做了一个非常简单的小程序,没有什么实际的功能。但是用来解释一些问题还是可以的。
.syntax unified
.section .bss.user_data
user_data:
.space 4
.size user_data, .-user_data
.global _start
.text
.type _start, STT_FUNC
.thumb_func
_start:
ldr r0, =#0x12345678
ldr r1, =user_data
str r0, [r1]
loop:
adds r0, r0, #1
b loop
.size _start, .-_start
2.1.1 符号浏览器
编译以后的程序中的符号,可以在这个符号浏览器中找到。
比如这里,我在.bss.user_data上预留了一个字,地址为user_data。编译以后,这个符号会在右下方的符号浏览器里找到,如上图所示。我在代码中由于已经告知了汇编器这个数据块的大小,所以这里可以在符号列表中找到这个符号的信息。
也能找到函数_start的信息。
2.1.2 读取elf文件和map文件
当编译成功后,任何一个编译器应该都会生成至少是elf文件。其次会根据用户的设定再生成hex文件。
大部分IDE是把这些输出文件都是按照不可读文件,或者直接就按照二进制文件处理的。但是在这个IDE下,似乎有很多的可以看的。直接双击就可以打开elf文件和map文件,看到里面的编译后生成的二进制文件的很多的信息。这里只是截取了一部分供参考。
对于C语言开发的程序,通过elf还可以直接看到被链接的所有源码和二进制反汇编。比如这个
至于map文件,就是类似。但是存放的是所有的符号的链接信息。
2.2 调试
2.2.1 查看变量
笔者觉得,这个IDE对汇编的支持还是比较好的。比如在这段代码中,笔者在汇编文件中定义了一个符号叫user_data,4个字节长。在_start函数中,修改了这个地址下的值。所以看到这个值被修改了。而且可以通过右击那个变量,定位到这个变量在内存中的位置。
我印象中,Keil中是无法在汇编中定义个符号然后去追踪的。更不能直接定位到内存。
2.2.2 设置供电
如果把一个没有供电的板直接接到J-Link调试器上,会发现KEIL能直接脸上,但是Segger Embedded Studio就连不上。其实很简单,如下图把供电打开就是了。
2.3 运行环境设置
2.3.1 编译器
这里编译器是指的针对C语言的。支持两种编译器:Segger Compiler和GNU Compiler。由于笔者对C语言的测试没有做过,如果只是写逻辑的话,没有看到很多差异性。
2.3.2 汇编器
汇编器有GNU、Segger和Segger Assembler三种。但是最后一种好像语法更严格一些。对于后面两个笔者没有研究过。但是伪指令体系好像都是GNU系的。都要遵守《Using as - The GNU Assembler》这个文件的规范。但是如果您自己去找这个文件,可能会发现这个规范不好找。它是在GNU Manuals Online下面的Binutils下面的。里面还有其他的工具在一起。
2.3.3 包含其他文件
这里笔者会说是“其他文件”而不是头文件,是因为考虑到汇编也会用到.include和.incbin包含进来其他的文件。一般来说默认的文件树都是虚拟文件夹。就是看起来建立了一个复杂的项目文件树,但是实际上这些文件都是在同一个物理目录下的。所以尝试在虚拟的项目文件树里面建立同名的文件或文件夹都是不成立的。但是如果物理上存在文件层次,那么需要用Project ->Code->Preprocessor->User include Directories去添加或修改。
2.3.4 .bss和.data段的地址分配
这个在其他的只有一块RAM和FLASH的MCU上没有体现。但是407有两块内存,分别是RAM和CCRAM,并且地址不连续。如果你用的是KEIL,你大概率不会知道CCRAM的存在,除非你在那个里面用汇编和链接脚或者Keil工具本古法添加。但是在这里,只要去查查链接脚本,就知道每个段都是怎么分配的。
默认的全局变量都放在了CCRAM。但是如果你任性地就想把某一个符号定义到某个段上,那么就是参考这段链接脚本。
好了,懂得都懂了。如果要把存储块定义到CCRAM上,就直接用.bss就行;如果要定义到SRAM上,那就用.RAM1就是了。
三、总结
以上就是笔者最近使用Segger Embedded Studio的一些发现。总的来说还是听流畅的。而且GNU汇编也是笔者比较熟悉的。C语言的话,支持性也都是标配的。可能会在很长时间内入手这件兵器啦。