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

📄 os_core.c

📁 从Keil C51 的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决 重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于 Ke
💻 C
字号:
/*************************************************************************
*                           Point RTOS(51)                               *
*                 The Real-Time Kernel(For Keil c51)                     *
*                                                                        *
*                     (c) Copyright 2005, PenGH                          *
*                         All Rights Reserved                            *
*                                                                        *
*                               V0.9.1                                  *
*                                                                        *
*        File :  OS_CORE.C                                               *
*      Author :  彭光红                                                  *
*     History :  
*                2005/08  By PenGH
*************************************************************************/


/*----------------------------------------------------------------------*/

#define   __IN_OS_CORE__

#include ".\include\config.h"


/*************************************************************************
*
*  MODEL NAME  : IDATA
*  DESCRIPTION : 全局数据空间定义
*
*************************************************************************/
UINT8 data OSTaskID;
UINT8 data OSNextTaskID;

UINT8 data OSWaitTick[OS_MAX_TASKS+1];
UINT8 data OSTaskRuning;
UINT8 data OSTaskCreated;

UINT8 const OSMapTbl[]={0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

/*************************************************************************
*
*  MODEL NAME  : OSInit
*  DESCRIPTION : 操作系统初始化
*
*************************************************************************/
void OSInit(void) small
{
    OSTaskID = OS_MAX_TASKS;
    OSNextTaskID = 0;
    OSCPUInit();
}

/*************************************************************************
*
*  MODEL NAME  : OSTaskCreate
*  DESCRIPTION : 任务建立
*
*************************************************************************/
UINT8 _OSTaskCreate(UINT8 TaskID, \
                    void (code * task)(void), \
                    void xdata *ptos) small
{
   extern idata UINT8 STACK[];

    if (TaskID < OS_MAX_TASKS+1)
    {
      if ((OSTaskCreated & OSMapTbl[TaskID]) != 0)
      {
        return FALSE;
      }
      OSTaskCreated |= OSMapTbl[TaskID]; //任务建立标记
      OSTaskRuning |= OSMapTbl[TaskID];  //任务运行就绪标记
      
      OSTaskStkInit(task, ptos, TaskID);    //
      return TRUE;
  }
  return FALSE;
}

/*************************************************************************
*
*  MODEL NAME  : OSTaskResume
*  DESCRIPTION : 任务恢复
*
*************************************************************************/
void OSTaskResume(UINT8 TaskID)  small
{
    if(TaskID<OS_MAX_TASKS)
      OSTaskRuning |= OSMapTbl[TaskID];
}

/*************************************************************************
*
*  MODEL NAME  : OSTaskSuspend
*  DESCRIPTION : 任务休眠
*
*************************************************************************/
void OSTaskSuspend(UINT8 TaskID) small
{
    if (TaskID < OS_MAX_TASKS)
    {
      OSTaskRuning &= ~OSMapTbl[TaskID];
    }
}


/*************************************************************************
*
*  MODEL NAME  : OSFindNextRunningTask
*  DESCRIPTION : 查找下个运行任务
*
*************************************************************************/
void OSFindNextRunningTask(void) small
{
    UINT8 temp;

    temp = OSTaskRuning & OSTaskCreated;

    /* 查找处于就绪状态最高优先级任务 */
    for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS+1; OSNextTaskID++)
    {
        if ( temp & 0x01 )
        {
            return;//break;
        }
        temp = temp >> 1;
    }
    return;
}

/*************************************************************************
*
*  MODEL NAME  : OSSched
*  DESCRIPTION : 任务调度
*
*************************************************************************/
void  OSSched(void) small
{
    OSFindNextRunningTask();
    if(OSNextTaskID!=OSTaskID)
    {
      OS_TASK_SW();                   /* 进行任务调度 */
    }
}

/*************************************************************************
*
*  MODEL NAME  : OSTimeTick
*  DESCRIPTION : 时钟处理函数
*
*************************************************************************/
//void  OSTimeTick(void)  small
//{
//    UINT8 i;
//
//    for (i = 0; i < OS_MAX_TASKS+1; i++)
//    {
//        if (OSWaitTick[i] != 0 )
//        {
//            OSWaitTick[i]--;
//            if (OSWaitTick[i] == 0)
//            {
//              OSTaskRuning |= OSMapTbl[i]; 
//            }
//        }
//    }
//}

/*************************************************************************
*
*  MODEL NAME  : OSSleep
*  DESCRIPTION : 任务休眠
*
*************************************************************************/
void OSSleep(UINT8 ticks)  small
{
//    EA=0;
    OSTaskSuspend(OSTaskID);
    OSWaitTick[OSTaskID] = ticks;                  /*   设置超时时间   */
//    EA=1;
    if(ticks)
    {
      OSSched();                                         /*  任务切换  */
    }
}

/*************************************************************************
*
*  MODEL NAME  : OSWakeup
*  DESCRIPTION : 任务唤醒
*
*************************************************************************/
void OSWakeup(UINT8 TaskID)    small
{
    OSWaitTick[TaskID] = 0;
    OSTaskResume(TaskID);
}


/*************************************************************************
*
*  MODEL NAME  : OSTimeDly
*  DESCRIPTION : 任务延时
*
*************************************************************************/
void OSTimeDly(UINT8 ticks)    small
{
   UINT8 tmp;
   
   tmp = OSWaitTick[OSTaskID];  
   if(ticks)
   {
      OSWaitTick[OSTaskID] = ticks;               /* 设置超时时间       */
      while(OSWaitTick[OSTaskID]);
	  OSWaitTick[OSTaskID]=tmp;
   }
}

/* The end of file */

⌨️ 快捷键说明

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