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

📄 schcore.c

📁 这是一个合作式内核的实时系统,开发平台式KEIl51.
💻 C
字号:
/*------------------------------------------------------------------*-

   SCHCore.C 
-----------------------------------------------------------------*/

#include "Main.h"
#include "Port.h"

#include "SCHCore.h"

//数据区
sTask SCH_tasks_G[SCH_MAX_TASKS];  //调度器任务队列
tByte Error_code_G = 0;
//系统休眠函数
static void SCH_Go_To_Sleep(void);
//设置系统报错参数
static tWord Error_tick_count_G; //报错周期
static tByte Last_error_code_G; //上次报错状态


/*------------------------------------------------------------------*-
SCH_Dispatch_Tasks()
系统调度执行任务
-*------------------------------------------------------------------*/
void SCH_Dispatch_Tasks(void) 
   {
   tByte Index;

   for (Index = 0; Index < SCH_MAX_TASKS; Index++)   //查询任务队列,优先级按队列位置排列
      {
      if (SCH_tasks_G[Index].RunMe > 0) //任务就绪
         {
         (*SCH_tasks_G[Index].pTask)();  //执行任务

         SCH_tasks_G[Index].RunMe -= 1;   // 任务出列

         if (SCH_tasks_G[Index].Period == 0) //如果不是周期性任务,则删除
            {
            SCH_Delete_Task(Index);
            }
         }
      }

   // 报告系统状态
   SCH_Report_Status();  

   // 系统休眠
   SCH_Go_To_Sleep();          
   }

/*------------------------------------------------------------------*-
 SCH_Add_Task()
系统添加任务
 参数:
   *pFunction--函数名
   DELAY--启动延时,赋0则立刻执行
   PERIOD--运行周期,赋0则只执行一次
  返回值:任务号或系统报错
-*------------------------------------------------------------------*/
tByte SCH_Add_Task(void (code * pFunction)(), 
                   const tWord DELAY, 
                   const tWord PERIOD)    
   {
   tByte Index = 0;
   
   while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
      {
      Index++;
      } 
 
   if (Index == SCH_MAX_TASKS)
      {
     
      Error_code_G = ERROR_SCH_TOO_MANY_TASKS;

      return SCH_MAX_TASKS;  
      }
      

   SCH_tasks_G[Index].pTask  = pFunction;
     
   SCH_tasks_G[Index].Delay  = DELAY;
   SCH_tasks_G[Index].Period = PERIOD;

   SCH_tasks_G[Index].RunMe  = 0;

   return Index; 
   }

/*------------------------------------------------------------------*-
 SCH_Delete_Task()
系统删除任务
  参数:
	TASK_INDEX--任务号
  返回值:
    1--成功,0--失败
-*------------------------------------------------------------------*/
bit SCH_Delete_Task(const tByte TASK_INDEX) 
   {
   bit Return_code;

   if (SCH_tasks_G[TASK_INDEX].pTask == 0)   //任务为空时,删除失败
      {
      Error_code_G = ERROR_SCH_CANNOT_DELETE_TASK;
      Return_code = RETURN_ERROR;
      }
   else
      {
      Return_code = RETURN_NORMAL;
      }      
   
   SCH_tasks_G[TASK_INDEX].pTask   = 0x0000;
   SCH_tasks_G[TASK_INDEX].Delay   = 0;
   SCH_tasks_G[TASK_INDEX].Period  = 0;

   SCH_tasks_G[TASK_INDEX].RunMe   = 0;

   return Return_code;    
   }


/*------------------------------------------------------------------*-

  SCH_Report_Status()
  报告系统状态

-*------------------------------------------------------------------*/
void SCH_Report_Status(void)
   {
#ifdef SCH_REPORT_ERRORS
   if (Error_code_G != Last_error_code_G)
      {
      Error_port = 255 - Error_code_G;
      
      Last_error_code_G = Error_code_G;

      if (Error_code_G != 0)
         {
         Error_tick_count_G = 60000;
         }
      else
         {
         Error_tick_count_G = 0;
         }
      }
   else
      {
      if (Error_tick_count_G != 0)
         {
         if (--Error_tick_count_G == 0)
            {
            Error_code_G = 0; 
            }
         }
      }
#endif
   }


/*------------------------------------------------------------------*-

  SCH_Go_To_Sleep()
  系统休眠
-*------------------------------------------------------------------*/
void SCH_Go_To_Sleep()
   {
   PCON |= 0x01;   
  }

⌨️ 快捷键说明

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