FreeRTOS 开关中断
FreeRTOS 开关中断函数为 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS(),这两个函数其实是宏定义,在 portmacro.h 中有定义,如下:
#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()
#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0)
可以看出开关中断实际上是通过函数 vPortSetBASEPRI(0)和 vPortRaiseBASEPRI()来实现的。
函数 vPortSetBASEPRI()是向寄存器 BASEPRI 写入一个值,此值作为参数 ulBASEPRI 传 递进来,portENABLE_INTERRUPTS()是开中断,它传递了个 0 给 vPortSetBASEPRI(),根据我们前面讲解 BASEPRI 寄存器可知,结果就是开中断。
函 数 vPortRaiseBASEPRI() 是 向 寄 存 器 BASEPRI 写 入 宏configMAX_SYSCALL_INTERRUPT_PRIORITY , 那 么 优 先 级 低 于configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断就会被屏蔽!
临界段代码
临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。FreeRTOS 系统本身就有很多的临界段代码,这些代码都加了临界段代码保护,我们在写自己的用户程序的时候有些地方也需要添加临界段代码保护。
FreeRTOS 与 临 界 段 代 码 保 护 有 关 的 函 数 有 4 个 :taskENTER_CRITICAL() 、taskEXIT_CRITICAL() 、 taskENTER_CRITICAL_FROM_ISR() 和taskEXIT_CRITICAL_FROM_ISR(),这四个函数其实是宏定义,在 task.h 文件中有定义。这四个函数的区别是前两个是任务级的临界段代码保护,后两个是中断级的临界段代码保护。
任务级临界代码保护使用方法如下:
中断级临界代码保护使用方法如下:
-
开关
+关注
关注
19文章
3287浏览量
95888 -
嵌入式
+关注
关注
5161文章
19788浏览量
319741 -
寄存器
+关注
关注
31文章
5447浏览量
125411 -
函数
+关注
关注
3文章
4388浏览量
65316 -
FreeRTOS
+关注
关注
13文章
495浏览量
64740
发布评论请先 登录
rt-thread 优化系列(二) 之 同步和消息关中断分析
转:第15章 FreeRTOS临界段和开关中断
转第16章 FreeRTOS调度锁,任务锁和中断锁
为什么ucosII移植后开关中断函数总是报错?
FreeRTOS_中断Github简介
怎样去使用FreeRTOS的中断配置和临界段呢
RTThread中开关中断的具体实现过程以及进入临界区的相关操作说明
请问ch32v307全局中断开关定义怎样写?
基于STM32应用的FreeRTOS中断设置

STM32之FreeRTOS:(一) 中断配置和临界段的使用

评论