- 1、本文档共28页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第16章 FreeRTOS 调度锁 ,任务锁和中断锁
FreeRTOS 调度锁 ,任务锁和中断锁
本章教程为大家讲解调度锁 ,任务锁和中断锁的概念,以及 FreeRTOS 调度锁的使用。
本章教程配套的例子含 Cortex-M3 内核的 STM32F103和 Cortex-M4 内核的 STM32F407 以及 F429。
16.1 调度锁
16.2 中断锁
16.3 任务锁
16.4 FreeRTOS 调度锁开启
16.5 FreeRTOS 调度锁关闭
16.6 实验例程说明
16.7 总结
16.1 调度锁
16.1 调度锁
调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调 了调度锁开关函数,处于调度锁开和调
度锁关之间的代码在执行期间是不会被高优先级的任务抢占的,即任务调度被禁止。这一点要跟临界段的
作用区分开 ,调度锁只是禁止了任务调度 ,并没有关闭任何中断,中断还是正常执行的。而临界段进行了
开关中断操作。
16.2 中断锁
16.2 中断锁
中断锁就是 RTOS 提供的开关中断函数,FreeRTOS 没有专门的中断锁函数,使 15.3 小节里面介
绍的中断服务程序临界段处理函数就可以实现同样效果。
16.3 任务锁
16.3 任务锁
简单的说,为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制就是任务锁。
FreeRTOS 也没有专门的任务锁函数,但是使 FreeRTOS 现有的功能有两种实现方法:
通过给调度器加锁实现
利 FreeRTOS 的调度锁功能给调度器加锁的话,将关闭任务切换功能 ,从而高优先级任务也就无法
抢占低优先级任务的执行,同时高优先级任务也是无法向低优先级任务切换的。另外特别注意 ,调度
锁只是禁止了调度器工作,并没有关闭任何中断。
通过关闭任务切换中断 PendSV 和系统时钟节拍中断 Systick
武汉安富莱电子有限公司
武汉安富莱电子有限公司
WWW.ARMFLY.COM 安富莱STM32-V6开发板FreeRTOS教程
WWW.ARMFLY.COM 安富莱STM32-V6开发板FreeRTOS教程
利 FreeRTOS 的任务代码临界段处理函数就可以关闭 PendSV 中断和 Systick 中断。因为进入临界
段前 ,操作寄存器 basepri 关闭了所有小于等于宏定义
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定义的中断优先级 (实现任务切换功能
的 PendSV 中断和滴答定时器中断是最低优先级中断,所以也是被关闭的 ),这样低优先级任务在执
行临界段代码期间是不会被高优先级任务打断的 ,从而就实现了任务锁的效果。
16.4 FreeRTOS 调度锁开启
16.4 FreeRTOS 调度锁开启
使用如下函数可以实现 FreeRTOS 的调度锁开启 :
vTaskSuspendAll()
关于这个函数的讲解及其使用方法可以看 FreeRTOS 在线版手册:
这里也对此函数进行下介绍。
函数原型
void vTaskSuspendAll( void );
函数描述
函数 vTaskSuspendAll 用于实现 FreeRTOS 调度锁开启。
使 这个函数要注意以下问题 :
1. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。
2. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。
2016年06月30 日 版本:1.0 第 2 页 共
文档评论(0)