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

来源:https://www.cnblogs.com/iot-dev/archive/2019/10/16/11688881.html
-Advertisement-
Play Games

移植前的準備工作 1. 獲取STM32的裸機工程模板 STM32的裸機工程模板直接使用野火STM32開發板配套的固件庫常式即可。可以從我 上獲取 "https://github.com/jiejieTop/TencentOS Demo" 下載TencentOS tiny 源碼 TencentOS t ...


移植前的準備工作

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開發”公眾號!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 軟體定時器的基本概念 TencentOS tiny 的軟體定時器是由操作系統提供的一類 ,它構建在硬體定時器基礎之上,使系統能夠提供不受硬體定時器資源限制的定時器服務,本質上軟體定時器的使用相當於擴展了定時器的數量,允許創建更多的定時業務,它實現的功能與硬體定時器也是類似的。 硬體定時器是晶元本身提 ...
  • 引言 大家在裸機編程中很可能經常用到 這種變數,用來標誌一下某個事件的發生,然後在迴圈中判斷這些標誌是否發生,如果是等待多個事件的話,還可能會 這樣子做判斷。當然,如果聰明一點的同學就會拿 的`某些位 A`事件,第二位表示 事件,當這兩個事件都發生的時候,就判斷 的值是多少,從而判斷出哪個事件發生了 ...
  • 互斥鎖 互斥鎖又稱互斥互斥鎖,是一種特殊的信號量,它和信號量不同的是,它具有 等特性,在操作系統中常用於對臨界資源的 處理。在任意時刻互斥鎖的狀態只有兩種, ,當互斥鎖被任務持有時,該互斥鎖處於閉鎖狀態,當該任務釋放互斥鎖時,該互斥鎖處於開鎖狀態。 一個任務持有互斥鎖就表示它擁有互斥鎖的所有權,只有 ...
  • 信號量 信號量( )在操作系統中是一種實現系統中任務與任務、任務與中斷間同步或者臨界資源互斥保護的機制。在多任務系統中,各任務之間常需要同步或互斥,信號量就可以為用戶提供這方面的支持。 抽象來說,信號量是一個非負整數,每當信號量被獲取( )時,該整數會減一,當該整數的值為 時,表示信號量處於無效狀態 ...
  • 消息隊列 在前一篇文章中 "【TencentOS tiny學習】源碼分析(3)——隊列" 我們描述了TencentOS tiny的隊列實現,同時也點出了TencentOS tiny的隊列是依賴於消息隊列的,那麼我們今天來看看消息隊列的實現。 其實消息隊列是TencentOS tiny的一個 基礎組件 ...
  • 隊列基本概念 隊列是一種常用於任務間通信的數據結構,隊列可以在 傳遞消息,實現了任務接收來自其他任務或中斷的不固定長度的消息,任務能夠從隊列裡面讀取消息,當隊列中的消息是空時,讀取消息的任務將被阻塞,用戶還可以指定任務等待消息的時間 ,在這段時間中,如果隊列為空,該任務將 狀態以等待隊列數據有效。當 ...
  • 溫馨提示:本文不描述與浮點相關的寄存器的內容,如需瞭解自行查閱(畢竟我自己也不懂) 調度器的基本概念 中提供的任務調度器是基於優先順序的全搶占式調度,在系統運行過程中,當有比當前任務優先順序更高的任務就緒時,當前任務將立刻被 ,高優先順序任務 處理器運行。 內核中也允許創建相同優先順序的任務。相同優先順序的任 ...
  • 任務的基本概念 從系統的角度看,任務是競爭系統資源的最小運行單元。TencentOS tiny是一個支持多任務的操作系統,任務可以使用或等待CPU、使用記憶體空間等系統資源,並獨立於其它任務運行,理論上任何數量的任務都可以共用同一個優先順序,這樣子處於就緒態的多個相同優先順序任務將會以時間片切換的方式共用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...