FreeRTOS临界段代码

2023-05-16

本文是《ALIENTEK STM32F429 FreeRTOS 开发教程》第四章学习笔记的补充
第一章笔记–FreeRTOS简介与源码下载
第二章笔记–FreeRTOS在STM32F4上移植
第三章笔记-FreeRTOS系统配置
第四章笔记-FreeRTOS中断分析

1. 临界段代码简介

临界段代码也称为临界区,指那些必须完整运行,不能被打断的代码段。

FreeRTOS在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。

FreeRTOS系统本身就有很多的临界段代码保护

2. 任务级临界段代码保护

进入临界段:taskENTER_CRITICAL()

退出临界段:taskEXIT_CRITICAL()

这两个函数其实是一个宏定义,定义为:

#define taskENTER_CRITICAL() portENTER_CRITICAL()
#define taskEXIT_CRITICAL() portEXIT_CRITICAL()

分别封装了个函数portENTER_CRITICAL()和portEXIT_CRITICAL(),而被封装的两个函数也是宏定义,定义为:

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

函数vPortEnterCritical()和vPortExitCritical()在文件port.c里,函数原型为:

void vPortEnterCritical( void )
{
    portDISABLE_INTERRUPTS();
    uxCriticalNesting++;
    if( uxCriticalNesting == 1 )
    {
        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
    }
}

void vPortExitCritical( void )
{
    configASSERT( uxCriticalNesting );
    uxCriticalNesting--;
    if( uxCriticalNesting == 0 )
    {
        portENABLE_INTERRUPTS();
    }
}

进入函数vPortEnterCritical()先执行portDISABLE_INTERRUPTS()函数(关闭中断

再执行uxCriticalNesting++ 将变量加一 变量表示临界段嵌套次数

接下来如果为1,进入一个断言函数

configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );

#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } 

进入函数vPortExitCritical() 执行configASSERT( uxCriticalNesting );

再对uxCriticalNesting减1 只有当变量为0时才调用函数portENABLE_INTERRUPTS()使能中断

#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 )

static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{
    __asm
    {
        /* Barrier instructions are not used as this function is only used to
        lower the BASEPRI value. */
        msr basepri, ulBASEPRI
    }
}

portENABLE_INTERRUPTS()即是向 BASEPRI寄存器中写入0,即屏蔽优先级不高于0的中断,因为0优先级已经最高,所以停止屏蔽中断

这样做保证了,在有多个临界段代码时不会因为某一临界段代码退出而打乱其他临界段的保护,只有所有临界段代码都退出后才使能中断

3. 中断级临界段代码保护

用在中断服务程序中的临界段代码保护

进入临界段:taskENTER_CRITICAL_FROM_ISR()

退出临界段:taskEXIT_CRITICAL_FROM_ISR()

#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x)

ulPortRaiseBASEPRI():

static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void )
{
uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

    __asm
    {
        mrs ulReturn, basepri
        msr basepri, ulNewBASEPRI
        dsb
        isb
    }

    return ulReturn;
}

首先读出BASEPRI寄存器的值保存在ulReturn

将configMAX_SYSCALL_INTERRUPT_PRIORITY写入BASEPRI寄存器中

返回ulReturn的值

vPortSetBASEPRI():

static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{
    __asm
    {
        msr basepri, ulBASEPRI
    }
}

向BASEPRI寄存器中写入一个值

中断级临界代码保护使用方法:

//定时器5中断服务函数
void TIM5_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM5_Handler);
}

//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    uint32_t status_value
    if(htim==(&TIM5_Handler))
    {
        status_value=taskENTER_CRITICAL_FROM_ISR();
        printf("TIM5输出.......\r\n");
        taskEXIT_CRITICAL_FROM_ISR(status_value);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS临界段代码 的相关文章

  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • FreeRTOS内核配置说明---FreeRTOS Kernel V10.2.1

    FreeRTOS内核是高度可定制的 使用配置文件FreeRTOSConfig h进行定制 每个FreeRTOS应用都必须包含这个头文件 用户根据实际应用来裁剪定制FreeRTOS内核 这个配置文件是针对用户程序的 而非内核 因此配置文件一般
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • 【FreeRTOS】多任务创建

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • 【FreeRTOS】任务通知的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 防止GCC LTO删除函数

    我使用 GCC ARM Embedded 和 FreeRTOS FreeRTOS具有的功能vTaskSwitchContext 仅在某些情况下使用 内联汇编代码 问题是 当我使用LTO时 GCC不考虑内联汇编代码并认为该函数没有被使用 因此
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR

随机推荐

  • 【文献阅读】DFAF——模态内和模态间动态融合的VQA模型(P. Gao等人,CVPR,2019)

    一 文章概况 文章题目 xff1a Dynamic Fusion with Intra and Inter modality Attention Flow for Visual Question Answering 这篇文章是CVPR201
  • 【文献阅读】BUTD——自上而下注意力机制的视觉问答系统(P. Anderson等人,CVPR,2018,有代码)

    一 文献概况 文章题目 xff1a Bottom up and top down attention for image captioning and visual question answering 偶然看到VQA xff08 visu
  • Zookeeper启动zkServer.cmd闪退, zk服务启动跟报错:Unexpected exception, exiting abnormally java.net.BindException

    Zookeeper启动zkServer cmd闪退 编辑zkServer cmd xff0c 在代码最后一行添加pause 运行cmd xff0c 查看Error报错内容 2021 06 22 10 24 21 727 span class
  • windows10家庭版安装docker踩坑

    目录 前提条件 排错1 xff1a 下载并运行安装程序 排错2 xff1a 排错3 xff1a 注意点 xff1a 运行docker 配置镜像加速 xff1a 测试下吧 成功安装 前提条件 需要Windows功能 xff1a Hyper V
  • XML文件解析

    void DomXml parseXml QDomDocument document 声明QDomDocument document setContent amp xml 初始化QDomDocument 文档结构 QDomElement r
  • ROS安装指令集合(快速安装+简易原理教程)

    很多刚装了Ubuntu的工控机上ROS官网很慢 xff0c 而且mirror不好找 xff0c 所以我把安装ROS的指令都放了进来 xff0c 一条一条复制即可 加载中科大镜像 xff1a sudo sh c 39 etc lsb rele
  • 蓝桥杯 嵌入式设计与开发项目 历届 客观题

    蓝桥杯嵌入式各届客观题 xff0c 包含省赛第八至十三届 xff0c 决赛第十 十一届 第十三届 部分题目为本人自己做的 xff0c 非标准答案 xff0c 仅供参考 注 xff1a 大学组客观题为10道 xff0c 研究生组客观题为15道
  • 输入rostopic echo /scan 报错:Segmentation fault (core dumped)[gazebo-2] process has died

    问题背景 xff1a 在gazebo中用rplidar实现gampping算法时 xff0c 一旦输入rostopic echo scan xff0c 就会报错 xff0c 错误 xff1a Segmentation fault core
  • C# 注释详解

    一 二 三 是智能注释也称xml注释 xff0c 会在被编译 xff0c 并生成xml文件在可执行文件中 会影响编译速度 xff0c 但不会影响代码执行速度 一级注释 xff1a 1 lt remarks gt 对类型进行描述 xff0c
  • STM32控制HC-05蓝牙模块进行通信

    一 HC 05蓝牙模块 1 简介 HC 05主从一体蓝牙串口模块采用英国CSR公司BlueCore4系列的芯片 xff0c 符合符合蓝牙2 0 43 EDR规范 xff0c 可以同带同种蓝牙功能的电脑 蓝牙主机和手机等智能终端配对 2 主要
  • 51单片机PWM的控制(呼吸灯)

    一 PWM Pulse Width Modulation脉冲宽度调制 xff0c 简称PWM PWM 脉冲宽度调制 对模拟信号电平进行数字编码的方法 xff0c 计算机只能输出0或5V的数字电压值而不能输出模拟电压 xff0c 而我们如果想
  • STM32用SPI方式控制OLED模块

    一 OLED 1 OLED模块的外观 2 OLED模块的电路图 3 OLED模块参数 项目说明接口特性3 3V 串电阻后 xff0c 可与 5V 系统连接 通信接口4 线 SPI屏幕分辨率128 64屏幕尺寸0 96 寸工作温度 40 70
  • STM32上使用UCOSII--消息队列和信号量集

    有关UCOS任务的介绍 xff1a STM32上使用UCOSII 任务 有关UCOS信号量和邮箱的介绍 xff1a STM32上使用UCOSII 信号量和邮箱 一 消息队列 使用消息队列可以在任务之间传递多条消息 消息队列由三个部分组成 x
  • PID控制算法+倒立摆控制应用

    一 位式控制算法 传统的控制算法采用位式控制算法 特点 位式控制算法输出信号只有H L两种状态算法输出信号OUT的依据 xff1a span class hljs comment 二位式 span span class hljs comme
  • 调整 mysql policy requirements

    Error xff1a mysql gt CREATE USER 39 tester 39 64 39 39 IDENTIFIED BY 39 password 39 ERROR 1819 HY000 Your password does
  • FreeRTOS简介与源码下载

    RTOS系统 实时操作系统 RTOS全称 Real Time OS 实时操作系统 xff0c 强调实时性 实时操作系统分为硬实时和软实时 硬实时要求在规定的时间内必须完成操作 xff0c 不允许超时 xff1b 软实时则没有那么严格 xff
  • FreeRTOS在STM32F4上移植

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第二章学习笔记 第一章笔记 FreeRTOS简介与源码下载 一 移植 1 准备工程文件 MCU用的是STM32F429的CORE xff0c 用keli创建一个基础工
  • FreeRTOS系统配置

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第三章学习笔记 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 FreeRTOSConfig h FreeRTOS的配
  • FreeRTOS中断分析

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第四章学习笔记 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 第三章笔记 FreeRTOS系统配置 一 Cortex
  • FreeRTOS临界段代码

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第四章学习笔记的补充 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 第三章笔记 FreeRTOS系统配置 第四章笔记