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源碼核心文件夾分析

打開TencentOS tiny源碼文件,可以看見裡面有12個文件夾,下面先來了解主要文件夾及其子文件夾的作用,然後將TencentOS tiny源碼的核心文件提取出來,添加到工程根目錄下的文件夾中,因為工程只需要有用的源碼文件,而不是全部的TencentOS tiny源碼,所以可以避免工程過於龐大。

一級目錄

二 / 三級目錄

說明(傑傑)

arch

arm

TencentOS tiny適配的IP核架構(含M核中斷、調度、tick相關程式碼),對我們的移植很重要

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提供的功能示例

kernel

core

TencentOS tiny內核源碼(這部分是最重要的)

hal

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的過程全部完成!

Tags: