【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

猜你喜欢

转载自blog.csdn.net/weixin_41865104/article/details/107072782