前言
近期工作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文章
19178瀏覽量
229200 -
C++語言
+關注
關注
0文章
147瀏覽量
6972 -
RT-Thread
+關注
關注
31文章
1274瀏覽量
39940 -
STM32F103ZET6
+關注
關注
9文章
67瀏覽量
21096 -
st-link
+關注
關注
1文章
43瀏覽量
9604
發布評論請先 登錄
相關推薦
評論