0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Windows上使用VS Code编译RT-Thread工程的过程

冬至子 来源:lchnu 作者:lchnu 2023-09-28 11:08 次阅读

前言

近期工作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插件。

1.jpg

Step 1. VS Code工作区配置

在VS Code中,将工作区存放在硬盘某个目录。这一步纯属个人习惯。

1.jpg

Step 2. 使用RT-Studio新建一个工程。

在本文中,以STM32F103ZET6为处理器,新建一个4.1.0版本的工程。(原计划这一步使用4.0.5版本的,不小心选错,将错就错了)

1.jpg

Step 3. 将已有工程添加到VS Code工作区。

在RT-Thread Studio中关闭新建的工程。在VS Code中击添加工程到工作区,找到RT-Thread Studio生成工程的路径,将文件目录添加即可。

1.jpg

Step 4. 在VS Code中编译工程。

此处的四个图标,分别对应:编译、下载、调试、清除工程文件。编译后,会发现有大量的c,m未定义的情况。

1.jpg

打开application目录下的SConscript文件,删除CPPDEFINES中的m和c部分。

1.jpg

删除后,再次编译。此时编译错误发生变化,提示bss段相关信息无法找到。右键进入到工程属性菜单中,在文件夹属性处,默认是勾选上在编译前自动检查/更新rtconfig.py文件。根据这个提示,可以在左侧文件目录中找到rtconfig.py文件。

1.jpg

默认在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]

1.jpg

VS Code的下载配置

Step 6. 下载程序。

点击下载,下方的输出窗口提示出错,无法找到ST-Link Programmer。

1.jpg

Step 7. 修改下载配置。

在工程上点击右键,进入属性配置。此处要重点关注如下逻辑:

文件夹 > 工作区 > 用户

文件夹的配置优先级要高于工作区和用户。因此,此处在文件夹的属性中配置下载路径。RT-Thread团队已经很贴心地给出了参考目录。由于我是将RT-Thread Studio安装在C盘默认路径下,因此,只需要将官方示例的文字内容复制,将D改成C即可。各位可以按照自己的实际安装路径进行配置。

配置后,再次点击下载,在VS Code中编译的工程会成功下载到STM32F1处理器中,通过终端工具发现程序成功得以运行。

1.jpg

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。

1.jpg

此处需要说明的是,由于版本不同,在VS Code中点击RT-Thread Settings,会出现下图中无法找到Tkinter的错误。

1.jpg

解决方案是,在官网上下载最新的env工具包,然后将其中tools路径下的PYTHON27和PYTHON27_32覆盖到T-Thread安装路径下RT-ThreadStudioplatformenv_releasedenvtools即可。

解决Tkinter错误之后,再次点击RT-Thread Settings,会出现如下配置。我们在Components组件中找到FAL,使能FAL。本文仅做最基础的入门操作,因此不使能SFUD。

1.jpg

Step 9. 更新软件包。

使能FAL后,保存,关闭RT-Thread Settings。然后在工程名称上点击右键,更新软件包。然后,在下方命令行中输入:

scons --userconfig = .config

这一条命令,我不太确定是否必须。感兴趣的朋友自行验证。

1.jpg

Step 10. 再次编译程序且出错。

再次编译程序,提示fal_cfg.h文件无法找到。

1.jpg

解决方案不难。我个人习惯是,将falsamplesporing路径下的fal_cfg.h文件,剪切至falinc路径下。

1.jpg

默认的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, 128
1024, 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中,这部分代码没有被添加进来。

1.jpg

通过简单修改,在drv_flash_f1.c中,添加一句#define PKG_USING_FAL即可。

1.jpg

在main函数中添加fal_init,对FAL组件进行初始化,编译无误,运行正确的结果。

1.jpg

为了进一步验证结果,屏蔽main函数中的log输出,重新下载后,使用fal probe和fal read命令,可以发现在bl分区,即0x08000000地址上,出现了熟悉的栈顶指针和中断向量表。

1.jpg

后续

最后一部分内容是Debug。点击Debug,会弹出属性窗口,按照官方配置后,依然无法Debug。我根据对应的错误提示,正在下载最新的GNU_Tools_for_ARM_Embedded_Processors,不确定能否解决。

1.jpg

小结

在本文中,简单演示了在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
收藏 人收藏

    评论

    相关推荐

    使用RT-Thread Master+QEMU模拟器进行RT-Thread原型快速开发

    前段时间分别在Win和Mac M1/M2 Silicon硬件环境下折腾了VS Code + RT-Thread编译问题。
    的头像 发表于 09-27 14:50 2805次阅读
    使用<b class='flag-5'>RT-Thread</b> Master+QEMU模拟器进行<b class='flag-5'>RT-Thread</b>原型快速开发

    RT-Thread Studio 使用 RT-Thread Nano

    本文介绍了如何在 RT-Thread Studio 使用 RT-Thread Nano,并以创建 stm32f103RB 的 Nano 工程为例。准备工作安装
    发表于 05-18 15:59

    请问RT-Thread工程vscode中如何开发?

    关闭之前打开的 RT-Thread Settings;配置结束后,需要更新软件包。工程右击,弹出框中选择更新软件包。编译工程如果环境配置已
    发表于 03-14 15:23

    Windows使用VS Code开发RT-Thread qemu-vexpress-a9 BSP工程

    图所示。步骤三 编译 RT-Thread点击 VS Code “查看 -> 终端” 打开 VS C
    发表于 03-31 18:07

    RT-Thread 3.1.3 vs2012工程编译报错请问怎么解决

    使用env_released_1.2.0 工具 对 rt-thread 3.1.3的bsp\\simulator生成 vs2012工程编译报错严重性 代码 说明 项目 文件 行错误 L
    发表于 08-17 12:55

    Windows平台使用VSCode调试 RT-Thread qemu-vexpress-a9 BSP工程

    摘要本应用笔记描述了 Windows 平台使用 VS Code 调试 RT-Thread qemu-vexpress-a9 BSP
    发表于 10-26 15:25

    如何创建标准的RT-Thread项目工程?详细过程分析概述

    本文档旨在指导用户全功能 RT-Thread 版本基础,根据项目需求搭建 RT-Thread 工程框架。
    的头像 发表于 08-18 11:25 9209次阅读

    使用VS Code调试 RT-Thread qemu-vexpress-a9 BSP工程

    可以使用 scons --target=vsc -s 命令更新 VS Code 需要用到的 C/C++ 头文件搜索路径信息。不是每次都需要更新,只有使用了 menuconfig 重新配置了
    的头像 发表于 09-21 10:16 6863次阅读

    如何使用xmake工具来编译rt-thread工程

     最新的 rt-thread 主仓库,支持使用 xmake 工具来编译 rt-thread 工程。   
    的头像 发表于 05-11 15:03 2182次阅读
    如何使用xmake工具来<b class='flag-5'>编译</b><b class='flag-5'>rt-thread</b><b class='flag-5'>工程</b>

    RT-Thread全球技术大会:KconfigRT-Thread中的工作机制

    RT-Thread全球技术大会:KconfigRT-Thread中的工作机制               审核编辑:彭静
    的头像 发表于 05-27 14:49 1498次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:Kconfig<b class='flag-5'>在</b><b class='flag-5'>RT-Thread</b>中的工作机制

    RT-Thread全球技术大会:RT-Thread编写测试用例

    RT-Thread全球技术大会:RT-Thread编写测试用例           审核编辑:彭静
    的头像 发表于 05-27 16:28 1448次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>在</b><b class='flag-5'>RT-Thread</b><b class='flag-5'>上</b>编写测试用例

    RT-Thread全球技术大会:RT-Thread底层汇编及arm与riscv的差异

    开发者秦韦忠,RT-Thread全球技术大会上,以RT-Thread底层汇编及arm与riscv的差异为主题进行了详细的教程说明。
    的头像 发表于 05-28 09:56 1596次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b>底层汇编及<b class='flag-5'>在</b>arm与riscv<b class='flag-5'>上</b>的差异

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread中的Github Actions

    (.github/workflows/static_code_analysis.yml) 下面分别讲解这五个Github Action。 RT-Thread BSP build check 总的来说,这个
    的头像 发表于 06-01 03:10 680次阅读
    <b class='flag-5'>RT-Thread</b>中的Github Actions