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

📄 sch51.lst

📁 《时间触发嵌入式系统设计模式》一书中的合作式调度器的算法
💻 LST
📖 第 1 页 / 共 2 页
字号:
 183                                                                  const unsigned int PERIOD)  // 连续的运行之间的间隔(时标)
 184          {
 185   1              unsigned char Index = 0;
 186   1              // 首先在队列中找到一个空隙(如果有的话)
 187   1              while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
 188   1              {
 189   2                      Index++;        // 如果没有,就在队列中一下位置检索
 190   2              }
 191   1      
 192   1              // 是否已经到达队列的结尾?
 193   1              if (Index == SCH_MAX_TASKS)
 194   1              {
 195   2                      // 任务队列已满
 196   2                      // 设置全局错误变量
 197   2                      Error_code_G = ERROR_SCH_TOO_MANY_TASKS;
 198   2                      // 同时返回错误代码
 199   2                      return SCH_MAX_TASKS;
 200   2              }
 201   1      
 202   1              // 如果能运行到这里,则说明任务队列中有空间
 203   1              SCH_tasks_G[Index].pTask = pFunction;
 204   1              SCH_tasks_G[Index].Delay = DELAY;
 205   1              SCH_tasks_G[Index].Period = PERIOD;
 206   1              SCH_tasks_G[Index].RunMe = 0;
 207   1              // 返回任务的位置(以便以后删除)
 208   1              return Index;   
 209   1      }
 210          
 211          
 212          /*---------------------------------------------------------*-
 213           * 函数名称: SCH_Delete_Task()
 214           * 入    口: TASK_INDEX -任务索引.由SCH_Add_task()提供
 215           * 
 216           * 出    口: 返回值: RETURN_ERROR(或)RETURN_NORMAL
 217           *              
 218           * 函数功能: 从调度器删除任务.
 219           * 
 220           * 说    明: 请注意:并不是从存储器中删除相关的函数,仅仅是不再
 221           *                       由调度器调用这个任务.
 222           *
 223           * 当前版本: 1.1                         * 取代版本:
 224           * 作    者: wsl                 * 原作者  : Michael J.Pont
 225           * 完成日期: 2006-09-14          * 完成日期: 
 226          -*---------------------------------------------------------*/
 227          bit SCH_Delete_Task(const unsigned char TASK_INDEX)
 228          {
 229   1              bit Return_code;
 230   1      
 231   1              if (SCH_tasks_G[TASK_INDEX].pTask == 0)
 232   1              {
 233   2                      // 这里没有任务
 234   2                      // 设置全局错误变量
 235   2                      Error_code_G = ERROR_SCH_CANNOT_DELETE_TASK;
 236   2                      // 同时返回错误代码
 237   2                      Return_code = RETURN_ERROR;
 238   2              }
 239   1              else
 240   1              {
 241   2                      Return_code = RETURN_NORMAL;
C51 COMPILER V8.08   SCH51                                                                 10/02/2007 07:17:23 PAGE 5   

 242   2              }
 243   1      
 244   1              // 删除任务
 245   1              SCH_tasks_G[TASK_INDEX].pTask = 0x00;
 246   1              SCH_tasks_G[TASK_INDEX].Delay = 0;
 247   1              SCH_tasks_G[TASK_INDEX].Period = 0;
 248   1              SCH_tasks_G[TASK_INDEX].RunMe = 0;
 249   1      
 250   1              // 返回状态
 251   1              return Return_code;
 252   1      }
 253          
 254          /*---------------------------------------------------------*-
 255           * 函数名称: SCH_Update()
 256           * 入    口: 
 257           * 出    口:
 258           * 函数功能: 在调度器的中断服务程序中运行
 259           * 
 260           * 说    明: "刷新"函数,确定某个任务需要运行时,将这个任务的
 261           *                       RunMe标志加1,然后该任务将由调度程序执行.
 262           *
 263           * 当前版本: 1.1                         * 取代版本:
 264           * 作    者: wsl                 * 原作者  : Michael J.Pont
 265           * 完成日期: 2006-09-14          * 完成日期:
 266          -*---------------------------------------------------------*/
 267          void SCH_Updata(void)
 268          {
 269   1              unsigned char Index;
 270   1              // 注意: 计算单位为"时标" (不是毫秒)
 271   1              for (Index=0; Index < SCH_MAX_TASKS; Index++)
 272   1              {
 273   2                      // 检测这里是否有任务?
 274   2                      if (SCH_tasks_G[Index].pTask != 0)
 275   2                      {
 276   3                              if (SCH_tasks_G[Index].Delay == 0)
 277   3                              {
 278   4                                      // 任务需要运行
 279   4                                      SCH_tasks_G[Index].RunMe += 1;  // RunMer标志加1
 280   4                                      if (SCH_tasks_G[Index].Period != 0)
 281   4                                      {
 282   5                                              // 调度定期的任务再次运行
 283   5                                              SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;   
 284   5                                      }
 285   4                              }
 286   3                              else
 287   3                              {
 288   4                                      // 还没有准备好运行,延迟减1
 289   4                                      SCH_tasks_G[Index].Delay -= 1;          
 290   4                              }
 291   3                      }       
 292   2              }
 293   1      }
 294          /*---------------------------------------------------------*-
 295           * 函数名称: SCH_Init_Timer2()
 296           * 入    口: 
 297           * 出    口:
 298           * 函数功能: 准备调度器数据结构并且设置定时器以所需的频率中断
 299           * 
 300           * 说    明: 调度器初始化化函数,必须在使用调度器之前调用它
 301           *
 302           * 当前版本: 1.1                         * 取代版本:
 303           * 作    者: wsl                 * 原作者  : Michael J.Pont
C51 COMPILER V8.08   SCH51                                                                 10/02/2007 07:17:23 PAGE 6   

 304           * 完成日期: 2006-09-14          * 完成日期:
 305          -*---------------------------------------------------------*/
 306          void SCH_Init_Timer2(void)
 307          {
 308   1              unsigned char i;
 309   1              
 310   1              for (i=0; i<SCH_MAX_TASKS; i++)
 311   1              {
 312   2                      SCH_Delete_Task(i);
 313   2              }
 314   1      
 315   1              // 复位全局错误变量
 316   1              // - SCH_Delete_Task()将产生一个错误代码
 317   1              // (因为任务队列是空的)
 318   1      //      Error_code_G = 0;
 319   1      
 320   1              // 设置定时器2
 321   1              // 16位定时自动重装
 322   1              T2CON = 0x04;
 323   1              
 324   1              TH2 = PRELOAD_05mS_H;
 325   1              RCAP2H = PRELOAD_05mS_H;
 326   1              TL2 = PRELOAD_05mS_L;
 327   1              RCAP2L = PRELOAD_05mS_L;
 328   1              
 329   1              ET2 = 1;        // 使能定时器2中断
 330   1              TR2 = 1;        // 启动定时器2  
 331   1      }
 332          
 333          
 334          /*---------------------------------------------------------*-
 335           * 函数名称: SCH_Start()
 336           * 入    口: 
 337           * 出    口:
 338           * 函数功能: 通过允许中断来启动调度器
 339           * 
 340           * 说    明: 在添加了所有定期的任务之后调用,从而使任务保持同步.
 341           *                       注意:应该只使能调度器中断
 342           *
 343           * 当前版本: 1.1                         * 取代版本:
 344           * 作    者: wsl                 * 原作者  : Michael J.Pont
 345           * 完成日期: 2006-09-14          * 完成日期: 
 346          -*---------------------------------------------------------*/
 347          void SCH_Start(void)
 348          {
 349   1              EA = 1;
 350   1      }
 351          
 352          
 353          
 354          
 355          
 356          //**************END OF FILE*********************************
 357          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    504    ----
   CONSTANT SIZE    =     22    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     59       3
C51 COMPILER V8.08   SCH51                                                                 10/02/2007 07:17:23 PAGE 7   

   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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