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

📄 rtx430.c

📁 MSP430单片机的实时多任务操作系统c源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    task_switch();
    
    return(0xff);
}


unsigned char os_clear_signal(unsigned char task_no)
{
   unsigned char *p;
   
   if (task_no>=RTX_MAXTASKN)return(0xff);
   
   _DINT();
   
   p=&STATE[task_no].st;
   *p&=SIG_EVENT;
   
   _EINT();
   
   return(0);
}

unsigned char os_send_signal(unsigned char task_no)
{
   unsigned char *p;
   
   clear_watchdog();

   if (task_no>=RTX_MAXTASKN)  return (0xff);

   _DINT();
   
   p=&STATE[task_no].st;

   if(*p&K_ACTIVE)
     {
        if (*p&K_SIG)*p|=K_READY;
     }
   *p|=SIG_EVENT;

   _EINT();

   return(0);
}


unsigned char isr_send_signal(unsigned char task_no)
{
   unsigned char *p;
   
   clear_watchdog();

   if (task_no>=RTX_MAXTASKN)  return (0xff);

   _DINT();
   
   p=&STATE[task_no].st;

   if(*p&K_ACTIVE)
     {
        if (*p&K_SIG)*p|=K_READY;
     }
   *p|=SIG_EVENT;

   _EINT();

   return(0);
}


unsigned char os_delete_task(unsigned char task_no)
{
    unsigned int *j,*p1,*p2;

    clear_watchdog();
    
    if(task_no>=RTX_MAXTASKN)return(0xff);

    if(!(STATE[task_no].st & K_ACTIVE))return(0xff);

    _DINT();
    STATE[task_no].st &= ~(K_ACTIVE | K_READY | K_SIG | K_TMO | K_ROBIN);
    _EINT();

  

    if(TASK_Current==task_no)
      {
         RTX_SP=STKP[task_no];
         putsp(RTX_SP);
         task_switch();
      }
    
    if(TASK_Current<task_no)
      {
         p1=(unsigned int *)(task_no==RTX_MAXTASKN ? RTX_RAMBOTTOM : STKP[task_no+1]);
         j=(unsigned int *)STKP[task_no];
         
         do{
              p2=(unsigned int *)(STKP[task_no]);     
              while(p1!=p2)
              {
                 *p1=*j;
                 p1++;
                 j++;
              }
              STKP[task_no]=(unsigned int)p1;
              task_no--;
           }while (TASK_Current!=task_no);
         return (0);
      }

    if(TASK_Current>task_no)
      {
         p1=(unsigned int *)(STKP[task_no+1]);
         j=(unsigned int *)(STKP[task_no]);
         do{
              task_no++;
              STKP[task_no]=(unsigned int)(j);
              p2=(unsigned int *)(task_no==TASK_Current ? RTX_SP : STKP[task_no+1]);
              while(p1!=p2)
              {
                 j++;
                 p1++;
                 *j=*p1;
              }
           }while(TASK_Current!=task_no);
         RTX_SP=(unsigned int)j;
         putsp(RTX_SP);
         return (0);
      }
      
   return(0xff);   
}

unsigned char os_create_task(unsigned int proc_name, unsigned char task_no)
{
   unsigned int i;
   unsigned int *j,*p1,*p2;
  
   clear_watchdog();
   
   if(task_no>=RTX_MAXTASKN)return(0xff);

   if(STATE[task_no].st&K_ACTIVE)return(0xff);

   STATE[task_no].st|=K_ACTIVE+K_READY;

   i=TASK_Current;
   
   RTX_SP=getsp();
   
   while(i<task_no)
   {
      i++;
      p1=(unsigned int *)STKP[i];
      p2=(unsigned int *)(i==RTX_MAXTASKN ? RTX_RAMBOTTOM : STKP[i+1]);
      p2--;
      while(p1!=p2)
      {
	 j=p1+5;
	 *j=*p1;
         p1--;
      }
      STKP[i]+=10;
   }
   
   if(i>task_no)
     {
        RTX_SP-=10;
        putsp(RTX_SP);
     }   

   while(i>task_no)
   {
      p1=(unsigned int *)(i==TASK_Current ? RTX_SP : STKP[i+1]);
      p2=(unsigned int *)STKP[i];
      STKP[i]-=10;
      while(p1!=p2)
      {
         j=p1+5;
         *p1=*j;
         p1++;
      }
      i--;
   }

   
   j=(unsigned int *)(STKP[task_no]-2);
   *j=proc_name;
   
   j++;
   *j=0;
   j++;
   *j=0;
   j++;
   *j=0;
   j++;
   *j=0;
    
   return(0);
}


unsigned char os_system_start(void)  /* 操作系统初始化 */
{
     unsigned char i;
     unsigned int *j,*p1,*p2;

     _DINT();
    
     clear_watchdog();
     
     RTX_TS&=~RTX_TS_REQ;

     RTX_TS&=~RTX_TS_DELAY;

     TASK_Current=0;

     i=TASK_Current;

     while(1)
     {
        if ((++i)==(RTX_MAXTASKN))i=0;
        if (STATE[i].st&K_READY)break;
     }

     RTX_SP=getsp();
     RTX_SP+=8;
     putsp(RTX_SP);
     j=(unsigned int *)RTX_SP;
     
     while(TASK_Current<i)
     {
        TASK_Current++;
        
        p1=(unsigned int *)STKP[TASK_Current];
        p2=(unsigned int *)(TASK_Current==RTX_MAXTASKN ? RTX_RAMBOTTOM : STKP[TASK_Current+1]);

        STKP[TASK_Current]=RTX_SP;
        
        while(p1!=p2)
        {
           RTX_SP-=2;
           putsp(RTX_SP);
           j--;
           p1--;
           *j=*p1;
        }
     }

     while(TASK_Current>i)
     {
        p1=(unsigned int *)(TASK_Current==RTX_MAXTASKN ? RTX_SP : STKP[TASK_Current+1]);
        p2=(unsigned int *)STKP[TASK_Current];
        
        while(j!=p2)
        {
           *p1=*j;
           p1++;
           j++;
           RTX_SP+=2;
           putsp(RTX_SP);
        }
        STKP[TASK_Current] = (unsigned int)p1;

        TASK_Current--;
      }

      RTX_RobinTime=RTX_TIMESHARING;
      
      TACTL=TASSEL1+TACLR;     //SMCL , CLREAR TAR 
      CCR0=RTX_CLOCK;
      CCTL0|=CCIE;
      TACTL|=MC1;
      
      _EINT();

      return(0x00);
}


void os_system_init(void)  /* 操作系统初始化 */
{
     unsigned char   i;

     _DINT();
     
     
     clear_watchdog();
         
     for(i=0;i<RTX_MAXTASKN;i++)
        {
	   STKP[i]=RTX_RAMBOTTOM;
	   STATE[i].st=0;
	}
     
     STKP[0]=getsp();
     
     TASK_Current=0;
}

void clear_watchdog(void)
{
     if(!(WDTCTL&WDTTMSEL))WDTCTL=WDT_ARST_250;      /* WDT 250 MS */
}

/*******************************************************************/

int task_test1(void)      /* 测试任务1 */
{
     char i;

     while(1)
     {
        i++;
        i++;
        i++;
        i++;
        //os_wait(K_SIG,0);
     };
     
     return(0x1234);
}

void task_test2(void)      /* 测试任务2 */
{
     char i;

     while(1)
     {
        i++;
        i++;
        i++;
        i++;
        //os_delete_task(2);
     };
}

void task_test3(void)      /* 测试任务3 */
{
     char i;

     while(1)
     {
        i++;
        i++;
        i++;
        i++;
     };
}


void main(void)
{
     os_system_init();                             /* 系统初始化 */
     os_create_task((unsigned int)task_test1,1);   /* 任务创建   */
     os_create_task((unsigned int)task_test2,2);   /* 任务创建   */
     os_create_task((unsigned int)task_test3,3);   /* 任务创建   */
     os_system_start();                            /* 系统运行   */
}   










⌨️ 快捷键说明

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