TencentOS tiny 移植到STM32F103全教程(基於標準庫)
- 2019 年 10 月 5 日
- 筆記
移植前的準備工作
1. 獲取STM32的裸機工程模板
STM32的裸機工程模板直接使用野火STM32開發板配套的韌體庫常式即可。可以從我github上獲取https://github.com/jiejieTop/TencentOS-Demo

下載TencentOS tiny 源碼
TencentOS tiny的源碼可從TencentOS tiny GitHub倉庫地址https://github.com/Tencent/TencentOS-tiny下載,如果GitHub下載慢,也可以通過騰訊工蜂開源倉下載,地址:https://git.code.tencent.com/Tencent_Open_Source/TencentOS-tiny ,大家在移植時並不需要把整個TencentOS tiny 源碼放進工程文件中,否則工程的程式碼量太大。傑傑將在下文講解如何將TencentOS tiny移植到工程中去,以及如何把TencentOS tiny源碼中的核心部分單獨提取出來,方便以後在不同的平台上移植。目前使用的是TencentOS tiny最新版本,由於TencentOS tiny在不斷更新,如果以後TencentOS tiny更新到更高的版本,則以最新的版本為準。

TencentOS tiny源碼核心文件夾分析
打開TencentOS tiny源碼文件,可以看見裡面有12個文件夾,下面先來了解主要文件夾及其子文件夾的作用,然後將TencentOS tiny源碼的核心文件提取出來,添加到工程根目錄下的文件夾中,因為工程只需要有用的源碼文件,而不是全部的TencentOS tiny源碼,所以可以避免工程過於龐大。
一級目錄 | 二 / 三級目錄 | 說明(傑傑) | |
|---|---|---|---|
|
|
| |
arch | risc-v | TencentOS tiny適配的risc-v架構 | |
board | TencentOS_tiny_EVB_MX | TencentOS tiny 訂製開發板demo,包含AT適配框架、MQTT協議、安全組件等 | |
component | connectivity / loraWAN | loRaWAN協議棧實現源碼及適配層 | |
connectivity / Eclipse-Paho-MQTT | MQTT協議棧實現源碼及適配層 | ||
connectivity / TencentCloud_SDK | 騰訊雲C-SDK實現源碼及適配層 | ||
fs | 文件系統實現源碼 | ||
security | mbedtls 安全協議源碼 | ||
utils | 包含json相關源碼 | ||
devices | TencentOS tiny適配的一些外設驅動(如串口wifi gprs 驅動等) | ||
doc | TencentOS tiny相關技術文檔及開發指南( | ||
examples | TencentOS tiny提供的功能示例 | ||
|
|
| |
|
| ||
pm | TencentOS tiny低功耗模組源碼 | ||
net | at | TencentOS tiny為串口類通訊模組提供的AT框架實現層 | |
lora_module_wrapper | TencentOS tiny為串口類LoraWAN模組提供的移植框架 | ||
lwip | Lwip協議實現源碼及適配層 | ||
sal_module_wrapper | TencentOS tiny為串口類網路模組(wifi gprs)提供的socket移植框架 | ||
tencent_firmware_module_wrapper | TencentOS tiny提供的騰訊訂製模組移植框架 | ||
osal | cmsis_os | TencentOS tiny提供的cmsis os 適配 | |
platform | hal | TencentOS tiny適配的部分晶片的驅動實現源碼 | |
vendor_bsp | 晶片廠家提供的原廠bsp韌體庫,如STM32的HAL庫 | ||
test | 存放TencentOS tiny提供的一些測試程式碼,含內核及上層模組示例及測試程式碼 | ||
tools | 存放TencentOS tiny提供的工具,小程式,配置工具等 |
簡單提一下我們的重點文件夾:
- arch:
TencentOS tiny是軟體,單片機是硬體,為了使TencentOS tiny運行在單片機上面,TencentOS tiny和單片機必須關聯在一起,那麼如何關聯呢?還是要通過程式碼來關聯,這部分關聯的文件叫介面文件,通常由彙編語言和C語言聯合編寫。這些介面文件都是跟硬體密切相關的,不同的硬體介面文件是不一樣的,但都大同小異。TencentOS tiny在archarmarm-v6m目錄中存放了cortex m0內核的單片機的介面文件,在archarmarm-v7m目錄中存放了cortex m3、m4和m7內核的單片機的介面文件,以及一些通用的介面文件,基於這些內核的mcu都可以使用裡面的介面文件。 - kernel:
kernel是TencentOS tiny內核核心源碼,它的重要性我也不用多說,畢竟整個內核就是由這裡面的文件組成,而其他文件夾都是基於內核的組件。提取TencentOS tiny內核源碼將裸機工程源碼重命名為hello-world,然後在裸機工程中新建一個TencentOS文件夾,接著將kernel文件夾、arch文件夾、添加到TencentOS文件夾下:除了
在這裡插入圖片描述 TencentOS tiny的核心文件外,還需要移植一下其他文件,如關於TencentOS tiny系統的配置文件。這是一些可以被用戶修改的文件,所以會放在具體的工程文件中。board就是TencentOS tiny為一些常用開發板開發的demo文件夾,其內有各個工程的配置文件,選一個與移植晶片最相機的開發板,找到它的配置文件tos_config.h,比如我們可以選擇:TencentOS-tinyboardSTM32F103_SIM800ATOS-CONFIG路徑下的配置文件,把它拷貝到我們工程中的TencentOS文件夾下,當然你也可以把整個TOS-CONFIG目錄拷貝過去,把其他無關的配置刪掉就好了。
在這裡插入圖片描述 這個配置文件很重要,後續在移植工程時,我們需要對這個配置文件進行修改,這樣子可以裁剪
在這裡插入圖片描述 TencentOS tiny的功能,得到最適合的工程配置。開始移植打開TencentOS-Demohello-worldProjectRVMDK(uv5)路徑下的TencentOS.uvprojx文件。
在這裡插入圖片描述 - 根據下圖的提示,新建
3個工程分組,分別為tos/kernel、tos/arch、tos/config,這樣可以見其名知其意,這些工程分組分別保存TencentOS tiny的內核源碼、介面文件、以及配置文件。
在這裡插入圖片描述 - 根據下圖將
TencentOS-Demohello-worldTencentOSkernelcore路徑下的所有.c文件添加到tos/kernel工程分組中,也將TencentOS-Demohello-worldTencentOSkernelpm目錄下的所有.c文件添加到tos/kernel工程分組中:
在這裡插入圖片描述 - 同理將
TencentOS-Demohello-worldTencentOSarcharmarm-v7mcommon路徑下的tos_cpu.c、tos_fault.c添加到tos/arch工程分組下,也將TencentOS-Demohello-worldTencentOSarcharmarm-v7mcortex-m3armcc路徑下的port_s.S、port_c.c文件添加到tos/arch工程分組下
在這裡插入圖片描述 - 最後再將
TencentOS-Demohello-worldTencentOSTOS-CONFIG路徑下的tos_config.h文件添加到tos/config工程分組中。
需要注意的是,在tos/arch分組中添加的port_s.S文件,需要在添加時選擇文件類型為「All files (*.*)」,添加(.h)文件類型的時候也需要選擇文件類型為`「All files (.*)」`
添加完成後的文件:

指定頭文件路徑
編譯時需要為這些源文件指定頭文件的路徑,否則編譯會報錯。TencentOS tiny的源碼中有很多頭文件,必須將對應的路徑添加到開發環境里。在添加TencentOS tiny源碼時,一些其他的頭文件夾也被複制到了工程目錄中,所以這些文件夾的路徑也要加到開發環境中。

這些頭文件的路徑分別是:
....TencentOSarcharmarm-v7mcommoninclude ....TencentOSarcharmarm-v7mcortex-m3armcc ....TencentOSkernelcoreinclude ....TencentOSkernelpminclude ....TencentOSTOS-CONFIG
同時還要在配置中勾選支援C99模式:

嘗試編譯
如果你走到這一步,那麼可以嘗試編譯一下,不過我測試時編譯是沒通過的,原因是缺少了部分頭文件:

不過這不影響,我們在配置文件tos_config.h中修改一下就好,添加兩句話
#include "stm32f10x.h" #include <stdio.h>
如下圖:

修改中斷函數
注釋PendSV_Handler()函數
鑒於TencentOS tiny已經處理好PendSV與SysTick中斷了,就不需要用戶自己去處理,所以要在中斷相關的源文件(stm32f10x_it.c文件)中注釋(或者刪除)PendSV_Handler()函數。

編寫SysTick_Handler()函數
SysTick中斷服務函數是一個非常重要的函數,TencentOS tiny所有跟時間相關的事情都在裡面處理,SysTick就是TencentOS tiny的一個心跳時鐘,驅動著TencentOS tiny的運行,就像人的心跳一樣,假如沒有心跳,我們就相當於「掛掉」,同樣的,TencentOS tiny沒有了心跳,那麼它就會卡死在某個地方,不能進行任務調度,不能運行任何的東西,因此我們需要實現一個TencentOS tiny的心跳時鐘。程式碼如下:
注意:SysTick_Handler()中調用的都是TencentOS tiny中的函數,所以需要在stm32f10x_it.c文件中包含tos.h頭文件。
#include "tos.h" // SysTick_Handler()函數 void SysTick_Handler(void) { if (tos_knl_is_running()) { tos_knl_irq_enter(); tos_tick_handler(); tos_knl_irq_leave(); } }編寫main函數
當你走到這一步,編譯是不會出錯了,此時我們已經完全移植好作業系統了,那麼可以編寫程式碼了,現在編寫一個測試程式碼,在main.c文件中:
#include "stm32f10x.h" #include "bsp_usart.h" #include "tos.h" k_task_t task; k_stack_t task_stack[1024]; void test_task(void *Parameter) { while(1) { printf("hello world!rn"); tos_task_delay(1000); } } /** * @brief 主函數 * @author 傑傑 * @retval 無 */ int main(void) { k_err_t err; /*初始化USART 配置模式為 115200 8-N-1,中斷接收*/ USART_Config(); printf("Welcome to TencentOS tinyrn"); tos_knl_init(); // TOS Tiny kernel initialize err = tos_task_create(&task, "task1", test_task, NULL, 2, task_stack, 1024, 20); if(err != K_ERR_NONE) printf("TencentOS Create task fail! code : %d rn",err); tos_knl_start(); // Start TOS Tiny }下載
然後編譯,下載到開發板上,就通過串口可以看到程式已經跑起來了:

end
至此,TencentOS tiny移植到stm32f1的過程全部完成!