首页 > 其他分享 >第九章 FreeRTOS 任务切换

第九章 FreeRTOS 任务切换

时间:2024-11-06 15:48:43浏览次数:5  
标签:函数 FreeRTOS 第九章 中断 PendSV 切换 SysTick 上下文

9.1 PendSV 异常

PendSV(可挂起的系统调用)异常对 OS 操作非常重要,其优先级可以通过编程设置。可以 通过将中断控制和壮态寄存器 ICSR 的 bit28,也就是 PendSV 的挂起位置 1 来触发 PendSV 中 断。与 SVC 异常不同,它是不精确的,因此它的挂起状态可在更高优先级异常处理内设置,且会在高优先级处理完成后执行。

若将 PendSV 设置为最低的异常优先级,可以让 PendSV 异常处理在所有其他 中断处理完成后执行,这对于上下文切换非常有用

上下文切换被触发的场合可以是:

⚫ 执行一个系统调用

⚫ 系统滴答定时器(SysTick)中断

在 OS 中,任务调度器决定是否应该执行上下文切换,如图 9.1.1 中任务切换都是由 SysTick 中断中执行,每次它都会决定切换到一个不同的任务中。

若中断请求(IRQ)在 SysTick 异常前产生,则 SysTick 异常可能会抢占 IRQ 的处理,在这种 情况下,OS 不应该执行上下文切换,否则中断请求 IRQ 处理就会被延迟,而且在真实系统中 延迟时间还往往不可预知——任何有一丁点实时要求的系统都决不能容忍这种事。对于 CortexM3 和 Cortex-M4 处理器,当存在活跃的异常服务时,设计默认不允许返回到线程模式,若存在 活跃中断服务,且 OS 试图返回到线程模式,则将触发用法 fault

在一些 OS 设计中,要解决这个问题,可以在运行中断服务时不执行上下文切换,此时可 以检查栈帧中的压栈 xPSR 或 NVIC 中的中断活跃壮态寄存器。不过,系统的性能可能会受到 影响,特别时当中断源在 SysTick 中断前后持续产生请求时,这样上下文切换可能就没有执行的机会了。

为了解决这个问题,PendSV 异常将上下文切换请求延迟到所有其他 IRQ 处理都已经完成后,此时需要将 PendSV 设置为最低优先级。若 OS 需要执行上下文切换,他会设置 PendSV 的挂起状态,并在 PendSV 异常内执行上下文切换。

9.2 FreeRTOS 任务切换场合

上下文(任务)切换被触发的场合:● 可以执行一个系统调用 ● 系统滴答定时器(SysTick)中断。

执行系统调用

执行系统调用就是执行 FreeRTOS系统提供的相关API函数,比如任务切换函数 taskYIELD(), FreeRTOS 有些 API 函数也会调用函数 taskYIELD(),这些 API 函数都会导致任务切换,这些 API 函数和任务切换函数 taskYIELD()都统称为系统调用。

系统滴答定时器(SysTick)中断

FreeRTOS 中滴答定时器(SysTick)中断服务函数中也会进行任务切换,滴答定时器中断服务函数如下:

在滴答定时器中断服务函数中调用了 FreeRTOS 的 API 函数 xPortSysTickHandler(),此函数 源码如下:

void xPortSysTickHandler( void )
{
vPortRaiseBASEPRI();                                                (1)
{
if( xTaskIncrementTick() != pdFALSE ) //增加时钟计数器 xTickCount 的值
{
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;                     (2)
}
}
vPortClearBASEPRIFromISR();                                         (3)
}

(1)、关闭中断

(2)、通过向中断控制和壮态寄存器 ICSR 的 bit28 写入 1 挂起 PendSV 来启动 PendSV 中 断。

这样就可以在 PendSV 中断服务函数中进行任务切换了。

(3)、开启中断

标签:函数,FreeRTOS,第九章,中断,PendSV,切换,SysTick,上下文
From: https://blog.csdn.net/qq_45150278/article/details/143484042

相关文章

  • Pbootcms网站,从Apache切换为Nginx后网站打不开
    打开网站设置登录宝塔面板。选择需要配置的网站,点击“设置”。进入伪静态设置在网站设置页面中,找到并点击“伪静态”选项卡。添加Nginx伪静态规则在伪静态设置中,清空原有规则或选择自定义规则。输入以下Nginx伪静态规则:location/{if(!-e$request_f......
  • 鸿蒙 next 实现应用内的暗黑模式切换
    鸿蒙next实现应用内的暗黑模式切换实现暗黑模式的大致思路是利用@Provider与@Consume共享一个lightMode变量,在页面创建时读取持久化的lightMode,来实现暗黑模式。1.在Entry页面使用@Provide注解lightMode@Entry@ComponentstructQuickTestMainPage{@Providelig......
  • 手机ip地址怎么切换外省
    在现代社会中,随着网络技术的不断发展,手机已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,手机都扮演着重要的角色。然而,在某些特定情况下,我们可能需要将手机IP地址切换到外省,以便访问特定地区的网络资源或服务。本文将详细介绍如何通过不同的方法实现手机IP......
  • FreeRtos中任务的有关理解
    osThreadNew 和 xTaskCreate 都是用于创建任务(线程)的函数,但它们属于不同的接口和框架。接口层级:xTaskCreate:是FreeRTOS的原生API直接用于创建任务,属于FreeRTOS的核心函数。这是一个更低级的接口,直接与FreeRTOS的调度器交互。osThreadNew:是根据CMSIS-RTOSA......
  • 切换SVN登录的账号
    目录1、找到已登录的[用户信息2、删除已登录的用户信息3、获取重输用户信息弹窗4、使用新的用户信息登录1、找到已登录的[用户信息(1)在任何文件夹里面右键,找到TortoiseSVN,然后选择里面的Settings(2)进入Settings之后,找到左面菜单中的SavedData,点击Clear就可以看到所有已保存的用......
  • FreeRTOS操作系统1,介绍
    1操作系统1.1.1操作系统概述手机:点击相机(上位机顶层)---->操作系统----->打开摄像头(硬件底层)不上操作系统:相机--->打开摄像头:该情况下只有原相机可以打开摄像头,不支持第三方软件MCU:没上操作系统之前--->硬件上操作系统:MCU--->操作系统--->硬件图例:1.1.2常见操作系统Win......
  • uniapp使用uni.createInnerAudioContext()播放指定音频并且切换
    uniapp使用uni.createInnerAudioContext()播放指定音频并且切换因为做的小程序或者h5需要视频讲解或者音乐组件的默认展示播放按钮,当点击播放的时候显示暂停音乐这样的一个效果。在unipp中我们直接只用uni.createInnerAudioContext()代替audio,使用更加方便,更加简洁,unia......
  • Winform在主窗体里切换多个窗体
    1.点击解决方案资源管理器的项目名称,右键添加用户控件(Windows窗体)。2.在主窗体代码中实例化添加的用户控件(Windows窗体)。3.在主窗体界面中添加pane控件,该控件的大小就是要切换的界面大小,然后在主窗体代码中将实例化的用户控件(Windows窗体)添加到pane控件的集合,有多少个界面就添......
  • 《代码大全》读后感-第九章
    第九章着重探讨了高质量的类和子程序的编写,这对于软件开发来说至关重要。在当今复杂的软件系统中,类和子程序是构建软件大厦的基石,其质量直接决定了整个软件的稳定性、可维护性和可扩展性。首先,书中强调了类的设计。一个好的类应该具有明确的职责和清晰的接口。职责单一的类更容易......
  • 使用批处理,切换电源计划,切换自动休眠时间
    1、打开命令提示符:按Win+R,输入cmd,然后按Enter。2、列出电源计划的GUIDpowercfg/list获取输出结果取下:C:\Users\Administrator>powercfg/list现有电源使用方案(*Active)-----------------------------------电源方案GUID:381b4222-f694-41f0-****-ff5bb260df......