【FreeRTOS操作系统教程】第15章 FreeRTOS临界段和开关中断.pdf

【FreeRTOS操作系统教程】第15章 FreeRTOS临界段和开关中断.pdf

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【FreeRTOS操作系统教程】第15章 FreeRTOS临界段和开关中断

第15章 FreeRTOS 临界段和开关中断 本章教程为大家讲解两个重要的概念,FreeRTOS 的临界段和开关中断。 本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。 15.1 临界段 15.2 任务代码临界段处理 15.3 中断服务程序临界段处理 15.4 开关中断的实现 15.5 BSP 板级支持包中开关中断的特别处理 15.6. 实验例程说明 15.7 总结 15.1 临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码 的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。 ? FreeRTOS 临界段相关知识补充 FreeRTOS 的源码中有多处临界段的地方,临界段虽然保护了关键代码的执行不被打断,但也会 影响系统的实时性。比如此时某个任务正在调用系统 API 函数,而且此时中断正好关闭了,也就是进 入到了临界区中,这个时候如果有一个紧急的中断事件被触发,这个中断就不能得到及时执行,必须 等到中断开启才可以得到执行,如果关中断时间超过了紧急中断能够容忍的限度,危害是可想而知的。 FreeRTOS 源码中就有多处临界段的处理,跟 FreeRTOS 一样,uCOS-II 和 uCOS-III 源码中都是有 临界段的,而 RTX 的源码中不存在临界段。另外,除了 FreeRTOS 操作系统源码所带的临界段以外,用 户写应用的时候也有临界段的问题,比如以下两种: ? 读取或者修改变量(特别是用于任务间通信的全局变量)的代码,一般来说这是最常见的临界代码。 ? 调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。 总之,对于临界段要做到执行时间越短越好,否则会影响系统的实时性。 武汉安富莱电子有限公司 WWW.ARMFLY.COM 安富莱 STM32-V6 开发板 FreeRTOS 教程 2016年06月30日 版本:1.0 第 2 页 共 34 页 15.2 任务代码临界段处理 FreeRTOS 任务代码中临界段的进入和退出主要是通过操作寄存器 basepri 实现的。进入临界段前操 作寄存器 basepri 关闭了所有小于等于宏定义 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定义的中断优先级,这样临界段代码就不会被中断干扰到,而且实现任务切换功能的 PendSV 中断和滴 答定时器中断是最低优先级中断,所以此任务在执行临界段代码期间是不会被其它高优先级任务打断的。 退出临界段时重新操作 basepri 寄存器,即打开被关闭的中断(这里我们不考虑不受 FreeRTOS 管理的更 高优先级中断)。FreeRTOS 进入和退出临界段的函数如下: #define taskENTER_CRITICAL() portENTER_CRITICAL() #define taskEXIT_CRITICAL() portEXIT_CRITICAL() 上面这两个函数是供用户调用的,其中函数 taskENTER_CRITICAL 是进入临界段,函数 taskEXIT_CRITICAL 是退出临界段。进一步跟踪宏定义的实现如下: #define portENTER_CRITICAL() vPortEnterCritical() #define portEXIT_CRITICAL() vPortExitCritical() 再进一步跟踪宏定义的实现如下: void vPortEnterCritical( void ) { portDISABLE_INTERRUPTS(); uxCriticalNesting++; /* This is not the interrupt safe version of the enter critical function so assert() if it is being called from an interrupt context. Only API functions that end in FromISR can be used in an interrupt. Only assert if the critical nesting count is 1

文档评论(0)

l215322 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档