移植前的準備作業
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 |
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在arch\arm\arm-v6m目錄中存放了cortex m0內核的單片機的介面檔案,在arch\arm\arm-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-tiny\board\STM32F103_SIM800A\TOS-CONFIG路徑下的組態檔,把它拷貝到我們工程中的TencentOS檔案夾下,當然你也可以把整個TOS-CONFIG目錄拷貝過去,把其他無關的配置刪掉就好了,


這個組態檔很重要,后續在移植工程時,我們需要對這個組態檔進行修改,這樣子可以裁剪TencentOS tiny的功能,得到最適合的工程配置,
開始移植
打開TencentOS-Demo\hello-world\Project\RVMDK(uv5)路徑下的TencentOS.uvprojx檔案,

- 根據下圖的提示,新建
3個工程分組,分別為tos/kernel、tos/arch、tos/config,這樣可以見其名知其意,這些工程分組分別保存TencentOS tiny的內核原始碼、介面檔案、以及組態檔,

- 根據下圖將
TencentOS-Demo\hello-world\TencentOS\kernel\core路徑下的所有.c檔案添加到tos/kernel工程分組中,也將\TencentOS-Demo\hello-world\TencentOS\kernel\pm目錄下的所有.c檔案添加到tos/kernel工程分組中:

- 同理將
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工程分組下

- 最后再將
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開發”公眾號!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/30527.html
標籤:嵌入式
上一篇:jvm~xmx設定多少合適
