移植前的準備工作 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
源碼文件,可以看見裡面有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開發”公眾號!