首页 > 其他分享 >FreeRTOS 原理 --- 任务调度机制

FreeRTOS 原理 --- 任务调度机制

时间:2023-09-25 23:35:33浏览次数:50  
标签:链表 优先级 FreeRTOS pxConstList pxIndex --- 任务 任务调度 define

任务的状态

  • 运行态
  • 就绪态
  • 阻塞态(被动让出CPU)
  • 挂起态(主动让出CPU)

就绪链表

就绪态,每个任务优先级对应一个链表,如下:

PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ] = {0};    /*< Prioritised ready tasks. */

 

xPortPendSVHandler 中断只会从高优先级链表取任务,最高优先级链表没有任务,则往低优先级链表取任务,其内调用如下宏:

    #define taskSELECT_HIGHEST_PRIORITY_TASK()                                                        \
    {                                                                                                \
    UBaseType_t uxTopPriority;                                                                        \
                                                                                                    \
        /* Find the highest priority list that contains ready tasks. */                                \
        portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority );                                \
        configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 );        \
        listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) );        \
    } /* taskSELECT_HIGHEST_PRIORITY_TASK() */

 

如下可知,链表的成员变量 pxIndex 指向当前正在指向的任务。链表是一个循环链表,新插入的任务放在 pxIndex 的前面(保证后插入的任务后执行)。

#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )                                        \
{                                                                                            \
List_t * const pxConstList = ( pxList );                                                    \
    /* Increment the index to the next item and return the item, ensuring */                \
    /* we don't return the marker used at the end of the list.  */                            \
    ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;                            \
    if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) )    \
    {                                                                                        \
        ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;                        \
    }                                                                                        \
    ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner;                                            \
}

阻塞链表

当获取不到互斥锁,把当前任务从就绪链表移到阻塞链表

何时触发任务切换

tick中断

高优先级任务变为就绪态

  • 释放信号量导致高优先级任务可以获得信号量
  • 释放互斥锁导致高优先级任务可以获得互斥锁
  • 创建了一个高优先级任务,且调度器已启动
  • ......

当释放信号量,会把等待此信号量的任务从阻塞链表移到就绪链表,如果优先级大于当前正在执行的任务,则调用如下函数触发 xPortPendSVHandler 中断

#define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API()

#define portYIELD_WITHIN_API portYIELD

#define portYIELD()                                            \
{                                                            \
    /* Set a PendSV to request a context switch. */            \
    portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;            \
    __DSB();                                                \
    __ISB();                                                \
}

 

标签:链表,优先级,FreeRTOS,pxConstList,pxIndex,---,任务,任务调度,define
From: https://www.cnblogs.com/god-of-death/p/17729120.html

相关文章

  • abc321E - Complete Binary Tree
    E-CompleteBinaryTree首先我们只考虑x子树中的答案,非常明显,一定是一个连续的区间,那么我们只需要找到两个端点即可,左端点一直往左走即可,但是右端点要注意,如果走不了,如果左端点存在,说明n就是我们的右端点。处理完子树之后往上跳即可,因为树高只有60#include<cstdio>#include<......
  • Mybatis-Plus 系列:简介和基本使用
    目录一、简介二、特性三、基本使用1、初始化数据库2、初始化工程3、精简SpringBoot相关日志一、简介官网:https://www.baomidou.comMyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,主要作用为简化开发、提高效率。二、特性无侵入:只做增强不做改......
  • abc246F - typewriter
    F-typewriter直接容斥即可,每次选出它们的并集。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#definefo(i,a,b)for(int(i)=(a);(i)<=(b);(i)++)#definefd(i,b,a)for(int(i)=(b);(i)>=(a);(i)-......
  • RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码)
    RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码)RSA算法是一种非对称加解密算法。服务方生成一对RSA密钥,即公钥+私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。1.RAS密钥生成器2.RAS加解密和签名和验签代码13.RAS实现签名......
  • 接口自动化测试--Postman安装和环境部署
    Postman是一款功能强大的网页调试和模拟发送HTTP请求的谷歌插件,可以使用各种方法发送网页HTTP请求,能够运行测试用例1.先安装Postman  官网:https://www.postman.com/downloads/?utm_source=postman-home这里下载的是Windows版本的进行安装的就好环境部署需要部署node.js、cnpm、......
  • ruoyi-cloud免登录访问
    1、首先在nacos中找到gateway.yml编辑,找到ignore下的whites,添加需要名登录的连接2、还要把连接上面的权限校验的代码注解给删除掉......
  • 无涯教程-JavaScript - STANDARDIZE函数
    描述STANDARDIZE函数从以均值和standard_dev为特征的分布返回归一化值。语法STANDARDIZE(x,mean,standard_dev)争论Argument描述Required/OptionalXThevalueyouwanttonormalize.RequiredMeanThearithmeticmeanofthedistribution.RequiredStandard_de......
  • OpenStack(Train版)-部署neutron(二)
    7.2.3、部署自助服务网络Self-servicenetworks7.2.3.1、部署Neutron控制节点(controller)7.2.3.1.1、创库授权createdatabaseneutron;grantallprivilegesonneutron.*to'neutron'@'localhost'identifiedby'neutron123';grantallprivilegesonneut......
  • pytorch(3-0) 可视化训练误差折线图有
     缺点必须手动点击下关闭才能刷新最新的图,起码不会阻塞训练过程     ###画图训练损失训练精度测试精度importmatplotlib.pyplotaspltimportthreadingimporttimeimportmatplotlib.animationasanimationclassAnimator:def__init__(self......
  • USART-通信详解
    目录一.通信基本概念1.根据数据传输方式划分2.根据数据传输方向划分3.根据数据同步方式划分二.USART流程分析1.USART协议2.USART框图分析3.寄存器分析三.USART驱动代码1.寄存器方式驱动2.固件库方式驱动一.通信基本概念1.根据数据传输方式划分串行通信:一般是8......