• FreeRTOS基础知识


    一、任务调度方式
    抢占式(preemption schedule):任务优先级高的任务一旦就绪立即获得CPU的使用权(抢夺低优先级任务);抢占式调度,是最高优先级的任务一旦就绪,总能得到CPU的执行权;它抢占了低优先级的运行机会。在抢占式调度系统中,总是运行已就绪当前最高优先级的任务。

    时间片:在FreeRTOS中,抢占式调度,与时间片轮转可以同时存在;当有高优先级任务就绪时,运行高优先级任务;当最高优先级的任务有好几个时,这几个任务可以以时间片轮转方式调度。

    时间片调度: configUSE_TIME_SLICING
    slice time schedule 时间片调度

    一个时间片就等于systick定时器的中断周期;(当然用户可以系统滴答定时器可以设置任意的中断周期1us,1ms,10ms);

    抢占式&时间片调度共同模式下不加阻塞延时vTaskDelay,
    也会在最高并且同优先级任务间进行轮流执行的,但是低优先级任务不能被执行???

       Q问题:抢占式&时间片调度共同模式下不加阻塞延时vTaskDelay时,最高并且同优先级任务间是如何进行切换轮流执行???
       【答案】任务调度器会在每一次系统滴答定时器(系统时钟)节拍到时切换任务,轮流执行一个时间片的时间(一个滴答定时器中断周期);
    
    • 1
    • 2

    合作式调度(暂时性理解):
    task yield 任务让步放弃(屈服)
    1、使能合作式调度宏后,也就是一旦某个任务取得了CPU执行权,不调用taskYIELD()/vTaskDelay主动放弃CPU使用权它就一直占用,不会退出
    2、是非抢占的,任务主动放弃CPU使用权才执行别的任务,而不是被别的任务主动打断的;
    3、合作式调度器的思路就是用一个定时器中断(例如系统滴答定时器)去周期性的刷新任务,若任务运行时间到了,
    就将任务运行标志置为运行态,没到则所有任务运行时间 -1,然后在 main() 函数主循环中依次遍历所有任务的运行标志(判断各任务运行标志是否置1为已就绪),
    若为运行态,则运行该任务且将运行标志复位清0。
    4、按各任务规定的时间周期顺序依次运行的,类似轮询方式;

    【reference】合作式调度:https://www.bilibili.com/read/cv14583592/
    合作(co-routines 协作)式:
    https://www.eetopic.com/article/94070.html
    https://codeleading.com/article/89704434720/

    二、任务状态
    运行态、就绪态、阻塞态、挂起态
    运行态:当前正在执行的任务,同一时刻只能有一个任务在执行;
    就绪态:任务处于就绪(但还未被执行),满足条件随时被执行;
    阻塞态:被调用阻塞延时或等待外部信号量时不被执行,延时时间或者外部信号量到了才进入就绪态;
    挂起态:主动调用挂起函数vTaskSuspend将任务挂起,需通过调用解挂起函数vTaskResume恢复到就绪态;

    Q问题:任务优先级最高能设置到多大?为什么是0~31共32个优先级呢???
    【答案】根据软件定义的32bit的变量共32bit,每个bit位表示任务就绪表的就绪状态值;32位MCU最大变量可被定义的数据类型就4byte;
    
    • 1
    • 2

    三、任务调度
    调度器总是在所有处于就绪态列表的任务中,选择具有最高优先级的任务来执行;

    Q问题:任务优先级均相同的几个任务,就绪列表如何登记呢???
    【答案】相同优先级的几个任务如果都处于就绪状态时,相同优先级的任务会连接在同一个就绪表上的;
    例如task1,task2的任务优先级都为1,那么pxReadyTaskLists[1];
    pxReadyTaskLists[x],x代表任务优先级数值;
    
    • 1
    • 2
    • 3
    • 4

    四、文件配置说明

          Q问题:RVDS文件夹缩写说明???
    	  【答案】RVDS(RealView Development Suite) 是ARM公司最新推出的面向SOC和大型复杂应用程序的高端开发工具,被业界称为最好的ARM开发工具。
    
    • 1
    • 2

    FreeRTOSConfig.h配置文件的作用:对rtos进行功能配置和裁剪,以及API函数的使能失能;
    configUSE_PORT_OPTIMISED_TASK_SELECTION 置1时为特殊方法(硬件方式)选择下一个要执行的任务,
    硬件架构支持前导零的汇编指令CLZ,使用硬件方式会限制任务优先级数目为32个,最大优先级数值32-1;
    【reference】 https://www.bilibili.com/read/cv13971414/
    #define configTICK_RATE_HZ (1000) //时钟节拍频率,这里设置为1000,周期就是1ms
    在这里插入图片描述

    【补充complement】9.1.1 系统嘀嗒(SysTick)校准值寄存器
    系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。

    【reference】https://blog.csdn.net/qq_39577221/article/details/125153214

      Q&A: RTOS中该宏变量configTICK_RATE_HZ是如何影响滴答定时器(系统时基)频率的???
      【答案】参考我的文章:FreeRTOS应用问题汇总
    
    • 1
    • 2

    在这里插入图片描述

    /** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source 
    * @{
    */
    #define SYSTICK_CLKSOURCE_HCLK_DIV8    0x00000000U   //0: AHB/8
    #define SYSTICK_CLKSOURCE_HCLK         0x00000004U   //1: Processor clock (AHB)
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    JXLS 导出多sheet,带页眉页脚
    Hadoop之HDFS——【模块一】元数据架构
    内核中oops 错误解析以及问题定位
    从 0 开始学习 Git + GitHub
    java最优建树算法
    C#.Net筑基-集合知识全解
    Vue零基础实战教程
    多GPU训练大型模型:资源分配与优化技巧 | 英伟达将推出面向中国的改良芯片HGX H20、L20 PCIe、L2 PCIe
    Redis实战 - 17 Redis事务和乐观锁实现缓存登录图片验证码功能
    1分钟快速实现Redis数据对比
  • 原文地址:https://blog.csdn.net/SUR0608/article/details/133827968