本篇介绍的是调度器的上锁和解锁:
  1. 调度器上锁函数OSSchedlock()的功能是用于禁止任务调度,使任务保持对CPU的控制权。
  2. 调度器开锁函数OSSchedUnlock()的功能是解除对任务调度的禁止。
  3. OSSchedlock()和OSSchedUnlock()必须成对使用。
  4. 调度器解锁包括两层含义:第一个是没有中断嵌套;第二个是没有嵌套锁存在。只有这两个条件都满足,才能进行任务调度。
/*$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)相关推荐

  1. OS_CORE.C(11)

    OS_SchedNew(void)找到将要运行的最高优先级任务函数 和任务调度函数OS_Sched(void): /* **************************************** ...

  2. OS_CORE.C(10)

    今天看os_core.c文件中的各种初始化函数. OS_EventWaitListInit(OS_EVENT *pevent)初始化事件控制块的等待列表: /*$PAGE*/ /*2018/2/8 * ...

  3. OS_CORE.C(总结)

    在内核的功能模块中,重点函数为: static  void  OS_InitEventList(void);/*初始化事件列表*/ static  void  OS_InitMisc(void);/* ...

  4. OS_CORE.C(1)

    第一个函数(获得信号量.互斥量.邮箱或者队列名字的函数)的流程图和分析图如下所示: /*$PAGE*/ /* ********************************************* ...

  5. OS_CORE.C(9)

    本篇介绍以下几个函数: OSVersion()获得版本号函数. OS_Dummy()虚拟函数. OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U ...

  6. OS_CORE.C(8)

    本篇介绍的是OSStart()函数和OSStatInit()函数和OSTimeTick()函数. OSStart()多任务开始函数: /*$PAGE*/ /* ******************** ...

  7. OS_CORE.C(6)

    先介绍一下优先级反转的相关知识: 优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证. 例 ...

  8. OS_CORE.C(5)

    /*$PAGE*/ /* *************************************************************************************** ...

  9. OS_CORE.C(3)

    OSTCBCur->OSTCBStat |= events_stat | /* Resource not available, ...无法获得资源的话就将其挂起 */OS_STAT_MULTI; ...

最新文章

  1. DPDK — IGB_UIO,与 UIO Framework 进行交互的内核模块
  2. RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayer-RTSP实现支持H265编码格式过程介绍
  3. 一致性 Hash 算法学习(分布式或均衡算法)
  4. Linux——回射服务器多并发(多线程)
  5. 成功者都在用的“成功咒语”
  6. 第26月第13天 hibernate导包
  7. led设备驱动(s3c_led.c)
  8. 海量数据挖掘MMDS week2: Nearest-Neighbor Learning最近邻学习
  9. 倒车雷达matlab仿真,倒车雷达系统设计(超声波-SEG4)
  10. 【UVM基础】+uvm_set_verbosity 使用介绍
  11. stm32无源蜂鸣器定时器_STM32与无源蜂鸣器
  12. 在线考试答题刷题小程序
  13. p3c 插件,是怎么检查出你那屎山的代码?
  14. 北京新生儿医保办理流程【非京籍】
  15. 《Mysql》必知必会读书笔记
  16. 软件技术专业需要学什么?
  17. USB 设置接口SetInterface
  18. 微信小程序 —— 模块化方法的总结
  19. XZ_iOS之实现textView占位文本和占位图片
  20. 100道Python编程题

热门文章

  1. 简明docker教程 1
  2. ALTER AVAILABILITY GROUP (Transact-SQL)
  3. Linux 内核将要支持最新龙芯 3A2000/3B2000
  4. Java 线程池中的线程复用是如何实现的?
  5. 干货 | 强化学习在携程酒店推荐排序中的应用探索
  6. 异地多活场景下的数据同步之道 | 珍藏版
  7. 谈谈To B业务的难点
  8. 简单易懂的自动驾驶科普知识
  9. 解读:大数据在电信行业的五大应用
  10. 深刻理解:反向代理服务器