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

2023-05-16

文章目录

  • 问题:
  • 原因:
    • 1.在SysTick中断里完成任务切换会降低操作系统的实时性:
  • 2.把systick优先级设置为最高把PendSV设置为最低的好处:
  • 3、结语:

问题:

看过Cortex-m3/m4操作系统RTOS内核代码的伙伴们都知道,OS中的任务调度实现方式如下:
1、开启SysTick中断,也就是系统滴答定时器中断。然后在SysTick中断中触发PendSV中断,实际的任务切换是在PendSV的中断服务函数中完成的。
2、PendSV的中断服务函数一般用汇编来写。
那为什么不直接在SysTick的中断服务函数里完成任务切换呢?
其中原因如下:

原因:

1.在SysTick中断里完成任务切换会降低操作系统的实时性:

首先我们需要了解Cortex-m3/m4内核的中断和优先级。内核共有256个中断优先级,并且前16个中断分配给了系统内核异常中断,因此外设中断只能排在前16个以后,因此外部中断最多只能有256-16=240个。比如中断0的异常号是16。
在这里插入图片描述
在这里插入图片描述

系统内核发生异常时会触发中断,内核的异常情况如下:
在这里插入图片描述
其中外部中断的优先级有中断优先级配置寄存器,因为外部中断最多只能有256-16=240个,因此外部中断优先级寄存器有240个。看下图可知,确实有240个寄存器控制着外部240个中断的中断优先级。
在这里插入图片描述
而内部系统异常中断的中断优先级则不在这个寄存器里面,而是单独的一块寄存器来保存内部中断的中断优先级:
在这里插入图片描述
有了这些知识,我们就可以回答为什么不在systick中断里面进行操作系统任务切换了。

假设在systick里面,即要保证系统的心跳(也就是系统的时间,或者说节拍),也进行任务切换。那么就必须把systick的中断优先级设置为最低,因为有其他外中断时,是不能进行任务切换的。

如果不把systick的优先级设置为最低,而是设置为最高,1ms执行一次。有个串口中断,执行一次需要5ms。
在0ms时刻,系统初始化完成。

在0.5ms时刻,来了一个串口中断,

在1ms时刻,systick发起中断请求,因为systick中断优先级比串口中断优先级高,systick就会抢占串口中断并执行任务切换函数,而任务切换需要占用一定的时间,等任务切换执行完毕后,程序指针就已经改变为下一个任务的地址了,就没法再回到串口中断服务函数里面了。因此切换任务时需要关闭所有中断。

而如果把systick的优先级设置为最低,确实可以解决有其他中断时不执行任务切换。但是这样就没法保证系统的时钟了。
假设systick每1ms执行1次,而有个串口中断执行一次要5ms。

在0ms时刻,系统初始化完成。

在0.5ms时刻,进了串口中断。

在1ms时刻,systick发出中断请求,但是因为systick优先级比较低,无法抢占串口中断,只有等5ms时刻串口中断退出,才会进入systick中断。

在5ms时刻,串口中断执行完毕,此时进入systick中断。在systick中断里面会把系统时间+1,认为现在系统时间为1ms,但实际此时的系统时间是5ms,这样整个实时系统的时间就全部不准确了。而如果有6个串口中断,那么systick计数的时间很可能每30ms才计数1下,这对于实时系统是根本无法接受的。
在这里插入图片描述

2.把systick优先级设置为最高把PendSV设置为最低的好处:

用systick的高优先级来保证操作系统时间的正确性,而用最低优先级的PendSV来保证不会在有其他中断时进行任务切换。我们还来演绎一下:
假设有个串口中断,systick优先级为最高,1ms进一次。PendSV优先级为最低,会在systick中触发PendSV中断,则无其他中断时,PendSV也是1ms执行一次。串口中断依然是执行一次需要耗时5ms。

在0ms时刻,系统初始化完成。

在0.5ms时刻,进了串口中断。

在1ms时刻,systick发起中断请求,因为systick优先级为最高,则systick会抢占串口中断。在systick中完成系统时钟+1,然后就立即退出了systick。整个systick函数执行很快,只需要对一个数+1,并且将pendsv触发位置为1即可。退出systick后程序会返回到串口中断函数里面,此时pendsv也发起了中断请求。但因为pendsv优先级为最低,因此不能抢占串口中断。

到5ms时刻时,systick已经计数了5次,保证了操作系统的时钟没错误。此时串口中断函数执行完毕,退出串口中断服务函数。如没其他中断,就会执行优先级最低的pendsv中断,在pendsv中断里执行任务切换。

虽然5ms才执行了pendsv一次,但是因为systick依旧是1ms执行一次,因此各任务的检测到的时间也都是5ms,没有错误,因此保证了实时操作系统的实时性。

3、结语:

因此在配置操作系统时,要把systick配置为优先级最高,把pendsv配置为优先级最低。

以上是我画了很长时间琢磨出来并且验证了的,有帮助的话还麻烦点个赞,收藏一下!!!^~^

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

有了Systick中断为什么还要PendSV中断? 的相关文章

  • STM32F103 配置Systick

    Systick系统滴答时钟 Systick h ifndef SYSTICK H define SYSTICK H include 34 stm32f10x h 34 void SysTick Init void void Delay ms
  • 怎样去理解异常SVC和PendSV

    目录 什么是SVC和PendSV 什么是SVC和PendSV SVC xff08 系统服务调用 xff09 和 PendSV xff08 可悬挂系统调用 xff09 它们多用于在操作系统之上的软件开发中 SVC 用于产生系统函数的调用请求
  • UC/OS-III学习——触发PendSV中断

    UC OS III学习 触发PendSV中断 前言一 关于PendSV的基础知识二 代码1 c语言2 汇编语言 前言 PendSV典型使用场合是在上下文切换时 xff08 在不同任务之间切换 xff09 本文主要介绍触发PendSv中断的两
  • 【FreeRTOS】3. PendSV异常

    PendSV异常 问题 xff1a 怎么触发PendSV异常 xff1f 何时使用MSP何时切换PSP xff1f PendSV如何实现上下文切换 xff1f 1 触发PendSV异常 在RTOS内核中 xff0c 任务切换的原理是 xff
  • 【stm32】 OS 支持特性之 PendSV 异常和 SVC异常

    1 SVC和PENDSV 基本概念 SVC xff08 系统服务调用 xff0c 亦简称系统调用 xff09 和 PendSV xff08 可悬起系统调用 xff09 xff0c 它们多用于在操作系统之上的软件开发中 SVC 用于产生系统函
  • 三、任务切换之PendSV异常

    文章目录 PendSV异常1 没有PendSV异常的任务切换2 有PendSV异常的任务切换2 1 系统调用引起的任务切换2 2 systick中断引起任务切换2 3 PendSV异常处理函数2 4 寻找下一个要运行的任务2 5 时间片调度
  • STM32关于systick计时器时间不对的一点问题

    STM32关于systick计时器时间不对的一点问题 我是新手刚接触STM32 xff0c 我设定的时间总是实际时间的一半 xff0c 检查许久也不知道是哪里出了问题 下面是延时函数和计时器的配置 void SysTick Init u8
  • 手写RTOS-PendSV中断

    今天这一篇 xff0c 我们说一下操作系统都要用到的PendSV中断 xff0c 整个操作系统中 xff0c 要自己写的的汇编代码不超过20行 xff0c 全部都在PendSV中断里 以下是 Cotex M3权威指南 里对PendSV的描述
  • 手写RTOS-使用PendSV进行压栈与出栈操作

    学会使用PendSV中断进行压栈和出栈操作 xff0c 是实现任务调度的关键 今天我们就来学习一下如何使用不超过20行的汇编实现压栈和出栈操作 我们现在来实现这么一个例子 xff1a 先把R4 R11通用寄存器的值保存到一个缓冲区里面 xf
  • STM32基础(4)使用SysTick滴答定时器实验精准延时

    原理 SysTick 定时器也叫 SysTick 滴答定时器 xff0c 它是 Cortex M3 内核的一个外设 xff0c 被嵌入在 NVIC 中 它是一个 24 位向下递减的定时器 xff0c 每计数一次所需时间为 1 SYSTICK
  • PendSV中断服务函数

    之前在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler xff09 xff0c xPortSysTickHandler xff09 函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中断 xff
  • 三、STM32中systick中断的优先级

    1 systick中断的优先级 systick为内核外设中断 xff0c 与普通外设中断的优先级有些区别 xff0c 并没有抢占优先级和子优先级的说法 对于M3来说内核外设的中断优先级由内核SCB这个外设的寄存器 xff1a SHPRx x
  • FreeRTOS操作系统如何设置的PendSV和SysTick优先级

    首先应该明确PendSV和SysTick的优先级应该设置为最低 xff0c 具体原因参见这一篇博客 PendSV功能 xff0c 为什么需要PendSV 设置优先级在函数port c中的xPortStartScheduler 函数中实现的
  • 中断及pendSV

    1 概述 通过任务及任务切换一节读者已经了解了任务切换的详细过程 其实要实现任务切换的功能前面讲的还远远不够 因为 PSP的操作必须在特权模式下 而用户的程序是工作在线程模式下的 所以 用户要想实现任务的切换功能就必须想办法让CPU工作在特
  • FreeRTOS的学习(十四)——PendSV异常

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • STM32CubeMX自动生成SYSTICK配置

    1 SYSTICK原理及其寄存器 1 1 SYSTICK原理 SysTick 是一个24位的倒计数定时器 xff0c 当计到0时 xff0c 将从RELOAD寄存器中自动重装载定时初值并继续计数 xff0c 且同时触发中断 只要不把它在Sy
  • 关于PendSV异常和SVC异常

    这里先说什么是异常 xff0c 什么是中断 xff1f 请下这张图 颜色加深的表项为异常 xff0c 这些属于cm3内核自带的 其中 3 xff0c 2 xff0c 1异常的优先级固定 xff0c 是不可更改的 xff0c 其余的异常中断优
  • SVC和PendSV

    转载于 xff1a http book 2cto com 201209 4625 html 1 xff0e SVC SVC xff08 Supervisor Call xff09 指令用于产生一个SVC异常 它是用户模式代码中的主进程 xf
  • STM32中SysTick、FCLK、SYSCLK、HCLK

    http rmingwang com the stm32 systick fclk sysclk hclk html 转载原文 在STM32中 xff0c 有五个时钟源 xff0c 为HSI HSE LSI LSE PLL HSI是高速内部
  • STM32-(16):Systick 系统时钟

    上一篇 STM32 15 如何用ID号保护自己的劳动成果 下一篇 STM32 17 SPI与数码管 数码管 Systick的两大作用 1 可以产生精确延时 原先的Delay只是盲等 2 可以提供给操作系统一个单独的心跳 时钟 节拍 通常实现

随机推荐