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_state爲KNL_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