⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_sem.lst

📁 一种51单片机嵌入式系统SMALL RTOS 51的应用
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.23a  OS_SEM                                                                01/01/2001 02:30:57 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE OS_SEM
OBJECT MODULE PLACED IN .\OS_SEM.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\OS\OS_SEM.C BROWSE DEBUG OBJECTEXTEND PRINT(.\OS_SEM.lst) OBJECT(.\OS_SE
                    -M.obj) 

stmt level    source

   1          /*********************************************************************************************************
   2          **                                                             Small RTOS(51)
   3          **                                   The Real-Time Kernel(For Keil c51)
   4          **
   5          **                                  (c) Copyright 2002-2003, chenmingji
   6          **                                           All Rights Reserved
   7          **
   8          **                                                  V1.20.0
   9          **
  10          **
  11          **--------------文件信息--------------------------------------------------------------------------------
  12          **文   件   名: OS_Q.C
  13          **创   建   人: 陈明计
  14          **最后修改日期:  2003年8月3日
  15          **描        述: Small RTOS(51)信号量代码
  16          **
  17          **--------------历史版本信息----------------------------------------------------------------------------
  18          ** 创建人: 陈明计
  19          ** 版  本: V1.10~V1.12.0
  20          ** 日 期: 2002年9月1日~2002年12月30日
  21          ** 描 述: 完善信号量代码
  22          **
  23          **------------------------------------------------------------------------------------------------------
  24          ** 修改人: 陈明计
  25          ** 版  本: V1.20.0
  26          ** 日 期: 2003年8月3日
  27          ** 描 述: 删除OSInt*函数,根据新版本要求改变一些代码
  28          **
  29          **--------------当前版本修订----------------------------------------------------------------------------
  30          ** 修改人:
  31          ** 日 期:
  32          ** 描 述:
  33          **
  34          **------------------------------------------------------------------------------------------------------
  35          ********************************************************************************************************/
  36          
  37          #define  IN_OS_SEM
  38          #include "config.h"
  39          
  40                         /* 分配信号量存储空间 */
  41          #if EN_OS_SEM > 0
              #if OS_MAX_TASKS < 9
              uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 2];
              #else
              uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 3];
              #endif
              
              
              
              /*********************************************************************************************************
              ** 函数名称: OSSemCreate
              ** 功能描述: 初始化消息队列
              ** 输 入: Index:信号量索引
              **         data:信号量初始值
C51 COMPILER V6.23a  OS_SEM                                                                01/01/2001 02:30:57 PAGE 2   

              ** 输 出: NOT_OK:没有这个信号量
              **         OS_SEM_OK:成功
              ** 全局变量: 无
              ** 调用模块: 无
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              
                      uint8 OSSemCreate(uint8 Index,uint8 Data)
              {
                  OS_ENTER_CRITICAL();
                  if (Index < OS_MAX_SEMS )
                  {
              #if OS_MAX_TASKS < 9
                      OsSemBuf[2 * Index] = Data;             /* 计数器置初值 */
                      OsSemBuf[2 * Index + 1] = 0;            /* 清空等待队列 */
              #else
                      OsSemBuf[3 * Index] = Data;             /* 计数器置初值 */
                              /* 清空等待队列 */
                      OsSemBuf[3 * Index + 1] = 0;
                      OsSemBuf[3 * Index + 2] = 0;
              #endif
                      OS_EXIT_CRITICAL();
                      return OS_SEM_OK;
                  }
                  OS_EXIT_CRITICAL();
                  return NOT_OK;
              }
              
              /*********************************************************************************************************
              ** 函数名称: OSSemPend
              ** 功能描述: 等待一个信号量
              ** 输 入: Index:信号量索引
              **         Tick:等待时间
              ** 输 出: NOT_OK:参数错误
              **         OS_SEM_OK:得到信号量
              **         OS_SEM_TMO:超时到
              **         OS_SEM_NOT_OK:没有得到信号量
              ** 全局变量: 无
              ** 调用模块: OSRunningTaskID,OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月20日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月26日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年12月2日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年12月30日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
C51 COMPILER V6.23a  OS_SEM                                                                01/01/2001 02:30:57 PAGE 3   

              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_SEM_PENT > 0
              
                      uint8 OSSemPend(uint8 Index, uint8 Tick)
              {
              #if EN_OS_SEM_CHK > 0
                  if (Index >= OS_MAX_SEMS)
                  {
                      return 0;
                  }
              #endif
              
                  OS_ENTER_CRITICAL();
              
                  OSWaitTick[OSRunningTaskID()] = Tick;       /* 设置超时时间         */
                                                              /* 可以优化寄存器的使用  */
                              /* 把任务加入等待任务队列 */
              #if OS_MAX_TASKS < 9
                  OsSemBuf[Index * 2 + 1] |= OSMapTbl[OSRunningTaskID()];
              #else
                  if (OSRunningTaskID() < 8)
                  {
                      OsSemBuf[Index * 3 + 1] |= OSMapTbl[OSRunningTaskID()];
                  }
                  else
                  {
                      OsSemBuf[Index * 3 + 2] |= OSMapTbl[OSRunningTaskID() & 0x07];
                  }
              #endif
                              /* 信号量是否有效 */
              #if OS_MAX_TASKS < 9
                  while (OsSemBuf[Index * 2] == 0)
                  {
              #else
                  while (OsSemBuf[Index * 3] == 0)
                  {
              #endif
                              /* 使用堆栈是为了使函数具有重入性 */
              #ifdef __C51__
                      SP++;
                      *((uint8 data *)SP) = Index;
              #endif
                          /* 信号量无效 */
                      OS_TaskSuspend(OSRunningTaskID());   /* 任务进入等待状态 */
                      OSSched();                          /* 运行下一个任务 */
              
              #ifdef __C51__
                      Index = *((uint8 data *)SP);
                      SP--;
              #endif
                           /* 任务再次运行,如果超时到,退出循环 */
                      if (OSWaitTick[OSRunningTaskID()] == 0)
                      {
                          break;
                      }
                  }
              
                          /* 将任务从等待队列中清除(可以删除) */
              #if OS_MAX_TASKS < 9
                  OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[OSRunningTaskID()];
C51 COMPILER V6.23a  OS_SEM                                                                01/01/2001 02:30:57 PAGE 4   

              #else
                  if (OSRunningTaskID() < 8)
                  {
                      OsSemBuf[Index * 3 + 1] &= ~OSMapTbl[OSRunningTaskID()];
                  }
                  else
                  {
                      OsSemBuf[Index * 3 + 2] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
                  }
              #endif
                          /* 判断信号量是否有效。有效,信号量计数器减一 */
              #if OS_MAX_TASKS < 9
                  if (OsSemBuf[Index * 2] > 0)
                  {
                      OsSemBuf[Index * 2]--;
              #else
                  if (OsSemBuf[Index * 3] > 0)
                  {
                      OsSemBuf[Index * 3]--;
              #endif
                      OS_EXIT_CRITICAL();
                      return OS_SEM_OK;
                  }
                  else
                  {
                      /* 无信号返回信号无效 */
                      OS_EXIT_CRITICAL();
                      return OS_SEM_TMO;
                  }
              }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -