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

📄 sem.lst

📁 模仿ucos ii和RTX Tiny写的一个小操作系统
💻 LST
字号:
C51 COMPILER V8.08   SEM                                                                   05/09/2008 17:57:19 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE SEM
OBJECT MODULE PLACED IN sem.OBJ
COMPILER INVOKED BY: C:\Keil808\C51\BIN\C51.EXE sem.c ROM(COMPACT) DEBUG OBJECTEXTEND

line level    source

   1          
   2          #include <AT89X52.H>
   3          
   4          #include "os_core.h"
   5          #include "main.h"
   6          #include "task_switch.h"
   7          #include "sem.h"
   8          #include "q.h"
   9          #include "uart.h"
  10          
  11          /////////////////信号量定义////////////////////////////////////////////////////
  12          SemBlk Sem[MAX_SEM];
  13          
  14          
  15          /////////////////////////////初始化信号量//////////////////////////////////////
  16          void OSSemCreat(uint8 Index,uint8  Count) reentrant 
  17          { 
  18   1        if(Index<MAX_SEM)                          //存在该信号量
  19   1       {
  20   2        Sem[Index].OSTaskPendTbl=0;       //等待信号量的任务列表
  21   2        Sem[Index].OSEventCount=Count;        //信号量 
  22   2        }
  23   1      } 
  24          
  25          
  26          /////////////////////////任务等待信号量////////////////////////////////////////
  27          uint8 OSTaskSemPend(uint8 Index,uint8 Timeout) reentrant 
  28          { 
  29   1         if(Index<MAX_SEM)                    //存在该信号量
  30   1       {
  31   2      
  32   2         if(Sem[Index].OSEventCount)       //信号量有效 
  33   2         {  
  34   3                Sem[Index].OSEventCount -- ;   //减一            
  35   3         } 
  36   2         else                                                                         
  37   2         {                     
  38   3            Sem[Index].OSTaskPendTbl|=OSMapTbl[OS_Current_ID];    //加入信号的任务等待表
  39   3      bb:                           
  40   3            if(OSWait(K_TMO,Timeout)==TMO_EVENT)   //超时
  41   3                {    
  42   4                   Sem[Index].OSTaskPendTbl &= ~OSMapTbl[OS_Current_ID];  //从等待表中去除 
  43   4                   return SEM_TMO;                                                //返时超时
  44   4                }
  45   3      
  46   3                if(Sem[Index].OSTaskPendTbl&OSMapTbl[OS_Current_ID]) //等待表中还有该任务
  47   3                   goto bb;                                         //不是因为有信号而恢复
  48   3         }
  49   2                 return SEM_OK;                       //信号量有效                                                                                                    
  50   2        }     
  51   1                 return NOT_OK;
  52   1      }
  53                                                                                            
  54          ///////////////////////////////任务发送信号量///////////////////////////////////
  55          void OSSemPost(uint8 Index) reentrant 
C51 COMPILER V8.08   SEM                                                                   05/09/2008 17:57:19 PAGE 2   

  56          {        
  57   1          uint8 i,tempPrio=255; 
  58   1      
  59   1          if(Index<MAX_SEM)                         //存在该信号量
  60   1        {
  61   2      
  62   2           for(i=0;i<TASK_NUM;i++)                      //查找优先级最高的任务
  63   2          {
  64   3            if(Sem[Index].OSTaskPendTbl&OSMapTbl[i]&&OS_TCB[i].Prio<tempPrio)    
  65   3            {
  66   4                  tempPrio=OS_TCB[i].Prio;
  67   4            }
  68   3           }
  69   2      
  70   2           for(i=0;i<TASK_NUM;i++)
  71   2          { 
  72   3             if(Sem[Index].OSTaskPendTbl&OSMapTbl[i]&&OS_TCB[i].Prio==tempPrio)    
  73   3            {
  74   4                       break;
  75   4            }
  76   3              }
  77   2      
  78   2           if(i < TASK_NUM)                            //如果有任务需要
  79   2          { 
  80   3                OS_ENTER_CRITICAL();                  //进入临界区    
  81   3            Sem[Index].OSTaskPendTbl &= ~OSMapTbl[i]; //从等待表中去除 
  82   3                OS_EXIT_CRITICAL();                   //退出临界区 
  83   3            OSSendSignal(i);
  84   3          }                                                                              
  85   2          else                                        //没有任务需要
  86   2          { 
  87   3            Sem[Index].OSEventCount++;           //使信号量加一
  88   3          } 
  89   2      
  90   2        }
  91   1      }
  92          
  93          
  94          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    386    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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