UCOS-III笔记(三)
作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:UCOS-III,本专栏为UCOS-III学习记录
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
UCOS-III笔记(三)
临界段代码保护及任务调度锁
临界段代码保护
- UCOS-III在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断
- 临界区是直接屏蔽了中断,系统任务调度靠中断,ISR也靠中断
函数:
- CPU_CRITICAL_ENTER( ) 进入临界段
- CPU_CRITICAL_EXIT( ) 退出临界段
临界区调用格式:
CPU_SR_ALLOC();
/* 非临界区代码 */
CPU_CRITICAL_ENTER();
{...... /* 临界区代码 */
}
CPU_CRITICAL_EXIT();
/* 非临界区代码 */
特点:
- 成对使用
- 不支持嵌套
- 尽量保持临界段耗时短
任务调度锁
- 用于对调度器上锁以及解锁。调度器上锁时则禁止任务调度,解锁时则允许任务调度。
- 可以多次调用OSSchedLock( )对调度器上锁,解锁时需调用同样次数的OSSchedUnlock( )才可解锁
注意:调度锁只是将调度器关闭,并不影响中断的执行,中断依旧正常触发,只是不会执行任务切换
函数:
- void OSSchedLock (OS_ERR *p_err) 调度器加锁
- void OSSchedUnlock (OS_ERR *p_err) 调度器解锁
任务调度锁使用格式:
OS_ERR err;
OSSchedLock(&err); /* 调度器上锁 */
{/* 操作代码 */
}
OSSchedUnlock(&err); /* 调度器解锁 */
特点:
- 成对使用
- 支持嵌套
临界段代码保护&任务调度锁区别:
-
与临界区不一样的是,挂起任务调度器,未关闭中断;
-
它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;
-
与临界区不一样的是,挂起任务调度器,未关闭中断;
-
它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;
-
调度器上锁是挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全
