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


移植前的准備工作

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 tinyarch\arm\arm-v6m目錄中存放了cortex m0內核的單片機的接口文件,在arch\arm\arm-v7m目錄中存放了cortex m3、m4m7內核的單片機的接口文件,以及一些通用的接口文件,基於這些內核的mcu都可以使用里面的接口文件。

  • kernelkernelTencentOS tiny內核核心源碼,它的重要性我也不用多說,畢竟整個內核就是由這里面的文件組成,而其他文件夾都是基於內核的組件。

提取TencentOS tiny內核源碼

將裸機工程源碼重命名為hello-world,然后在裸機工程中新建一個TencentOS文件夾,接着將kernel文件夾、arch文件夾、添加到TencentOS文件夾下:

除了TencentOS tiny的核心文件外,還需要移植一下其他文件,如關於TencentOS tiny系統的配置文件。這是一些可以被用戶修改的文件,所以會放在具體的工程文件中。board就是TencentOS tiny為一些常用開發板開發的demo文件夾,其內有各個工程的配置文件,選一個與移植芯片最相機的開發板,找到它的配置文件tos_config.h,比如我們可以選擇:TencentOS-tiny\board\STM32F103_SIM800A\TOS-CONFIG路徑下的配置文件,把它拷貝到我們工程中的TencentOS文件夾下,當然你也可以把整個TOS-CONFIG目錄拷貝過去,把其他無關的配置刪掉就好了。

這個配置文件很重要,后續在移植工程時,我們需要對這個配置文件進行修改,這樣子可以裁剪TencentOS tiny的功能,得到最適合的工程配置。

開始移植

打開TencentOS-Demo\hello-world\Project\RVMDK(uv5)路徑下的TencentOS.uvprojx文件。

  1. 根據下圖的提示,新建3個工程分組,分別為tos/kernel、tos/arch、tos/config,這樣可以見其名知其意,這些工程分組分別保存TencentOS tiny內核源碼、接口文件、以及配置文件
  2. 根據下圖將TencentOS-Demo\hello-world\TencentOS\kernel\core路徑下的所有.c文件添加到tos/kernel工程分組中,也將\TencentOS-Demo\hello-world\TencentOS\kernel\pm目錄下的所有.c文件添加到tos/kernel工程分組中:
  3. 同理將TencentOS-Demo\hello-world\TencentOS\arch\arm\arm-v7m\common路徑下的 tos_cpu.c、tos_fault.c添加到tos/arch工程分組下,也將TencentOS-Demo\hello-world\TencentOS\arch\arm\arm-v7m\cortex-m3\armcc路徑下的 port_s.S、port_c.c文件添加到tos/arch工程分組下
  4. 最后再將TencentOS-Demo\hello-world\TencentOS\TOS-CONFIG路徑下的tos_config.h文件添加到tos/config工程分組中。

需要注意的是,在tos/arch分組中添加的port_s.S文件,需要在添加時選擇文件類型為“All files (*.*)”,添加(*.h)文件類型的時候也需要選擇文件類型為“All files (*.*)”

添加完成后的文件:

指定頭文件路徑

編譯時需要為這些源文件指定頭文件的路徑,否則編譯會報錯。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開發”公眾號!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM