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

📄 untitled1.txt

📁 一个多任务调度器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
unsigned char KW1_count=0;      //按键延迟计数器  
unsigned char KW3_count=0;      //按键延迟计数器  
unsigned char Key_delay_count=0;//无键按下延迟计数器  
unsigned char count_500ms=0;  
unsigned int  AUO_count_val=25200;//自动状态计数变量;  
unsigned char disp_buff[3]={0,0,0};   //显示寄存器  
//unsigned int  Sec_count=25200;   //0.5秒计数器  
                      
void Hex_Bcd(unsigned int x)         
{unsigned char i;  
unsigned int j;  
j=x;  
for(i=0;i<3;i++)  
    {disp_buff[i]=j%10;  
     j=j/10;  
    }  
}                      

void off_led(void)                 
{COM1=1;  
COM2=1;  
COM3=1;  
}  

void on_led(unsigned char x)         
{if(x==0)COM1=0;  
else if(x==1)COM2=0;  
else  COM3=0;  
}  
/*  
void delay_us(unsigned char x)      
{unsigned char i;  
for (i=0;i<x;i++);  
}  
*/  
void out_164(unsigned char x)       
{unsigned char i;  
for (i=0;i<8;i++)  
     { CLK=0;  
       CLK=0;  
       if((x<<i)&0x80)DATA=1;  
       else DATA=0;  
    //  CLK=0;  
    //  CLK=0;  
       CLK=1;  
       CLK=1;  
     }  
   
}  

void cpu_kz_Init(void)              //cpu端口初始化函数  
{P1=0xff;  
P3=0xff;  
}  

void Key_Update(void)               
{if(CU_AU==0)                       
    {start_one=1;                     
     CU_AU_down_fg=1;               
     if(++CU_AU_count>200)  
       {CU_AU_down_fg=0;  
        CU_AU_count=210;  
        Work_fg=1 ;      
       }  
    }  
  else                            
    {if(CU_AU_down_fg)             
       {if((CU_AU_count>1)&&(CU_AU_count<30))  
           {CU_AU_fg=~CU_AU_fg;                 
            Work_fg=0;  
            CU_AU_down_fg=0;  
            Key_delay_count=0;  
            OUT_1KW=LED_1KW=1;  
            OUT_3KW=LED_3KW=1;  
            KW3_fg=KW1_fg=0;  
            }  
       }  
     CU_AU_count=0;    
    }     
  if(CU_AU_fg==0)                  
    {if(KW1==0)                    
       {start_one=1;                     
        KW1_count++;}  
     else  
       {if(KW1_count>1)  
           {KW1_fg=~KW1_fg;  
            Work_fg=1;  
            }  
        KW1_count=0;  
       }  
     if(KW3==0)                   
       {start_one=1;                     
        KW3_count++;  
        }  
     else  
       {if(KW3_count>1)  
           {KW3_fg=~KW3_fg;  
            Work_fg=1;  
            }  
        KW3_count=0;  
       }    
  }     
if(start_one==0)  
        {if(++Key_delay_count>200)  
           {CU_AU_fg=1;         
            Work_fg=1;  
            start_one=1;  
            }  
        }  
}  

void Disp_Update(void)          
{off_led();  
if((CU_AU_fg==1)&&(Work_fg==1))   
     {  
      Hex_Bcd(AUO_count_val/240);    
      if(led_disp_index==0)   
         {if(Sec_500ms_fg)  
           { out_164(Tab[disp_buff][0]]&0x7f);}  
          else{out_164(Tab[disp_buff][0]]);}   
         }  
          else if(led_disp_index==1)out_164(Tab[disp_buff][1]]);  
          else if(led_disp_index==2)out_164(Tab[disp_buff][2]]);  
          on_led(led_disp_index);  
     }  
else if((CU_AU_fg==1)&&(Work_fg==0))   
      {if(led_disp_index==0) out_164(Tab[0]);  
          else if(led_disp_index==1)out_164(Tab[12]);  
          else if(led_disp_index==2)out_164(Tab[10]);  
          on_led(led_disp_index);  
      }   
else if((CU_AU_fg==0)&&(Work_fg==1))   
      {if(led_disp_index==0) out_164(Tab[0]);  
          else if(led_disp_index==1)out_164(Tab[12]);  
          else if(led_disp_index==2)out_164(Tab[11]);  
          on_led(led_disp_index);  
      }   
else if((CU_AU_fg==0)&&(Work_fg==0))   
      {if(led_disp_index==0) out_164(Tab[0]);  
          else if(led_disp_index==1)out_164(Tab[12]);  
          else if(led_disp_index==2)out_164(Tab[11]);  
          on_led(led_disp_index);  
      }             
  if(++led_disp_index>2)led_disp_index=0;      
}  

void Work_Update(void)            
{if((CU_AU_fg==1)&&(Work_fg==1))   
   {if(AUO_count_val>0)  
      { if(++count_500ms>=2)  
           {Sec_500ms_fg=~Sec_500ms_fg;   
            count_500ms=0;  
            }    
        AUO_count_val-=1;  
        if(AUO_count_val>43200)        
          {LED_CUO=1;  
           LED_AUO=0;  
           OUT_1KW=LED_1KW=0;  
           OUT_3KW=LED_3KW=0;  
          }   
        else if(AUO_count_val>0)          
               {LED_CUO=1;  
                LED_AUO=0;  
                OUT_1KW=LED_1KW=0;  
                OUT_3KW=LED_3KW=1;  
               }   
        else {LED_CUO=1;LED_AUO=0;       
              OUT_1KW=LED_1KW=1;  
              OUT_3KW=LED_3KW=1;  
              Sec_500ms_fg=0;  
             }  
       }   
    }        
else if((CU_AU_fg==1)&&(Work_fg==0))    
         {LED_CUO=1;LED_AUO=0;  
          OUT_1KW=LED_1KW=1;  
          OUT_3KW=LED_3KW=1;  
         }                               
else if((CU_AU_fg==0)&&(Work_fg==1))   
        {AUO_count_val=50400;  
         LED_CUO=0;LED_AUO=1;  
         if(KW1_fg)OUT_1KW=LED_1KW=0;  
         else OUT_1KW=LED_1KW=1;  
         if(KW3_fg)OUT_3KW=LED_3KW=0;  
         else OUT_3KW=LED_3KW=1;  
        }  
else if((CU_AU_fg==0)&&(Work_fg==0))   
        {AUO_count_val=50400;  
         LED_CUO=0;LED_AUO=1;  
         OUT_1KW=LED_1KW=1;  
         OUT_3KW=LED_3KW=1;  
        }   
}  

/**************************************************  
OS_main.c  
**************************************************/  
#include "Main.h"  

static void SCH_Go_To_Sleep(void);  
static tWord Error_tick_count_G;  
static tByte Last_error_code_G;  
void SCH_Init_T0(void);         
void SCH_Start(void);  

/*****************************************  
以下程序需要根据实际情况修改  
/*****************************************/  
void cpu_kz_Init(void);  
void Key_Update(void);  
void Disp_Update(void);  
void Work_Update(void);   
/*****************************************/  
    
typedef data struct   
   {void (code * pTask)(void);    
    tWord Delay;         
    tWord Period;         
    tByte RunMe;         
   } sTask;   

void  SCH_Dispatch_Tasks(void);  
tByte SCH_Add_Task(void (code*) (void), const tWord, const tWord);    
bit   SCH_Delete_Task(const tByte);  
void  SCH_Report_Status(void);  

sTask SCH_tasks_G[SCH_MAX_TASKS];  
tByte Error_code_G = 0;  

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)();  // Run the task  
          SCH_tasks_G[Index].RunMe -= 1;   // Reset / reduce RunMe flag  
          if (SCH_tasks_G[Index].Period == 0)  
             {  
             SCH_Delete_Task(Index);  
             }  
         }  
      }  
    SCH_Report_Status();    
    SCH_Go_To_Sleep();            
   }  

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;   
   }  


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;       // return 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; // Reset error code  
            }  
         }  
      }  
#endif  
   }  


void SCH_Go_To_Sleep()  
   {  
   PCON |= 0x01;     
   //PCON |= 0x01;    // Enter idle mode (#1)  
   //PCON |= 0x20;    // Enter idle mode (#2)  
   }  

 
   下载了两天,看了之後觉得好像看故事书-.- 
引用了超大量例子说明一件事情但却表明不了在说明的问题所要
用到的详细解决方法.其它看到210页中的一个例仔是这样子的: 
void main(void) 
{ 
        //设置调度器 
        SCH_Init_T2(); 
        //为"Flash_LED"任务准备 
        LED_Flash_Init(); 
        //增加"Flash LED"任务(1000ms亮,1000ms灭) 
        //定时单位为时标(1ms时标间隔) 
        //(最大的间隔/延迟是65535个时标) 
        SCH_Add_Task(LED_Flash_Update, 0, 1000); 
        //开始调度 
        SCH_Start();//刷新任务 
        while(1) 
        { 
                SCH_Disptch_Tasks(); 
        } 
} 
void SCH_Update(void) interrupt INTRTTUPT_Timer_2_Overflow 
{ 
        //刷新任务 
        ...... 
} 
// 
这个例子到底是如何表达这个 "合作式调度器" 呢!? 
其实是不是说在一个程程式运行的时後,就不知道将要做些什麽,要接到一些输入或者本身想要定时 
做一些时情,而家些事情将会在main 主体中置位,但是是在其中一个中断里作这些加到到的事件,当然 
在做这些事之前要先将某些要做的动作置位,这样中断里就可以利用这些置位和相关的参数做中断里
事!? 当中断(这个我想在设置调度器的时後要先输入一些参数,如是多少间隔就要查一下你有没
有事要做) 
里查到你有事要做,而参数要你做一次或多次或每隔一段时间做事的. 
假如中断查到要做一个动作就是闪led的一个动作置位了就检查这个事件的参数,
如果一次就做完後就把 
这个动作清0 如果要是做多次的就把这个参数减1 看看是否等於0,如果是的话清0(当然可以加很多动作) 
// 
但是如果加入有10个任务,检查做处理都是一个一个的顺序做把? 
我是看不太懂里面所说的调度器是不是我想的那一种.... 
// 
最初想到的一些概念是来自linux,看到书里介和网上介绍了一些linux处理任务的问题, 
要是有一个任务要做,系铳就是做这件事,要是有n种任务,它可以同时处理n个,而这种处理是自动按时 
按要用到的ram自动分配给任务,要是任务多了,就会所有任务的运作都会变慢... 
难道这书是要介绍这样的软件设计结构吗!!!!!!?????? 
// 
哪位大侠可以教教我这个合作式调度器 或者说调度器到底是什麽一个概念呢? 

⌨️ 快捷键说明

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