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

📄 sch51.lst

📁 《时间触发嵌入式系统设计模式》一书中的合作式调度器的算法
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.08   SCH51                                                                 10/02/2007 07:17:23 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE SCH51
OBJECT MODULE PLACED IN SCH51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SCH51.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*--------------------------------------------------------------------*-
   2          
   3                  SCH51.C (V1.00)
   4          
   5                  这里是调度器的内核函数,这个函数可以用于所有的8051芯片.
   6                  
   7              --- SCH_MAX_TASKS必须由用户设置 ----
   8                   
   9          -*---------------------------------------------------------------------*/
  10          
  11          /*
  12           * Copyright (c) 2006
  13           * All rights reserved
  14           * 
  15           * 文件名称: SCH51.C 
  16           * 文件标识: 
  17           * 摘    要: 内核函数
  18           * 
  19           * 当前版本: 1.1                         * 取代版本:
  20           * 作    者: wsl                 * 原作者  : Michael J.Pont
  21           * 完成日期: 2006-09-14          * 完成日期:
  22           ************************************************************************/
  23          
  24          #include"main.H"
  25          #include"Port.H"
  26          #include"SCH51.H"
  27          #include "MMI.h"
  28          #include"Uart.h"
  29          #include"LedDisp.h"
  30          #include"key.h"
  31          
  32          
  33          /*私有函数*/
  34          static void SCH_Updata(void);
  35          static void SCH_Report_Status(void);
  36          //---------------公用常数-------------------------------
  37          // 在任一时刻要求的任务最大数目
  38          // 每个新建项目都必须调整
  39          #define SCH_MAX_TASKS (8)
  40          //-------公用变量定义-----------------------------------------------------
  41          // 任务队列
  42          sTask SCH_tasks_G[SCH_MAX_TASKS];
  43          
  44          
  45          
  46          #define RETURN_NORMAL (bit)0
  47          #define RETURN_ERROR (bit)1
  48          // 错误代码
  49          #define ERROR_SCH_TOO_MANY_TASKS (1)
  50          #define ERROR_SCH_CANNOT_DELETE_TASK (2)
  51          // 用来显示错误代码
  52          static unsigned char Error_code_G = 0;
  53          static unsigned char RTCCounter = 0;
  54          
  55          
C51 COMPILER V8.08   SCH51                                                                 10/02/2007 07:17:23 PAGE 2   

  56          /*---------------------------------------------------------*-
  57           * 函数名称: SCH_Update_Server()
  58           * 入    口: 
  59           * 出    口:
  60           * 函数功能: 调度器的中断服务程序
  61           * 
  62           * 说    明: "刷新"函数,确定某个任务需要运行时,将这个任务的
  63           *                       RunMe标志加1,然后该任务将由调度程序执行.
  64           *
  65           * 当前版本: 1.1                         * 取代版本:
  66           * 作    者: wsl                 * 原作者  : Michael J.Pont
  67           * 完成日期: 2006-09-14          * 完成日期:
  68          -*---------------------------------------------------------*/
  69          void SCH_Update_Server(void)interrupt 5 
  70          {
  71   1              static unsigned char KeytimeRunCnt;
  72   1              TF2 = 0; // 必须手工清除
  73   1              
  74   1              if( (++RTCCounter == 200) )
  75   1              {       
  76   2                      RTCCounter = 0;
  77   2                      RTC_Soft_clock();                       /*定时器例行程序*/
  78   2                      /*每秒钟查询一次是否有闹铃时间到*/
  79   2                      if (RingIDRegister > 0)
  80   2                      {       /*响铃*/
  81   3                              Ring_server();
  82   3                      }
  83   2              }
  84   1      
  85   1              if (++KeytimeRunCnt == 2)
  86   1              {
  87   2                      KeytimeRunCnt = 0;
  88   2                      KeyPad();               /*每10毫秒扫描一次键盘*/
  89   2              }
  90   1              FlashFreq();
  91   1              SCH_Updata();
  92   1      }
  93          
  94          
  95          /*---------------------------------------------------------*-
  96           * 函数名称: SCH_Dispatch_Tasks()
  97           * 入    口: 
  98           * 出    口:
  99           * 函数功能: 调度函数,当一个任务()需要运行时,此函数将运行它,
 100           * 
 101           * 说    明: 这个函数必须被主循环(重复)调用 
 102           *
 103           * 当前版本: 1.1                         * 取代版本:
 104           * 作    者: wsl                 * 原作者  : Michael J.Pont
 105           * 完成日期: 2006-09-14          * 完成日期:
 106          -*---------------------------------------------------------*/
 107          void SCH_Dispatch_Tasks(void)
 108          {
 109   1              unsigned char Index;
 110   1      
 111   1              // 调度(运行)下一个任务(如果有任务就绪)
 112   1              for (Index=0; Index<SCH_MAX_TASKS; Index++)
 113   1              {
 114   2                      if (SCH_tasks_G[Index].RunMe > 0)
 115   2                      {
 116   3                              // 运行任务
 117   3                              (*SCH_tasks_G[Index].pTask)();
C51 COMPILER V8.08   SCH51                                                                 10/02/2007 07:17:23 PAGE 3   

 118   3                              // 复位 / 降低RunMe标志
 119   3                              SCH_tasks_G[Index].RunMe -= 1;
 120   3      
 121   3                              // 周期性的任务将自动地再次运行
 122   3                              // 如果这个是'单次'任务,将它从队列中删除
 123   3                              if (SCH_tasks_G[Index].Period == 0)
 124   3                              {
 125   4                                      SCH_Delete_Task(Index);
 126   4                              }
 127   3                      }
 128   2              }
 129   1              
 130   1              // 报告系统状况
 131   1              SCH_Report_Status();
 132   1      }
 133          
 134          /*---------------------------------------------------------*-
 135           * 函数名称: SCH_Report_Status()
 136           * 入    口: 
 137           * 出    口:
 138           * 函数功能: 用来显示错误代码
 139           * 
 140           * 说    明: 错误只在有限的时间内显示,此后错误代码被复位为0.
 141           *
 142           * 当前版本: 1.1                         * 取代版本:
 143           * 作    者: wsl                 * 原作者  : Michael J.Pont
 144           * 完成日期: 2006-09-14          * 完成日期: 
 145          -*---------------------------------------------------------*/
 146          void SCH_Report_Status(void)
 147          {
 148   1              // 只在需要报告错误时适用
 149   1              // 检查新的错误代码
 150   1              if (Error_code_G != 0)
 151   1              {
 152   2                      switch (Error_code_G)
 153   2                      {
 154   3                              case 1: uart_send_string("Tasks Full\n", 0);    break;  // 任务队列已满
 155   3                              case 2: uart_send_string("No Tasks\n", 0);      break;  // 这里没有任务
 156   3                              default: break;
 157   3                      }
 158   2              }
 159   1              
 160   1              Error_code_G = 0; // 复位错误代码
 161   1      }
 162          
 163          
 164          /*---------------------------------------------------------*-
 165           * 函数名称: SCH_Add_Task()
 166           * 入    口: (*pFunction)任务指针,(DELAY)到第一次运行间隔时标,
 167           *                       (PERIOD)每次运行的间隔时标
 168           *
 169           * 出    口: 返回SCH_MAX_TASKS表示任务队列已满
 170           *                       返回(Index)=任务位置
 171           *
 172           * 函数功能: 用来添加任务到任务队列上,以保证它们在需要的时
 173           *                       候被调用
 174           * 
 175           * 说    明: 使任务函数每隔一定间隔或在用户的延迟之后执行.
 176           *
 177           * 当前版本: 1.1                         * 取代版本:
 178           * 作    者: wsl                 * 原作者  : Michael J.Pont
 179           * 完成日期: 2006-09-14          * 完成日期:
C51 COMPILER V8.08   SCH51                                                                 10/02/2007 07:17:23 PAGE 4   

 180          -*---------------------------------------------------------*/
 181          unsigned char SCH_Add_Task(void (code *pFunction)(),    // 任务指针
 182                                                                  const unsigned int DELAY,       // 延迟Delay个时标后函数将第一次运行

⌨️ 快捷键说明

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