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

📄 os_q.lst

📁 一个通过方向判别芯片进行角度计算的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.05a   OS_Q                                                                 03/10/2007 13:05:45 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE OS_Q
OBJECT MODULE PLACED IN .\Os_q.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\OS\Os_q.c ROM(SMALL) DEBUG OBJECTEXTEND PRINT(.\Os_q.lst) OBJECT(.\Os_q.
                    -obj)

line 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.3
   9          **
  10          **
  11          **--------------文件信息--------------------------------------------------------------------------------
  12          **文   件   名: OS_Q.C
  13          **创   建   人: 陈明计
  14          **最后修改日期:  2003年3月8日
  15          **描        述: Small RTOS(51)消息队列代码
  16          **
  17          **--------------历史版本信息----------------------------------------------------------------------------
  18          ** 创建人: 陈明计
  19          ** 版  本: V1.10~V1.12.0
  20          ** 日 期: 2002年6月20日~2002年12月30日
  21          ** 描 述: 完善消息队列代码
  22          **
  23          **------------------------------------------------------------------------------------------------------
  24          ** 修改人: 陈明计
  25          ** 版  本: V1.20.0
  26          ** 日 期: 2003年8月3日
  27          ** 描 述: 删除OSInt*函数,根据新版本要求改变一些代码
  28          **
  29          **--------------当前版本修订-----------------------------------------------------------------------------
  30          ** 修改人: 陈明计
  31          ** 日 期: 2004年6月8日
  32          ** 描 述: 更正计算溢出的错误
  33          **
  34          **------------------------------------------------------------------------------------------------------
  35          ********************************************************************************************************/
  36          
  37          #define  IN_OS_Q
  38          #include "config.h"
  39          
  40          #if EN_OS_Q > 0
  41          /*********************************************************************************************************
  42          ** 函数名称: OSQCreate
  43          ** 功能描述: 初始化消息队列
  44          ** 输 入: Buf:为队列分配的存储空间地址
  45          **         SizeOfBuf:为队列分配的存储空间大小
  46          ** 输 出: NOT_OK:参数错误
  47          **         OS_Q_OK:成功
  48          ** 全局变量: 无
  49          ** 调用模块: 无
  50          **
  51          ** 作 者: 陈明计
  52          ** 日 期: 2002年9月1日
  53          **-------------------------------------------------------------------------------------------------------
  54          ** 修改人: 陈明计
C51 COMPILER V8.05a   OS_Q                                                                 03/10/2007 13:05:45 PAGE 2   

  55          ** 日 期: 2002年10月27日
  56          **-------------------------------------------------------------------------------------------------------
  57          ** 修改人:
  58          ** 日 期:
  59          **-------------------------------------------------------------------------------------------------------
  60          ********************************************************************************************************/
  61          
  62                  uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf)
  63          //Buf[0]:队列中字节数,Buf[1]:Buf总长度,Buf[2]:出对端,Buf[3](,Buf[4]):等待队列任务列表
  64          {
  65   1          OS_ENTER_CRITICAL();
  66   1      
  67   1          if ((SizeOfBuf >= 5) && (Buf != NULL))
  68   1          {
  69   2              Buf[0] = 0;                         /* 队列中消息数目           */
  70   2              Buf[1] = SizeOfBuf;                 /* 消息队列占用内存字节数    */
  71   2      #if OS_MAX_TASKS < 9
  72   2              Buf[2] = 4;                         /* 将要出队的消息所在位置    */
  73   2      #else
                      Buf[2] = 5;                         /* 将要出队的消息所在位置    */
              #endif
  76   2              Buf[3] = 0;                         /* 消息队列的等待任务列表    */
  77   2              Buf[4] = 0;                         /* 任务数大于等于8时为等待任务列表的一部分, */
  78   2                                                  /* 否则为消息缓冲区         */
  79   2      
  80   2              OS_EXIT_CRITICAL();
  81   2              return OS_Q_OK;
  82   2          }
  83   1          else
  84   1          {
  85   2              OS_EXIT_CRITICAL();
  86   2              return NOT_OK;
  87   2          }
  88   1      
  89   1      }
  90          
  91          /*********************************************************************************************************
  92          ** 函数名称: OSQPend
  93          ** 功能描述: 等待消息队列中的消息
  94          ** 输 入: Ret:返回的消息
  95          **         Buf:指向队列的指针
  96          **         Tick:等待时间
  97          ** 输 出: NOT_OK:参数错误
  98          **         OS_Q_OK:收到消息
  99          **         OS_Q_TMO:超时到
 100          **         OS_Q_NOT_OK:无消息
 101          ** 全局变量: 无
 102          ** 调用模块: OSRunningTaskID,OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
 103          **
 104          ** 作 者: 陈明计
 105          ** 日 期: 2002年9月1日
 106          **-------------------------------------------------------------------------------------------------------
 107          ** 修改人: 陈明计
 108          ** 日 期: 2002年10月9日
 109          **------------------------------------------------------------------------------------------------------
 110          ** 修改人: 陈明计
 111          ** 日 期: 2002年12月2日
 112          **-------------------------------------------------------------------------------------------------------
 113          ** 修改人:
 114          ** 日 期:
 115          **-------------------------------------------------------------------------------------------------------
 116          ********************************************************************************************************/
C51 COMPILER V8.05a   OS_Q                                                                 03/10/2007 13:05:45 PAGE 3   

 117          #if EN_OS_Q_PENT > 0
 118          
 119                  uint8 OSQPend(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick)
 120          {
 121   1      #ifdef __C51__
 122   1          uint8 data *cp;
 123   1      #endif
 124   1      
 125   1      #if EN_OS_Q_CHK > 0
                  if (Buf == NULL)
                  {
                      return NOT_OK;
                  }
              #endif
 131   1      
 132   1          OS_ENTER_CRITICAL();
 133   1      
 134   1          OSWaitTick[OSRunningTaskID()] = Tick;       /* 设置超时时间         */
 135   1                                                      /* 可以优化寄存器的使用  */
 136   1      
 137   1                      /* 使用堆栈是为了使函数具有重入性 */
 138   1      #ifdef __C51__
 139   1          SP++;
 140   1          *((uint8 data * data *)SP) = Ret;
 141   1      #endif
 142   1      
 143   1                      /* 把任务加入等待任务队列 */
 144   1      #if OS_MAX_TASKS < 9
 145   1          Buf[3] |= OSMapTbl[OSRunningTaskID()];
 146   1      #else
                  if (OSRunningTaskID() < 8)
                  {
                      Buf[3] |= OSMapTbl[OSRunningTaskID()];
                  }
                  else
                  {
                      Buf[4] |= OSMapTbl[OSRunningTaskID() & 0x07];
                  }
              #endif
 156   1      
 157   1          while (Buf[0] == 0)             /* 消息队列中是否有消息 */
 158   1          {
 159   2                      /* 无消息 */
 160   2      #ifdef __C51__
 161   2              SP = SP + sizeof(Buf);
 162   2              *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf))) = Buf;
 163   2      #endif
 164   2      
 165   2              OS_TaskSuspend(OSRunningTaskID());   /* 任务进入等待状态 */
 166   2              OSSched();                          /* 运行下一个任务 */
 167   2      
 168   2      #ifdef __C51__
 169   2              Buf = *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf)));
 170   2              SP = SP - sizeof(Buf);
 171   2      #endif
 172   2                      /* 任务再次运行,如果超时到,退出循环 */
 173   2              if (OSWaitTick[OSRunningTaskID()] == 0)
 174   2              {
 175   3                  break;
 176   3              }
 177   2          }
 178   1      
C51 COMPILER V8.05a   OS_Q                                                                 03/10/2007 13:05:45 PAGE 4   

 179   1                      /* 将任务从等待队列中清除(可以删除) */
 180   1      #if OS_MAX_TASKS < 9
 181   1          Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
 182   1      #else
                  if (OSRunningTaskID() < 8)
                  {
                      Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
                  }
                  else
                  {
                      Buf[4] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
                  }
              #endif
 192   1                      /* 判断消息队列中是否有消息 */
 193   1          if (Buf[0] > 0)
 194   1          {
 195   2                      /* 有,消息出队 */
 196   2              Buf[0]--;           /* 队列的消息数目减一 */
 197   2                      /* 指向下一个出队位置 */
 198   2              Buf[2]++;
 199   2              if (Buf[2] >= Buf[1] )
 200   2              {
 201   3      #if OS_MAX_TASKS < 9
 202   3                  Buf[2] = 4;
 203   3      #else
                          Buf[2] = 5;
              #endif
 206   3              }
 207   2      #ifdef __C51__
 208   2              cp = (uint8 data *)(*((uint8 data *)SP));
 209   2              SP--;
 210   2              *cp = Buf[Buf[2]];
 211   2      #else
                      *Ret = Buf[Buf[2]];
              #endif
 214   2              OS_EXIT_CRITICAL();
 215   2              return OS_Q_OK;
 216   2          }

⌨️ 快捷键说明

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