【TencentOS tiny】 超詳細的TencentOS tiny移植到STM32F103全教程

移植前的準備工做

1. 獲取STM32的裸機工程模板

STM32的裸機工程模板直接使用野火STM32開發板配套的固件庫例程便可。能夠從我github上獲取github.com/jiejieTop/T…git

下載TencentOS tiny 源碼

TencentOS tiny的源碼可從TencentOS tiny GitHub倉庫地址github.com/Tencent/Ten…下載,若是GitHub下載慢,也能夠經過騰訊工蜂開源倉下載,地址:git.code.tencent.com/Tencent_Ope… ,你們在移植時並不須要把整個TencentOS tiny 源碼放進工程文件中,不然工程的代碼量太大。傑傑將在下文講解如何將TencentOS tiny移植到工程中去,以及如何把TencentOS tiny源碼中的核心部分單獨提取出來,方便之後在不一樣的平臺上移植。目前使用的是TencentOS tiny最新版本,因爲TencentOS tiny在不斷更新,若是之後TencentOS tiny更新到更高的版本,則以最新的版本爲準。TencentOS tiny源碼github

TencentOS tiny源碼核心文件夾分析

打開TencentOS tiny源碼文件,能夠看見裏面有12個文件夾,下面先來了解主要文件夾及其子文件夾的做用,而後將TencentOS tiny源碼的核心文件提取出來,添加到工程根目錄下的文件夾中,由於工程只須要有用的源碼文件,而不是所有的TencentOS tiny源碼,因此能夠避免工程過於龐大。json

一級目錄 二 / 三級目錄
說明(傑傑)
arch arm TencentOS tiny適配的IP核架構(含M核中斷、調度、tick相關代碼),對咱們的移植很重要
arch risc-v TencentOS tiny適配的risc-v架構
board
TencentOStinyEVB_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提供的功能示例
kernel
core TencentOS tiny內核源碼(這部分是最重要的)

hal TencentOS tiny驅動抽象層

pm TencentOS tiny低功耗模塊源碼
net
at TencentOS tiny爲串口類通訊模組提供的AT框架實現層

loramodulewrapper TencentOS tiny爲串口類LoraWAN模塊提供的移植框架

lwip Lwip協議實現源碼及適配層

salmodulewrapper TencentOS tiny爲串口類網絡模塊(wifi gprs)提供的socket移植框架

tencentfirmwaremodule_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 tinyarcharmarm-v6m目錄中存放了cortex m0內核的單片機的接口文件,在archarmarm-v7m目錄中存放了cortex m三、m4m7內核的單片機的接口文件,以及一些通用的接口文件,基於這些內核的mcu均可以使用裏面的接口文件。
  • kernelkernelTencentOS 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文件。app

  1. 根據下圖的提示,新建3個工程分組,分別爲tos/kernel、tos/arch、tos/config,這樣能夠見其名知其意,這些工程分組分別保存TencentOS tiny內核源碼、接口文件、以及配置文件
  2. 根據下圖將TencentOS-Demohello-worldTencentOSkernelcore路徑下的全部.c文件添加到tos/kernel工程分組中,也將TencentOS-Demohello-worldTencentOSkernelpm目錄下的全部.c文件添加到tos/kernel工程分組中:
  3. 同理將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工程分組下
  4. 最後再將TencentOS-Demohello-worldTencentOSTOS-CONFIG路徑下的tos_config.h文件添加到tos/config工程分組中。

須要注意的是,在tos/arch分組中添加的port_s.S文件,須要在添加時選擇文件類型爲「All files (*.*)」,添加(.h)文件類型的時候也須要選擇文件類型爲`「All files (.*)」`框架

添加完成後的文件:socket

指定頭文件路徑

編譯時須要爲這些源文件指定頭文件的路徑,不然編譯會報錯。TencentOS tiny的源碼中有不少頭文件,必須將對應的路徑添加到開發環境裏。在添加TencentOS tiny源碼時,一些其餘的頭文件夾也被複制到了工程目錄中,因此這些文件夾的路徑也要加到開發環境中。這些頭文件的路徑分別是:

..\..\TencentOS\arch\arm\arm-v7m\common\include
..\..\TencentOS\arch\arm\arm-v7m\cortex-m3\armcc
..\..\TencentOS\kernel\core\include
..\..\TencentOS\kernel\pm\include
..\..\TencentOS\TOS-CONFIG複製代碼

同時還要在配置中勾選支持C99模式:

嘗試編譯

若是你走到這一步,那麼能夠嘗試編譯一下,不過我測試時編譯是沒經過的,緣由是缺乏了部分頭文件:不過這不影響,咱們在配置文件tos_config.h中修改一下就好,添加兩句話

#include "stm32f10x.h"
#include <stdio.h> // 或者 #include <stddef.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!\r\n");
        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 tiny\r\n");

    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 \r\n",err);
    
    tos_knl_start(); // Start TOS Tiny

}複製代碼

下載

而後編譯,下載到開發板上,就經過串口能夠看到程序已經跑起來了:

end

至此,TencentOS tiny移植到stm32f1的過程所有完成!

喜歡就關注我吧!

歡迎關注我公衆號

相關代碼能夠在公衆號後臺獲取。歡迎關注「物聯網IoT開發」公衆號

相關文章
相關標籤/搜索