- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- Unit_3_My_favorite_food_is_hamburgers..ppt
- Unit_9__When_was_he_born(课堂).doc
- Universal Actability of and with Knowledge Managing and Communicating Knowledge with Patter.pdf
- Universal Bibliographic Control and.pdf
- Universal bounds and blow-up estimates for a reaction-diffusion system.pdf
- Universal bounds on buffer size for packetizing fluid policies in input queued, crossbar sw.pdf
- UNIVERSAL CACHE MISS EQUATIONS FOR AUTONOMIC COMPUTING.pdf
- Universal Computation with Watson-Crick D0L Systems.pdf
- Unit_4_Reading___What_would_you_do_if.啊.ppt
- Universal Conductance Distributions in the Crossover between Diffusive and Localization Reg.pdf
最近下载
- 爸爸妈妈的童年演示教学.ppt
- 2023届高考语文一轮复习语言表达训练:下定义.docx
- 陈雪珠台湾乐龄发展协会秘书长国立中正大学成人及继续-Loxa教育网.ppt
- 图解《数据出境安全评估办法》十问数据出境安全合规-炼石网络.docx VIP
- 科创板知识测评(含答案) .pdf
- 2024年江苏省连云港市中考语文真题写作话题解读与参考范文“天呐,原来这么有意思”、“助人者,天助之”“易得易失的启示”.docx
- 广东省深圳市龙岗区南园学校九年级(上)第一次月考数学试卷.doc VIP
- 长方形与正方形面积说课.ppt VIP
- 第8课 先秦时期的科技与文化(同步课件).pptx VIP
- “这里,也是我的舞台”写作指导及优秀范文.docx VIP
文档评论(0)