移植 TencentOS-tiny 實時操作系統(一)

                                      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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章