FreeRTOS常见知识点

2023-05-16

FreeRTOS常见知识点

1、临界段代码

       临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如某些外设的初始化需要严格的时序,且不能被打断。FreeRTOS提供的解决方案是在进入临界区时关闭中断,在离开时恢复中断,这就是临界段代码保护。
       FreeRTOS提供了四个API来实现临界段代码保护:taskENTER_CRITICAL()、taskEXIT_CRITICAL()、taskENTER_CRITICAL_FROM_ISR()、taskEXIT_CRITICAL_FROM_ISR()。可以从名字上看出这四个API成两对,前两个是任务级的临界段代码保护,后两个是中断级的临界段代码保护。他们都在task.h中定义,且都是宏定义。

/**
 * task. h
 *
 * Macro to mark the start of a critical code region.  Preemptive context
 * switches cannot occur when in a critical region.
 *
 * NOTE: This may alter the stack (depending on the portable implementation)
 * so must be used with care!
 *
 * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL
 * \ingroup SchedulerControl
 */
#define taskENTER_CRITICAL() portENTER_CRITICAL()
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()

/**
 * task. h
 *
 * Macro to mark the end of a critical code region.  Preemptive context
 * switches cannot occur when in a critical region.
 *
 * NOTE: This may alter the stack (depending on the portable implementation)
 * so must be used with care!
 *
 * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL
 * \ingroup SchedulerControl
 */
#define taskEXIT_CRITICAL() portEXIT_CRITICAL()
#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

1.1 任务级临界段代码保护

       portENTER_CRITICAL()、portEXIT_CRITICAL()代码定义在portmacro.h中,代码如下;

#define portENTER_CRITICAL() vPortEnterCritical()
#define portEXIT_CRITICAL() vPortExitCritical()

       API实现在prot.c中,代码如下:

//进入关键区API
extern void disableSYSIRQ(void);
extern void enablesysIRQ(void);
void vPortEnterCritical( void )
{
    portDISABLE_INTERRUPTS(); //关中断
    disableSYSIRQ(); 
    uxCriticalNesting++;//关键区嵌套数++
}
/*-----------------------------------------------------------*/

//离开关键区
void vPortExitCritical( void )
{
    if(uxCriticalNesting>0)//关键区嵌套数--
        uxCriticalNesting--;
    if(uxCriticalNesting == 0 ) //关键区嵌套数为0时,即不再关键区了
    {
        portENABLE_INTERRUPTS();//打开中断
        enablesysIRQ();
    }
}

       API相对简单,重点关注的嵌套处理,即uxCriticalNesting的处理。

1.2 中断级临界段代码保护

       同样,API接口portSET_INTERRUPT_MASK_FROM_ISR() 、portCLEAR_INTERRUPT_MASK_FROM_ISR(x)定义在portmacro.h中。
备注:代码的实现和所用到的开发板有关,具体代码有差异。本文是基于Cotex-M核开发板编写的,请注意。

#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask()//__disable_irq();//
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x)//__enable_irq();/

实现在prot.c中。根据读者使用的开发板决定如何是实现。

//关中断
__asm unsigned long ulPortSetInterruptMask( void )
{
    //堆栈8字节对齐
    PRESERVE8
    mrs r0, basepri //读取basepri寄存器的值到r0,后面恢复的时候会用到该值
    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY  //配置读到r1中
    msr basepri, r1  //r1值写入中断屏蔽及初期
   bx r14           //返回主调函数
}
/*-----------------------------------------------------------*/
//开中断
__asm void vPortClearInterruptMask( unsigned long ulNewMask )
{
    //堆栈8字节对齐
    PRESERVE8
    msr basepri, r0 //恢复中断屏蔽寄存器
    bx r14   //返回主调函数
}

       在Cotex-M中BASESPI寄存器定义了被屏蔽中断的阈值。当它被设置成某个值时,所有优先级大于等于该值的中断都将被关闭(优先级值越大,优先级越低),但若被设成0,则不关闭任何中断,0也是缺省值。#configMAX_SYSCALL_INTERRUPT_PRIORITY 该配置就是FreeRTOS中开发人员确定的阈值,该配置在FreeRTOSConfig.h中定义。

作者知识有限,如有错误,欢迎指正!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS常见知识点 的相关文章

随机推荐

  • FreeRTOS学习笔记-消息缓冲区(FreeRTOS中文官网)

    RTOS消息缓冲区 API RTOS 消息缓冲区 API 函数 xff1a xMessageBufferCreate xMessageBufferCreateStatic xMessageBufferSend xMessageBufferS
  • ubuntu系统X86环境下配置TX2的ARM环境的交叉编译链

    总步骤 安装qtcreator的IDE安装aarch64 linux gnu g 43 43 交叉编译链下载Qt库的源码 xff0c 配置编译选项 xff0c 编译生成针对TX2的ARM环境的qmake工具配置qtcreator xff0c
  • ROS中Eigen库的引用

    在CmakeList txt中添加两个地方 find package Eigen REQUIRED include directories Eigen INCLUDE DIR 如果找不到Eigen xff0c 我们将第一句改成 find p
  • ROS tf使用

    1 静态tf发布 lt node pkg 61 34 tf 34 type 61 34 static transform publisher 34 name 61 34 link1 link2 broadcaster 34 args 61
  • SLAM算法配置——使用Realsense D435i结合ROS跑通ORB-SLAM2的RGB-D节点

    ORB SLAM2源地址 配置环境依赖 Pangolin xff0c OpenCV xff0c Eigen3 xff0c DBoW2 and g2o xff08 源代码里有 xff0c 不用自己装 xff09 xff0c ROS xff08
  • 代码编写及阅读规范

    阅读常识 1 C语言中在函数名或关键字前加下划线 一般情况是标识该函数或关键字是自己内部使用的 xff0c 与提供给外部的接口函数或关键字加以区分 规范 综述 C 43 43 是一门十分复杂并且威力强大的语言 xff0c 使用这门语言的时候
  • 流媒体开发之路

    其实很早之前 xff0c 就想写属于自己的博客 xff0c 大二就有了CSDN账号 xff0c 很讽刺的是 xff0c 工作几年了 xff0c 账号里面的内容竟然和小鲜肉脸一样干净 干净的让人尴尬 回顾自己的这几年的开发之路 xff0c 接
  • matlab图像处理实例详解---note

    1 直方图均衡及直方图规定化 可以优化图像的亮度及gamma效果 2 图像的标准差 当图像越清晰的时候 xff0c 图像的标准差就越大 是否可以用来做af的判定标准 作为fv的值 另外是否可以用图像的相关系数作为caf的一个trigger
  • promise限制并发请求数量

    所谓并发请求 xff0c 就是指在一个时间点多个请求同时执行 当并发的请求超过一定数量时 xff0c 会造成网络堵塞 xff0c 服务器压力大崩溃或者其他高并发问题 xff0c 此时需要限制并发请求的数量 假如等待请求接口1000个 xff
  • 一个跨平台的 C++ 内存泄漏检测器(转载)

    一个跨平台的 C 43 43 内存泄漏检测器 吴咏炜 adah 64 netstd com 2004 年 3 月 内存泄漏对于C C 43 43 程序员来说也可以算作是个永恒的话题了吧 在Windows下 xff0c MFC的一个很有用的功
  • printf和wprintf、printf输出结束标识符、c++按值返回临时对象是否是const的实验

    ifndef TEST H define TEST H include lt iostream gt include lt string gt using namespace std int x 61 5 struct s public s
  • 自己搭深度学习环境踩坑血泪史

    自己搭深度学习环境踩坑的血泪史 从一个沮丧的事情开始问题1 强行更新了一次win10后 双系统里的ubuntu的启动项就没了 xff0c 直接进入win10系统问题2 sudo apt get update 总是超时问题3 conda in
  • 电脑串口延迟/缓冲设置方法

    使用串口做精确信号发送的时候会经常出现不能时间不精确的问题 xff0c 使用两个u口转串口串连之后一个接收一个发送的情况下 收到的时间延迟数据如下 xff1a 注意 xff1a 这里的因为有一个接收缓冲区和一个发送缓冲区 xff0c 所以这
  • apt-get install 连同诸多依赖包一并安装的指令

    apt get install 连同诸多依赖包一并安装 如题 xff0c apt get安装某个包的时候 xff0c 经常会碰到很多依赖包 xff0c 需要一一安装了才行 xff0c 非常麻烦 当然 xff0c 可以使用以下指令一步到位 a
  • git 分支操作记录

    查看分支 xff1a 查看本地分支 xff1a git branch 查看远程分支 xff1a git branch r 查看全部分支 xff08 本地和远程 xff09 git branch a 新建分支 xff1a 创建新分支 xff1
  • C++ 简析容器Vector

    向量 xff08 Vector xff09 是一个封装了动态大小数组的顺序容器 xff08 Sequence Container xff09 跟任意其它类型容器一样 xff0c 它能够存放各种类型的对象 可以简单的认为 xff0c 向量是一
  • SLAM初始化

    本节的学习要点 xff1a 初始化的目的 单目 双目 初始化的两种方法初始化过程 初始化的目的 单目SLAM初始化的目的是 61 61 构建初始的三维点云地图 xff08 空间点 xff09 并为之后的计算提供初始值 61 61 由于仅从单
  • tensorflow lite example label_image 分析【二】

    接上文 3 代码分析 main函数首先将入参写入参数结构体 Settings s struct Settings bool verbose 61 false bool accel 61 false bool input floating 6
  • 利用Kalibr标定双目相机与IMU

    本文介绍如何利用Kalibr标定工具进行双目相机与IMU的联合标定 主要过程包括以下四步 xff1a 生成标定板标定双目相机标定IMU联合标定 1 生成标定板 使用AprilTag rosrun kalibr kalibr create t
  • FreeRTOS常见知识点

    FreeRTOS常见知识点 1 临界段代码 临界段代码也叫做临界区 xff0c 是指那些必须完整运行 xff0c 不能被打断的代码段 xff0c 比如某些外设的初始化需要严格的时序 xff0c 且不能被打断 FreeRTOS提供的解决方案是