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

📄 os_core.lst

📁 本RTOS参考 usOS-II, ARM-RTX
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE OS_CORE
OBJECT MODULE PLACED IN OS_CORE.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE OS_CORE.C DEBUG OBJECTEXTEND CODE SYMBOLS

stmt level    source

   1          #include "include.h"
   2          
   3          #define DEBUG
   4          #define OS_TASK_SWITCH
   5          
   6          extern uint8 idata STACK[1];
   7          //堆栈首地址
   8          uint8 data gStack;
   9          
  10          //当前任务号
  11          uint8 data OSCurrentTaskID;
  12          
  13          //下一个任务号
  14          //uint8 data OSNextTaskID; 
  15          
  16          
  17          uint8 const OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00};
  18          
  19          //uint8 data OS_IRQ_Sum;//中断计数器
  20          
  21          uint8 xdata taskMAX_stack[24];
  22          
  23          uint8  code  OSUnMapTbl[] = {
  24              0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
  25              4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
  26              5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
  27              4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
  28              6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
  29              4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
  30              5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
  31              4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
  32              7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
  33              4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
  34              5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
  35              4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
  36              6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
  37              4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
  38              5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
  39              4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
  40          };
  41          // 上面256的表可以简化为16*2的表,查表麻烦点,不过说不定最后占用代码空间更大
  42          // 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,  //0Xx0 0Xx1 0Xx2 0Xx3....0XxE 0XxF
  43          // 0, 4, 5, 4, 6, 4, 5, 4, 7, 4, 5, 4, 6, 4, 5, 4,  //0X00 0X10 0X20 0X30....0XE0 0XF0
  44          
  45          uint8   data         OSRdyGrp;                        // Ready list group
  46          uint8   data         OSRdyTbl[OS_RDY_TBL_SIZE];       // Table of tasks which are ready to run
  47          
  48          OS_TCB data Tasks_TCB[OS_MAX_TASKS];
  49          
  50          extern void Push_Reg (void);
  51          extern void Pop_Reg (void);
  52          
  53          
  54          
  55          //功能描述: 系统开始运行时初始化
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 2   

  56          void OSInit(void) SMALL
  57          {uint8 i;
  58   1          
  59   1          gStack=STACK-2; //堆栈的首地址
  60   1          //OS_IRQ_Sum = 0;
  61   1          
  62   1          OSRdyGrp=0;//就绪组标志
  63   1          memset(OSRdyTbl, 0, OS_RDY_TBL_SIZE);///就绪组内标志
  64   1          
  65   1          OSCurrentTaskID = OS_MAX_TASKS-1;//当前任务为系统任务
  66   1          
  67   1          //OSCPUInit();//初始化任务表
  68   1          for (i = 0; i < OS_MAX_TASKS; i++)
  69   1          {
  70   2             Tasks_TCB[i].pTask          = 0;      // Load Stack pointer in TCB
  71   2             //Tasks_TCB[i].OSTCBPrio    = i;  // Load task priority into TCB
  72   2             Tasks_TCB[i].OSTCBStat      = INACTIVE; //OS_STAT_RDY;    // Task is ready to run
  73   2             Tasks_TCB[i].OSTCBDly       = 0;              //Task is not delayed
  74   2             //Tasks_TCB[i].stk            = stk;
  75   2             Tasks_TCB[i].size           = 0;
  76   2             Tasks_TCB[i].stk_used       = 0;
  77   2          }
  78   1          
  79   1      }
  80          
  81          /*
  82          该函数将创建一个系统任务
  83          
  84          */
  85          //#pragma disable  //禁止所有中断
  86          void os_sys_init(pFUN task)//( void (*task)(void) )
  87          {char xdata *pstack;
  88   1       //char idata *stack_bottom;
  89   1       //uint8  IEtemp;
  90   1       uint16 addr;
  91   1       
  92   1          
  93   1          OS_AllIRQ_Unable(); //总中断禁止
  94   1          //IEtemp=Read_data(SP--);//将堆栈中的中断标志读出来 #pragma disable  //禁止所有中断
  95   1          
  96   1          OSInit();
  97   1          
  98   1          
  99   1          //系统任务地址
 100   1          addr=Read_data(SP--);     //读出刚才压入堆栈的函数地址.高地址
 101   1          addr <<= 8;
 102   1          addr += Read_data(SP) ;//Read_data(SP-1);  //读出刚才压入堆栈的函数地址.低地址.有错
 103   1          SP++;
 104   1      
 105   1          
 106   1          //保存系统任务
 107   1          Tasks_TCB[OS_MAX_TASKS-1].pTask          = (void code *)addr;  // Load Stack pointer in TCB
 108   1          //Tasks_TCB[OS_MAX_TASKS-1].OSTCBPrio      = (INT8U)priority;  // Load task priority into TCB
 109   1          Tasks_TCB[OS_MAX_TASKS-1].OSTCBStat      = READY; //OS_STAT_RDY;    // Task is ready to run
 110   1          Tasks_TCB[OS_MAX_TASKS-1].OSTCBDly       = 0;              //Task is not delayed
 111   1          Tasks_TCB[OS_MAX_TASKS-1].stk            = taskMAX_stack;
 112   1          Tasks_TCB[OS_MAX_TASKS-1].size           = sizeof(taskMAX_stack);
 113   1          Tasks_TCB[OS_MAX_TASKS-1].stk_used       = (2+13);
 114   1              
 115   1          pstack=Tasks_TCB[OS_MAX_TASKS-1].stk;
 116   1          
 117   1          //系统任务就绪
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 3   

 118   1          //OSTaskResume(OS_MAX_TASKS-1);
 119   1          OSRdyGrp               |= OSMapTbl[(OS_MAX_TASKS-1)>>3];     //prio>>3-->prio/8
 120   1          OSRdyTbl[(OS_MAX_TASKS-1)>>3]      |= OSMapTbl[(OS_MAX_TASKS-1)&0x07];   //prio&0x07-->prio%8
 121   1          
 122   1          
 123   1          //将task函数地址替换为进入该函数后地址,该函数退出后将执行task函数
 124   1          task();//该函数里面会打开中断
 125   1          //addr = (uint16)task;
 126   1          //Write_data( ++SP, addr );
 127   1          //Write_data( ++SP, addr>>8 );
 128   1          //Write_data( ++SP, IEtemp );
 129   1          
 130   1      }
 131          
 132          /*------------------------------------------------------------------*-
 133          创建任务
 134          
 135          * pFunction--任务地址
 136          * prio--优先级
 137          
 138          task,   Task to create 
 139          prio,   Task priority (1-254)
 140          stk,    Pointer to the task's stack
 141          size,   Number of bytes in the stack
 142          
 143          任务创建后进入就绪状态
 144          -*------------------------------------------------------------------*/
 145          #pragma disable  //禁止所有中断
 146          
 147          OS_TID  os_tsk_create_user( pFUN task, U8 prio, void* stk, STK_SIZE_BIT size ) SMALL 
 148          {//OS_TCB    *ptcb;
 149   1       char xdata *pstack;
 150   1       uint16 i;
 151   1          
 152   1          //OS_ENTER_CRITICAL();
 153   1      //    IrqAll_Unable();    //总中断禁止  IrqT0_Unable();   //定时器0中断禁止
 154   1          
 155   1          //ptcb=&Tasks_TCB[prio];
 156   1          if (Tasks_TCB[prio].pTask == NULL)
 157   1          {
 158   2              Tasks_TCB[prio].pTask          = task;      // Load Stack pointer in TCB
 159   2              //Tasks_TCB[prio].OSTCBPrio      = (INT8U)priority;  // Load task priority into TCB
 160   2              Tasks_TCB[prio].OSTCBStat      = READY; //OS_STAT_RDY;    // Task is ready to run
 161   2              Tasks_TCB[prio].OSTCBDly       = 0;              //Task is not delayed
 162   2              Tasks_TCB[prio].stk            = stk;
 163   2              Tasks_TCB[prio].size           = size;//size必须比2+13大
 164   2              Tasks_TCB[prio].stk_used       = 2+13;//2个任务地址+13个特殊功能寄存器
 165   2              
 166   2              //设置任务就绪表,让任务就绪
 167   2              OSRdyGrp               |= OSMapTbl[prio>>3];     //prio>>3-->prio/8
 168   2              OSRdyTbl[prio>>3]      |= OSMapTbl[prio&0x07];   //prio&0x07-->prio%8
 169   2              
 170   2              //堆栈初始化
 171   2              //OSTaskStkInit(task, prio);
 172   2              pstack=Tasks_TCB[prio].stk;
 173   2              
 174   2              *pstack++ = (uint8)task;     //任务低地址进栈
 175   2              *pstack++ = (uint16)task>>8; //任务高地址进栈
 176   2              for(i=0; i<Tasks_TCB[prio].size; i++)//初始化清空堆栈
 177   2              {
 178   3                 *pstack++ = 0;
 179   3              }
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 4   

 180   2              return (prio);
 181   2          }
 182   1          //OS_EXIT_CRITICAL();
 183   1      //    IrqAll_Enable();    //总中断允许 IrqT0_Enable();          //打开T0中断允许
 184   1          return (0);
 185   1      }    
 186          
 187          #ifndef OS_TASK_SWITCH
              //功能描述: 系统时钟中断服务函数
              //#pragma disable  //禁止所有中断
              void OSTickISR(void) interrupt 1  //OS_TIME_ISR
              {uint8 data IEtemp;
                  
                  //TH0=T0H_COUNTER;
                  //TL0=T0L_COUNTER;
                  
                  IEtemp=IE;//保存中断
                  OS_AllIRQ_Unable(); //总中断禁止
                  
                  //IE &= B0000_0000; //IE &= B0000_0001; //保留外部中断原来状态,屏蔽掉其他中断
                  
              
              //#if EN_TIMER_SHARING > 0
                  if(TH0==0)//==0说明是定时器溢出中断,!=0表示是软件设置的定时器中断
                  {
                     TH0=T0H_COUNTER;
                     TL0=T0L_COUNTER;
                     OSTimeTick();           //调用系统时钟处理函数
                  }//
                  
              //#else
              //  OSIntSendSignal(TIME_ISR_TASK_ID); // 唤醒ID为TIME_ISR_TASK_ID的任务
              //#endif
                  
                  
                  OSIntExit();                       //在完全退出中断时,才进行任务切换
                  
                  //OS_AllIRQ_Enable(); //总中断允许
                  IE=IEtemp;  //恢复所有中断状态
              }
              #else
 221              
 222          #endif
 223          
 224          /*
 225          堆栈保存内容:
 226          数据堆栈+函数地址+特殊功能积存器
 227          
 228          //功能描述: 中断退出处理函数,在此进行中断后的任务切换
 229          //IRQ_Stack_Bottom任务中断后的堆栈栈顶
 230          //在退出中断时,不让进栈的数据出栈。在完全退出中断时,才进行任务切换,
 231          1.1 保存当前任务堆栈
 232          1.2 保存任务特殊功能寄存器
 233          1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
 234          1.4 切换任务
 235          2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
 236          2.2 恢复任务特殊功能寄存器
 237          2.3 将新任务原来断点地址压入堆栈
 238          */
 239          void OSIntExit(void)    SMALL
 240          {char idata * stack_bottom;
 241   1       char xdata * stack_bottom_bak;
C51 COMPILER V7.07   OS_CORE                                                               06/09/2008 17:22:34 PAGE 5   

 242   1       //uint16 addr;
 243   1       uint16 old_addr;
 244   1       uint8 old_taskid;//
 245   1          
 246   1          old_taskid=OSCurrentTaskID;
 247   1          OSFindNextRunningTask();        //查找下一个就绪的任务
 248   1          if(old_taskid==OSCurrentTaskID) //任务不切换
 249   1            return;
 250   1          
 251   1          Tasks_TCB[OSCurrentTaskID].OSTCBStat = RUNNING; //任务运行中
 252   1          //系统不备份调用本函数压入的堆栈
 253   1          old_addr=Read_data(SP--);     //读出刚才压入堆栈的函数地址.高地址
 254   1          old_addr <<= 8;
 255   1          old_addr += Read_data(SP--);  //读出刚才压入堆栈的函数地址.低地址
 256   1          
 257   1          stack_bottom=gStack+1;//当前任务堆栈底地址
 258   1          stack_bottom_bak=Tasks_TCB[old_taskid].stk;//当前任务堆栈底备份地址
 259   1          
 260   1          //1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
 261   1          Tasks_TCB[old_taskid].stk_used=SP-gStack;//任务堆栈已经使用数量
 262   1          memcpy(stack_bottom_bak, stack_bottom, SP-gStack);
 263   1          
 264   1          //1.4 切换任务.前面已经执行过
 265   1          //OSFindNextRunningTask();        //查找下一个就绪的任务
 266   1          
 267   1          //2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
 268   1          stack_bottom=gStack+1;//当前任务堆栈底地址

⌨️ 快捷键说明

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