什么是临界段

临界段用一句话概括就是一段在执行的时候不能被中断的代码段。在 FreeRTOS 里面, 这个临界段最常出现的就是对全局变量的操作,全局变量就好像是一个枪把子,谁都可以 对他开枪,但是我开枪的时候,你就不能开枪,否则就不知道是谁命中了靶子。可能有人 会说我可以在子弹上面做个标记,我说你能不能不要瞎扯淡。

那么什么情况下临界段会被打断?一个是系统调度,还有一个就是外部中断。在 FreeRTOS,系统调度,最终也是产生 PendSV 中断,在 PendSV Handler 里面实现任务的切 换,所以还是可以归结为中断。既然这样,FreeRTOS 对临界段的保护最终还是回到对中断 的开和关的控制。

Cortex-M 内核快速关中断指令

为了快速地开关中断, Cortex-M 内核专门设置了一条 CPS 指令,有 4 种用法,具体见代码

 CPSID I ;PRIMASK=1 ;关中断CPSIE I ;PRIMASK=0 ;开中断CPSID F ;FAULTMASK=1 ;关异常CPSIE F ;FAULTMASK=0 ;开异常

代码中PRIMASK 和 FAULTMAST 是 Cortex-M内核 里面三个中断屏蔽寄存 器中的两个,还有一个是 BASEPRI,有关这三个寄存器的详细用法.

Cortex-M 内核中断屏蔽寄存器组描述

但是,在 FreeRTOS 中,对中断的开和关是通过操作 BASEPRI 寄存器来实现的,即大 于等于 BASEPRI 的值的中断会被屏蔽,小于 BASEPRI 的值的中断则不会被屏蔽,不受 FreeRTOS 管理。用户可以设置 BASEPRI 的值来选择性的给一些非常紧急的中断留一条后路。

关中断

FreeRTOS 关中断的函数在 portmacro.h 中定义,分不带返回值和带返回值两种,具体实现

 /* 不带返回值的关中断函数,不能嵌套,不能在中断里面使用 */ #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()void vPortRaiseBASEPRI( void ){uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; __asm{msr basepri, ulNewBASEPRI dsbisb}}/* 带返回值的关中断函数,可以嵌套,可以在中断里面使用 */ #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()ulPortRaiseBASEPRI( void ){uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; __asm{mrs ulReturn, basepri msr basepri, ulNewBASEPRI dsbisb}return ulReturn;}

开中断

FreeRTOS 开中断的函数在 portmacro.h 中定义,

 /* 不带中断保护的开中断函数 */#define portENABLE_INTERRUPTS() vPortSetBASEPRI/* 带中断保护的开中断函数 */#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) void vPortSetBASEPRI( uint32_t ulBASEPRI ) {__asm{msr basepri, ulBASEPRI}}

进入/退出临界段的宏

进入和退出临界段的宏在 task.h 中定义

 #define taskENTER_CRITICAL() portENTER_CRITICAL()#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()#define taskEXIT_CRITICAL() portEXIT_CRITICAL()#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

进入和退出临界段的宏分中断保护版本和非中断版本,但最终都是通过开/关中断来实 现。有关开/光中断的底层代码我们已经讲解,那么接下来的退出和进入临界段的代码配套 注释来理解即可。

临界段代码的应用

在 FreeRTOS 中,对临界段的保护出现在两种场合,一种是在中断场合一种是在非中 断场合,具体的应用见

 /* 在中断场合,临界段可以嵌套 */{uint32_t ulReturn;/* 进入临界段,临界段可以嵌套 */ulReturn = taskENTER_CRITICAL_FROM_ISR();/* 临界段代码 *//* 退出临界段 */taskEXIT_CRITICAL_FROM_ISR( ulReturn );}/* 在非中断场合,临界段不能嵌套 */{/* 进入临界段 */taskENTER_CRITICAL();/* 临界段代码 *//* 退出临界段*/taskEXIT_CRITICAL();}

FreeRTOS临界段的保护相关推荐

  1. 【FreeRTOS】06 临界段的保护——关中断和关调度

    本节来讲一讲FreeRTOS如何保护临界段,先讲临界段的概念,再讲保护临界段的方法. 1)临界段的概念 简单来讲,临界段是一段执行时不允许被中断(或其他任务)打断的代码:如果被打断,就有可能运行出错. ...

  2. FreeRTOS内核实现03:临界段的保护

    目录 1. 临界段概述 1.1 什么是临界段 1.2 临界段何时会被打断 2. 关中断操作 2.1 不带中断保护 2.2 带中断保护 3. 开中断操作 4. 进入临界段操作 4.1 不带中断保护 4. ...

  3. freertos临界段保护

    freertos临界段保护 中断的基础知识 cortex-m里面开中断.关中断指令 关中断和开中断 进入临界段和退出临界段 中断的基础知识 嵌套: 嵌套向量中断控制器 NVIC(Nested Vect ...

  4. FreeRTOS 临界段和开关中断

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码 的执行不被 ...

  5. FreeRTOS临界段

    临界断代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,FreeRTOS与临界断代码保护有关的函数有4个: taskENTER_CRITICAL() --任务级进入临界段 taskEXIT_ ...

  6. FreeRTOS — 临界段和开关中断

    以下内容转载自安富莱电子:http://forum.armfly.com/forum.php 1.临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行 ...

  7. 从0到1写RT-Thread内核——临界段的保护

    临界段就是一段在执行的时候不能被中断的代码段,在RT-Thread里,临界段最常出现的就是对全局变量的操作(类似Linux下的锁).RT-Thread对临界段的保护是直接把中断全部关了,NMI FAU ...

  8. FreeRTOS源码分析与应用开发01:中断配置与临界段

    目录 1. 异常与中断的基本概念 1.1 异常分类 1.2 中断概述 1.2.1 中断处理宜短暂 1.2.2 临界段影响中断实时性 1.3 中断硬件基础 1.3.1 外设 1.3.2 中断控制器 1. ...

  9. FreeRTOS内核详解(1) —— 临界段保护原理

    什么是临界段 临界段用一句话概括就是一段在执行的时候不能被中断的代码段. 在 FreeRTOS 里面,这个临界段最常出现的就是对全局变量的操作,由于不同任务间可以切换运行,当一个任务在访问某个全局变量 ...

最新文章

  1. 为了新零售,A.O.史密斯做出一个令人吃惊的决定
  2. CTFshow 文件上传 web154
  3. uap--studio设置文本字体
  4. 滴滴经验分享:SQLFlow如何让运营专家用上AI?
  5. 信息学奥赛C++语言:蒙氏数学难题
  6. BZOJ3324 : [Scoi2013]火柴棍数字
  7. Java推断文本文件编码格式以及读取
  8. iostream.h和iostream 区别
  9. 服务中没有listen_Odoo 中的 IM(即时通讯)实现分析
  10. SpringBoot学习笔记(3)----SpringBoot的profile多环境配置
  11. matlab2016 win10,新手,win10电脑上面装matlab2016a还是b好呢?64位操作系统
  12. 服务器的日常运维巡检视频,日常运维检查记录表
  13. 从零基础到高级软件测试工程师学习路线规划
  14. 我的appstore新游戏--LeBallon 拿码了
  15. 放弃75W年薪,回老家当公务员,提离职被领导教育,网友:leader嫉妒了
  16. electron Mac版截图功能实现
  17. 国产芯片传来好消息,纯国产CPU测试数据“曝光”
  18. Netty 学习之旅:ByteBuf 篇之 ByteBuf 内部结构与 API 学习
  19. Blender Rigify版Walker绑定下载
  20. 学生档案信息管理系统java_基于jsp的学籍档案信息管理系统-JavaEE实现学籍档案信息管理系统 - java项目源码...

热门文章

  1. Python爬虫自学与实战,爬一下自己的博客文章
  2. linux桌面版安装输入法,Debian KDE桌面安装五笔和拼音输入法
  3. PTA 7-4 平面向量加法
  4. Ubuntu备份还原
  5. JavaScript制作页面倒计时器
  6. RV32I 基本指令集汇编解析
  7. 全站仪和手机连接软件_南方全站仪传输软件-南方全站仪传输软件下载 1.0 中文版 - 河东下载站...
  8. ridge regression and lasso analysis-reproduced from csdn
  9. python爬取股票数据,以上证指数为例,可以爬取任何股票,保存为temp.csv文件
  10. HCIA网络课程第一周作业