TencentOS tiny
概述
閒暇之時,移植TencentOS-tiny玩玩,聽說這個系統佔用資源比較少。好了,我們正面瞭解一下這個RTOS系統。
本文章有點長,需要耐心閱讀,謝謝各位看官,在百忙之中,抽出時間來到這裏共同學習。本人水平有限,定會有錯誤的地方,
如有發現,請大家指出,第一時間更新,謝謝!!
一、TencentOS tiny 的特性
1、資源佔用極少
TencentOS tiny 最少資源佔用:RAM 0.8KB,ROM 1.8KB;在類似煙感和紅外等實際場景下,TencentOS tiny 的資源佔用僅 爲:RAM 2.69KB、ROM 12.38KB。資源佔用之少業界領先。
2、高效功耗管理框架
完整包含 MCU 和外圍設備功耗管理,用戶可以根據業務場景選擇可參考的低功耗方案,有效降低設備耗電,延長設備壽命。
3、自動移植工具
TencentOS tiny 提供多種編譯器快速移植指南和移植工具,可實現向新硬件開發板的一鍵移植,省時省力,有效提升開發效 率。
4、最後一屏調試工具
TencentOS tiny 可以自動獲取故障現場信息,並保持在端側存儲設備中,觸發重啓後會自動上傳故障信息,可有效解決遠程物 聯網設備故障信息獲取難題,提升故障分析解決效率。
5、安全分級方案
TencentOS tiny 提供了多個等級的 IoT 安全方案。您可以根據業務場景和成本要求選擇合適的安全解決方案,方便客戶在安全 需求和成本控制之間進行有效平衡。
二、應用場景
1、MCU芯片/IOT模組
TencentOS tiny 支持主流的 MCU 芯片,如 STM32 NXP 等,支持主流通信模組,如 ESP8266 wifi、LoraWAN 模組、NB-IoT 模組等。
2、物聯網終端設備廠家
TencentOS tiny 提供完整的終端軟件棧,簡單易用的端雲 SDK 縮短設備廠家的開發週期,進而節省終端產品開發成本。
3、物聯網解決方案
TencentOS tiny 提供一站式軟件解決方案,方便各種物聯網設備快速接入騰訊雲,可支撐智慧城市、智能水錶、智能家居、智慧農業、智能穿戴、車聯網等多種行業應用。
三、移植TencentOS-tiny系統
閒暇之時,利用一點點時間移植一下TencentOS-tiny系統玩玩。
硬件(MCU):STM32L051C8T6
目前來說TencentOS-tiny比起LiteOS還有一些不足的地方(組件還沒有LiteOS完善),但是它佔用flash確實是小些,比起LiteOS。
直接進入話題,其實,我已在前一個月就移植好了,現在就是做個記錄。
好啦!其實移植很簡單,官方已經給我們寫了移植步驟,只需一步步按照步驟來進行即可。
不過移植時要注意一些小小地方。
移植前需要做幾個步驟:
1、使用STM32CubeMx工具生成demo工程,我的工程名叫STM32L051C8T6
1)新建工程頁面:
根據你手上的板子芯片型號來選擇,對應的芯片,即可。
2)時鐘配置界面:
3)GPIO管腳配置頁面:
配置好後,接着點擊生成代碼按鍵,在當前窗口右上角"GENERATE CODE",點擊它即可。
自動啓動Keil IDE 工具
測試該工程結果
以確保本工程是可以正常運行,繼續往下前行。
2、就是在TencentOS-tiny官方下載源碼。(現在幾乎每天都在更新源碼,不斷完善中)
1)源碼的地址:https://github.com/Tencent/TencentOS-tiny
2)克隆源碼:
注:下載代碼,可以使用(GitHub Desktop工具克隆源碼) ,這個過程很漫長,需要耐心等待。
3、在這我是基於keil IDE開發的環境,所以我是按照官網教程步驟如下:
二、內核移植
1. 代碼目錄規劃
如圖所示,新建TencentOS_tiny主目錄,並在主目錄下添加四個子目錄,其中arch、kernel、osal從代碼倉直接拷貝過來即可,而board目錄下則放入我前面使用STM32CubeMX 工具生成的裸機工程代碼,如下圖所示:
2. 添加arch平臺代碼
引入TencentOS-tiny中的arch文件
1:arch\arm\arm-v7m\common\tos_cpu.c
2:arch\arm\arm-v7m\cortex-m0+\armcc\port_c.c 和 arch\arm\arm-v7m\cortex-m0+\armcc\port_s.S
tos_cpu.c是TencentOS tiny 的CPU適配文件,包括堆棧初始化,中斷適配等,如果您的芯片是ARM Cortex M核,該文件可以不 做改動,M0、M3 、M4、M7是通用的,其他IP核需要重新適配;
port_s.S 文件是TencentOS tiny的任務調度彙編代碼,主要做彈棧壓棧等處理的,port_c.c適配systick等,這兩個文件 每個IP核和編譯器都是不一樣的,如果您的芯片是ARM Cortex M核,我們都已經適配好,比如現在我們移植的芯片是STM32L073RZ,是ARM Cortex M0+核,使用的編譯器是KEIL,所以我們選擇arch\arm\arm-v7m\cortex-m0+\armcc下的適配代碼,如果你的開發板是STM32F429IG,M4核,編譯器是GCC,則可以選擇arch\arm\arm-v7m\cortex-m4\gcc目錄下的適配文件。
3. 添加內核源碼
把kernel目錄下中的core和pm兩個文件夾所有.c文件添加進來即可,其中Core下爲基礎內核,如何還沒涉及
到低功耗,這個pm目錄下的.c文件可以不用添加。如下如所示:
4. 添加cmsis os源碼
cmsis os已經幫我們考慮到兼容問題,所以弄了個抽象層OS,這樣移植TencentOS tiny的工作量。
cmsis_os.c文件路徑:osal\cmsis_os\cmsis_os.c
5. 添加TencentOS tiny頭文件目錄
在工程目錄下,新建一個TOS_CONFIG文件夾,同時創建一個tos_config.h文件,用來存放TencentOS tiny的配置頭文件。
如下圖所示:
6. 新建TencentOS tiny系統配置文件 tos_config.h
#ifndef _TOS_CONFIG_H_
#define _TOS_CONFIG_H_
#include "stm32l0xx.h" // 目標芯片頭文件,用戶需要根據情況更改
#define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默認支持的最大優先級數量
#define TOS_CFG_ROUND_ROBIN_EN 0u // 配置TencentOS tiny的內核是否開啓時間片輪轉
#define TOS_CFG_OBJECT_VERIFY_EN 1u // 配置TencentOS tiny是否校驗指針合法
#define TOS_CFG_TASK_DYNAMIC_CREATE_EN 1u // TencentOS tiny 動態任務創建功能宏
#define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模塊功能宏
#define TOS_CFG_MMBLK_EN 1u //配置TencentOS tiny是否開啓內存塊管理模塊
#define TOS_CFG_MMHEAP_EN 1u //配置TencentOS tiny是否開啓動態內存模塊
#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN 1u // TencentOS tiny 默認動態內存池功能宏
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100 // 配置TencentOS tiny默認動態內存池大小
#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否開啓互斥鎖模塊
#define TOS_CFG_MESSAGE_QUEUE_EN 1u // 配置TencentOS tiny是否開啓消息隊列模塊
#define TOS_CFG_MAIL_QUEUE_EN 1u // 配置TencentOS tiny是否開啓消息郵箱模塊
#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 1u // 配置TencentOS tiny是否開啓優先級消息隊列模塊
#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN 1u // 配置TencentOS tiny是否開啓優先級消息郵箱模塊
#define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否開啓軟件定時器模塊
#define TOS_CFG_PWR_MGR_EN 0u // 配置TencentOS tiny是否開啓外設電源管理模塊
#define TOS_CFG_TICKLESS_EN 0u // 配置Tickless 低功耗模塊開關
#define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否開啓信號量模塊
#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN 1u // 配置TencentOS tiny是否開啓任務棧深度檢測
#define TOS_CFG_FAULT_BACKTRACE_EN 0u // 配置TencentOS tiny是否開啓異常棧回溯功能
#define TOS_CFG_IDLE_TASK_STK_SIZE 128u // 配置TencentOS tiny空閒任務棧大小
#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick頻率
#define TOS_CFG_CPU_CLOCK (SystemCoreClock) // 配置TencentOS tiny CPU頻率
#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否將TIMER配置成函數模式
#endif
三、按照上面的步驟,基本上TencentOS tiny移植完成, 接下來測試移植結果。
1. 修改部分代碼
修改stm32l0xx_it.c的中斷函數,在stm32l0xx_it.c文件中包含 tos_k.h 頭文件
如果不去掉這個選擇,那就要在stm32l0xx_it.c文件中的PendSV_Handler函數前添加__weak關鍵字纔行。
同時在SysTick_Handler函數中添加TencentOS tiny的調度處理函數,如下圖所示:
/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
if(tos_knl_is_running())
{
tos_knl_irq_enter();
tos_tick_handler();
tos_knl_irq_leave();
}
/* USER CODE END SysTick_IRQn 1 */
}
2. 編寫TencentOS tiny 測試任務
在usart.c文件
在mian.c 中添加TencentOS tiny 頭文件,編寫任務函數
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "cmsis_os.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//task1
#define TASK1_STK_SIZE 256
void task1(void *pdata);
osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
//task2
#define TASK2_STK_SIZE 256
void task2(void *pdata);
osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
void task1(void *pdata)
{
int count = 1;
while(1)
{
printf("\r\nHello world!\r\n###This is task1 ,count is %d \r\n", count++);
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
osDelay(2000);
}
}
void task2(void *pdata)
{
int count = 1;
while(1)
{
printf("\r\nHello TencentOS !\r\n***This is task2 ,count is %d \r\n", count++);
osDelay(1000);
}
}
/* USER CODE END PTD */
/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
.
.
.
/* USER CODE BEGIN 1 */
/*printf() 重定向輸出到串口*/
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /*__GNUC__*/
PUTCHAR_PROTOTYPE
{
/*通過串口1發送一個字符,ch爲字符的存儲地址,0xffff爲超時時間*/
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/* USER CODE END 1 */
3. 編譯下載測試TencentOS tiny移植結果
繼續在main.c 的mian函數中硬件外設初始化代碼後添加TencentOS tiny的初始化代碼:
osKernelInitialize(); //TOS Tiny kernel initialize
osThreadCreate(osThread(task1), NULL);// Create task1
osThreadCreate(osThread(task2), NULL);// Create task2
osKernelStart();//Start TOS Tiny
5、運行結果:
代碼鏈接
源碼鏈接:Git