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

【FreeRTOS】临界资源管理

资源管理

如何实现互斥操作

像是的信号量、互斥量、队列、事件组,这些都是依靠上面的“谁可能和我抢,我就屏蔽谁”的方法来完成互斥和防干扰操作的。

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

任务中使用:taskENTER_CRITICAL()/taskEXIT_CRITICAL()

ISR 中使用:taskENTER_CRITICAL_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR()

任务中屏蔽中断

/* 在任务中,当前时刻中断是使能的
* 执行这句代码后,屏蔽中断
*/
taskENTER_CRITICAL();/* 访问临界资源 *//* 重新使能中断 */
taskEXIT_CRITICAL();

在 taskENTER_CRITICA()/taskEXIT_CRITICAL()之间:

低优先级的中断被屏蔽了:优先级低于、等于configMAX_SYSCALL_INTERRUPT_PRIORITY

高优先级的中断可以产生:优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY

但是,这些中断 ISR 里,不允许使用 FreeRTOS 的 API 函数

任务调度依赖于中断、依赖于 API 函数,所以:这两段代码之间,不会有任务调度产生

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 函数,所以:这两段代码之间,不会有任务调度产生

暂停调度器

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

使用示例

vTaskSuspendScheduler();
/* 访问临界资源 */
xTaskResumeScheduler();

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

http://www.dtcms.com/a/340610.html

相关文章:

  • 树上背包(P2014 [CTSC1997] 选课)
  • 经营帮租赁经营板块:解锁资产运营新生态,赋能企业增长新引擎
  • 【最后203篇系列】034 使用SQLite构建简单的任务管理
  • Qt5.9.9 + Windows API 开发系统监控工具 - 教学级项目实战
  • Obsidian 1.9.10升级
  • 19.web api 10
  • SQL-leetcode— 2356. 每位教师所教授的科目种类的数量
  • 有关SWD 仿真和PA.15, PB3, PB4的冲突问题
  • 深入Linux内核:架构设计与核心功能解析
  • CSS3DRenderer+ CSS3DObject实现在 Three.js 中添加文本内容
  • 算法230. 二叉搜索树中第 K 小的元素
  • 10M25DCF484C8G Altera FPGA MAX10
  • 云原生俱乐部-RH294知识点归纳(1)
  • RK-Android11-PackageInstaller安装器自动安装功能实现
  • iOS App 混淆工具实战 医疗健康类 App 的安全与合规保护
  • 电脑驱动免费更新? 这款驱动管理工具:一键扫更新,还能备份恢复,小白也会用~
  • 【知识杂记】方差、标准差、均方误差、均方根误差与平均绝对误差,概念、计算公式、物理意义
  • 微型导轨的快速调平技术如何提升激光加工效率?
  • Python默认参数
  • CPTS--Administrator
  • 【clion】调试脚本并cmake构建Fargo项目win32版本
  • Spring Boot 配置
  • C++---向下取整(>>)与向零取整(/)
  • Vue2封装Axios
  • PyTorch - Developer Notes
  • 《录井工程与管理》——第二章井位勘测技术
  • 精品方案 | GCKontrol与OMNeT++联合仿真在机载网络性能分析中的应用
  • 基于单片机环境火灾安全检测
  • 驾驭复杂表单:用 RxJava 实现响应式表单处理
  • mysql-8.0.37-linux-glibc2.12-x86_64安装