前言
近期工作PC從Win轉(zhuǎn)向了Mac,由于Mac平臺還沒有RT Studio IDE工具,日常開發(fā)不是太方便。在前期折騰的基礎(chǔ)上,萌生了用VS Code+GCC在Mac上偶爾編程的想法。
考慮到Mac上配置會相對復(fù)雜一點(diǎn),需要首先安裝GNU_Tools_for_ARM_Embedded_Processors,過程中還需要安裝brew。因此,本文暫時不用Mac,后續(xù)在全新Mac上留好每一步的安裝記錄,再寫一篇Mac上的配置過程。
本文簡單介紹在Windows上使用VS Code編譯RT-Thread工程的過程,按照文章步驟來,應(yīng)該都能成功。前置條件如下:
安裝了RT-Thread Studio;
安裝了VS Code,RT-Thread插件(該插件的其他依賴項(xiàng)會自動安裝)。
VS Code的基礎(chǔ)配置
VS Code的插件安裝如下圖所示,依賴于C/C++,Cortex-Debug插件。
Step 1. VS Code工作區(qū)配置
在VS Code中,將工作區(qū)存放在硬盤某個目錄。這一步純屬個人習(xí)慣。
Step 2. 使用RT-Studio新建一個工程。
在本文中,以STM32F103ZET6為處理器,新建一個4.1.0版本的工程。(原計(jì)劃這一步使用4.0.5版本的,不小心選錯,將錯就錯了)
Step 3. 將已有工程添加到VS Code工作區(qū)。
在RT-Thread Studio中關(guān)閉新建的工程。在VS Code中擊添加工程到工作區(qū),找到RT-Thread Studio生成工程的路徑,將文件目錄添加即可。
Step 4. 在VS Code中編譯工程。
此處的四個圖標(biāo),分別對應(yīng):編譯、下載、調(diào)試、清除工程文件。編譯后,會發(fā)現(xiàn)有大量的c,m未定義的情況。
打開application目錄下的SConscript文件,刪除CPPDEFINES中的m和c部分。
刪除后,再次編譯。此時編譯錯誤發(fā)生變化,提示bss段相關(guān)信息無法找到。右鍵進(jìn)入到工程屬性菜單中,在文件夾屬性處,默認(rèn)是勾選上在編譯前自動檢查/更新rtconfig.py文件。根據(jù)這個提示,可以在左側(cè)文件目錄中找到rtconfig.py文件。
默認(rèn)在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'
將上方的內(nèi)容刪除,使用此處提供的新內(nèi)容。注意,根據(jù)使用的CPU不同,cortex-m3,lds路徑均要根據(jù)具體的處理器進(jìn)行相應(yīng)修改。
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能得到正確的編譯結(jié)果。從結(jié)果中可以看到,RT-Thread Studio和VS Code編譯后的text內(nèi)容相差4個字節(jié)。我思考了很久,暫時沒有找到答案。以后解決了再來填坑 [## TODO]
VS Code的下載配置
Step 6. 下載程序。
點(diǎn)擊下載,下方的輸出窗口提示出錯,無法找到ST-Link Programmer。
Step 7. 修改下載配置。
在工程上點(diǎn)擊右鍵,進(jìn)入屬性配置。此處要重點(diǎn)關(guān)注如下邏輯:
文件夾 > 工作區(qū) > 用戶
文件夾的配置優(yōu)先級要高于工作區(qū)和用戶。因此,此處在文件夾的屬性中配置下載路徑。RT-Thread團(tuán)隊(duì)已經(jīng)很貼心地給出了參考目錄。由于我是將RT-Thread Studio安裝在C盤默認(rèn)路徑下,因此,只需要將官方示例的文字內(nèi)容復(fù)制,將D改成C即可。各位可以按照自己的實(shí)際安裝路徑進(jìn)行配置。
配置后,再次點(diǎn)擊下載,在VS Code中編譯的工程會成功下載到STM32F1處理器中,通過終端工具發(fā)現(xiàn)程序成功得以運(yùn)行。
VS Code下添加組件
Step 8. 在VS Code環(huán)境下添加FAL。
本文原計(jì)劃是基于v4.0.5版本撰寫,因?yàn)樵摪姹局心J(rèn)不含F(xiàn)AL,需要通過軟件包下載。但是,前文生成工程時誤用了v4.1.0,因此,下文繼續(xù)基于v4.1.0進(jìn)行添加。
在4.1.0中,F(xiàn)AL是RT-Thread Component的一部分,因此,需要通過Settings配置打開Component,而不是去online packages中尋找FAL。
此處需要說明的是,由于版本不同,在VS Code中點(diǎn)擊RT-Thread Settings,會出現(xiàn)下圖中無法找到Tkinter的錯誤。
解決方案是,在官網(wǎng)上下載最新的env工具包,然后將其中tools路徑下的PYTHON27和PYTHON27_32覆蓋到T-Thread安裝路徑下RT-ThreadStudioplatformenv_releasedenvtools即可。
解決Tkinter錯誤之后,再次點(diǎn)擊RT-Thread Settings,會出現(xiàn)如下配置。我們在Components組件中找到FAL,使能FAL。本文僅做最基礎(chǔ)的入門操作,因此不使能SFUD。
Step 9. 更新軟件包。
使能FAL后,保存,關(guān)閉RT-Thread Settings。然后在工程名稱上點(diǎn)擊右鍵,更新軟件包。然后,在下方命令行中輸入:
scons --userconfig = .config
這一條命令,我不太確定是否必須。感興趣的朋友自行驗(yàn)證。
Step 10. 再次編譯程序且出錯。
再次編譯程序,提示fal_cfg.h文件無法找到。
解決方案不難。我個人習(xí)慣是,將falsamplesporing路徑下的fal_cfg.h文件,剪切至falinc路徑下。
默認(rèn)的fal_cfg.h文件中,有一個norflash和stm32f2的示例。我在本文中,僅僅使用了STM32F1的自帶Flash,因此,建議按照下方的代碼進(jìn)行修改。配置過程如下:
首先在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初始化內(nèi)容一致
按照個人需求修改分區(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, 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 */
修改后再次編譯,出現(xiàn)了新的錯誤,提示無法找到變量stm32_onchip_flash。
此處的原因是,V4.1.0的配置中,沒有去掉以前PKG方式的配置,導(dǎo)致在drv_stm32_flash.c中,這部分代碼沒有被添加進(jìn)來。
通過簡單修改,在drv_flash_f1.c中,添加一句#define PKG_USING_FAL即可。
在main函數(shù)中添加fal_init,對FAL組件進(jìn)行初始化,編譯無誤,運(yùn)行正確的結(jié)果。
為了進(jìn)一步驗(yàn)證結(jié)果,屏蔽main函數(shù)中的log輸出,重新下載后,使用fal probe和fal read命令,可以發(fā)現(xiàn)在bl分區(qū),即0x08000000地址上,出現(xiàn)了熟悉的棧頂指針和中斷向量表。
后續(xù)
最后一部分內(nèi)容是Debug。點(diǎn)擊Debug,會彈出屬性窗口,按照官方配置后,依然無法Debug。我根據(jù)對應(yīng)的錯誤提示,正在下載最新的GNU_Tools_for_ARM_Embedded_Processors,不確定能否解決。
小結(jié)
在本文中,簡單演示了在VS Code環(huán)境下編譯、下載、添加組件、修改再編譯的過程。得到的結(jié)果與Studio一致。通過這個過程,對GCC的編譯會有更深的體會。
至于修改rtconfig.py部分的參數(shù),可以對照GCC手冊進(jìn)行查找和閱讀。
補(bǔ)充
2023-03-26 17:00 補(bǔ)充文章部分內(nèi)容:
已有在Studio中配置成功的工程,相關(guān)組件包括F429+MQTT+WebClient+OTA+FAL+SD+FatFS+Libc+ADC+AT Client等。
在VS Code上,將上述已有豐富組件的工程重新編譯通過了,第一次成功的過程比較麻煩,主要是package中的samples在VS Code中通過Scons無法排除構(gòu)建,只能一個個手動刪,且同時修改在applications中生成的Sconscript。
第二次嚴(yán)格按照如下步驟執(zhí)行,packages中的samples.c等文件并不會參與到構(gòu)建過程中。不需要手動刪除,驗(yàn)證過程耗時短,簡單可行。
步驟:
1.同步C/C++設(shè)置
scons --target=vsc -s
2.打開RT-Thread Settings,保存
3.更新Scons所用的config
scons --useconfig=.config
4.確認(rèn)一下根目錄下的的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編譯結(jié)果
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編譯結(jié)果
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
尚未下載驗(yàn)證。
-
處理器
+關(guān)注
關(guān)注
68文章
19432瀏覽量
231255 -
C++語言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7030 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40411 -
STM32F103ZET6
+關(guān)注
關(guān)注
9文章
67瀏覽量
21214 -
st-link
+關(guān)注
關(guān)注
1文章
43瀏覽量
9671
發(fā)布評論請先 登錄
相關(guān)推薦
使用RT-Thread Master+QEMU模擬器進(jìn)行RT-Thread原型快速開發(fā)
![使用<b class='flag-5'>RT-Thread</b> Master+QEMU模擬器進(jìn)行<b class='flag-5'>RT-Thread</b>原型快速開發(fā)](https://file1.elecfans.com/web2/M00/A8/18/wKgZomUTz6yABVB3AADBtOXt38k601.jpg)
RT-Thread Studio工程里添加文件到工程
在 RT-Thread Studio 上使用 RT-Thread Nano
請問RT-Thread工程在vscode中如何開發(fā)?
在Windows上使用VS Code開發(fā)RT-Thread qemu-vexpress-a9 BSP工程
RT-Thread 3.1.3 vs2012工程編譯報錯請問怎么解決
在Windows平臺使用VSCode調(diào)試 RT-Thread qemu-vexpress-a9 BSP工程
如何創(chuàng)建標(biāo)準(zhǔn)的RT-Thread項(xiàng)目工程?詳細(xì)過程分析概述
使用VS Code調(diào)試 RT-Thread qemu-vexpress-a9 BSP工程
RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機(jī)制
![<b class='flag-5'>RT-Thread</b>全球技術(shù)大會:Kconfig<b class='flag-5'>在</b><b class='flag-5'>RT-Thread</b>中的工作機(jī)制](https://file.elecfans.com/web2/M00/46/18/pYYBAGKQcvGAQEQrAAFnDo7l2-o172.png)
RT-Thread中的Github Actions
![<b class='flag-5'>RT-Thread</b>中的Github Actions](https://file1.elecfans.com/web2/M00/90/5C/wKgaomTYmKGAbV_fAAAHfzdYOo8035.png)
評論