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

📄 os_core.lst

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


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

line level    source

   1          #include <AT89X52.H>
   2          
   3          #include "os_core.h"
   4          #include "main.h"
   5          #include "task_switch.h"
   6          #include "sem.h"
   7          #include "q.h"
   8          #include "uart.h"
   9          
  10          //程序控制块
  11           TCB    OS_TCB[TASK_NUM];
  12          //当前运行任务的优先级
  13           uint8  OS_Current_ID;
  14          //进入临界段计数器
  15           uint8  OS_En_Cr_Count;
  16          //任务就绪表
  17           uint8  OS_TaskRdy_List;
  18          //中断嵌套计数器
  19           uint8  Int_count;
  20          
  21           uint8  Task_Int_List;
  22          //置位表
  23          uint8 code  OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
  24          
  25          
  26          ////////////////////////////系统初始化//////////////////////////////////////////////////////
  27          void OS_Init(void)
  28          {  
  29   1         uint8 i ; 
  30   1      
  31   1         EA=0;                    //关中断
  32   1      
  33   1         ET2=1;                   //接受定时器2中断
  34   1         T2CON=0x00;         
  35   1         T2MOD=0x00;                                  
  36   1         RCAP2H=0xB1;
  37   1         RCAP2L=0xE0;             //定时时间为10ms  
  38   1        
  39   1         Int_count=0;                     //中断嵌套为0
  40   1         OS_TaskRdy_List=0;       //任务就绪表为0
  41   1         OS_Task_Q_List=0;
  42   1         OS_En_Cr_Count=0;        //进入临界段为0次
  43   1      
  44   1         Task_Int_List=0x00;
  45   1      
  46   1         OS_TCB[0].Task_SP=SP+2;      //初始化各任务的堆栈起始地址
  47   1      
  48   1         for(i=1;i<TASK_NUM;i++)
  49   1          OS_TCB[i].Task_SP=OS_TCB[i-1].Task_SP+(255-OS_TCB[0].Task_SP)/TASK_NUM;
  50   1      
  51   1      }
  52          
  53          ///////////////////////////创建一个任务////////////////////////////////////////////////////////
  54          void OS_Task_Create(uint8 Task_Prio,uint8 Task_ID, uint16 Task_PC,uint8  Stack_Bottom) reentrant
  55          {
C51 COMPILER V8.08   OS_CORE                                                               05/09/2008 17:57:19 PAGE 2   

  56   1        OS_ENTER_CRITICAL();
  57   1        if(OS_TCB[Task_ID].Status== No_Exist)
  58   1       {
  59   2         OS_TCB[Task_ID].Status=Exist;              /*任务存在*/
  60   2         OS_EXIT_CRITICAL();
  61   2         ((uint8 idata *)Stack_Bottom)[0]=Task_PC;        /*将任务入口地址保存在堆栈,压入低8位*/
  62   2         ((uint8 idata *)Stack_Bottom)[1]=Task_PC>>8;     /*压入高8位*/
  63   2      
  64   2         OS_TCB[Task_ID].Task_SP=Stack_Bottom+1;          /*将该任务的堆栈栈顶地址保存*/
  65   2                                        
  66   2         OS_TCB[Task_ID].Prio=Task_Prio;            /*任务优先级*/
  67   2      
  68   2         OS_TCB[Task_ID].Delay=0;                   /*任务初始不延时*/
  69   2      
  70   2         OS_TaskRdy_List|=OSMapTbl[Task_ID];            /*任务就绪*/
  71   2      
  72   2         return ;
  73   2       }
  74   1        OS_EXIT_CRITICAL();
  75   1      }
  76          
  77          ////////////////////////////系统启动///////////////////////////////////////////////////////////
  78          void OS_Start(void)
  79          {
  80   1      
  81   1          OS_Current_ID=TASK_NUM-1;
  82   1      
  83   1          SP=OS_TCB[OS_Current_ID].Task_SP;   /*修改堆栈指针;使其指向当前任务的堆栈段*/
  84   1      
  85   1           TR2=1;             /*启动定时器2*/
  86   1           EA=1;              /*开中断*/
  87   1      }
  88          
  89          ////////////////////////////系统时钟处理函数//////////////////////////////////////////////////
  90           void  OS_TimeTick(void)
  91          {
  92   1          uint8 i;            
  93   1              for(i=0;i<TASK_NUM;i++)        /*处理所有延时*/
  94   1        {
  95   2             if(OS_TCB[i].Delay)         /*如果任务需要延时*/
  96   2            {
  97   3                OS_TCB[i].Delay--;       /*延时时间减1*/
  98   3              if(OS_TCB[i].Delay==0)     /*如果延时时间到*/
  99   3              {
 100   4                 OSSendSignal(i);        /*中断中发信号,任务就绪*/
 101   4              }  
 102   3            } 
 103   2        }
 104   1      }
 105          ////////////////////////////////查找下一任务//////////////////////////////////////////////////
 106          void  OS_Find_Next_Task(void)
 107          {
 108   1      
 109   1         uint8 tempPrio,i;  
 110   1          
 111   1          tempPrio=OS_TCB[OS_Current_ID].Prio;        
 112   1      
 113   1          for(i=0;i<TASK_NUM-1;i++)
 114   1          { 
 115   2                if((OS_TaskRdy_List&OSMapTbl[i])&&(OS_TCB[i].Prio<tempPrio)) 
 116   2           {
 117   3                goto bb;     
C51 COMPILER V8.08   OS_CORE                                                               05/09/2008 17:57:19 PAGE 3   

 118   3           }
 119   2              }
 120   1      
 121   1          for(i=OS_Current_ID;i<TASK_NUM-1;i++)
 122   1          { 
 123   2                if((OS_TaskRdy_List&OSMapTbl[i])&&(OS_TCB[i].Prio==tempPrio)&&i!=OS_Current_ID) 
 124   2           {
 125   3                goto bb;     
 126   3           }
 127   2              }
 128   1      
 129   1              if(i==TASK_NUM-1)
 130   1         {
 131   2               for(i=0;i<TASK_NUM-1;i++)
 132   2              {
 133   3                if(OS_TaskRdy_List&OSMapTbl[i]) 
 134   3           {
 135   4                break;       
 136   4           }
 137   3              }
 138   2         }
 139   1      
 140   1      bb:    OS_Current_ID=i;
 141   1      
 142   1      }
 143          
 144          ///////////////////////////定时器2中断服务函数/////////////////////////////////////////////////
 145          #pragma disable        /* 除非最高优先级中断,否则,必须加上这一句 */
 146          void Timer2ISR(void) interrupt 5 
 147          {
 148   1             TF2=0;        /*清中断标志TF2*/
 149   1             Enter_Int();
 150   1      #if EN_TIMER_SHARING > 0
 151   1             OS_TimeTick();              /* 调用系统时钟处理函数 */
 152   1      #else
                     OSSendSignal(TIME_ISR_TASK_ID);   /* 唤醒ID为TIME_ISR_TASK_ID的任务*/
              #endif
 155   1             Exit_Int();
 156   1      }
 157          
 158          
 159          ///////////////////////////任务中给指定任务发送信号///////////////////////////////////////////
 160           void OSSendSignal(uint8 TaskId) 
 161          {
 162   1              if (TaskId < TASK_NUM)
 163   1         {
 164   2                OS_ENTER_CRITICAL();
 165   2            OS_TaskRdy_List|=OSMapTbl[TaskId ];/*任务就绪*/
 166   2            OS_EXIT_CRITICAL();
 167   2                if (Int_count==0)   /*不在中断中*/
 168   2           {  
 169   3              OSSched(); /*开始任务切换*/
 170   3                }
 171   2         }
 172   1      }
 173          //////////////////////////清除指定任务信号////////////////////////////////////////////////////
 174          void OSClearSignal(uint8 TaskId) 
 175          {
 176   1           if(TaskId <TASK_NUM)
 177   1          {
 178   2              OS_ENTER_CRITICAL();
 179   2              OS_TaskRdy_List &= ~OSMapTbl[TaskId];  /*任务不就绪*/
C51 COMPILER V8.08   OS_CORE                                                               05/09/2008 17:57:19 PAGE 4   

 180   2              OS_EXIT_CRITICAL();
 181   2                 if(TaskId==OS_Current_ID && Int_count==0) /*挂起自身并不在中断中*/
 182   2            {  
 183   3                   OSSched();  /*开始任务切换*/
 184   3                 }
 185   2              }         
 186   1      }
 187          //////////////////////////挂起指定任务////////////////////////////////////////////////////////
 188          void OSTaskSuspend(uint8 TaskId)
 189          {
 190   1          if (TaskId <TASK_NUM)
 191   1         {
 192   2             OS_TCB[TaskId].Delay = 0;  /*没有超时处理*/
 193   2             OSClearSignal(TaskId);     /*清除指定任务信号*/
 194   2         }
 195   1      }
 196          /////////////////////////系统等待函数//////////////////////////////////////////////////////////                                                                   
             -  
 197          uint8 OSWait(uint8 typ, uint8 ticks)   
 198          {
 199   1               OS_TCB[OS_Current_ID].Delay = ticks;  /*设置超时时间*/ 
 200   1          switch(typ)
 201   1          {
 202   2          case K_SIG:                                /*等待信号,即挂起自身*/
 203   2                      OSTaskSuspend(OS_Current_ID);
 204   2              return SIG_EVENT;
 205   2          case K_TMO: 
 206   2                  SP++;        
 207   2                  *((uint8 data * data *)SP) = ticks;    
*** WARNING C289 IN LINE 207 OF OS_CORE.C: '=': converting non-pointer to pointer
 208   2              OSClearSignal(OS_Current_ID);              /*等待超时,即延时一段时间*/
 209   2                      SP--;    
 210   2                  ticks = (uint8 data *)(*((uint8 data *)SP));
 211   2                  if(ticks&&OS_TCB[OS_Current_ID].Delay==0)   /*超时*/
 212   2                  {  
 213   3               return  TMO_EVENT;
 214   3                  }
 215   2                       return  SIG_EVENT;
 216   2          default:
 217   2              OS_TCB[OS_Current_ID].Delay = 0;
 218   2              return NOT_OK;
 219   2          }
 220   1      }
 221          
 222          
 223          


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


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

⌨️ 快捷键说明

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