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

📄 os_sem.lst

📁 一个分选系统的软件:用SmallRtos操作系统
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   OS_SEM                                                                06/20/2005 15:36:06 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE OS_SEM
OBJECT MODULE PLACED IN .\out\Os_sem.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\OS\Os_sem.c OPTIMIZE(6,SIZE) DEBUG OBJECTEXTEND PRINT(.\out\Os_sem.lst) 
                    -OBJECT(.\out\Os_sem.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.12.0
   9          **
  10          **
  11          **--------------文件信息--------------------------------------------------------------------------------
  12          **文   件   名: OS_Q.C
  13          **创   建   人: 陈明计
  14          **最后修改日期:  2002年12月2日
  15          **描        述: Small RTOS(51)信号量代码
  16          **
  17          **--------------历史版本信息----------------------------------------------------------------------------
  18          ** 创建人: 陈明计
  19          ** 版  本: V1.10
  20          ** 日 期: 2002年9月1日
  21          ** 描 述: 原始版本
  22          **
  23          **------------------------------------------------------------------------------------------------------
  24          ** 修改人: 陈明计
  25          ** 版  本: V1.10.5
  26          ** 日 期: 2002年10月26日
  27          ** 描 述: 更正笔误和统一格式
  28          **        更正检查信号量的错误,改善OSSemIntPost()的执行性能,更正
  29          **        OSSemAccept()在信号量无效时的Bug,减少OSSemQuery()对中断延迟
  30          **        的影响,更正OSSemPend()在超时时的Bug
  31          **------------------------------------------------------------------------------------------------------
  32          ** 修改人: 陈明计
  33          ** 版  本: V1.11.0
  34          ** 日 期: 2002年12月2日
  35          ** 描 述: 根据新版本需求更改开、关中断代码,增加注释
  36          **
  37          **------------------------------------------------------------------------------------------------------
  38          ** 修改人: 陈明计
  39          ** 版  本: V1.12.0
  40          ** 日 期: 2002年12月30日
  41          ** 描 述: 根据新版本需求更改部分代码
  42          **
  43          **--------------当前版本修订----------------------------------------------------------------------------
  44          ** 修改人:
  45          ** 日 期:
  46          ** 描 述:
  47          **
  48          **------------------------------------------------------------------------------------------------------
  49          ********************************************************************************************************/
  50          
  51          #define  IN_OS_SEM
  52          #include "config.h"
  53          
  54                         /* 分配信号量存储空间 */
C51 COMPILER V7.06   OS_SEM                                                                06/20/2005 15:36:06 PAGE 2   

  55          #if EN_OS_SEM > 0
  56          #if OS_MAX_TASKS < 9
  57          uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 2];
  58          #else
              uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 3];
              #endif
  61          
  62          
  63          
  64          /*********************************************************************************************************
  65          ** 函数名称: OSSemCreate
  66          ** 功能描述: 初始化消息队列
  67          ** 输 入: Index:信号量索引
  68          **         data:信号量初始值
  69          ** 输 出: NOT_OK:没有这个信号量
  70          **         OS_SEM_OK:成功
  71          ** 全局变量: 无
  72          ** 调用模块: 无
  73          **
  74          ** 作 者: 陈明计
  75          ** 日 期: 2002年9月1日
  76          **-------------------------------------------------------------------------------------------------------
  77          ** 修改人:
  78          ** 日 期:
  79          **-------------------------------------------------------------------------------------------------------
  80          ********************************************************************************************************/
  81          
  82                  uint8 OSSemCreate(uint8 Index,uint8 Data)
  83          {
  84   1          OS_ENTER_CRITICAL();
  85   1          if (Index < OS_MAX_SEMS )
  86   1          {
  87   2      #if OS_MAX_TASKS < 9
  88   2              OsSemBuf[2 * Index] = Data;             /* 计数器置初值 */
  89   2              OsSemBuf[2 * Index + 1] = 0;            /* 清空等待队列 */
  90   2      #else
                      OsSemBuf[3 * Index] = Data;             /* 计数器置初值 */
                              /* 清空等待队列 */
                      OsSemBuf[3 * Index + 1] = 0;
                      OsSemBuf[3 * Index + 2] = 0;
              #endif
  96   2              OS_EXIT_CRITICAL();
  97   2              return OS_SEM_OK;
  98   2          }
  99   1          OS_EXIT_CRITICAL();
 100   1          return NOT_OK;
 101   1      }
 102          
 103          /*********************************************************************************************************
 104          ** 函数名称: OSSemPend
 105          ** 功能描述: 等待一个信号量
 106          ** 输 入: Index:信号量索引
 107          **         Tick:等待时间
 108          ** 输 出: NOT_OK:参数错误
 109          **         OS_SEM_OK:得到信号量
 110          **         OS_SEM_TMO:超时到
 111          **         OS_SEM_NOT_OK:没有得到信号量
 112          ** 全局变量: 无
 113          ** 调用模块: OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 114          **
 115          ** 作 者: 陈明计
 116          ** 日 期: 2002年9月1日
C51 COMPILER V7.06   OS_SEM                                                                06/20/2005 15:36:06 PAGE 3   

 117          **-------------------------------------------------------------------------------------------------------
 118          ** 修改人: 陈明计
 119          ** 日 期: 2002年10月20日
 120          **-------------------------------------------------------------------------------------------------------
 121          ** 修改人: 陈明计
 122          ** 日 期: 2002年10月26日
 123          **-------------------------------------------------------------------------------------------------------
 124          ** 修改人: 陈明计
 125          ** 日 期: 2002年12月2日
 126          **-------------------------------------------------------------------------------------------------------
 127          ** 修改人: 陈明计
 128          ** 日 期: 2002年12月30日
 129          **-------------------------------------------------------------------------------------------------------
 130          ** 修改人:
 131          ** 日 期:
 132          **-------------------------------------------------------------------------------------------------------
 133          ********************************************************************************************************/
 134          #if EN_OS_SEM_PENT > 0
 135          
 136                  uint8 OSSemPend(uint8 Index, uint8 Tick)
 137          {
 138   1      #if EN_OS_SEM_CHK > 0
 139   1          if (Index >= OS_MAX_SEMS)
 140   1          {
 141   2              return 0;
 142   2          }
 143   1      #endif
 144   1      
 145   1          OS_ENTER_CRITICAL();
 146   1      
 147   1          OSWaitTick[OSRunningTaskID()] = Tick;       /* 设置超时时间         */
 148   1                                                      /* 可以优化寄存器的使用  */
 149   1                      /* 把任务加入等待任务队列 */
 150   1      #if OS_MAX_TASKS < 9
 151   1          OsSemBuf[Index * 2 + 1] |= OSMapTbl[OSRunningTaskID()];
 152   1      #else
                  if (OSRunningTaskID() < 8)
                  {
                      OsSemBuf[Index * 3 + 1] |= OSMapTbl[OSRunningTaskID()];
                  }
                  else
                  {
                      OsSemBuf[Index * 3 + 2] |= OSMapTbl[OSRunningTaskID() & 0x07];
                  }
              #endif
 162   1                      /* 信号量是否有效 */
 163   1      #if OS_MAX_TASKS < 9
 164   1          while (OsSemBuf[Index * 2] == 0)
 165   1          {
 166   2      #else
                  while (OsSemBuf[Index * 3] == 0)
                  {
              #endif
 170   2                      /* 使用堆栈是为了使函数具有重入性 */
 171   2      #ifdef __C51__
 172   2              SP++;
 173   2              *((uint8 data *)SP) = Index;
 174   2      #endif
 175   2                  /* 信号量无效 */
 176   2              OSClearSignal(OSRunningTaskID());   /* 任务进入等待状态 */
 177   2              OSSched();                          /* 运行下一个任务 */
 178   2      
C51 COMPILER V7.06   OS_SEM                                                                06/20/2005 15:36:06 PAGE 4   

 179   2      #ifdef __C51__
 180   2              Index = *((uint8 data *)SP);
 181   2              SP--;
 182   2      #endif
 183   2                   /* 任务再次运行,如果超时到,退出循环 */
 184   2              if (OSWaitTick[OSRunningTaskID()] == 0)
 185   2              {
 186   3                  break;
 187   3              }
 188   2          }
 189   1            
 190   1                  /* 将任务从等待队列中清除(可以删除) */
 191   1      #if OS_MAX_TASKS < 9
 192   1          OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[OSRunningTaskID()];
 193   1      #else
                  if (OSRunningTaskID() < 8)
                  {
                      OsSemBuf[Index * 3 + 1] &= ~OSMapTbl[OSRunningTaskID()];
                  }
                  else
                  {
                      OsSemBuf[Index * 3 + 2] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
                  }
              #endif
 203   1                  /* 判断信号量是否有效。有效,信号量计数器减一 */
 204   1      #if OS_MAX_TASKS < 9
 205   1          if (OsSemBuf[Index * 2] > 0)
 206   1          {
 207   2              OsSemBuf[Index * 2]--;
 208   2      #else
                  if (OsSemBuf[Index * 3] > 0)
                  {
                      OsSemBuf[Index * 3]--;
              #endif
 213   2              OS_EXIT_CRITICAL();
 214   2              return OS_SEM_OK;
 215   2          }
 216   1          else
 217   1          {
 218   2              /* 无信号返回信号无效 */
 219   2              OS_EXIT_CRITICAL();
 220   2              return OS_SEM_TMO;
 221   2          }
 222   1      }
 223          #endif
 224          
 225          /*********************************************************************************************************
 226          ** 函数名称: OSSemAccept
 227          ** 功能描述: 无等待请求信号量
 228          ** 输 入: Index:信号量索引
 229          ** 输 出: NOT_OK:参数错误
 230          **         OS_SEM_OK:得到信号量

⌨️ 快捷键说明

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