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

📄 2_01_12h.lst

📁 时间触发嵌入式系统设计模式:使用8051系列微控制器开发可靠应用
💻 LST
字号:
C51 COMPILER V6.10  2_01_12H                                                               04/19/2001 11:26:11 PAGE 1   


C51 COMPILER V6.10, COMPILATION OF MODULE 2_01_12H
OBJECT MODULE PLACED IN .\2_01_12H.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\2_01_12H.C OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*------------------------------------------------------------------*-
   2          
   3             2_01_12h.C (v1.00) 
   4          
   5            ------------------------------------------------------------------
   6          
   7             *** THIS IS A *HYBRID* SCHEDULER FOR STANDARD 8051 / 8052 ***
   8          
   9             *** Uses T2 for timing, 16-bit auto reload ***
  10             *** 12 MHz oscillator -> 1 ms (precise) tick interval ***
  11          
  12          
  13             COPYRIGHT
  14             ---------
  15          
  16             This code is from the book:
  17          
  18             PATTERNS FOR TIME-TRIGGERED EMBEDDED SYSTEMS by Michael J. Pont 
  19             [Pearson Education, 2001; ISBN: 0-201-33138-1].
  20          
  21             This code is copyright (c) 2001 by Michael J. Pont.
  22           
  23             See book for copyright details and other information.
  24          
  25          -*------------------------------------------------------------------*/
  26          
  27          #include "2_01_12h.h"
  28          
  29          // ------ Public variable declarations -----------------------------
  30          
  31          // The array of tasks (see Sch51.C)
  32          extern sTaskH hSCH_tasks_G[hSCH_MAX_TASKS];
  33          
  34          // Used to display the error code
  35          // See Main.H for details of error codes
  36          // See Port.H for details of the error port
  37          extern tByte Error_code_G;
  38          
  39          /*------------------------------------------------------------------*-
  40          
  41            hSCH_Init_T2()
  42          
  43            Scheduler initialisation function.  Prepares scheduler
  44            data structures and sets up timer interrupts at required rate.
  45          
  46            You must call this function before using the scheduler.  
  47          
  48          -*------------------------------------------------------------------*/
  49          void hSCH_Init_T2(void) 
  50             {
  51   1         tByte i;
  52   1      
  53   1         for (i = 0; i < hSCH_MAX_TASKS; i++) 
  54   1            {
  55   2            hSCH_Delete_Task(i);
C51 COMPILER V6.10  2_01_12H                                                               04/19/2001 11:26:11 PAGE 2   

  56   2            }
  57   1      
  58   1         // Reset the global error variable
  59   1         // - hSCH_Delete_Task() will generate an error code, 
  60   1         //   (because the task array is empty)
  61   1         Error_code_G = 0;  
  62   1      
  63   1         // Now set up Timer 2
  64   1         // 16-bit timer function with automatic reload
  65   1      
  66   1         // Crystal is assumed to be 12 MHz
  67   1         // The Timer 2 resolution is 0.000001 seconds (1 祍)
  68   1         // The required Timer 2 overflow is 0.001 seconds (1 ms)
  69   1         // - this takes 1000 timer ticks
  70   1         // Reload value is 65536 - 1000 = 64536 (dec) = 0xFC18
  71   1      
  72   1         T2CON = 0x04;   // load Timer 2 control register
  73   1         T2MOD = 0x00;   // load Timer 2 mode register
  74   1      
  75   1         TH2    = 0xFC;  // load timer 2 high byte
  76   1         RCAP2H = 0xFC;  // load timer 2 reload capture reg, high byte
  77   1         TL2    = 0x18;  // load timer 2 low byte
  78   1         RCAP2L = 0x18;  // load timer 2 reload capture reg, low byte
  79   1         
  80   1         ET2   = 1;  // Timer 2 interrupt is enabled
  81   1      
  82   1         TR2   = 1;  // Start Timer 2
  83   1         }
  84          
  85          
  86          /*------------------------------------------------------------------*-
  87          
  88            hSCH_Start()
  89          
  90            Starts the scheduler, by enabling interrupts.
  91          
  92            NOTE: Usually called after all regular tasks are added,
  93            to keep the tasks synchronised.
  94          
  95            NOTE: ONLY THE SCHEDULER INTERRUPT SHOULD BE ENABLED!!! 
  96          
  97          -*------------------------------------------------------------------*/
  98          void hSCH_Start(void) 
  99             {
 100   1         EA = 1;
 101   1         }
 102          
 103          /*------------------------------------------------------------------*-
 104          
 105            hSCH_Update
 106          
 107            This is the scheduler ISR.  It is called at a rate 
 108            determined by the timer settings in hSCH_Init().
 109            This version is triggered by Timer 2 interrupts:
 110            timer is automatically reloaded.
 111           
 112           -*------------------------------------------------------------------*/
 113          void hSCH_Update(void) interrupt INTERRUPT_Timer_2_Overflow  
 114             {
 115   1         tByte Index;
 116   1      
 117   1         TF2 = 0; // Have to manually clear this. 
C51 COMPILER V6.10  2_01_12H                                                               04/19/2001 11:26:11 PAGE 3   

 118   1      
 119   1         // NOTE: calculations are in *TICKS* (not milliseconds)
 120   1         for (Index = 0; Index < hSCH_MAX_TASKS; Index++)
 121   1            {
 122   2            // Check if there is a task at this location
 123   2            if (hSCH_tasks_G[Index].pTask)
 124   2               {
 125   3               if (hSCH_tasks_G[Index].Delay == 0)
 126   3                  {
 127   4                  // The task is due to run
 128   4                  // 
 129   4                  if (hSCH_tasks_G[Index].Co_op)
 130   4                     {
 131   5                     // If it is a co-operative task, increment the RunMe flag
 132   5                     hSCH_tasks_G[Index].RunMe += 1;  
 133   5                     }
 134   4                  else
 135   4                     {
 136   5                     // If it is a pre-emptive task, run it IMMEDIATELY
 137   5                     (*hSCH_tasks_G[Index].pTask)();  // Run the task
 138   5      
 139   5                     hSCH_tasks_G[Index].RunMe -= 1;   // Reset / reduce RunMe flag
 140   5      
 141   5                     // Periodic tasks will be run again (see below)
 142   5                     // - if this is a 'one shot' task, remove it from the array
 143   5                     if (hSCH_tasks_G[Index].Period == 0)
 144   5                        {
 145   6                        hSCH_tasks_G[Index].pTask  = 0;
 146   6                        }
 147   5                     }
 148   4      
 149   4                  if (hSCH_tasks_G[Index].Period)
 150   4                     {
 151   5                     // Schedule periodic tasks to run again
 152   5                     hSCH_tasks_G[Index].Delay = hSCH_tasks_G[Index].Period;
 153   5                     }
 154   4                  }
 155   3               else
 156   3                  {
 157   4                  // Not yet ready to run: just decrement the delay 
 158   4                  hSCH_tasks_G[Index].Delay -= 1;
 159   4                  }
 160   3               }         
 161   2            }
 162   1         }   
 163          
 164          
 165          /*------------------------------------------------------------------*-
 166            ---- END OF FILE -------------------------------------------------
 167          -*------------------------------------------------------------------*/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    285    ----
   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 + -