FreeRTOS的调度锁,任务锁、中断锁

一、调度锁

1、概念:

调度锁即 禁止任务调度 ,调度锁开和调度锁关之间的代码在执行期间不会被高优先级的任务抢占。
在获取调度锁期间,任务调度器将被禁用,因此任务都无法被调度。
注意调度锁只能在任务上下文中使用。

2、API:

vTaskSuspendAll
开启调度锁
xTaskResumeAll ()
关闭调度锁

3、注意:

  1. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。(临界段进行了开关中断操作)
  2. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。
  3. 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引起任务切换的 API,比如 vTaskDelayUntil、vTaskDelay、xQueueSend 等。

二、中断锁

1、概念:

中断锁即 中断开关 ,FreeRTOS 没有专门的中断锁函数,可以使用中断服务程序里面临界段的处理。

2、API:

taskENTER_CRITICAL_FROM_ISR()
进入临界段
taskEXIT_CRITICAL_FROM_ISR( x )
退出临界段

三、任务锁

1、概念:

任务锁即为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制。 FreeRTOS 也没有专门的任务锁函数。

2、实现方式

(1)使用调度器加锁实现
vTaskSuspendAll()
开启调度锁
xTaskResumeAll ()
关闭调度锁
(2) 通过关闭任务切换中断 PendSV 和系统时钟节拍中断 Systick
利用 FreeRTOS 的 任务代码临界段处理函数 就可以关闭 PendSV 中断和 Systick 中断。
因为进入临界段前,操作寄存器 basepri 关闭了所有小于等于宏定义 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定义的中断优先级( 实现任务切换功能 的 PendSV 中断和滴答定时器中断是最低优先级中断,所以也是被关闭的 ),这样低优先级任务在执行临界段代码期间是不会被高优先级任务打断的,从而就实现了任务锁的效果。

taskENTER_CRITICAL()
进入临界段
taskEXIT_CRITICAL()
退出临界段

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值