【TencentOS-tiny】小熊派TencentOS-tiny測試,TencentOS-tiny調度

          TencentOS-tiny快一年了,不像FreeRTOS 等國外的實時系統那麼完善,但是,絕對是入門實時系統的不二之選。內部集成 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT物聯網協議棧。近兩年物聯網技術應用廣泛,各個巨頭都想在物聯領域分一杯羹,各家推出自己的OS,像華爲的、阿里的,不然自家服務器怎麼賺錢,哈哈哈!言歸正傳!!!

TencentOS-tiny倉庫github 

SDK文檔查看

TencentOS-tiny架構查看

官方寫的非常好,正式,就不摘抄了。

官方把PendSV_Handler函數定義成弱函數,PendSV的作用是會自動延遲上下文切換的請求,直到其他的ISR都完成後纔會放行多用於OS中。舉個例子:任務B要切換到任務A突然來一個ISR(中斷),該ISR又被OS的心跳(系統中用的是SysTick做心跳)搶佔。SysTick做TencentOS-tiny心跳實現,關注port_c.c接口文件。

#include "tos_k.h"
#include "core_cm4.h"

__PORT__ void port_cpu_reset(void)
{
    NVIC_SystemReset();
}

__PORT__ void port_systick_config(uint32_t cycle_per_tick)
{
    (void)SysTick_Config(cycle_per_tick);
}

__PORT__ void port_systick_priority_set(uint32_t prio)
{
    NVIC_SetPriority(SysTick_IRQn, prio);
}

初始化 TencentOS-tiny心跳時鐘,創建任務,開起調度。

     osKernelInitialize(); //TOS Tiny kernel initialize
     osThreadCreate(osThread(task1), NULL);// Create task1
     osThreadCreate(osThread(task2), NULL);// Create task2
     osKernelStart();//Start TOS Tiny

 

此時肯定PendSV異常,延遲任務切換,執行中斷。流程:ISR---開始執行--->SysTick---搶佔--->ISR---繼續執行--->任務切換

SysTick_Handler函數中tos_knl_is_running()函數判斷是否運行,tos_tick_handler()函數,更新tick。

__weak void PendSV_Handler(void)//個人修改
{
  /* USER CODE BEGIN PendSV_IRQn 0 */

  /* USER CODE END PendSV_IRQn 0 */
  /* USER CODE BEGIN PendSV_IRQn 1 */

  /* USER CODE END PendSV_IRQn 1 */
}
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  //HAL_SYSTICK_IRQHandler();個人修改
	if(tos_knl_is_running()){	
		
		tos_knl_irq_enter();
		tos_tick_handler();
		tos_knl_irq_leave();//
	
	}

TencentOS-tiny如何調度?

tos_knl_is_running()  go to definition 。

初始化 k_knl_state =KNL_STATE_STOPPED。

knl_state_t         k_knl_state                 = KNL_STATE_STOPPED;

//初始化 k_knl_state =KNL_STATE_STOPPED;

如果  k_knl_stateKNL_STATE_RUNNING,tos_knl_is_running函數返回值爲1。

接着 tos_knl_start函數調用tos_knl_is_running函數,如果爲真,任務正在執行,無法完成調度,否則進行調度。

__API__ k_err_t tos_knl_start(void)
{
    if (unlikely(tos_knl_is_running())) {
        return K_ERR_KNL_RUNNING;
    }

    k_next_task = readyqueue_highest_ready_task_get();獲取就緒任務
    k_curr_task = k_next_task;把就緒任務給當前任務運行
    k_knl_state = KNL_STATE_RUNNING;再次更改 k_knl_state狀態,便於下次運行使用

    cpu_sched_start();

    return K_ERR_NONE;
}

__API__ int tos_knl_is_running(void)
{
    return k_knl_state == KNL_STATE_RUNNING;
}

源碼下載:

鏈接:https://pan.baidu.com/s/1orpPTBLZ7DGZEVz1bKDe4w 
提取碼:0w1m

 

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