当前位置: 首页 > web >正文

嵌入式学习笔记 - freeRTOS的两种临界禁止

一 禁止中断

更改就绪列表时,通常是通过禁止中断的方式,进入临界段,因为systick中断中有可以更改就绪列表的权利,

就绪列表(如 pxReadyTasksLists[] 数组)是全局共享的关键数据结构,存储了所有可运行任务的信息。多个任务或中断服务程序(ISR)可能并发访问该列表。若不进行保护,可能导致链表节点损坏、优先级错乱等数据竞争问题。

禁止任务调度器

 通过函数vTaskSuspendAll()挂起任务调度器,

vTaskSuspendAll()函数的功能很简单,就是对全局变量uxSchedulerSuspended 的值进行自增.

其核心功能是暂停所有任务调度(但允许中断),确保当前任务独占执行权,直到调用xTaskResumeAll()恢复调度。如下图所示,就是不进行任何任务的寻找与切换。

与临界区(关中断)不同,vTaskSuspendAll()仅暂停调度器,中断仍可响应,适用于需长时间保护临界区但需响应中断的场景。‌‌

注意此函数须与xTaskResumeAll()成对使用;每调用一次vTaskSuspendAll(),uxSchedulerSuspended自增一次,说明有一个任务需要暂停其他所有任务,再调用一次vTaskSuspendAll(),uxSchedulerSuspended再自增一次,说明又一个任务需要暂停其他所有任务,使用xTaskResumeAll()自减的时候,直到减到0才能释放任务调度权

http://www.xdnf.cn/news/12077.html

相关文章:

  • 改进社区检测和检索策略大幅提升GraphRAG性能新框架-ArchRAG
  • 策略公开了:年化494%,夏普比率5.86,最大回撤7% | 大模型查询akshare,附代码
  • 从 CLIP 和 Qwen2.5-VL 入门多模态技术
  • 2025Mybatis最新教程(三)
  • fmod产生的误差应该如何解决?
  • 日志项目——日志系统框架设计
  • 卡特兰数简单介绍
  • C++初阶 | 模板
  • C#中的依赖注入Dependency Injection, DI
  • AI 如何改变软件文档生产方式?
  • 图解浏览器多进程渲染:从DNS到GPU合成的完整旅程
  • JavaScript学习笔记(五)
  • 数据预处理的几种形式(转载)
  • 如何从零开始建设一个网站?
  • 卫星在轨姿态控制技术详解:从自旋稳定到高精度闭环控制
  • Redis中的setIfAbsent方法和execute
  • #开发环境篇:postMan可以正常调通,但是浏览器里面一直报403
  • python打卡day44@浙大疏锦行
  • GAN训练困境与模型分类:损失值异常与生成判别模型差异解析
  • WES7系统深度定制全流程详解(从界面剥离到工业部署)
  • RoPE 详解:旋转位置编码的原理与实践《一》
  • 回归分析-非线性回归及岭回归.docx
  • 基于51单片机的汽车雨刮器模拟proteus仿真
  • 【Linux】Linux 环境变量
  • 408考研逐题详解:2009年第31题
  • 组合式过电压保护器安装指南
  • 第N1周:one-hot编码案例
  • 使用cursor 编辑器开发 Vue项目,配置ESlint自动修复脚本,解决代码不规范引起的报错无法运行项目问题
  • rockyLinux常用共享的服务和配置
  • JAVASE:面向对象