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

📄 os_q.lst

📁 在51上运行的小的OS系统
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.08   OS_Q                                                                  10/17/2008 09:11:32 PAGE 1   


C51 COMPILER V8.08, 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 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.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年6月20日
  21          ** 描 述: 原始版本
  22          **
  23          **------------------------------------------------------------------------------------------------------
  24          ** 修改人: 陈明计
  25          ** 版  本: V1.10.2
  26          ** 日 期: 2002年9月9日
  27          ** 描 述: 修改OSQIntPost()的Keil C51特殊代码,它编译没有问题,但会造成阅读
  28          **         障碍。这部分代码仅在使用Keil C51时出现。
  29          **------------------------------------------------------------------------------------------------------
  30          ** 修改人: 陈明计
  31          ** 版  本: V1.10.5
  32          ** 日 期: 2002年10月26日
  33          ** 描 述: 修改OSQFlush()使其不再清除等待队列,修改OSQCreate()代码避免重入,修改OSQIntPost()
  34          **        和OSQIntPost()时其效率更高
  35          **
  36          **------------------------------------------------------------------------------------------------------
  37          ** 修改人: 陈明计
  38          ** 版  本: V1.11.0
  39          ** 日 期: 2002年12月2日
  40          ** 描 述: 根据新版本需求更改开、关中断代码,增加注释,简化
  41          **
  42          **------------------------------------------------------------------------------------------------------
  43          ** 修改人: 陈明计
  44          ** 版  本: V1.12.0
  45          ** 日 期: 2002年12月30日
  46          ** 描 述: 没有变化
  47          **
  48          **--------------当前版本修订-----------------------------------------------------------------------------
  49          ** 修改人:
  50          ** 日 期:
  51          ** 描 述:
  52          **
  53          **------------------------------------------------------------------------------------------------------
  54          ********************************************************************************************************/
  55          
C51 COMPILER V8.08   OS_Q                                                                  10/17/2008 09:11:32 PAGE 2   

  56          #define  IN_OS_Q
  57          #include "config.h"
  58          
  59          #if EN_OS_Q > 0
              /*********************************************************************************************************
              ** 函数名称: OSQCreate
              ** 功能描述: 初始化消息队列
              ** 输 入: Buf:为队列分配的存储空间地址
              **         SizeOfBuf:为队列分配的存储空间大小
              ** 输 出: NOT_OK:参数错误
              **         OS_Q_OK:成功
              ** 全局变量: 无
              ** 调用模块: 无
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月27日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              
                      uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf)
              //Buf[0]:队列中字节数,Buf[1]:Buf总长度,Buf[2]:出对端,Buf[3](,Buf[4]):等待队列任务列表
              {
                  OS_ENTER_CRITICAL();
              
                  if ((SizeOfBuf >= 5) && (Buf != NULL))
                  {
                      Buf[0] = 0;                         /* 队列中消息数目           */
                      Buf[1] = SizeOfBuf;                 /* 消息队列占用内存字节数    */
              #if OS_MAX_TASKS < 9
                      Buf[2] = 4;                         /* 将要出队的消息所在位置    */
              #else
                      Buf[2] = 5;                         /* 将要出队的消息所在位置    */
              #endif
                      Buf[3] = 0;                         /* 消息队列的等待任务列表    */
                      Buf[4] = 0;                         /* 任务数大于等于8时为等待任务列表的一部分, */
                                                          /* 否则为消息缓冲区         */
              
                      OS_EXIT_CRITICAL();
                      return OS_Q_OK;
                  }
                  else
                  {
                      OS_EXIT_CRITICAL();
                      return NOT_OK;
                  }
              
              }
              
              /*********************************************************************************************************
              ** 函数名称: OSQPend
              ** 功能描述: 等待消息队列中的消息
              ** 输 入: Ret:返回的消息
              **         Buf:指向队列的指针
              **         Tick:等待时间
              ** 输 出: NOT_OK:参数错误
              **         OS_Q_OK:收到消息
C51 COMPILER V8.08   OS_Q                                                                  10/17/2008 09:11:32 PAGE 3   

              **         OS_Q_TMO:超时到
              **         OS_Q_NOT_OK:无消息
              ** 全局变量: 无
              ** 调用模块: OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
              **
              ** 作 者: 陈明计
              ** 日 期: 2002年9月1日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年10月9日
              **------------------------------------------------------------------------------------------------------
              ** 修改人: 陈明计
              ** 日 期: 2002年12月2日
              **-------------------------------------------------------------------------------------------------------
              ** 修改人:
              ** 日 期:
              **-------------------------------------------------------------------------------------------------------
              ********************************************************************************************************/
              #if EN_OS_Q_PENT > 0
              
                      uint8 OSQPend(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick)
              {
              #ifdef __C51__
                  uint8 data *cp;
              #endif
              
              #if EN_OS_Q_CHK > 0
                  if (Buf == NULL)
                  {
                      return NOT_OK;
                  }
              #endif
              
                  OS_ENTER_CRITICAL();
              
                  OSWaitTick[OSRunningTaskID()] = Tick;       /* 设置超时时间         */
                                                              /* 可以优化寄存器的使用  */
              
                              /* 使用堆栈是为了使函数具有重入性 */
              #ifdef __C51__
                  SP++;
                  *((uint8 data * data *)SP) = Ret;
              #endif
              
                              /* 把任务加入等待任务队列 */
              #if OS_MAX_TASKS < 9
                  Buf[3] |= OSMapTbl[OSRunningTaskID()];
              #else
                  if (OSRunningTaskID() < 8)
                  {
                      Buf[3] |= OSMapTbl[OSRunningTaskID()];
                  }
                  else
                  {
                      Buf[4] |= OSMapTbl[OSRunningTaskID() & 0x07];
                  }
              #endif
              
                  while (Buf[0] == 0)             /* 消息队列中是否有消息 */
                  {
                              /* 无消息 */
              #ifdef __C51__
C51 COMPILER V8.08   OS_Q                                                                  10/17/2008 09:11:32 PAGE 4   

                      SP = SP + sizeof(Buf);
                      *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf))) = Buf;
              #endif
              
                      OSClearSignal(OSRunningTaskID());   /* 任务进入等待状态 */
                      OSSched();                          /* 运行下一个任务 */
              
              #ifdef __C51__
                      Buf = *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf)));
                      SP = SP - sizeof(Buf);
              #endif
                              /* 任务再次运行,如果超时到,退出循环 */
                      if (OSWaitTick[OSRunningTaskID()] == 0)
                      {
                          break;
                      }
                  }
              
                              /* 将任务从等待队列中清除(可以删除) */
              #if OS_MAX_TASKS < 9
                  Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
              #else
                  if (OSRunningTaskID() < 8)
                  {
                      Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
                  }
                  else
                  {
                      Buf[4] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
                  }
              #endif
                              /* 判断消息队列中是否有消息 */
                  if (Buf[0] > 0)
                  {
                              /* 有,消息出队 */
                      Buf[0]--;           /* 队列的消息数目减一 */
                              /* 指向下一个出队位置 */
                      Buf[2]++;
                      if (Buf[2] >= Buf[1] )
                      {
              #if OS_MAX_TASKS < 9
                          Buf[2] = 4;
              #else
                          Buf[2] = 5;
              #endif
                      }
              #ifdef __C51__
                      cp = (uint8 data *)(*((uint8 data *)SP));
                      SP--;
                      *cp = Buf[Buf[2]];
              #else
                      *Ret = Buf[Buf[2]];
              #endif
                      OS_EXIT_CRITICAL();
                      return OS_Q_OK;
                  }
                  else
                  {
                              /* 无,返回错误码 */
              #ifdef __C51__
                      SP--;
              #endif
C51 COMPILER V8.08   OS_Q                                                                  10/17/2008 09:11:32 PAGE 5   

              
                      OS_EXIT_CRITICAL();
                      return OS_Q_TMO;
                  }
              }
              #endif
              
              /*********************************************************************************************************

⌨️ 快捷键说明

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