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

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

一 禁止中断

通过函数taskENTER_CRITICAL() ,taskEXIT_CRITICAL()实现

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

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

禁止任务调度器

 通过函数vTaskSuspendAll(),xTaskResumeAll()实现

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

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

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

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

http://www.lryc.cn/news/2401072.html

相关文章:

  • 202403-02-相似度计算 csp认证
  • 【Oracle】游标
  • MySQL 中 char 与 varchar 的区别
  • DeepSeek 赋能智能零售,解锁动态定价新范式
  • 在Flutter中定义全局对象(如$http)而不需要import
  • <4>, Qt窗口
  • 6.04打卡
  • 【基于SpringBoot的图书购买系统】操作Jedis对图书图书的增-删-改:从设计到实战的全栈开发指南
  • Ubuntu中TFTP服务器安装使用
  • Spring Boot微服务架构(十):Docker与K8S部署的区别
  • 接口重试的7种常用方案!
  • vue3:Table组件动态的字段(列)权限、显示隐藏和左侧固定
  • pikachu靶场通关笔记13 XSS关卡09-XSS之href输出
  • MCP客户端Client开发流程
  • 学习日记-day21-6.3
  • C语言探索之旅:深入理解结构体的奥秘
  • uniapp 开发企业微信小程序,如何区别生产环境和测试环境?来处理不同的服务请求
  • Dockerfile常用指令介绍
  • Docker 容器化:核心技术原理与实践
  • 不确定性分析在LEAP能源-环境系统建模中的整合与应用
  • 经典算法回顾之最小生成树
  • Ubuntu下实现nginx反向代理
  • c++ QicsTable使用实例
  • 在WordPress上添加隐私政策页面
  • 二维 根据矩阵变换计算镜像旋转角度
  • 你工作中涉及的安全方面的测试有哪些怎么回答
  • 阿里云ACP云计算备考笔记 (3)——云服务器ECS
  • Eigen实现非线性最小二乘拟合 + Gauss-Newton算法
  • 区块链技术:原理、应用与发展趋势
  • 从零开始:用Tkinter打造你的第一个Python桌面应用