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

📄 os_sched.h

📁 在基于avr内核的单片机上实现MP3播放器的功能
💻 H
字号:
//进行任务调度  这只是个轮询的调度方法,不是很好,但是也不算太糟。
void OSSched(void) 
{  
   //  根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况 

 // __asm__ __volatile__("fisrt_last_OSSched: \n\t"); 
  __asm__ __volatile__("PUSH __zero_reg__         \n\t");  //R1 
  __asm__ __volatile__("PUSH __tmp_reg__          \n\t");  //R0  
  __asm__ __volatile__("IN   __tmp_reg__,__SREG__ \n\t");  //保存状态寄存器SREG 
  __asm__ __volatile__("PUSH __tmp_reg__          \n\t");  //保存状态寄存器SREG 
  __asm__ __volatile__("CLR  __zero_reg__         \n\t");  //R1重新清零 
  __asm__ __volatile__("PUSH R2                  \n\t");   
  __asm__ __volatile__("PUSH R3                  \n\t"); 
  __asm__ __volatile__("PUSH R4                  \n\t"); 
  __asm__ __volatile__("PUSH R5                  \n\t"); 
  __asm__ __volatile__("PUSH R6                  \n\t"); 
  __asm__ __volatile__("PUSH R7                  \n\t"); 
  __asm__ __volatile__("PUSH R8                  \n\t"); 
  __asm__ __volatile__("PUSH R9                  \n\t"); 
  __asm__ __volatile__("PUSH R10                  \n\t"); 
  __asm__ __volatile__("PUSH R11                  \n\t"); 
  __asm__ __volatile__("PUSH R12                  \n\t"); 
  __asm__ __volatile__("PUSH R13                  \n\t");     
  __asm__ __volatile__("PUSH R14                  \n\t"); 
  __asm__ __volatile__("PUSH R15                  \n\t"); 
  __asm__ __volatile__("PUSH R16                  \n\t"); 
  __asm__ __volatile__("PUSH R17                  \n\t");     
  __asm__ __volatile__("PUSH R18                  \n\t");  
  __asm__ __volatile__("PUSH R19                  \n\t"); 
  __asm__ __volatile__("PUSH R20                  \n\t"); 
  __asm__ __volatile__("PUSH R21                  \n\t"); 
  __asm__ __volatile__("PUSH R22                  \n\t"); 
  __asm__ __volatile__("PUSH R23                  \n\t"); 
  __asm__ __volatile__("PUSH R24                  \n\t"); 
  __asm__ __volatile__("PUSH R25                  \n\t");     
  __asm__ __volatile__("PUSH R26                  \n\t"); 
  __asm__ __volatile__("PUSH R27                  \n\t"); 
 //__asm__ __volatile__("PUSH R28                  \n\t"); 
 //__asm__ __volatile__("PUSH R29                  \n\t");     
  __asm__ __volatile__("PUSH R30                  \n\t");  
  __asm__ __volatile__("PUSH R31                  \n\t");  

  __asm__ __volatile__("PUSH R28                  \n\t");  //R28与R29用于建立在堆栈上的指针 
  __asm__ __volatile__("PUSH R29                  \n\t");  //入栈完成 
   //===========================================  
     __asm__ __volatile__("Interrupt_OSSched:              \n\t");  
 TCB[OSTaskRunningPrio].OSTaskStackTop=SP;           //将正在运行的任务的堆栈底保存 
//=============================================
    unsigned char OSNextTaskPrio,j=0;   
	OSNextTaskPrio=OSTaskRunningPrio;
	OSRdyTbl &= ~(0x01<<idle_id);//挂起os_idle task 
	//******
next_task_id:  if(++OSNextTaskPrio>=OS_TASKS) //轮流运行各个任务,没有优先级 
                   OSNextTaskPrio=0; 
				  if(++j>OS_TASKS)  OSRdyTbl |= (0x01<<idle_id); //如果所有的任务都是挂起的,那么就进入idle
	  if(! (OSRdyTbl & (0x01<<OSNextTaskPrio)))  goto next_task_id;
//*****
 OSTaskRunningPrio=OSNextTaskPrio;
 //***********************
  cli();  //保护堆栈转换 
  SP=TCB[OSTaskRunningPrio].OSTaskStackTop; 
  sei(); 
   //===========================================  
    //根据中断时的出栈次序     
  __asm__ __volatile__("POP  R29                  \n\t");     
  __asm__ __volatile__("POP  R28                  \n\t");
//===============================         
  __asm__ __volatile__("POP  R31                  \n\t");     
  __asm__ __volatile__("POP  R30                  \n\t");     
  __asm__ __volatile__("POP  R27                  \n\t");     
  __asm__ __volatile__("POP  R26                  \n\t");     
  __asm__ __volatile__("POP  R25                  \n\t");     
  __asm__ __volatile__("POP  R24                  \n\t");     
  __asm__ __volatile__("POP  R23                  \n\t");     
  __asm__ __volatile__("POP  R22                  \n\t");     
  __asm__ __volatile__("POP  R21                  \n\t");     
  __asm__ __volatile__("POP  R20                  \n\t");     
  __asm__ __volatile__("POP  R19                  \n\t"); 
  __asm__ __volatile__("POP  R18                  \n\t");
  __asm__ __volatile__("POP  R17                  \n\t");   
  __asm__ __volatile__("POP  R16                  \n\t"); 
  __asm__ __volatile__("POP R15                  \n\t"); 
  __asm__ __volatile__("POP R14                  \n\t"); 
  __asm__ __volatile__("POP R13                  \n\t"); 
  __asm__ __volatile__("POP R12                  \n\t"); 
  __asm__ __volatile__("POP R11                  \n\t"); 
  __asm__ __volatile__("POP R10                  \n\t"); 
  __asm__ __volatile__("POP R9                   \n\t"); 
  __asm__ __volatile__("POP R8                   \n\t"); 
  __asm__ __volatile__("POP R7                   \n\t"); 
  __asm__ __volatile__("POP R6                   \n\t");     
  __asm__ __volatile__("POP R5                   \n\t"); 
  __asm__ __volatile__("POP R4                   \n\t"); 
  __asm__ __volatile__("POP R3                   \n\t"); 
  __asm__ __volatile__("POP R2                   \n\t");      
  __asm__ __volatile__("POP  __tmp_reg__          \n\t");      //SERG 出栈并恢复 
  __asm__ __volatile__("OUT  __SREG__,__tmp_reg__ \n\t");      // 
  __asm__ __volatile__("POP  __tmp_reg__          \n\t");      //R0 出栈 
  __asm__ __volatile__("POP  __zero_reg__         \n\t");      //R1 出栈 
  __asm__ __volatile__("RETI                      \n\t");     //返回并开中断 
    
  //中断时出栈完成 
} 

//开始任务调度
void OSStartTask(uint8 id)         
{ 
OSTaskRunningPrio=id; 
  SP=TCB[id].OSTaskStackTop;
__asm__ __volatile__("RJMP Interrupt_OSSched      \n\t");  //重新调度 
//调用子函数时

⌨️ 快捷键说明

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