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