最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

STM32CubeIDE使用說(shuō)明_4 —— 運(yùn)行μC/OS-III

2022-05-10 12:00 作者:bili_42806779649  | 我要投稿

? ? ? ? 一般而言,當(dāng)軟件功能比較簡(jiǎn)單時(shí),前后臺(tái)系統(tǒng)基本都能很好的實(shí)現(xiàn)想要的功能,當(dāng)實(shí)現(xiàn)的功能越來(lái)越復(fù)雜時(shí),就需要引入操作系統(tǒng),一般稱為RTOS,即嵌入式實(shí)時(shí)操作系統(tǒng)。嵌入式實(shí)時(shí)操作系統(tǒng)有很多,收費(fèi)的或者開(kāi)源的數(shù)不勝數(shù),例如FreeRTOS、Vxworks、RT-Thread、μC/OS-III、μC/OS-Ⅱ等,國(guó)產(chǎn)的也有Huawei LiteOS、AliOS Things、都江堰操作系統(tǒng)、TencentOS Tiny等。

? ? ? ? 網(wǎng)上有很多基于Keil來(lái)移植μC/OS的教程,用此文章記錄下在STM32CubeIDE下移植μC/OS的過(guò)程,用于分享和記錄。

? ? ? ? μC/OS-III從2009年開(kāi)始發(fā)行,基于open-source?Apache 2.0許可證進(jìn)行開(kāi)源,供任何人下載學(xué)習(xí)。官網(wǎng)地址:https://www.silabs.com/developers/micrium

? ? ? ? 官網(wǎng)上提供了大量針對(duì)不同處理器移植的例程,只需要注冊(cè)即可下載(但是不知道為什么國(guó)內(nèi)帶.com后綴的郵箱無(wú)法注冊(cè)),例程下載地址:https://weston-embedded.com/micrium-examples

圖1 不同型號(hào)處理器例程


? ? ? ? 這里還是以STM32F103C8T6處理器來(lái)作為說(shuō)明,雖然目前這顆芯片的價(jià)格已經(jīng)非常離譜。官網(wǎng)提供的例程里面只包含的部分芯片,但是不重要,只要找到內(nèi)核相同的都可以使用。例如STM32F103C8T6 屬于Arm Cortex-M3,那我們只需要下載例程里面相同內(nèi)核的芯片STM32F107的例程就可以使用,將其解壓后即可得到源文件。

圖2 STM32F107 例程


? ? ? ? 參照前幾節(jié)的文章,使用STM32CubeIDE生成一個(gè)STM32F103C8T6的工程,并在工程文件夾內(nèi)新建一個(gè)RTOS文件夾用于存放uCOS-III相關(guān)文件。

圖3 新建RTOS文件夾

? ? ? ??

? ? ? ? 將解壓出來(lái)的源碼文件夾中和下圖紅框所示同名的三個(gè)文件夾拷貝到新建的的RTOS文件夾中,并新建一個(gè)uC-Config文件夾來(lái)存放其他文件。

圖4 拷貝文件


? ? ? ? ?然后將下圖所示綠框路徑下的紅框內(nèi)的文件全部拷貝到剛剛新建的uC-Config文件夾內(nèi)。

圖5 拷貝文件


? ? ? ? 退后到上一級(jí)文件夾,將BSP文件夾的內(nèi)容也拷貝到新建的uC-Config文件夾內(nèi)。

圖6 拷貝文件


? ? ? ? 在STM32CubeIDE工程中刷新一下就可以看到剛剛拷貝過(guò)來(lái)的文件。

圖7 刷新


? ? ? ? 將RTOS文件夾增加到Paths and symbols的源文件路徑下。

圖8 增加源文件路徑


? ? ? 不同編譯器的匯編不一樣,例程文件夾里面提供了三種主流編譯器的匯編文件。不相關(guān)文件不參與編譯,當(dāng)然也可以直接刪除。

圖9 去掉不相關(guān)文件


? ? ? ???將RTOS下的所有文件路徑全部添加到Include paths中。

圖10 包含頭文件


? ? ? ? 此時(shí)可以嘗試編譯一下,不出意外的會(huì)報(bào)大量的錯(cuò)誤,主要原因?yàn)榍拔目截惖腷sp.c和bsp.h文件中有太多不相關(guān)的代碼。首先,將bsp.h文件夾內(nèi)無(wú)關(guān)內(nèi)容全部刪除,只保留下圖所示內(nèi)容。

圖11 BSP.h保留內(nèi)容


? ? ? ? bsp.c文件夾中有很多例程平臺(tái)中的LED配置和操作的代碼,全部刪除。

圖12 無(wú)關(guān)的LED操作代碼


? ? ? ? 去掉這些內(nèi)容再次編譯,此時(shí)只剩下下圖所示獲取CPU主頻的部分報(bào)錯(cuò)。

圖13 獲取CPU主頻錯(cuò)誤


? ? ? ? 重寫該部分,包含 stm32f1xx_hal.h頭文件,使用HAL庫(kù)獲取CPU主頻,此時(shí)編譯將不會(huì)再報(bào)錯(cuò),編譯通過(guò)。

圖14 使用HAL庫(kù)獲取CPU主頻


? ? ? ? 然后參照例程文件夾里面App.c文件的內(nèi)容,將UCOS的初始化,創(chuàng)建任務(wù)、啟動(dòng)等代碼添加到主函數(shù)中。

圖15 例程App.c
圖16 初始化ucos


? ? ? ? 并在啟動(dòng)任務(wù)中添加LED翻轉(zhuǎn)用來(lái)表明系統(tǒng)在運(yùn)行。

圖17 創(chuàng)建啟動(dòng)任務(wù)


? ? ? ? 此時(shí)再嘗試編譯,編譯器會(huì)報(bào)錯(cuò),提示芯片RAM不夠,畢竟STM32F103C8T6也就20K的RAM空間。

圖18 提示RAM不夠

? ??

? ? ? ? 打開(kāi)工程文件存放的目錄,找到里面的debug文件夾的后綴為map的文件。

圖19 map文件


? ? ? ? 在map文件中搜索? Linker script and memory map 字段。往下拉到.bss開(kāi)頭的字段,這里描述的是占用的RAM大小,可以看到 lib_mem占用了一個(gè)相當(dāng)大的RAM空間。

圖20 查看占用RAM空間大小

? ? ? ??

? ? ? ? 打開(kāi)uC-Config文件夾下的lib_cfg.h文件,找到下圖所示的代碼, 并將27調(diào)整為5,減少UCOS內(nèi)存方向程序占用的RAM空間。

圖21 調(diào)整lib_mem占用的RAM大小


? ? ? ? 此時(shí)編譯正常通過(guò),編譯器內(nèi)存區(qū)域窗口給出了當(dāng)前占用的RAM和FLASH的大小和余量等信息。

圖22 RAM和FLASH占用情況


? ? ? ? 如果將lib_cfg.h文件的27從5調(diào)整為10,可以看到RAM已經(jīng)所剩無(wú)幾。

圖23??RAM和FLASH占用情況


? ? ? ? 當(dāng)然,此時(shí)UCOS仍然是不能運(yùn)行的,還需要再Systick的中斷函數(shù)中增加OS_CPU_SysTickHandler函數(shù),作為系統(tǒng)的“心臟”。

圖24 SysTick中斷函數(shù)


? ? ? ? ?然后將下圖所示文件中的所有的OS_CPU_PendSVHandler替換為PendSV_Handler,使用PendSV_Handler異常來(lái)進(jìn)行任務(wù)切換。不同的人有不同的習(xí)慣,有些人喜歡修改芯片啟動(dòng)匯編文件中的PendSV_Handler字段內(nèi)容為OS_CPU_PendSVHandler,也可以達(dá)到同樣的效果。

圖25 修改os_cpu_a.s


? ? ? ? 同時(shí)注釋或者刪掉stm32f1xx_it.c文件中的PendSV_Handler函數(shù),否則編譯器報(bào)錯(cuò)函數(shù)多重定義

圖26 刪除重復(fù)的PendSV_Handler函數(shù)


? ? ? ?編譯后下載,按照AppTaskStart中的任務(wù),LED將會(huì)一秒翻轉(zhuǎn)一次狀態(tài),表明UCOS已經(jīng)再運(yùn)行。按照慣例,可以定義一個(gè)浮點(diǎn)數(shù)來(lái)測(cè)試浮點(diǎn)運(yùn)算,同時(shí)修改LED翻轉(zhuǎn)時(shí)間為500ms讓燈閃爍慢一點(diǎn)。

圖27 增加浮點(diǎn)數(shù)運(yùn)算


? ? ? ? 進(jìn)入調(diào)試模式,可以在現(xiàn)場(chǎng)表達(dá)式窗口中,可以看到temp變量正在每500ms間隔增加0.01;

圖28 查看變量


? ? ? ? 自此,可以更進(jìn)一步體驗(yàn)UCOS的各種功能了。


STM32CubeIDE使用說(shuō)明_4 —— 運(yùn)行μC/OS-III的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
汕头市| 乌什县| 阜阳市| 南宁市| 宁远县| 视频| 谢通门县| 怀化市| 新昌县| 灵寿县| 嘉兴市| 沁水县| 临清市| 黄石市| 定边县| 六盘水市| 邳州市| 安远县| 修水县| 喀什市| 阿城市| 林芝县| 乐山市| 嘉兴市| 荃湾区| 梁河县| 巴东县| 安西县| 铜山县| 泽州县| 枣庄市| 萍乡市| 岳池县| 阜宁县| 龙泉市| 营口市| 霍邱县| 临泉县| 黔江区| 团风县| 巴林左旗|