0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Windows上使用VS Code編譯RT-Thread工程的過程

冬至子 ? 來源:lchnu ? 作者:lchnu ? 2023-09-28 11:08 ? 次閱讀

前言

近期工作PC從Win轉向了Mac,由于Mac平臺還沒有RT Studio IDE工具,日常開發(fā)不是太方便。在前期折騰的基礎上,萌生了用VS Code+GCC在Mac上偶爾編程的想法。

考慮到Mac上配置會相對復雜一點,需要首先安裝GNU_Tools_for_ARM_Embedded_Processors,過程中還需要安裝brew。因此,本文暫時不用Mac,后續(xù)在全新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工作區(qū)配置

在VS Code中,將工作區(qū)存放在硬盤某個目錄。這一步純屬個人習慣。

1.jpg

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

在本文中,以STM32F103ZET6為處理器,新建一個4.1.0版本的工程。(原計劃這一步使用4.0.5版本的,不小心選錯,將錯就錯了)

1.jpg

Step 3. 將已有工程添加到VS Code工作區(qū)。

在RT-Thread Studio中關閉新建的工程。在VS Code中擊添加工程到工作區(qū),找到RT-Thread Studio生成工程的路徑,將文件目錄添加即可。

1.jpg

Step 4. 在VS Code中編譯工程。

此處的四個圖標,分別對應:編譯、下載、調試、清除工程文件。編譯后,會發(fā)現有大量的c,m未定義的情況。

1.jpg

打開application目錄下的SConscript文件,刪除CPPDEFINES中的m和c部分。

1.jpg

刪除后,再次編譯。此時編譯錯誤發(fā)生變化,提示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個字節(jié)。我思考了很久,暫時沒有找到答案。以后解決了再來填坑 [## TODO]

1.jpg

VS Code的下載配置

Step 6. 下載程序。

點擊下載,下方的輸出窗口提示出錯,無法找到ST-Link Programmer。

1.jpg

Step 7. 修改下載配置。

在工程上點擊右鍵,進入屬性配置。此處要重點關注如下邏輯:

文件夾 > 工作區(qū) > 用戶

文件夾的配置優(yōu)先級要高于工作區(qū)和用戶。因此,此處在文件夾的屬性中配置下載路徑。RT-Thread團隊已經很貼心地給出了參考目錄。由于我是將RT-Thread Studio安裝在C盤默認路徑下,因此,只需要將官方示例的文字內容復制,將D改成C即可。各位可以按照自己的實際安裝路徑進行配置。

配置后,再次點擊下載,在VS Code中編譯的工程會成功下載到STM32F1處理器中,通過終端工具發(fā)現程序成功得以運行。

1.jpg

VS Code下添加組件
Step 8. 在VS Code環(huán)境下添加FAL。

本文原計劃是基于v4.0.5版本撰寫,因為該版本中默認不含FAL,需要通過軟件包下載。但是,前文生成工程時誤用了v4.1.0,因此,下文繼續(xù)基于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初始化內容一致
按照個人需求修改分區(qū)表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命令,可以發(fā)現在bl分區(qū),即0x08000000地址上,出現了熟悉的棧頂指針和中斷向量表。

1.jpg

后續(xù)

最后一部分內容是Debug。點擊Debug,會彈出屬性窗口,按照官方配置后,依然無法Debug。我根據對應的錯誤提示,正在下載最新的GNU_Tools_for_ARM_Embedded_Processors,不確定能否解決。

1.jpg

小結

在本文中,簡單演示了在VS Code環(huán)境下編譯、下載、添加組件、修改再編譯的過程。得到的結果與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。

第二次嚴格按照如下步驟執(zhí)行,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

尚未下載驗證。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19100

    瀏覽量

    228814
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6951
  • RT-Thread
    +關注

    關注

    31

    文章

    1261

    瀏覽量

    39839
  • STM32F103ZET6
    +關注

    關注

    9

    文章

    67

    瀏覽量

    21069
  • st-link
    +關注

    關注

    1

    文章

    43

    瀏覽量

    9584
收藏 人收藏

    評論

    相關推薦

    使用RT-Thread Master+QEMU模擬器進行RT-Thread原型快速開發(fā)

    前段時間分別在Win和Mac M1/M2 Silicon硬件環(huán)境下折騰了VS Code + RT-Thread編譯問題。
    的頭像 發(fā)表于 09-27 14:50 ?2762次閱讀
    使用<b class='flag-5'>RT-Thread</b> Master+QEMU模擬器進行<b class='flag-5'>RT-Thread</b>原型快速開發(fā)

    RT-Thread Studio 使用 RT-Thread Nano

    本文介紹了如何在 RT-Thread Studio 使用 RT-Thread Nano,并以創(chuàng)建 stm32f103RB 的 Nano 工程為例。準備工作安裝
    發(fā)表于 05-18 15:59

    請問RT-Thread工程vscode中如何開發(fā)?

    關閉之前打開的 RT-Thread Settings;配置結束后,需要更新軟件包。工程右擊,彈出框中選擇更新軟件包。編譯工程如果環(huán)境配置已
    發(fā)表于 03-14 15:23

    Windows使用VS Code開發(fā)RT-Thread qemu-vexpress-a9 BSP工程

    圖所示。步驟三 編譯 RT-Thread點擊 VS Code “查看 -> 終端” 打開 VS C
    發(fā)表于 03-31 18:07

    RT-Thread 3.1.3 vs2012工程編譯報錯請問怎么解決

    使用env_released_1.2.0 工具 對 rt-thread 3.1.3的bsp\\simulator生成 vs2012工程編譯報錯嚴重性 代碼 說明 項目 文件 行錯誤 L
    發(fā)表于 08-17 12:55

    Windows平臺使用VSCode調試 RT-Thread qemu-vexpress-a9 BSP工程

    摘要本應用筆記描述了 Windows 平臺使用 VS Code 調試 RT-Thread qemu-vexpress-a9 BSP
    發(fā)表于 10-26 15:25

    如何創(chuàng)建標準的RT-Thread項目工程?詳細過程分析概述

    本文檔旨在指導用戶全功能 RT-Thread 版本基礎,根據項目需求搭建 RT-Thread 工程框架。
    的頭像 發(fā)表于 08-18 11:25 ?9198次閱讀

    使用VS Code調試 RT-Thread qemu-vexpress-a9 BSP工程

    可以使用 scons --target=vsc -s 命令更新 VS Code 需要用到的 C/C++ 頭文件搜索路徑信息。不是每次都需要更新,只有使用了 menuconfig 重新配置了
    的頭像 發(fā)表于 09-21 10:16 ?6853次閱讀

    如何使用xmake工具來編譯rt-thread工程

     最新的 rt-thread 主倉庫,支持使用 xmake 工具來編譯 rt-thread 工程。   
    的頭像 發(fā)表于 05-11 15:03 ?2171次閱讀
    如何使用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中的工作機制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:49 ?1493次閱讀
    <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編寫測試用例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:28 ?1438次閱讀
    <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的差異

    開發(fā)者秦韋忠,RT-Thread全球技術大會上,以RT-Thread底層匯編及arm與riscv的差異為主題進行了詳細的教程說明。
    的頭像 發(fā)表于 05-28 09:56 ?1592次閱讀
    <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 簡介
    發(fā)表于 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 介紹與移植
    發(fā)表于 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 總的來說,這個
    的頭像 發(fā)表于 06-01 03:10 ?649次閱讀
    <b class='flag-5'>RT-Thread</b>中的Github Actions