os.c

来自「Counter」· C语言 代码 · 共 84 行

C
84
字号
#include <inavr.h>
#include "oSdef.h"
 __root unsigned char OSRdyGrp, OSRdyTbl[8],prio;
 
extern void (*TaskList[])(void);
extern void (*TaskArh[])(void);
extern void (*TaskRan)(void);



const unsigned char OSMapTbl[]   = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
__flash unsigned char OSUnMapTbl[] = {
                   0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
                   4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
                     };

 
void ISR(void)
{
    unsigned char x,y;
  __disable_interrupt();
    
    y=OSUnMapTbl[OSRdyGrp];
    x=OSUnMapTbl[OSRdyTbl[y]];
    prio = (y << 3)+x;
    TaskRan = TaskList[prio];
    
  __enable_interrupt();
}

void TaskOff(unsigned char pr)
{
  __disable_interrupt();
   
   if ((OSRdyTbl[pr>>3] &= ~OSMapTbl[pr & 0x07])== 0)
    OSRdyGrp &= ~OSMapTbl[pr>>3];
  
  __enable_interrupt();
}
void TaskOn(unsigned char pr)
{
  __disable_interrupt();

      OSRdyGrp |= OSMapTbl[pr>>3];
    OSRdyTbl[pr>>3] |= OSMapTbl[pr & 0x07];

  __enable_interrupt();
}

void Reset_diseble_task(void)
{
  TaskOff(prio);
}

void Enable_Task(unsigned char Ntask)
{
  __disable_interrupt();
    
    TaskList[Ntask]=TaskArh[Ntask];

  __enable_interrupt();
}

void Disable_Task(unsigned char Ntask)
{
  __disable_interrupt();
     TaskList[Ntask]=Reset_diseble_task;
  __enable_interrupt();  
}

⌨️ 快捷键说明

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