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

📄 sch.c

📁 这是应用在AVR单片机上的小型操作系统。在任务级别运行。成功运行在ATmega16上。
💻 C
字号:
#include "MySch.h"

/////////////////////////////////////////////////////////////////////////////
//SCH  调度器内核函数


//   任务调度器数组 
sTask SCH_tasks_G[SCH_MAX_TASKS];


/*
***********************************************
*  void SCH_Init_T0(void) 
***********************************************
*/

void SCH_Init_T0(void) 
{
      
	TCCR0 = (1<<CS01)|(1<<CS00);		//1024分频
	uint8_t i;
    for (i = 0; i < SCH_MAX_TASKS; i++) 
    {
        SCH_Delete_Task(i);				//删除不必要的任务
    } 

    // 定时器0,8位定时,手动重装
    TIMSK &= 0xFD;         // Clear all T0 bits (T1,2 left unchanged)

    // 设置定时器0的初志
    SCH_Manual_Timer0_Reload(); 		//填装函数

    //  Interrupt Timer 0 enabled
    TIMSK |= 0x01;
}



/*
************************************************
*  void SCH_Start(void)
***********************************************
*/
void SCH_Start(void) 
{
   sei();							//开启全局中断
}

/*
************************************************************
*  
* void SCH_Update(void) interrupt INTERRUPT_Timer_0_Overflow 
*
*************************************************************
*/
SIGNAL(SIG_OVERFLOW0) 
{
    uint8_t Index;

    SCH_Manual_Timer0_Reload();

    for ( Index = 0;  Index < SCH_MAX_TASKS;  Index++ )
    {
        if (SCH_tasks_G[Index].pTask)
        {
            //**********************************************************
           if (SCH_tasks_G[Index].Delay == 0)
           {
                  // 给可以被调度的任务设置标志位
                // 说明:任务运行标志位不具有存储功能,也就是说,如果在规定的
                //       间隔内没有被运行,则机会丧失
                SCH_tasks_G[Index].RunMe += 1;  // Inc. the 'Run Me' flag

                   if (SCH_tasks_G[Index].Period)//将任务需要的延时装入
                   {
                       SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
                }
             }
            //************************************************************
            else
             {
                    SCH_tasks_G[Index].Delay -= 1;//延时-1
             }
            //************************************************************
        }         
    }
} 

/*
************************************************************
*  
* void SCH_Manual_Timer0_Reload()
*
*************************************************************
*/
void SCH_Manual_Timer0_Reload()
{
   
   TCNT0=0X83;						//64分频下1ms
}

/*
********************************************************************************************************
*     
*                             任务调度器内核
*
********************************************************************************************************
*/


/*
************************************************************
*  
* void SCH_RUN_Tasks(void) 
*
************************************************************
*/
void SCH_RUN_Tasks(void) 
{
   uint8_t 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);
         }
      }
   }
}

/*
************************************************************
*  
*     uchar SCH_Add_Task
*
*************************************************************
*/
uint8_t SCH_Add_Task( const void (*pFunction)(void), 
                    uint16_t DELAY, 
                    uint16_t PERIOD)    
{
   uint8_t Index = 0;
   
   while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
   {
      Index++;					
   } 
   
   // Have we reached the end of the list?   
   if (Index == SCH_MAX_TASKS)
   {
      // Task list is full
      
      return SCH_MAX_TASKS;  
    }
      
   // If we're here, there is a space in the task array
   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; // return position of task (to allow later deletion)
}

/*
************************************************************
*  
*     uint8_t SCH_Delete_Task(const uchar TASK_INDEX) 
*
*************************************************************
*/
uint8_t SCH_Delete_Task( uint8_t TASK_INDEX) 
{
   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 0;       // return status
}

⌨️ 快捷键说明

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