OS_CORE.C(7)
- 调度器上锁函数
OSSchedlock()
的功能是用于禁止任务调度,使任务保持对CPU的控制权。 - 调度器开锁函数
OSSchedUnlock()
的功能是解除对任务调度的禁止。 - OSSchedlock()和OSSchedUnlock()必须成对使用。
- 调度器解锁包括两层含义:第一个是没有中断嵌套;第二个是没有嵌套锁存在。只有这两个条件都满足,才能进行任务调度。
/*$PAGE*/
/*
*********************************************************************************************************
* PREVENT SCHEDULING
* 给调度器上锁
* Description: This function is used to prevent rescheduling to take place. This allows your application
* to prevent context switches until you are ready to permit context switching.
*本函数用于禁止任务调度,直到任务完成后调用给调度器开锁函数OSSchedUnlock()为止。调用OSSchedlock()的任务保持对CPU的控制权,尽管有个优先级更高的任务进入了就绪态。
* Arguments : none
*
* Returns : none
*
* Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
* call to OSSchedLock() you MUST have a call to OSSchedUnlock().OSSchedlock()和OSSchedUnlock()必须成对使用。
*********************************************************************************************************
*/#if OS_SCHED_LOCK_EN > 0u /*允许生成OS_SCHED_LOCK()函数*/
void OSSchedLock(void)
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register 给CPU状态寄存器分配存储空间*/OS_CPU_SR cpu_sr = 0u; /*中断号为3*/
#endifif (OSRunning == OS_TRUE) { /* Make sure multitasking is running 有多个任务在等待 */OS_ENTER_CRITICAL(); /*关闭中断*/if (OSIntNesting == 0u) { /* Can't call from an ISR 没有中断,无法调用中断函数 */if (OSLockNesting < 255u) { /* Prevent OSLockNesting from wrapping back to 0最大嵌套锁为255u*/OSLockNesting++; /* Increment lock nesting level 嵌套锁加1 */}}OS_EXIT_CRITICAL(); /*开中断*/}
}
#endif/*$PAGE*/
/*
*********************************************************************************************************
* ENABLE SCHEDULING
* 给调度器解锁
* Description: This function is used to re-allow rescheduling.
*该功能用来解禁任务调度
* Arguments : none
*
* Returns : none
*
* Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
* call to OSSchedLock() you MUST have a call to OSSchedUnlock().
OSSchedlock()和OSSchedUnlock()必须成对使用,在使用OSSchedUnlock()函数之前必须使用OSSchedLock()函数
*********************************************************************************************************
*/#if OS_SCHED_LOCK_EN > 0u /*允许生成OS_SCHED_LOCK()函数*/
void OSSchedUnlock(void) /*给调度器解锁函数*/
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */OS_CPU_SR cpu_sr = 0u;
#endifif (OSRunning == OS_TRUE) { /* Make sure multitasking is running有多个任务*/OS_ENTER_CRITICAL(); /*关闭中断*/if (OSLockNesting > 0u) { /* Do not decrement if already 0 嵌套锁大于0*/OSLockNesting--; /* Decrement lock nesting level 嵌套锁减1*/if (OSLockNesting == 0u) { /* See if scheduler is enabled and ...将嵌套锁减1之后看此时嵌套锁的层数是否为0如果为0,调度管理器可用*/if (OSIntNesting == 0u) { /* ... not in an ISR若也没有中断嵌套,则可以进行任务的调度*/OS_EXIT_CRITICAL(); /*开中断*/OS_Sched(); /* See if a HPT is ready 进入任务调度*/}else {OS_EXIT_CRITICAL(); /*退出中断*/}}else {OS_EXIT_CRITICAL(); /*退出中断*/}}else {OS_EXIT_CRITICAL(); /*退出中断*/}}
}
#endif
OS_CORE.C(7)相关推荐
- OS_CORE.C(11)
OS_SchedNew(void)找到将要运行的最高优先级任务函数 和任务调度函数OS_Sched(void): /* **************************************** ...
- OS_CORE.C(10)
今天看os_core.c文件中的各种初始化函数. OS_EventWaitListInit(OS_EVENT *pevent)初始化事件控制块的等待列表: /*$PAGE*/ /*2018/2/8 * ...
- OS_CORE.C(总结)
在内核的功能模块中,重点函数为: static void OS_InitEventList(void);/*初始化事件列表*/ static void OS_InitMisc(void);/* ...
- OS_CORE.C(1)
第一个函数(获得信号量.互斥量.邮箱或者队列名字的函数)的流程图和分析图如下所示: /*$PAGE*/ /* ********************************************* ...
- OS_CORE.C(9)
本篇介绍以下几个函数: OSVersion()获得版本号函数. OS_Dummy()虚拟函数. OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U ...
- OS_CORE.C(8)
本篇介绍的是OSStart()函数和OSStatInit()函数和OSTimeTick()函数. OSStart()多任务开始函数: /*$PAGE*/ /* ******************** ...
- OS_CORE.C(6)
先介绍一下优先级反转的相关知识: 优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证. 例 ...
- OS_CORE.C(5)
/*$PAGE*/ /* *************************************************************************************** ...
- OS_CORE.C(3)
OSTCBCur->OSTCBStat |= events_stat | /* Resource not available, ...无法获得资源的话就将其挂起 */OS_STAT_MULTI; ...
最新文章
- DPDK — IGB_UIO,与 UIO Framework 进行交互的内核模块
- RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayer-RTSP实现支持H265编码格式过程介绍
- 一致性 Hash 算法学习(分布式或均衡算法)
- Linux——回射服务器多并发(多线程)
- 成功者都在用的“成功咒语”
- 第26月第13天 hibernate导包
- led设备驱动(s3c_led.c)
- 海量数据挖掘MMDS week2: Nearest-Neighbor Learning最近邻学习
- 倒车雷达matlab仿真,倒车雷达系统设计(超声波-SEG4)
- 【UVM基础】+uvm_set_verbosity 使用介绍
- stm32无源蜂鸣器定时器_STM32与无源蜂鸣器
- 在线考试答题刷题小程序
- p3c 插件,是怎么检查出你那屎山的代码?
- 北京新生儿医保办理流程【非京籍】
- 《Mysql》必知必会读书笔记
- 软件技术专业需要学什么?
- USB 设置接口SetInterface
- 微信小程序 —— 模块化方法的总结
- XZ_iOS之实现textView占位文本和占位图片
- 100道Python编程题