嵌入式FreeRTOS学习十一,深入理解任务调度机制

news2024/11/23 15:08:32

一.任务调度机制

  • 可抢占:高优先级的任务先运行
  • 时间片轮转:同优先级的任务轮流执行
  • 空闲任务礼让:如果有同是优先级为0的其他就绪任务,空闲任务主动放弃一次运行机会
  • 函数调用vTaskDelay( xDelay5ms )可以主动放弃任务执行,让出CPU使用权
  • 系统中最低优先级中断比最高优先级任务大
int main( void )
{
	prvSetupHardware();
	
	xTaskCreate(vTask1, "Task 1", 1000, NULL, 0, NULL);
	xTaskCreate(vTask2, "Task 2", 1000, NULL, 0, NULL);
	xTaskCreate(vTask3, "Task 3", 1000, NULL, 2, NULL);

	/* 启动调度器 */
	vTaskStartScheduler();

	/* 如果程序运行到了这里就表示出错了, 一般是内存不足 */
	return 0;
}

=========================================================================

二.空闲任务函数 portTASK_FUNCTION( prvIdleTask, pvParameters )

static portTASK_FUNCTION( prvIdleTask, pvParameters )
{    
    ( void ) pvParameters;   
    portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE );
    for( ; ; )
    {      
        prvCheckTasksWaitingTermination();
        #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) )
            {               
                if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
                {
                    taskYIELD();
                }
                else
                {
                    mtCOVERAGE_TEST_MARKER();
                }
            }
        #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */
        #if ( configUSE_IDLE_HOOK == 1 )
            {
                extern void vApplicationIdleHook( void );               
                vApplicationIdleHook();
            }
        #endif /* configUSE_IDLE_HOOK */
        #endif /* configUSE_TICKLESS_IDLE */
    }
}

FreeRTOS操作系统中配置项 configUSE_PREEMPTION == 1表示同等优先级之间可抢占,配置项configIDLE_SHOULD_YIELD == 1 表示表示主动礼让,只有在任务可抢占的情况下,才考虑空闲礼让的情况。 

如果 配置选项配置为configUSE_PREEMPTION == 0不抢占的情况,那么直接进行礼让 taskYIELD(),任何其他的情况发生都是直接礼让。可抢占的时候可以配置是否礼让,不抢占中有礼让的这一种情况。

在空闲任务portTASK_FUNCTION中,会对任务就绪链表里的任务进行一次判断,如果当前任务就绪链表长度listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) )大于1,那么说明链表里面出了空闲任务外,还有其他的优先级为0的任务。那么空闲任务马上就做出任务礼让。其中tskIDLE_PRIORITY =0,即pxReadyTasksLists[ 0 ] 。

 礼让了其他任务以后,空闲任务函数执行 taskYIELD() 礼让其他任务,让其他任务先运行,函数执行到taskYIELD()后马上启动任务调度函数,任务调度函数执行任务Task1,任务Task2,任务Task3,等这三个任务运行完后,再执行回去执行空闲任务函数,从上次礼让的位置继续执行下去。

=========================================================================

可抢占可礼让的情况下,任务执行的的顺序是idle_task 执行一会后,马上执行任务Task 1,是否会执行任务Task 2,任务Task 3还得看任务是否会轮流执行。

在 xTaskIncrementTick函数中可以看到,只有配置成configUSE_PREEMPTION == 1可抢占和 configUSE_TIME_SLICING == 1时间片轮转的情况,任务Task2才可以得到执行。 不抢占不轮转,任务Task2永远得不到运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大学物理·第8章【电磁感应、电磁场】

from now on, 以后的篇幅我都不会写太多了。因为效果也不一定有,还很浪费时间。 感应电动势 那个奥特曼变身器的符号是 磁链 看看划线公式即可 动生电动势:dξ vB dl 例 如果,到时候复习的时候觉得简单的话,就删掉好了 自感、互…

【HTML5】登录页面制作简易版

刚开始学习Java。文件的命名,讲道理应该以英文为主,但是英语又不好,所以只好用拼音,最痛苦的应该算是那些英语又不好,又想秀一下的程序员,一半英语一半拼音,如mainFangFa~~~你说看了糟心不糟心。…

山东大学线性代数-1-矩阵-1

目录 1.2 几种特殊的矩阵 1.2.1 方阵 1.2.2 零矩阵 1.2.3 对角矩阵 1.2.4 单位矩阵 1.2.5 数量矩阵 1.2.6 三角阵 1.2.7 梯形阵 1.3 矩阵的运算(一) 1.3.1 相等 1.3.2 加、减法 1.3.3 数乘 1.3.4 矩阵的乘法 1.4 矩阵的运算(二&#x…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.18 查询文档

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.18 查询文档4.18.1 查询文档4.18.2 小结4.18.3 总…

山东大学线性代数-3-n维向量

目录 3.1 n维向量及其线性运算 3.1.1 n维向量的概念 3.1.2 向量的相等 3.1.3 n维向量的线性运算 3.1.4 线性组合 3.1.5 向量组的等价 3.2 向量组的线性相关性 3.2.1 线性相关性的定义 3.2.2 特殊情形的线性相关性 3.3 相关性的判定及有关重要结论 3.3.1 线性相关与…

[MQ] SpringBoot使用直连交换机Direct Exchange

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

Bootstrap-栅格实例(二)

栅格实例 进入官网 选择3.0的中文文档: 选择组件: 选择缩放图: 选择这个,复制代码: 把代码拷贝到,新创建的模板固定container里面: 删除靠过来的多余的row: 修改div的calss&…

【信息奥赛实训】Week1——STL 与基础数据结构专题训练

【信息奥赛实训】Week1-Lab-STL 作者|Rickyの水果摊 时间|2022年11月20日 实训概要 实训专题 STL 与基础数据结构专题训练 实训目的 掌握STL常用的算法、容器、容器适配器的使用方法。能够利用STL的算法、容器、容器适配器求解问题。 题目列表 A&…

HTML小游戏9 —— 潜行游戏《侠盗罗宾汉》(附完整源码)

💂 网站推荐:【神级源码资源网】【摸鱼小游戏】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的计算机相关知…

紫外线杀菌器

一、概述 紫外线杀菌器是利用波长为225-275nm的紫外线对微生物的杀灭而使水中菌类得以净化。当水流经消毒仪时,高强度杀菌作用的紫外线即将水中细菌杀灭。本产品彻底解决了饮用水二次污染细菌超标问题,同时也适用于饮料、食品、游泳池等用水的消毒处理。…

Linux基本指令——综合操作

bc指令bc指令其实就是Linux下的计算器Ctrl c退出也可以通过管道进行输出。bc命令并不常用,主要是见见。uname -r指令语法:uname [选项]作用:uname可以用来获取电脑或者操作系统的相关信息。选项:-a或–all 详细输出所有信息&…

ConsulManager安装

地址 地址: https://github.com/starsliao/ConsulManager使用yum部署consul 在这里可以直接使用yum安装部署consul这个组件 # 使用yum部署consul yum install -y yum-utils yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.re…

(续)SSM整合之springmvc笔记(RESTful之RESTful案例)(P148-153)

目录 RESTful案例 一 . 准备工作 1 . 准备实体类 2 .准备dao模拟数据 3. 创建控制层EmployeeController 二 功能清单 三 . 具体功能:查询所有员工数据 ①控制器方法 ②创建employee_list.html RESTful案例 一 . 准备工作 和传统CRUD 一样,…

【前沿技术RPA】 一文了解UiPath 通过Invoke Method 和 Invoke Code增强自动化功能

🐋作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。 🐬个人主页:会敲键盘的肘子 🐰系列专栏:UiPath 🦀专栏简介:UiPath在传统的RPA(Robotic…

[附源码]Python计算机毕业设计_旅游系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

多表操作(外键)

多表操作 外键 外键(foreign key): 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。 主表(父表):对于两个具有关联关系的表而言,相关联字段中…

HTML+CSS+JS网页设计期末课程大作业____(航天月球响应式 3页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#…

【Java八股文总结】之Spring

文章目录Spring一、Spring介绍1、Spring是什么?特性?2、Spring有哪些模块?3、Spring中的设计模式?二、IOC1、基本概念2、什么是IOC?什么是DI?Q:为什么要使用 IOC 呢?3、Spring IOC的…

一文快速学会hadoop完全分布式集群搭建,很详细

文章目录前言一、准备工作二、克隆三台虚拟机并进行网络配置克隆虚拟机克隆引导修改网络配置验证验证方式一验证方式二三、安装jdk和hadoop四、ssh免密登录配置概述生成公钥和私钥把公钥拷贝到三台虚拟机上面去验证把hadoop103 和 hadoop104的免密登录配置安装上面的操作再做一…

ZYNQ - 无DDR固化程序(代码运行在OCM上)

写在前面 ZYNQ固化时,正常情况下都需要DDR参与,但是有时硬件设计时,可能将DDR去掉或设计出错,这将导致ZYNQ无法正常固化,之前有写过一个使用静态链接库进行无DDR固化的文章,当时那个是压缩了FSBL的相关代码…