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

taskENTER_CRITICAL()分析

1. 临界段代码

//任务级的临界段代码保护

taskENTER_CRITICAL()
taskEXIT_CRITICAL()

//中断级的临界段代码保护

taskENTER_CRITICAL_FROM_ISR()
taskEXIT_CRITICAL_FROM_ISR()
2. 以STM32为例

(1)STM32有0~15,共16级中断,可嵌套。数字小,优先级高。
(2) FreeRTOS 系统可管理的最大优先级为5,表示可以开关5-15优先级的中断,即5-15优先级的中断可以调用 FreeRTOS 的 API 函数(带FromISR)。
(3) 优先级(0~4)的中断 FreeRTOS 是不能禁止的,中断服务函数也不能调用 FreeRTOS 的 API 函数!
(4) 中断级临界段代码保护
taskENTER_CRITICAL_FROM_ISR()和 taskEXIT_CRITICAL_FROM_ISR()中断级别临 界 段 代 码 保 护 , 是 用 在 中 断 服 务 程 序 中 的 , 而 且 这 个 中 断 的 优 先 级 一 定 要 低 于configMAX_SYSCALL_INTERRUPT_PRIORITY!举例,中断优先级为7的uart接收中断,可以使用taskENTER_CRITICAL_FROM_ISR()和 taskEXIT_CRITICAL_FROM_ISR()。

3. 相关代码

//FreeRTOSConfig.h

/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */#define configPRIO_BITS       		__NVIC_PRIO_BITS
#else#define configPRIO_BITS       		4        /* 15 priority levels */
#endif/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			0xf/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5/* Interrupt priorities used by the kernel port layer itself.  These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

//port.c

#define portNVIC_PENDSV_PRI					( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
#define portNVIC_SYSTICK_PRI				( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )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();}
}

//portmacro.h

static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{__asm{/* Barrier instructions are not used as this function is only used tolower the BASEPRI value. */msr basepri, ulBASEPRI}
}
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}
}
configMAX_SYSCALL_INTERRUPT_PRIORITY = 0x50

执行到HAL_Init()前面
在这里插入图片描述
程序运行后,systick优先级,240/16=15
在这里插入图片描述

相关文章:

  • 数据可视化:解析其在现代生活中的日益重要地位
  • 6个PPT素材模板网站,免费!
  • wine的使用 ubuntu入门之二十三
  • linux 查看 线程名, 线程数
  • 【C++】开源:RabbitMQ安装与配置使用(SimpleAmqpClient)
  • Python库之Scrapy-Redis的高级用法深度解析
  • 2023职称继续教育--新时代如何培养和造就未来科技创新领军人才
  • linux下can-utils的使用以及can接口的配置(以ubuntu20.04为例)
  • 为啥装了erlang,还报错erl: command not found?
  • STM32 HAL库USART的接收数据方法实现(STM32Cube_FW_F1_V1.8.5)
  • 使用last查看系统登录情况
  • 开源与闭源 AI 模型:发展路径的比较与前瞻
  • 【SAP HANA 33】前端参数多选情况下HANA如何使用IN来匹配?
  • k8s集群的存储卷、pvc和pv
  • VB6 MQTT为什么在物联网应用中使用 MQTT 而不是 HTTP?
  • 【译】JS基础算法脚本:字符串结尾
  • go append函数以及写入
  • Java的Interrupt与线程中断
  • java概述
  • js ES6 求数组的交集,并集,还有差集
  • JS基础之数据类型、对象、原型、原型链、继承
  • Linux下的乱码问题
  • MySQL数据库运维之数据恢复
  • SQL 难点解决:记录的引用
  • vue2.0项目引入element-ui
  • vuex 笔记整理
  • 半理解系列--Promise的进化史
  • 程序员最讨厌的9句话,你可有补充?
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 基于组件的设计工作流与界面抽象
  • 两列自适应布局方案整理
  • 盘点那些不知名却常用的 Git 操作
  • 如何编写一个可升级的智能合约
  • 深度学习在携程攻略社区的应用
  • 用Python写一份独特的元宵节祝福
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 进程与线程(三)——进程/线程间通信
  • ​数据链路层——流量控制可靠传输机制 ​
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (分布式缓存)Redis哨兵
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (一)Thymeleaf用法——Thymeleaf简介