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

📄 os_core.c

📁 SmallRTOSAVR.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSFindNextRunningTask(void)
{
    OS_TCB_PRIO *tcbp;
    uint8 temp;

    temp = OSHighPrio;                      /* 从优先级OSHighPrio处开始查找 */
    tcbp = &(OSTCBPrioTbl[temp]);
    while (1)
    {
        if (tcbp->TcbNext != NULL)          /* 相应的优先级有任务就绪       */
        {
            OSTCBHighRdy = tcbp->TcbNext;   /* 获取将要运行的任务的TCB      */
            OSHighPrio = temp;              /* 设置下次查找起始点           */
            if (OSTickCnt == 0)             /* 没有任务需要时间服务延时     */
            if (tcbp->OSTCBDly != 0)        /* 新优先级需要轮询服务         */
            {
                                            /* 启动时间服务                 */
                OSTickCnt = tcbp->OSTCBDly;
                OSTickThisCnt = OSTickCnt;
            }
            break;
        }
        tcbp++;
        temp++;
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: OSCtxSw
** 功能描述: 堆栈处理函数
** 输 入: 无
** 输 出: 无
** 作 者: 焦进星
** 日 期: 2007年12月30日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
          void OSCtxSw(void)  
{   
  asm("PUSH __zero_reg__ \n\t");  //R1入栈 
  asm("PUSH __tmp_reg__  \n\t");  //R0入栈
  asm("PUSH R16  \n\t");          //SREG入栈
  asm("PUSH R18  \n\t"); 
  asm("PUSH R19  \n\t"); 
  asm("PUSH R20  \n\t"); 
  asm("PUSH R21  \n\t"); 
  asm("PUSH R22  \n\t"); 
  asm("PUSH R23  \n\t"); 
  asm("PUSH R24  \n\t"); 
  asm("PUSH R25  \n\t"); 
  asm("PUSH R26  \n\t"); 
  asm("PUSH R27  \n\t"); 
  asm("PUSH R30  \n\t");     
  asm("PUSH R31  \n\t"); 
  
  asm("OSIntCtxSw : \n\t");   //当中断要求调度,直接进入这里 
  
  asm("PUSH R28  \n\t");      //R28与R29入栈(中断时未入栈)
  asm("PUSH R29  \n\t"); 
  
  asm("in   r28, 0x3d \n\t"); //这四条指令不可省
  asm("in   r29, 0x3e \n\t");
  asm("sbiw r28, 0x01 \n\t");
  asm("out  0x3e, r29 \n\t");
  asm("out  0x3d, r28 \n\t");
             
  OSTCBCur->OSTCBStkPtr=(uint8 *) SP; 	//堆栈指针变换
		  
  OSTCBCur  = OSTCBHighRdy;            
  
  SP=(uint16)(OSTCBCur->OSTCBStkPtr); 
  
  asm("in    r28, 0x3d \n\t");
  asm("in    r29, 0x3e \n\t");
  asm("adiw  r28, 0x01 \n\t");
  asm("out   0x3e, r29 \n\t");
  asm("out   0x3d, r28 \n\t");
  
  //寄存器出栈  
  asm("POP  R28  \n\t");   //这四条指令不可省  
  asm("POP  R29  \n\t");
  asm("POP  R31  \n\t");     
  asm("POP  R30  \n\t");
  asm("POP  R27  \n\t");     
  asm("POP  R26  \n\t");     
  asm("POP  R25  \n\t");     
  asm("POP  R24  \n\t"); 
  asm("POP  R23  \n\t");     
  asm("POP  R22  \n\t");     
  asm("POP  R21  \n\t");     
  asm("POP  R20  \n\t");
  asm("POP  R19  \n\t"); 
  asm("POP  R18  \n\t"); 
  asm("POP  R16  \n\t"); 
  asm("POP  __tmp_reg__  \n\t");      //R0 出栈 
  asm("POP  __zero_reg__ \n\t");      //R1 出栈 
  asm("OUT  __SREG__,R16 \n\t");      //恢复SREG 
  asm("RET               \n\t");      //返回,不主动开中断!!!
  //出栈完成 
}

/*********************************************************************************************************
** 函数名称: OSIntEnter
** 功能描述: 中断进入处理函数
** 输 入: 无
** 输 出: 无
**         无
** 作 者: 焦进星
** 日 期: 2007年12月30日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void   OSIntEnter(void)
{
 		SREGTEMP=*((uint8 * )SP+15);         /* 使已入堆栈的SREG置开中断位 */
        SREGTEMP|=0x80;                             
        *((uint8 * )SP+15)=SREGTEMP;         /* 中断入栈13个加子程序调用入栈2个 */    
        OSIntNesting++;                      /* 中断嵌套加一 */
	    sei();                               /* 开中断 */
}

/*********************************************************************************************************
** 函数名称: OSIntExit
** 功能描述: 中断退出处理函数,在此进行中断后的任务切换
** 输 入: 无
** 输 出: TRUE:需要进行任务切换
**         FALSE:不需要进行任务切换
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 焦进星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,适用于atmega16/32等
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSIntExit(void)

{
    OS_ENTER_CRITICAL();
    OsEnterSum = 0;                 /* 因为在中断中,所以关中断计数器为0 */
                /* 中断嵌套处理 */
    if (OSIntNesting > 0)
    {
        OSIntNesting--;
    }
    if (OSIntNesting == 0)   
    {
        OSFindNextRunningTask();
        if (OSTCBCur != OSTCBHighRdy)
       {
         asm("POP  R17 \n\t");                  /* 去除因调用子程序而入栈的PC和因临界而的入栈的R16 */
         asm("POP  R17 \n\t"); 
		 asm("POP  R16 \n\t"); 
		 asm("RJMP OSIntCtxSw  \n\t");          /* 跳到中断的调度 */
        }
    }
    return 0;
}  

/*********************************************************************************************************
** 函数名称: OSSched
** 功能描述: 非中断的任务切换函数
** 输 入: 无
** 输 出: OS_NO_ERR
** 作 者: 陈明计
** 日 期: 2005年6月10日
**------------------------------------------------------------------------------------------------------
** 修改人: 焦进星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,适用于atmega16/32等
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8  OSSched(void)
{

    if (OSIntNesting == 0)              /* 是否是中断中调用 */
    {
        OSFindNextRunningTask();
        if (OSTCBCur != OSTCBHighRdy)
        {
            OS_TASK_SW();
        }
    }
    return OS_NO_ERR;
}

/*********************************************************************************************************
** 函数名称: SIGNAL(SIG_OVERFLOW0) 
** 功能描述: 系统定时中断函数
** 输 入: 无
** 输 出: 无
**         无
** 作 者: 焦进星
** 日 期: 2007年12月30日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        SIGNAL(SIG_OVERFLOW0)  
{ 
  OSIntEnter();
  OSTimeTick();  
  TCNT0=0xDD;     
  OSIntExit();
} 

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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