FreeRTOS中打开关闭任务切换

2023-05-16

本文介绍FreeRTOS中解决多任务之间互相影响的两种方法。

1 基本临界区

基本临界区是指宏 taskENTER_CRITICAL()与taskEXIT_CRITICAL()之间的代码区间,下面是一段范例代码。Critical Sections 也被称作Critical Regions。

/* 为了保证对PORTA寄存器的访问不被中断,将访问操作放入临界区。

进入临界区 */

taskENTER_CRITICAL();

/* taskENTER_CRITICAL() taskEXIT_CRITICAL()之间不会切换到其它任务。 中断可以执行,也允许嵌套,但只是针对优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断 而且这些中断不允许访问FreeRTOS API函数. */

PORTA |= 0x01;

/* 我们已经完成了对PORTA的访问,因此可以安全地离开临界区了。 */

taskEXIT_CRITICAL();

临界区是提供互斥功能的一种非常原始的实现方法。临界区的工作仅仅是简单地把中断全部关掉,或是关掉优先级在configMAX_SYSCAL_INTERRUPT_PRIORITY 及以下的中断——依赖于具体使用的FreeRTOS 移植。抢占式上下文切换只可能在某个中断中完成,所以调用taskENTER_CRITICAL()的任务可以在中断关闭的时段一直保持运行态,直到退出临界区。

临界区必须只具有很短的时间,否则会反过来影响中断响应时间。在每次调用taskENTER_CRITICAL()之后,必须尽快地配套调用一taskEXIT_CRITICAL()。从这个角度来看,对标准输出的保护不应当采用临界区,因为写终端在时间上会是一个相对较长的操作。

临界区嵌套是安全的,因为内核有维护一个嵌套深度计数。临界区只会在嵌套深度为0 时才会真正退出——即在为每个之前调用的taskENTER_CRITICAL()都配套调用了taskEXIT_CRITICAL()之后。

2 挂起(锁定)调度器

也可以通过挂起调度器来创建临界区。挂起调度器有些时候也被称为锁定调度器。基本临界区保护一段代码区间不被其它任务或中断打断。由挂起调度器实现的临界区只可以保护一段代码区间不被其它任务打断,因为这种方式下,中断是使能的。

如果一个临界区太长而不适合简单地关中断来实现,可以考虑采用挂起调度器的方式。但是唤醒(resuming, or un-suspending)调度器却是一个相对较长的操作。所以评估哪种是最佳方式需要结合实际情况。

vTaskSuspendAll() API 函数

void vTaskSuspendAll( void );

通过调用 vTaskSuspendAll()来挂起调度器。

挂起调度器可以停止上下文切换而不用关中断。如果某个中断在调度器挂起过程中要求进行上下文切换,则个这请求也会被挂起,直到调度器被唤醒后才会得到。

xTaskResumeAll() API 函数

portBASE_TYPE xTaskResumeAll( void );

portBASE_TYPE xTaskResumeAll( void );

 

返回值 在调度器挂起过程中,上下文切换请求也会被挂起,直到调度器被唤醒后才会得到执行。如果一个挂起的上下文切换请求在xTaskResumeAll()返回前得到执行,则函数返回pdTRUE。在其它情况下,xTaskResumeAll()返回pdFALSE。没有挂起的上下文切换,以及挂起的上下文切换在返回前没有被执行。

嵌套调用 vTaskSuspendAll()和xTaskResumeAll()是安全的,因为内核有维护一个嵌套深度计数。调度器只会在嵌套深度计数为0 时才会被唤醒——即在为每个之前调用的vTaskSuspendAll()都配套调用了xTaskResumAll()之后。

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

FreeRTOS中打开关闭任务切换 的相关文章

  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • 【FreeRTOS】多任务创建

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • freertos————互斥锁

    线程安全 多线程程序处于一个多变的环境 可访问的全局变量和堆数据随时可能被其他的线程改变 多个线程同时访问一个共享数据 可能造成严重的后果 出现问题的是之前移植了一个freemodbus的从站 多个任务访问全局变量保持寄存器区 导致最后读出
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J

随机推荐

  • 修改简历有用吗

    看情况 xff0c 一般都是很有用哒 xff01 简历修改会突出你的重点和优点 xff0c 优化你的简历内容 xff0c 让面试官一眼看到简历就被吸引了 xff01 如以上图片所示
  • 运行Python时出现SyntaxError: EOL while scanning string literal解决方法

    当运行Python时 xff0c 出行SyntaxError EOL while scanning string literal 一般是语法出现错误 xff0c 看一下是不是哪里忘记添加符号或是分号 xff1a 这些没打
  • 数据结构选择练习题(有解析)

    前言 已经到期末了 xff0c 昨天进行了一次马原考试 xff0c 那时候挺紧张的 xff0c 那时候虽然写完了试卷 xff0c 但是有4道题是乱写的 xff0c 因为我刚好没有背 xff0c 希望不会挂科吧 然后今天呢 xff0c 就开始
  • 论文阅读_异常检测综述

    英文题目 xff1a Anomaly Detection A Survey 中文题目 xff1a 异常检测综述 论文地址 xff1a https readpaper com paper 2122646361 领域 xff1a 异常检测 发表
  • 解决Mybatis-Plus分页插件无效

    1 导入依赖 span class token tag span class token tag span class token punctuation lt span dependencies span span class token
  • 一、FreeRTOS任务调度相关函数详解

    文章目录 1 FreeRTOS任务调度及相关函数分析1 1 任务创建过程分析1 1 1 任务创建函数分析1 1 2 任务初始化函数分析1 1 3 任务堆栈初始化分析1 1 4 添加任务到就绪列表 1 2 任务删除过程分析1 3 任务挂起过程
  • linux的exit和_exit

    进程退出 退出一个进程有多种方式 xff1a 正常退出 xff1a 在main函数里return 在进程里面调用exit exit 在进程的最后一个子线程调用pthread exit 异常退出 xff1a 被信号 xff08 9 15 xf
  • 三、任务切换之PendSV异常

    文章目录 PendSV异常1 没有PendSV异常的任务切换2 有PendSV异常的任务切换2 1 系统调用引起的任务切换2 2 systick中断引起任务切换2 3 PendSV异常处理函数2 4 寻找下一个要运行的任务2 5 时间片调度
  • Cortex-M系列中断和异常(一)

    文章目录 1 中断与异常1 1 异常的类型1 2 异常及中断的管理1 2 1 中断的一般使用方法 1 3 优先级的定义1 4 向量表和向量表的重定义1 4 1 向量表重定向的应用场景 1 5 中断输入和挂起行为1 5 1 中断请求的类型 1
  • Cortex-M系列中断和异常(三)

    文章目录 Cortex M系列中断和异常1 1 SCB中的寄存器1 1 1 中断控制和状态寄存器 xff08 SCB gt ICSR xff09 1 1 2 向量表偏移寄存器 xff08 SCB gt VTOR xff09 1 1 3 应用
  • Cortex-M系列中断和异常(四)

    文章目录 1 中断及异常的注意事项1 1 中断及异常的优先级配置1 2 中断与栈空间的关系1 3 向量表重定向情况1 4 软件中断1 5 ARM架构及中断 2 函数调用与异常处理的过程2 1 函数调用过程2 2 异常处理过程2 2 1 栈帧
  • Cortex-M芯片低功耗开发

    文章目录 芯片的低功耗1 1 低功耗的测量数据1 2 低功耗的系统特性1 3 低功耗的系统需求1 3 1 Cortex M3和Cortex M4处理器的低功耗特点 1 4 低功耗系统特性1 4 1 休眠模式1 4 2 系统控制寄存器 xff
  • Keil 启动文件详解

    文章目录 1 启动文件详解1 1 启动文件的主要任务1 2 启动文件中的汇编指令1 3 启动代码讲解1 3 1 栈的初始化1 3 2 堆的初始化1 3 3 向量表初始化1 3 4 复位程序1 3 5 中断服务程序1 3 6 用户堆栈初始化
  • TiveC微控制器基础练习1.1源码

    基础练习1 1 软件延时实现LED闪烁 硬件描述 LED2 蓝色 PF0 LED3 绿色 PA4 LED4 红色 PD6 使用这个引脚 注意事项 引脚PF0和PD7比较特殊 默认是保护的 要重新编程操作的话 需要先解锁 小技巧 通过SysC
  • git-lfs filter-process: git-lfs: command not found

    最初是认为网络不稳定 xff0c 或者git版本过低 开始自己的git版本是1 20 xff0c 后续升级为1 32仍旧存在这个问题 之后安装了git lfs xff0c 问题解决 不知道为什么其他同事没有出现该问题 brew instal
  • gazebo和rviz有具体的区别吗?哪个更好用?

    文章来源 xff1a 企鹅号 古月居 https www zhihu com question 268658280 answer 340190866 简单来讲 xff0c 两者的主要功能不同 xff0c 没办法比较哪个更好用 xff0c 如
  • Ubuntu下好用的录屏和视频格式转换工具

    xff08 1 xff09 Ubuntu录屏工具 kazam 安装 sudo apt get install kazam 安装完之后 xff0c 命令行中输入 xff1a kazam 就可以启动工具了 xff0c 可以看到工具界面如下 xf
  • linux的fork和vfork

    fork和vfork 区别 fork函数和vfork函数都可以用来创建一个子进程 他们有什么区别呢 xff1f 首先是fork xff1a 内核会给子进程分配虚拟内存空间和id xff0c 但不会分配物理内存子进程一开始是共享父进程的物理空
  • 经典卷积神经网络(一):LeNet-5和AlexNet

    本节介绍几种广泛使用的典型深层卷积神经网络 LeNet 5 LeNet 5 LeCun et al 1998 虽然提出的时间比较早 xff0c 但是是一个非常成功 的神经网络模型 基于LeNet 5的手写数字识别系统在90年代被美国很多银行
  • FreeRTOS中打开关闭任务切换

    本文介绍FreeRTOS中解决多任务之间互相影响的两种方法 1 基本临界区 基本临界区是指宏 taskENTER CRITICAL 与taskEXIT CRITICAL 之间的代码区间 xff0c 下面是一段范例代码 Critical Se