进入临界保护(支持嵌套):taskENTER_CRITICAL();
退出临界保护(支持嵌套):taskEXIT_CRITICAL();

中断里进入临界保护(支持嵌套): taskENTER_CRITICAL_FROM_ISR();
中断里退出临界保护(支持嵌套): taskEXIT_CRITICAL_FROM_ISR( x );

进入临界保护的定义代码:
从中可以看出,uxCriticalNesting++,正因为该变量的处理,才支持了嵌套。
退出临界保护的定义代码大同小异。
void vPortEnterCritical( void )
{
portDISABLE_INTERRUPTS();
uxCriticalNesting++;

/* This is not the interrupt safe version of the enter critical function so
assert() if it is being called from an interrupt context.  Only API
functions that end in "FromISR" can be used in an interrupt.  Only assert if
the critical nesting count is 1 to protect against recursive calls if the
assert function also uses a critical section. */
if( uxCriticalNesting == 1 )
{configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
}

}

继续深入,可以看到,实际上是操作了 basepri寄存器来实现开关中断的机理,而要关闭的中断是哪些优先级的中断,则是由 configMAX_SYSCALL_INTERRUPT_PRIORITY(如果用CubeMXs生成的话默认是systick的优先级)所决定。
configMAX_SYSCALL_INTERRUPT_PRIORITY = configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << 4,所有小于该优先级的中断都会被关断。
static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

__asm
{/* Set BASEPRI to the max syscall priority to effect a criticalsection. */msr basepri, ulNewBASEPRIdsbisb
}

}

在裸机中,开关中断是下面两个语句:
使能全局中断: __set_PRIMASK(0);
禁止全局中断: __set_PRIMASK(1);

要注意,因为 FreeRTOS 存在不受其控制的更高优先级中断,用户需要根据实际情况进行特别处理,可以不采用 FreeRTOS 的开关中断函数,而是直接使用__set_PRIMASK 实现全局中断的开关。

还要注意一点:使用临界保护时,在调度器没开始工作时,使用无效。有效的使用是在调度器开始工作后的任务里选择使用的。

FreeRTOS临界区操作相关推荐

  1. FreeRTOS临界区应用与总结

    https://blog.csdn.net/chipsea_mltsum/article/details/85612939 项目背景: 做一个测量阻抗脉搏波的设备,设备功能其中之一是采集阻抗信号,通过 ...

  2. FreeRTOS临界区

      FreeRTOS临界区是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断. FreeRTOS 在进入临界区代码的时候需要关闭中断,当处理完临界区代 ...

  3. FreeRTOS 临界区总结

    当一名嵌入式开发人员从裸机开发切换到 基于 FreeRTOS 的开发后就要注意 中断,资源竞争等等问题了. 下面,总结一下 FreeRTOS 临界区的知识及用法: 1. 应用程序使用临界区 1.1 深 ...

  4. 【STM32】FreeRTOS临界区

    00. 目录 文章目录 00. 目录 01. 概述 02. 任务级临界区代码保护 03.中断级临界区代码保护 04. 预留 05. 预留 06. 附录 07. 参考 01. 概述 临界段代码也叫做临界 ...

  5. freeRtos学习笔(3)临界区管理

    freeRtos学习笔记 freeRtos临界区管理 freeRtos临界区 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须 ...

  6. 嵌入式中断:如何正确设置中断优先级 (万字总结) - 基于Cortex-M和FreeRTOS

    嵌入式中断:深入探讨如何正确设置中断优先级 - 基于Cortex-M和FreeRTOS 1. 如何正确设置中断优先级 2. 从Cortex-M角度 configPRIO_BITS 3. 从RTOS角度 ...

  7. 正点原子FreeRTOS(中)

    更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进入------ ...

  8. 正点原子FreeRTOS(下)

    目录 第十六章FreeRTOS 事件标志组 16.1 事件标志组简介 16.2 创建事件标志组 16.3 设置事件位 16.4 获取事件标志组值 16.5 等待指定的事件位 16.6 事件标志组实验 ...

  9. 信号量的实现和应用实验报告_Java高级编程基础:原子信号量操作实现组线程执行管理...

    前言 由于Java高级并发编程主要是针对多线程并发访问公共资源控制来展开的,而现在服务器大多都是多核处理,所以在执行控制中,单一的同步锁无法满足需要,为此Java 1.5开始引入了三个重要的概念Sem ...

  10. 经典PV操作问题 [转]

    1. 睡眠理发师问题 理发店里有一位理发师.一把理发椅和n把供等候理发的顾客坐的椅子.如果没有顾客,则理发师便在理发椅上睡觉,如图2-20所示.当一个顾客到来时,他必须先叫醒理发师,如果理发师正在理发 ...

最新文章

  1. 手撸一个JdbcTemplate,带你了解其原理
  2. linux6.5 sftp,CentOS下实现SFTP CHROOT的几种方法
  3. 使用xmlhttp结合asp,实现网页的异步调用_asp实例
  4. html调用天气预报wsdl服务,webservice接口调用天气预报例程
  5. 在Json解析过程中,我为什么用object1.optInt ,和 object1.optString
  6. 关于FastStone Capture for Windows在Windows10英文系统下的中文乱码问题
  7. poj2182 Lost Cows-线段树
  8. VMware vSphere 6.7配置最大更改
  9. 谷歌大脑AI飞速解锁雅达利,训练不用两小时:预测能力“前所未有”
  10. restTemplate设置访问超时
  11. 算法面试题解答(六)
  12. 小雷:我的核心定位和远大志向(上次更新2013年11月9日)
  13. 烟台市计算机二级培训机构,烟台市2020年3月计算机二级报名时间|网上报名入口【12月20日9:00开通】...
  14. 什么是Servlet类
  15. IT 技能发展:10 大基本 IT 技能
  16. win10设置桌面图标间距
  17. SQLServer安装程序无法打开注册表项 UNKNOWN\Components\…的问题
  18. 如何快速查询手机在网状态
  19. 微型计算机实验仪,微型计算机实验仪
  20. Nginx Windows详细安装部署教程

热门文章

  1. Docker 停止容器
  2. html 页眉选项卡,连续两个奇数页页眉 再选择插入菜单——分页,执行2次
  3. Cesium地形地貌加载
  4. django tests 小结
  5. 谷歌大中华区总裁李开复离职
  6. 如何下载Google Chromium源码。
  7. 教你防范QQ黑客工具!!!!
  8. H264 帧格式 封装 传输
  9. 惠普电脑u盘重装系统步骤_惠普笔记本u盘系统安装步骤 惠普u盘启动系统安装...
  10. TP-LINK 忘记密码 - 恢复出厂设置