首页 > 其他分享 >韦东山freeRTOS系列教程之【第十二章】资源管理(Resource Management)

韦东山freeRTOS系列教程之【第十二章】资源管理(Resource Management)

时间:2023-07-03 11:00:56浏览次数:40  
标签:Management Resource freeRTOS 中断 ISR taskEXIT 屏蔽 CRITICAL taskENTER


文章目录

  • 系列教程总目录
  • 概述
  • 12.1 屏蔽中断
  • 12.1.1 在任务中屏蔽中断
  • 12.1.2 在ISR中屏蔽中断
  • 12.2 暂停调度器



系列教程总目录

本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以查看文章的 目录列表

概述

在前面讲解互斥量时,引入过临界资源的概念。在前面课程里,已经实现了临界资源的互斥访问。

本章节的内容比较少,只是引入两个功能:屏蔽/使能中断、暂停/恢复调度器。

要独占式地访问临界资源,有3种方法:

  • 公平竞争:比如使用互斥量,谁先获得互斥量谁就访问临界资源,这部分内容前面讲过。
  • 谁要跟我抢,我就灭掉谁:
  • 中断要跟我抢?我屏蔽中断
  • 其他任务要跟我抢?我禁止调度器,不运行任务切换
.. toctree::
   :maxdepth: 2

   section1

12.1 屏蔽中断

屏蔽中断有两套宏:任务中使用、ISR中使用:

  • 任务中使用:taskENTER_CRITICA()/taskEXIT_CRITICAL()
  • ISR中使用:taskENTER_CRITICAL_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR()

12.1.1 在任务中屏蔽中断

在任务中屏蔽中断的示例代码如下:

/* 在任务中,当前时刻中断是使能的
 * 执行这句代码后,屏蔽中断
 */
taskENTER_CRITICAL();

/* 访问临界资源 */

/* 重新使能中断 */
taskEXIT_CRITICAL();

taskENTER_CRITICA()/taskEXIT_CRITICAL()之间:

  • 低优先级的中断被屏蔽了:优先级低于、等于configMAX_SYSCALL_INTERRUPT_PRIORITY
  • 高优先级的中断可以产生:优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY
  • 但是,这些中断ISR里,不允许使用FreeRTOS的API函数
  • 任务调度依赖于中断、依赖于API函数,所以:这两段代码之间,不会有任务调度产生

这套taskENTER_CRITICA()/taskEXIT_CRITICAL()宏,是可以递归使用的,它的内部会记录嵌套的深度,只有嵌套深度变为0时,调用taskEXIT_CRITICAL()才会重新使能中断。

使用taskENTER_CRITICA()/taskEXIT_CRITICAL()来访问临界资源是很粗鲁的方法:

  • 中断无法正常运行
  • 任务调度无法进行
  • 所以,之间的代码要尽可能快速地执行

12.1.2 在ISR中屏蔽中断

要使用含有"FROM_ISR"后缀的宏,示例代码如下:

void vAnInterruptServiceRoutine( void )
{
    /* 用来记录当前中断是否使能 */
    UBaseType_t uxSavedInterruptStatus;
    
    /* 在ISR中,当前时刻中断可能是使能的,也可能是禁止的
     * 所以要记录当前状态, 后面要恢复为原先的状态
     * 执行这句代码后,屏蔽中断
     */
    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();
    
    /* 访问临界资源 */

    /* 恢复中断状态 */
    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );
    /* 现在,当前ISR可以被更高优先级的中断打断了 */
}

taskENTER_CRITICA_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR()之间:

  • 低优先级的中断被屏蔽了:优先级低于、等于configMAX_SYSCALL_INTERRUPT_PRIORITY
  • 高优先级的中断可以产生:优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY
  • 但是,这些中断ISR里,不允许使用FreeRTOS的API函数
  • 任务调度依赖于中断、依赖于API函数,所以:这两段代码之间,不会有任务调度产生

12.2 暂停调度器

如果有别的任务来跟你竞争临界资源,你可以把中断关掉:这当然可以禁止别的任务运行,但是这代价太大了。它会影响到中断的处理。

如果只是禁止别的任务来跟你竞争,不需要关中断,暂停调度器就可以了:在这期间,中断还是可以发生、处理。

使用这2个函数来暂停、恢复调度器:

/* 暂停调度器 */
void vTaskSuspendAll( void );

/* 恢复调度器
 * 返回值: pdTRUE表示在暂定期间有更高优先级的任务就绪了
 *        可以不理会这个返回值
 */
BaseType_t xTaskResumeAll( void );

示例代码如下:

vTaskSuspendScheduler();

/* 访问临界资源 */

xTaskResumeScheduler();

这套vTaskSuspendScheduler()/xTaskResumeScheduler()宏,是可以递归使用的,它的内部会记录嵌套的深度,只有嵌套深度变为0时,调用taskEXIT_CRITICAL()才会重新使能中断。


标签:Management,Resource,freeRTOS,中断,ISR,taskEXIT,屏蔽,CRITICAL,taskENTER
From: https://blog.51cto.com/weidongshan/6609567

相关文章

  • Container resources example----马哥教育
    https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ThefollowingPodhastwocontainers.Bothcontainersaredefinedwitharequestfor0.25CPUand64MiB(226 bytes)ofmemory. ......
  • getResources().getDrawable()过时问题
    前言在Android的开发中我们经常会遇到过时的方法,当时为了图快、编译时也不会报错,也就没有去理会。随着慢慢整理代码,看到过时地方确实不美观,也会影响后期的兼容性问题,故特此记录下。本篇记录下关于getResources().getDrawable()过时问题。 问题我们经常会根据不同场景显示不同......
  • [WPF]静态资源(StaticResource)和动态资源(DynamicResource)
    一、文章概述本演示介绍了WPF的静态资源和动态资源的基本使用,并对两者做了简单的比较。静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了;动态资源(DynamicResource)使用指的是在程序运行过程中然会去访问资源。相关下载(代码、屏幕录像):h......
  • Freertos学习07-看门狗
    一、前言看门狗是一种硬件计时器,用于监控系统的运行状态。它可以在系统出现故障或停止响应时自动重启系统,以确保系统的稳定性和可靠性。ESP-IDF支持多种类型的看门狗,其中两种主要类型是:中断看门狗定时器和任务看门狗定时器(TWDT)。中断看门狗定时器和TWDT都可以使用项目配置菜......
  • Kubernetes编程—— 使用自定义资源 —— 介绍自定义资源(Custom Resource,CR)
    介绍自定义资源(CustomResource,CR)自定义资源(CustomResource,CR),它是整个Kubernetes生态系统中最核心的扩展机制。 定义资源可以用作系统内部使用的对象,仅仅对它进行声明式定义,而不关联控制器逻辑,用不保存少量配置信息。但是自定义资源也可以成为很多复杂Kubernetes项目的......
  • Module not found: Error: Can't resolve ' vue-resource'
    问题:在学习vue的过程中出现了这个问题,说明VueResource模块没有安装。解决方法:打开终端,进入当前项目所在目录,输入指令npminstallvue-resource--save然后等待安装,安装好了以后在main.js中引用(下图红色框中代码) ......
  • QNX-9—QNX官网文档翻译—Resource Managers(上)
    注:本文翻译自:http://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.getting_started/topic/s1_resmgr.html一、本章前言在本章中,我们将了解编写资源管理器需要了解的内容。资源管理器是QNXNeutrino的另一个显着功能,它允许您通过标准POSIX调用访问服务......
  • Spring中什么时候用@Resource,@service,及Spring注解@Component、@Repository、@Servic
    参考资料http://crabboy.iteye.com/blog/339840文章正文<context:annotation-config/> <context:component-scanbase-package=”com.eric.spring”> component-scan标签默认情况下自动扫描指定路径下的包(含所有子包),将带有@Component、@Repository、@Service、@Controller标签......
  • Freertos学习06-任务堆栈
    一、前言在FreeRTOS中,每个任务都有自己的堆栈,用于存储任务执行期间使用的局部变量和函数调用。堆栈的大小在任务创建时指定,如果任务使用的堆栈空间超过了指定的大小,就会发生堆栈溢出错误。二、介绍1.堆栈分配xTaskCreate()为任务分配堆栈大小,但是需要注意的是,usStackDept......
  • 【FreeRTOS复盘】3-FreeRTOS系统的时钟节拍和延时函数
    参考文章1:《FreeRTOS的学习(六)——系统时钟》参考文章2:【FreeRTOS】04系统的时钟节拍和延时函数 原理reeRTOS使用裸机自带的滴答定时器中断,使用其主频或者外部频率作为时钟基准。由于定时器的功能作为FreeRTOS的核心,所以正常情况下必须是一个一直运行着的中断,那么就意味着Fre......