Segger Embedded Studio(简称SES)有许多使用技巧,本文介绍几个我比较常用的。

(1)自定义快捷键

通过菜单项:Tools –> Options –> Keyboard,实现自定义快捷键。

我所改的几个功能:

  • DebugDownloadActive(F8):下载当前工程。
    在Keil中,下载功能使用快捷键F8,与Build功能(F7)毗邻,这里设置成相同快捷键。
  • EditGoToDeclaration(F11):跳转到函数声明。
    跳转到函数定义快捷键是Alt+G和F12,后者是隐藏快捷键,这里设置成F11与之毗邻。

另外,在Tools –> Options –> Text Editor中,将Ctrl + Left Click Action设为Go To Definition,即可实现类似Source Insight中的“Ctrl+点击”的方式跳转函数定义。

(2)外部工具

SES可以添加外部工具,但是入口很隐晦。

打开菜单项:File –> Open Studio Folder –> External Tool Configuration,将打开tools.xml文件。

在<tools></tools>之间加入如下代码,参考链接

<item name="Tool.CMSIS_Config_Wizard" wait="no">
    <menu>&amp;CMSIS Configuration Wizard</menu>
    <text>CMSIS Configuration Wizard</text>
    <tip>Open a configuration file in CMSIS Configuration Wizard</tip>
    <key>Ctrl+Y</key>
    <match>*config*.h</match>
    <message>CMSIS Config</message>
    <commands>
    java -jar &quot;$(CMSIS_CONFIG_TOOL)&quot; &quot;$(InputPath)&quot;
    </commands>
</item>

此时对sdk_config.h文件点右键,右键菜单中将多出一个CMSIS Configuration Wizard的菜单项,快捷键是Ctrl+Y。如下:

CMSIS Configuration Wizard是一个可视化的设置sdk_config.h的工具,SDK14.2中已经自带了该工具:

同时可以看到,右键菜单中还有我自定义的擦除芯片(Erase the Chip)的命令。

(3)定位注释中的变量

有的代码注释会引用外部变量,如下:

enum BLE_GAP_EVTS
{
  BLE_GAP_EVT_DISCONNECTED,     /**< See @ref ble_gap_evt_disconnected_t.*/
  BLE_GAP_EVT_CONN_PARAM_UPDATE,/**< See @ref ble_gap_evt_conn_param_update_t.*/
  // ...
}

注释中提到了ble_gap_evt_disconnected_t,我想查看该类型变量的定义,由于它位于注释中,无法直接按F12跳转。

最直观的方法是”全局搜索“,再从搜索结果中筛选,但这样做效率很慢(而且SES的全局搜索功能还有陈年bug)。

一个快速的方式是,调用菜单项:Navigate –> Find Symbol(Alt + Y),在符号查找窗口中输入ble_gap_evt_disconnected_t,然后就能够快速定位到该变量的定义,如下:

(4)移除Code/Data列

在项目文件浏览器中,显示了各文件的Code/Data大小,这两列宽度无法调小,在笔记本屏幕上非常浪费空间。

在工具栏的右边角落里有个设置菜单,可以在菜单中隐藏这两列,如下图:

(5)简化工程选项(Project Options)

打开工程选项的常规做法是先选中工程,再右键选择Edit Options项。但是Options中的条目太多,看着麻烦,希望能够只显示我们关心的条目。

操作方法是,打开(4)中提到菜单,做如下设置:

然后在项目文件浏览器中会自动增加一个Project Options目录,里面存放了我们修改过的选项。

如果手动修改了Project Options中的条目,被修改的条目会自动添加到这里。注意,不可以随意删除这些条目,删除操作意味着将其值恢复为默认值。

最终效果如下:

(6)按等号对齐

写代码时候经常遇到这样情况:

p_yqs->conn_handle = BLE_CONN_HANDLE_INVALID;
p_yqs->data_handler = p_yqs_init->data_handler;
p_yqs->is_notification_enabled = false;

希望这些赋值操作按等号对齐,实现如下效果:

p_yqs->conn_handle             = BLE_CONN_HANDLE_INVALID;
p_yqs->data_handler            = p_yqs_init->data_handler;
p_yqs->is_notification_enabled = false;

很简单,选中这几行,调用菜单项:Edit –> Column Tidy功能,即可自动以按等号对齐。

(7)跳转到头文件

假设当前打开的文件为peer_manager.c,希望跳转到peer_manager.h文件中。

调用菜单项:Navigate –> Go To Header (Alt + L)即可。

反过来,从头文件中跳转到源文件,只要找一个函数,按F12跳转到定义即可。

 

(未完待续)

[下载最新版的SDK,里面有现成的SES的工程,无需再手动搭建,本文仅做参考。文末的参考链接,值得一看。]

1. 简介

SEGGER Embedded Studio(SES)是推出过J-Link的公司SEGGER推出的嵌入式开发IDE。虽然SES 比较小众,但是它有一些特别突出的优势:

(1)对非商业使用免费。

注意,是全功能、不限时免费。Keil和IAR的试用版都对二进制文件的大小有限制。

(2)编辑器很友好。

Keil与IAR的编辑器对于用户体验的忽视,简直达到了令人发指的程度。这里吐槽一下Keil,关闭标签操作连快捷键都没有,每次打开新标签都得用鼠标关闭,极其影响效率。

SES在编辑器方面做的非常用心,比如超快的智能提示,代码格式化,Ctrl+点击跳转到函数实现,等等功能。

(3)配置灵活。

举个例子,做nRF52 BLE开发,需要先下载Softdevice的Hex文件,再下载Application的Hex文件。一般都是依次下载,或者用批处理脚本。SES在设置界面预留了3个Bootloader位置,在用户程序下载前自动下载Bootloader。

(4)跨平台。

Linux跟Mac也可以快速进行嵌入式开发了。

本文利用SES搭建Nordic nRF52832的开发环境,在SES上开发调试Nordic BLE程序。

2. 下载安装

SES下载地址:https://www.segger.com/downloads/embedded-studio

我的电脑上已经安装好了Nordic SDK13和Keil 5,这也是必需的软件。

安装完毕,软件的样子如下:

SES_Dev_GUI

点开菜单项:Tools > Package Manager,下载两个项目:

  • CMSIS-CORE Support Package (不是CMSIS 5 CMSIS-CORE Support Package)
  • nRF CPU Support Package

此时软件已经装完,但是我们还需要额外下载以下几个文件:

文件 含义
ses_nrf52_startup.s 启动文件,包含了中断向量表
flash_placement_nrf52832.xml Flash布局描述文件,描述Flash和RAM的分配
thumb_crt0_nrf52832.s ARM基础文件

在SDK\component\toolchain新建一个ses文件夹,将这几个文件放这里备用。在我的电脑上路径是C:\Nordic\SDK\13.1.0\components\toolchain\ses。

3. 导入Keil工程

以ble_app_template工程为例,先用Keil运行该工程,确保能够正常编译和运行。

启动SES,打开File > Import IAR/Keil Project…,选择该Keil工程文件*.uvprojx,选择“Internal Toolchain”一项,如下:

SES_Dev_Import_Keil

打开该工程后,按F7构建工程,会报错。

第一个错误说nrf.h不存在。这是因为Keil有PACK系统,包含了该文件,SES这里需要手动添加Include目录。

执行下述步骤:

1. 选中工程Project 'ble_app_template_pca10040_s132',而非选中某个文件。

2. 点击Edit Options按钮,或菜单Project > Edit Options...。

SES的文件管理系统比较复杂,每个文件或文件夹都可以设置自己的Option,最终再进行逻辑合并形成最终的Option。所以这里要选择工程项目,然后再打开Edit Options对话框。如下图所示:

SES_Dev_Edit_Options

默认情况下,Build Configuration处显示的是SoftDevice的配置项,这里要先选中应用程序的配置项,然后找到Code > Preprocessor > User Include Directories,在里面加入../../../../../../components/device,如下图:

SES_Dev_Preprocessor

SoftDevice是Keil工程上用来方便下载SDK协议栈的编译配置项,在SES中没有用,可以直接删掉。打开菜单:Project > Build Configurations…,删除SoftDevice项,如下:

SES_Dev_Remove_Build_Config

这时再按F7编译,提示section .fs_data相关错误,说明内存布局有问题,需要配置Flash_Placement.xml和thumb_crt0.s文件。

这里不讨论这些文件的内容含义,简单讲就是告诉SES,该工程的Flash内容和RAM内容分别放在哪里。更多的信息可以参考帮助文件,讲的很清楚。

在SES的文件目录中展开Internal Files,删除Cortex_M_Startup.s和thumb_crt0.s。在该文件夹上点右键,选择Add Existing File…,添加前面下载的thumb_crt0_nrf52832.s和ses_nrf52_startup.s,同时添加C:\Nordic\SDK\13.1.0\components\toolchain\system_nrf52.c。如下图:

SES_Dev_Add_Internal_Files

选择工程文件,打开Edit Options对话框,利用搜索框功能,找到Linker > Section Placement File,输入前面下载的flash_placement_nrf52832.xml路径:

C:/Nordic/SDK/13.1.0/components/toolchain/ses/flash_placement_nrf52832.xml

这时编译一下,就可以编译成功了,会看到非常醒目的进度条:

SES_Dev_Build_Complete

如果是一个纯Peripheral工程,不包含SoftDevice,则配置到此结束。

但是本文介绍BLE工程,需要用到SoftDevice,到这里还没有完,因为Nordic nRF52832的Flash结构是下面是SoftDevice,上面是Application,所以需要设置Application存在Flash的位置,给SoftDevice留下位置。

选择工程文件,打开Edit Options对话框,找到Section Placement Macros,输入

FLASH_START=0x1F000
SRAM_START=0x20002000

然后再按F7编译一下,会看到进度条发生了变化。

SES_Dev_Flash_Placement_Config

既然给SoftDevice留下了位置,下面配置如何烧写SoftDevice。

1. 打开工程的Edit Options
2. 找到Preprocessor > Preprocessor Definitions,增加 NO_VTOR_CONFIG
3. 找到Loader > Additional Load File[0],输入
C:/Nordic/SDK/13.1.0/components/softdevice/s132/hex/s132_nrf52_4.0.2_softdevice.hex

到此,所有的配置完全结束,编译一下,连上开发板就可以下载运行了。

4. 小技巧

(1)利用工程宏变量(Project Macro),简化路径的输入

在工程的Edit Options窗口中找到Project Macros,输入:nRF52_SDK13_Dir=C:/Nordic/SDK/13.1.0

然后所有对SDK文件的引用,都可以用$(nRF52_SDK13_Dir)来代替。

比如User Include Directories里面的内容就可以变成:

$(PackagesDir)/CMSIS_4/CMSIS/Include
$(nRF52_SDK13_Dir)/components
$(nRF52_SDK13_Dir)/components/device
...

看起来更加清爽,而且不容易出错。

(2)手动编辑emProject工程文件

从Keil导入的工程,默认的Build Configuration名字为nrf52832_xxaa,以芯片型号来命名很容易引起误解。下面通过编辑emProject文件来更改这个命名。

退出SES,用记事本打开emProject文件。

找到

<configuration  Name="nrf52832_xxaa" ...

项,显然这个Name属性就是编译配置的名称,在文件内搜索该字符串,发现有两个地方用到了,直接替换成Debug,即可。

此外,从Keil导入的工程,会多一个Internal的编译配置,我不知道这个配置项是什么作用,颇为干扰,也可以通过编辑emProject文件来删除Internal配置。

(3)更改目录结构

Nordic SDK13设计的目录结构非常繁复,目录结构很深,这么做的目的是为了保持不同编译器(Keil/IAR/GCC),不同版本SDK(11/12/13)之间的形式统一,方便用户选择。

但是对于开发者,通常在一段时间内只会使用一个SDK版本和编译器版本,深目录比较麻烦。

因为编辑emProject很容易,所以我们可以把整个工程目录结构改成如下形式:

SES_Dev_Change_Project_Stucture

图中,工程目录名字是ble_template,工程文件放在工程目录中,源文件都放在source文件夹中,output是SES的输出文件。

(4)CMSIS Configuration Wizard

Nordic nRF52的SDK中,每个工程都配备一个sdk_config.h文件,配合Keil可以可视化开关某些模块,如下图:

SES_Dev_Keil_Wizard

这个可视化配置工具比较方便,而且可以避免出错。

在SES中,可以借助第三方免费工具 CMSIS Configuration Wizard实现类似的功能,在该软件中打开sdk_config.h效果如下:

SES_Dev_CMSIS_Config_Wizard

该工具下载地址:https://sourceforge.net/projects/cmsisconfig/?source=directory

参考

https://devzone.nordicsemi.com/blogs/1032/segger-embedded-studio-a-cross-platform-ide-w-no-c/

(完)