前言
近期工作PC从Win转向了Mac,由于Mac平台还没有RT Studio IDE工具,日常开发不是太方便。在前期折腾的基础上,萌生了用VS Code+GCC在Mac上偶尔编程的想法。
考虑到Mac上配置会相对复杂一点,需要首先安装GNU_Tools_for_ARM_Embedded_Processors,过程中还需要安装brew。因此,本文暂时不用Mac,后续在全新Mac上留好每一步的安装记录,再写一篇Mac上的配置过程。
本文简单介绍在Windows上使用VS Code编译RT-Thread工程的过程,按照文章步骤来,应该都能成功。前置条件如下:
安装了RT-Thread Studio;
安装了VS Code,RT-Thread插件(该插件的其他依赖项会自动安装)。
VS Code的基础配置
VS Code的插件安装如下图所示,依赖于C/C++,Cortex-Debug插件。
Step 1. VS Code工作区配置
在VS Code中,将工作区存放在硬盘某个目录。这一步纯属个人习惯。
Step 2. 使用RT-Studio新建一个工程。
在本文中,以STM32F103ZET6为处理器,新建一个4.1.0版本的工程。(原计划这一步使用4.0.5版本的,不小心选错,将错就错了)
Step 3. 将已有工程添加到VS Code工作区。
在RT-Thread Studio中关闭新建的工程。在VS Code中击添加工程到工作区,找到RT-Thread Studio生成工程的路径,将文件目录添加即可。
Step 4. 在VS Code中编译工程。
此处的四个图标,分别对应:编译、下载、调试、清除工程文件。编译后,会发现有大量的c,m未定义的情况。
打开application目录下的SConscript文件,删除CPPDEFINES中的m和c部分。
删除后,再次编译。此时编译错误发生变化,提示bss段相关信息无法找到。右键进入到工程属性菜单中,在文件夹属性处,默认是勾选上在编译前自动检查/更新rtconfig.py文件。根据这个提示,可以在左侧文件目录中找到rtconfig.py文件。
默认在VS Code中生成的部分文件信息如下:
modified by rtthread.studio.vscode
DEVICE = ' -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections'
CFLAGS = DEVICE + ' -Dgcc'
CFLAGS += ' -O0 -gdwarf-2 -g'
CXXFLAGS = CFLAGS
AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb '
AFLAGS += ' -gdwarf-2'
POST_ACTION = OBJCPY + ' -O binary **TARGET rtthread.binn' + SIZE + ' **TARGET n'
将上方的内容删除,使用此处提供的新内容。注意,根据使用的CPU不同,cortex-m3,lds路径均要根据具体的处理器进行相应修改。
modified by rtthread.studio.vscode
DEVICE = ' -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections '
CFLAGS = DEVICE + ' -Dgcc'
CFLAGS += ' -O0 -gdwarf-2 -g'
CXXFLAGS = CFLAGS
AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb '
AFLAGS += ' -gdwarf-2'
LFLAGS = DEVICE + '-Wl,-gc-sections, -T linkscripts//STM32F103ZE//link.lds'
POST_ACTION = OBJCPY + ' -O binary **TARGET rtthread.binn' + SIZE + ' --format=berkely' +' **TARGET n'
Step 5. 再次编译。
此时,VS Code能得到正确的编译结果。从结果中可以看到,RT-Thread Studio和VS Code编译后的text内容相差4个字节。我思考了很久,暂时没有找到答案。以后解决了再来填坑 [## TODO]
VS Code的下载配置
Step 6. 下载程序。
点击下载,下方的输出窗口提示出错,无法找到ST-Link Programmer。
Step 7. 修改下载配置。
在工程上点击右键,进入属性配置。此处要重点关注如下逻辑:
文件夹 > 工作区 > 用户
文件夹的配置优先级要高于工作区和用户。因此,此处在文件夹的属性中配置下载路径。RT-Thread团队已经很贴心地给出了参考目录。由于我是将RT-Thread Studio安装在C盘默认路径下,因此,只需要将官方示例的文字内容复制,将D改成C即可。各位可以按照自己的实际安装路径进行配置。
配置后,再次点击下载,在VS Code中编译的工程会成功下载到STM32F1处理器中,通过终端工具发现程序成功得以运行。
VS Code下添加组件
Step 8. 在VS Code环境下添加FAL。
本文原计划是基于v4.0.5版本撰写,因为该版本中默认不含FAL,需要通过软件包下载。但是,前文生成工程时误用了v4.1.0,因此,下文继续基于v4.1.0进行添加。
在4.1.0中,FAL是RT-Thread Component的一部分,因此,需要通过Settings配置打开Component,而不是去online packages中寻找FAL。
此处需要说明的是,由于版本不同,在VS Code中点击RT-Thread Settings,会出现下图中无法找到Tkinter的错误。
解决方案是,在官网上下载最新的env工具包,然后将其中tools路径下的PYTHON27和PYTHON27_32覆盖到T-Thread安装路径下RT-ThreadStudioplatformenv_releasedenvtools即可。
解决Tkinter错误之后,再次点击RT-Thread Settings,会出现如下配置。我们在Components组件中找到FAL,使能FAL。本文仅做最基础的入门操作,因此不使能SFUD。
Step 9. 更新软件包。
使能FAL后,保存,关闭RT-Thread Settings。然后在工程名称上点击右键,更新软件包。然后,在下方命令行中输入:
scons --userconfig = .config
这一条命令,我不太确定是否必须。感兴趣的朋友自行验证。
Step 10. 再次编译程序且出错。
再次编译程序,提示fal_cfg.h文件无法找到。
解决方案不难。我个人习惯是,将falsamplesporing路径下的fal_cfg.h文件,剪切至falinc路径下。
默认的fal_cfg.h文件中,有一个norflash和stm32f2的示例。我在本文中,仅仅使用了STM32F1的自带Flash,因此,建议按照下方的代码进行修改。配置过程如下:
首先在board.h中使能#define BSP_USING_ON_CHIP_FLASH
然后在stm32f1xx_hal_conf.h中使能#define HAL_FLASH_MODULE_ENABLED
stm32_onchip_flash变量位于drv_flash_f1.c中,将原文的stm32f2_onchip_flash修改成该变量
去掉FAL_FLASH_DEV_TABLE中的NorFlash
将FAL_PART_TABLE中的字符串修改成与drv_flash_f1.c文件中的stm32_onchip_flash初始化内容一致
按照个人需求修改分区表FAL_PART_TABLE
出于演示的需要,我将FLASH分别配置成128KB,128KB,256KB。
/* ===================== Flash device Configuration ========================= /
extern const struct fal_flash_dev stm32_onchip_flash;
/ flash device table /
#define FAL_FLASH_DEV_TABLE
{
&stm32_onchip_flash,
}
/ ====================== Partition Configuration ========================== /
#ifdef FAL_PART_HAS_TABLE_CFG
/ partition table /
#define FAL_PART_TABLE
{
{FAL_PART_MAGIC_WORD, "bl", "onchip_flash", 0, 1281024, 0},
{FAL_PART_MAGIC_WORD, "app", "onchip_flash", 1281024, 1281024, 0},
{FAL_PART_MAGIC_WORD, "download","onchip_flash", 2561024, 2561024, 0},
}
#endif /* FAL_PART_HAS_TABLE_CFG /
#endif /FAL_CFG_H */
修改后再次编译,出现了新的错误,提示无法找到变量stm32_onchip_flash。
此处的原因是,V4.1.0的配置中,没有去掉以前PKG方式的配置,导致在drv_stm32_flash.c中,这部分代码没有被添加进来。
通过简单修改,在drv_flash_f1.c中,添加一句#define PKG_USING_FAL即可。
在main函数中添加fal_init,对FAL组件进行初始化,编译无误,运行正确的结果。
为了进一步验证结果,屏蔽main函数中的log输出,重新下载后,使用fal probe和fal read命令,可以发现在bl分区,即0x08000000地址上,出现了熟悉的栈顶指针和中断向量表。
后续
最后一部分内容是Debug。点击Debug,会弹出属性窗口,按照官方配置后,依然无法Debug。我根据对应的错误提示,正在下载最新的GNU_Tools_for_ARM_Embedded_Processors,不确定能否解决。
小结
在本文中,简单演示了在VS Code环境下编译、下载、添加组件、修改再编译的过程。得到的结果与Studio一致。通过这个过程,对GCC的编译会有更深的体会。
至于修改rtconfig.py部分的参数,可以对照GCC手册进行查找和阅读。
补充
2023-03-26 17:00 补充文章部分内容:
已有在Studio中配置成功的工程,相关组件包括F429+MQTT+WebClient+OTA+FAL+SD+FatFS+Libc+ADC+AT Client等。
在VS Code上,将上述已有丰富组件的工程重新编译通过了,第一次成功的过程比较麻烦,主要是package中的samples在VS Code中通过Scons无法排除构建,只能一个个手动删,且同时修改在applications中生成的Sconscript。
第二次严格按照如下步骤执行,packages中的samples.c等文件并不会参与到构建过程中。不需要手动删除,验证过程耗时短,简单可行。
步骤:
1.同步C/C++设置
scons --target=vsc -s
2.打开RT-Thread Settings,保存
3.更新Scons所用的config
scons --useconfig=.config
4.确认一下根目录下的的Sconstruct中objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False),编译,等待applications中生成Sconscript,然后按照如下过程修改
import rtconfig
from building import *
cwd = GetCurrentDir()
src = Glob('../applications/ .c') + Glob('../drivers/ .c') + Glob('../libraries/STM32F4xx_HAL_Driver/Src/ .c') + Glob('../libraries/STM32F4xx_HAL_Driver/Src/Legacy/ .c') + Glob('../libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/ .c') + Glob('../libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/ .S')
CPPPATH = [
cwd,
cwd + '/../applications',
cwd + '/../drivers',
cwd + '/../libraries/STM32F4xx_HAL_Driver/Inc',
cwd + '/../libraries/STM32F4xx_HAL_Driver/Inc/Legacy',
cwd + '/../libraries/CMSIS/Include',
cwd + '/../libraries/CMSIS/RTOS/Template',
cwd + '/../libraries/CMSIS/Device/ST/STM32F4xx/Include',
cwd + '/../drivers/include',
cwd + '/../drivers/include/config',
]
CPPDEFINES = [
'SOC_FAMILY_STM32',
'SOC_SERIES_STM32F4',
'USE_HAL_DRIVER',
'STM32F429xx',
]
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
Return('group')
5.修改rtconfig.py
modified by rtthread.studio.vscode
DEVICE = ' -mcpu=cortex-m4 -mthumb -ffunction-sections -fdata-sections'
CFLAGS = DEVICE + ' -Dgcc'
AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb '
LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T linkscripts//STM32F429VI//link.lds'
CFLAGS += ' -O0 -gdwarf-2 -g'
AFLAGS += ' -gdwarf-2'
CXXFLAGS = CFLAGS
POST_ACTION = OBJCPY + ' -O binary **TARGET rtthread.binn' + SIZE + ' **TARGET n'
VS Code编译结果
LINK rt-thread.elf
arm-none-eabi-objcopy -O binary rt-thread.elf rtthread.bin
arm-none-eabi-size rt-thread.elf
text data bss dec hex filename
441700 3116 118176 562992 89730 rt-thread.elf
scons: done building targets.
RT-Studio编译结果
make -j8 all
arm-none-eabi-size --format=berkeley "rtthread.elf"
text data bss dec hex filename
442720 3108 118144 563972 89b04 rtthread.elf
Used Size(B) Used Size(KB)
Flash: 445828 B 435.38 KB
RAM: 121252 B 118.41 KB
尚未下载验证。
-
处理器
+关注
关注
68文章
19155浏览量
229041 -
C++语言
+关注
关注
0文章
147浏览量
6968 -
RT-Thread
+关注
关注
31文章
1271浏览量
39902 -
STM32F103ZET6
+关注
关注
9文章
67浏览量
21090 -
st-link
+关注
关注
1文章
43浏览量
9597
发布评论请先 登录
相关推荐
评论