【吐血总结】FreeRTOS难点、Systick中断-滴答定时器、PendSV中断-任务切换、SVC中断-系统底层、时间片调度-时钟节拍【已完结】

2023-05-16

文章目录

  • 🔴🟡🟢其他文章链接,独家吐血整理
  • 1、Systick滴答定时器
  • 2、SVC中断
  • 3、PendSV中断
  • 4、❤ Systick、SVC、PendSV小结
  • 5、时间片调度
  • 6、🧡 韦东山FreeRTOS部分
  • 7、💛 其它博主文章链接【转载】
    • 1、FreeRTOS任务切换——PendSV
    • 2、RTOS系列文章(2):PendSV功能,为什么需要PendSV
    • 3、有了Systick中断为什么还要PendSV中断?(==此文章有问题,仅作为参考==)
    • 4、【FreeRTOS】FreeRTOS 源码学习笔记 (5) 任务调度器 + vTaskStartScheduler、xPortPendSVHandler、xPortSysTickHandler
    • 5、FreeRTOS对系统异常优先级寄存器的PendSV和SysTick 的优先级设置过程


🔴🟡🟢其他文章链接,独家吐血整理

【吐血总结】FreeRTOS难点、Systick中断-滴答定时器、PendSV中断-任务切换、SVC中断-系统底层、时间片调度-时钟节拍【已完结】
(第1-8讲)STM32F4单片机,FreeRTOS基础知识总结【视频笔记、代码讲解】【正点原子】【原创】
(第9-10讲)STM32F4单片机,FreeRTOS任务创建和删除(动态方法)【视频笔记、代码讲解】【正点原子】【原创】
(第12讲)STM32F4单片机,FreeRTOS任务创建和删除(静态方法)【视频笔记、代码讲解】【正点原子】【原创】
(第13-14讲)STM32F4单片机,FreeRTOS任务挂起和恢复【视频笔记、代码讲解】【正点原子】【原创】
(第16-17讲)STM32F4单片机,FreeRTOS中断管理简介【视频笔记、代码讲解】【正点原子】【原创】
(第18-19讲)32单片机,FreeRTOS临界段代码保护、任务调度器的挂起和恢复【视频笔记、代码讲解】【原创】
(第20-22讲)STM32F4单片机,FreeRTOS列表和列表项API函数讲解【视频笔记、代码讲解、正点原子】【原创】
(第40-44讲)STM32F4单片机,FreeRTOS信号量【二值、计数、翻转、互斥】【代码讲解】【正点原子】【原创】

1、Systick滴答定时器

在这里插入图片描述
在这里插入图片描述
Systick异常请求=滴答定时器中断,原子的这颗F429芯片晶振是180MHZ,重装载值是18000,从18000计数减到0是一次心跳周期=1/1000s=1ms,这个systick定时器开启是在开启任务调度函数里面的
在这里插入图片描述
在这里插入图片描述
这个空任务就是空闲任务,任务优先级是0,即任务最低优先级(不是中断优先级)

在这里插入图片描述

其实我仍然不太明白嵌套计数器的含义,前几篇文章也分析过,总觉得理解不对

在这里插入图片描述
在这里插入图片描述

这个时间片计数轮询表述不恰当,这里其实是开启滴答定时器中断,用于PendSV任务切换使用

在这里插入图片描述至于Systick和PendSV两者之间谁的优先级高?这个我也不知道,待补充

开启定时器中断就是滴答定时器,里面有PendSV切换, 第6步里面全是汇编语言,反正我看不懂,待补充

2、SVC中断

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
已经创建好任务了,才进入的SVC中断,SVC中断是讲任务结构体数据依次按地址pop到cpu寄存器中(SVC中断只在启动第一次任务时会调用一次,以后均不调用),这里的使能全局中断相当于汇编语言开启中断,因为前面有进入临界区保护时关掉了中断,此时手动又开启了(具体为什么,我没有详细研究,会用大致上理解就行了)

在这里插入图片描述
绿色颜色很重要,这块原子讲得很详细,建议去看下视频

3、PendSV中断

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上图中的if( xTaskIncrementTick() != pdFALSE )判断中的xTaskIncrementTick() 函数里面就是一些链表的操作,即列表项之间的判断,插入,删除,阻塞之类的,因为列表项之间判断决定了是否进行任务切换,因为创建任务就是创建了列表

在这里插入图片描述

原子中的delay延时函数内部调用了上面橙色圈的函数,也就是说delay可以导致任务切换

在这里插入图片描述

这个是宏替换之后的PendSV中断函数,全是汇编语言,后面不想看了,太细了也很难

4、❤ Systick、SVC、PendSV小结

定时器中断是在开启任务调度器时开启的Systick中断函数(寄存器开启,1ms进入一次),里面有PendSV中断函数(寄存器开启,用来根据列表项操作进行任务函数切换),开启任务调度器之后创建了任务(创建任务的同时也就保存了数据),之后打开了SVC中断(汇编语言,获取任务堆栈地址,将任务数据进行出栈处理给cpu寄存器,用于操作硬件底层)(SVC中断只在启动第一次任务时会调用一次,以后均不调用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、时间片调度

在这里插入图片描述
没用完的时间片丢掉
在这里插入图片描述
在这里插入图片描述
时间片设置的是50ms,这个实验还是比较容易理解滴!因为没有加临界区,导致task1打印一半被阻塞跳到task2接着打印了

        taskENTER_CRITICAL();               /* 进入临界区 */
        printf("task1运行次数:%d\r\n",++task1_num);
        taskEXIT_CRITICAL();                /* 退出临界区 */
        taskENTER_CRITICAL();               /* 进入临界区 */
        printf("task2运行次数:%d\r\n",++task2_num);
        taskEXIT_CRITICAL();                /* 退出临界区 */

解决办法是printf上下加上临界区保护即可

6、🧡 韦东山FreeRTOS部分

void vTask1( void *pvParameters )
{
	const TickType_t xDelay100ms = pdMS_TO_TICKS( 100UL );		
	BaseType_t ret;
	
	/* 任务函数的主体一般都是无限循环 */
	for( ;; )
	{
		/* 打印任务的信息 */
		printf("Task1 is running\r\n");
		
		ret = xTaskCreate( vTask2, "Task 2", 1000, NULL, 2, &xTask2Handle );
		if (ret != pdPASS)
			printf("Create Task2 Failed\r\n");
		
		// 如果不休眠的话, Idle任务无法得到执行
		// Idel任务会清理任务2使用的内存
		// 如果不休眠则Idle任务无法执行, 最后内存耗尽
		vTaskDelay( xDelay100ms );
	}

void vTask2( void *pvParameters )
{	
	/* 打印任务的信息 */
	printf("Task2 is running and about to delete itself\r\n");

	// 可以直接传入参数NULL, 这里只是为了演示函数用法
	vTaskDelete(xTask2Handle);
}

int main( void )
{
	prvSetupHardware();
	
	xTaskCreate(vTask1, "Task 1", 1000, NULL, 1, NULL);

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

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

在这里插入图片描述
在这里插入图片描述
阻塞≠挂起(挂起只能使用具体的挂起函数,阻塞无需),只有freertos自带的taskdelay函数实现了任务切换,即task1被taskdelay挂起,task2执行完之后就delete了自己,因为taskdelay里面调用了vTaskSuspendAll();挂起函数,这里的阻塞就是PendSV里面的列表项操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个tick中断,时间片就是taskdelay延时,taskdelay(1000)就是1000个时间片,这1000ms内这个任务被阻塞,其它任务可以执行,这就是实时操作系统的妙处所在

在这里插入图片描述
svs操作系统底层,pendsv用于任务切换,任务的重要程度肯定比不上系统内核底层,根据上面的小节可知,svs就是获取任务堆栈地址,将任务数据进行出栈处理,用于操作硬件底层

7、💛 其它博主文章链接【转载】

1、FreeRTOS任务切换——PendSV

FreeRTOS任务切换——PendSV
在这里插入图片描述
这篇文章主要就是解释了上面张图,中断可打断PendSV,PendSV的作用,以及具有延时特点。

2、RTOS系列文章(2):PendSV功能,为什么需要PendSV

RTOS系列文章(2):PendSV功能,为什么需要PendSV
这篇文章写得很详细了,和我看完原子视频理解的大差不差

1、将Systick的优先级设置成高于IRQ
在这里插入图片描述
缺点,IRQ=外部中断被耽误,不可容忍

2、将Systick和PendSV的优先级设置为最低
在这里插入图片描述
缺点,IRQ影响Systick时钟,可容忍
3、将SysTick的优先级设置成最高,PendSV的优先级设置为低
在这里插入图片描述
缺点,耽误IRQ,不可容忍

1 PendSV是可悬起系统中断,具有【缓期执行】特征。
2 PendSV一般被嵌入式OS用于 任务调度的上下文切换。
3 使用PendSV时,一般会将PendSV的优先级设置为最低,让外部IRQ先执行,等到没有外部中断后,在执行上下文切换。
4 嵌入式实时操作系统的【实时】概念,并不仅仅指应用程序、任务的调度实时,而是指整个系统的实时性高,具备【可剥夺】特点,当有高优先级的中断、任务具备执行条件时,立刻中断当前正在运行的任务,去执行高优先级的IRQ和高优先级任务。
5 嵌入式OS一般会将SysTick的优先级也设置为最低,保证外部中断IRQ优先,详细的分析,我们下一篇文章讨论。

至于sys中断和pendsv中断谁的优先级更高?不清楚,还是没明白,反正两个都是设置最低!

3、有了Systick中断为什么还要PendSV中断?(此文章有问题,仅作为参考

有了Systick中断为什么还要PendSV中断?

4、【FreeRTOS】FreeRTOS 源码学习笔记 (5) 任务调度器 + vTaskStartScheduler、xPortPendSVHandler、xPortSysTickHandler

文章1

5、FreeRTOS对系统异常优先级寄存器的PendSV和SysTick 的优先级设置过程

文章2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【吐血总结】FreeRTOS难点、Systick中断-滴答定时器、PendSV中断-任务切换、SVC中断-系统底层、时间片调度-时钟节拍【已完结】 的相关文章

  • 使用pip安装第三方模块报错,WARNING: You are using pip version 20.2.1; however, version 21.0.1 is available. You

    问题 xff1a 使用pip安装第三方模块报错 xff0c WARNING You are using pip version 20 2 1 however version 21 0 1 is available You should co
  • python小数据池,代码块的深入剖析

    python小数据池 xff0c 代码块的深入剖析 文章目录 python小数据池 xff0c 代码块的深入剖析一 id xff0c is xff0c 61 61 二 代码块三 代码块的缓存机制四 小数据池五 小结 一 id xff0c i
  • docker 之Dockerfile

    Docker 镜像构建之 Dockerfile 在 Docker 中构建镜像最常用的方式 xff0c 就是使用 Dockerfile Dockerfile 是一个用来构建镜像的文本文件 xff0c 文本内容包含了一条条构建镜像所需的指令和说
  • 项目开发的完整流程(详解版)

    项目开发的完整流程 前言 一般情况下 xff0c 企业开发软件时会按照基线和定制两块并行方式执行项目开发工作 无论什么公司 xff0c 都需要遵从一套成熟的产品研发过程体系 xff0c 才能做出质量较好的产品 因此 xff0c 如果出现项目
  • nerfstudio介绍及在windows上的配置、使用

    nerfstudio提供了一个简单的API xff0c 可以简化创建 训练和可视化NeRF的端到端过程 该库通过模块化每个组件来支持可解释的NeRF实现 nerfstudio源码地址 https github com nerfstudio
  • pip源

    02 pip源更换 前面已经介绍过pip软件包管理工具基本使用及换源 链接 一 国内常用镜像源 清华大学 xff1a https pypi tuna tsinghua edu cn simple 阿里云 xff1a http mirrors
  • mysql启动失败,报错:Job for mysqld.service failed

    无论安装多少次mysql xff0c 仍然会出现各种各样的错误 xff0c 无可奈何 xff0c 只能和mysql硬刚了 xff01 所以最好的解决方案是查看错误日志 xff0c 去解决懵逼的代码错误 错误如图所示 xff1a 百度了好久
  • linux 安装SQL Server 2019

    可以直接参考官方文档 xff1a https docs microsoft com zh cn sql linux quickstart install connect red hat view 61 sql server ver15 一
  • Go 数组与切片

    Go 数组与切片 一 数组 1 1 数组定义与基本语法 数组 是一个由 固定长度 的特定类型元素组成的序列 xff0c 一个数组可以由零个或多个元素组成 在Go语言中 xff0c 数组从声明时就确定 xff0c 使用时可以修改数组成员 xf
  • linux安装chrome以及驱动

    一 安装chrome 下载安装脚本 span class token function wget span https intoli com install google chrome sh 然后授予可执行权限 span class tok
  • ardupilot编译过程,通过makefile的形式编译,分析make px4-v2指令

    ardupilot编译过程 xff0c 通过makefile的形式编译 xff0c 分析make px4 v2指令 我们都知道平时用的编译命令是make px4 v2 但是为什么是这个呢 xff0c 这个命令是怎样执行的呢 xff0c 挑干
  • AVT工业相机Windows、Opencv开发——驱动相机(超详细)

    一 概述 1 1使用Vimba控制相机需要经历以下几个步骤 1 打开Vimba 2 查找相机列表 3 打开特定相机 4 配置参数 xff08 可选 xff09 5 采集 xff1a 采集过程共分为5步 xff0c 具体见1 2 6 关闭相机
  • python-opencv尺寸测量

    首先 xff0c 利用机器视觉来测定零件尺寸 xff0c 我们能够直接得到的是图片的像素 xff0c 要想获得尺寸大小 xff0c 我们必须找到像素和实际尺寸间的关系 我们在这里定义一个比例概念 xff1a 每度量比的像素 xff08 pi
  • Bounding box(bbox) 预测

    在出现Bounding box预测之前 xff0c 一般都是通过滑动窗口进行目标检测 本文前两部分介绍滑动窗口算法 xff0c 这样是为了更好介绍 bounding box如何引出 为了解决什么问题而引出的 也可直接跳跃到第三部分看有关bo
  • YOLOv3网络结构分析以及工作流程

    注意 xff1a 本文章有很多图 xff0c 但是都是YOLOv3的结构图 xff0c 只是每张图表达出的信息都各有特色 xff0c 可将这些结构图结合起来 xff0c 能更好的理解 1 Darknet 53 模型结构 在论文中虽然有给网络
  • Qt中QDebug的使用

    QDebug类为调试信息 debugging information 提供输出流 它的声明在 lt QDebug gt 中 xff0c 实现在Core模块中 将调试或跟踪信息 debugging or tracing information
  • Ubuntu18.04安装教程——超详细的图文教程

    电脑配置 xff1a 名称 xff1a Lenovo 拯救者Y7000P 处理器 xff1a i7 10750H 内存 xff1a 32G 固态 xff1a 1TB 显卡 xff1a RTX2060 6G 一 准备工作 本文以 Ubuntu
  • Ubuntu18.04启动后无法进入桌面修复方法(图文)

    引言 xff08 吐槽可略过 xff09 xff1a Ubuntu是应用广泛的Linux操作系统 xff0c 特别是在机器学习应用中 xff0c 通过调用NVIDIA显卡的GPU进行计算和研究的主要平台之一 但是由于NV显卡的存在 xff0
  • VINS-Course代码解析——run_euroc前端数据处理

    vins mono总框架如下 xff1a 主要分为三大块 xff1a 我们先从主函数 main 入手 xff1a 主函数中有三个线程 xff0c 读取完数据集和配置文件的路径后就会进入这三个线程 xff0c 如下图 xff1a thd Ba
  • Gazebo11的更新与安装

    Melodic自带的Gazebo版本过低 xff0c 建议升级 Gazebo安装见gazebo官网 需注意以下四点 删除gazebo9以及相关插件选用Alternative installation step by step的安装方式 xf

随机推荐