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

📄 os_core.lst

📁 基于51的圈圈操作系统(51_00_OS)出来拉…… 来这里下载整个程序包: http://blog.21ic.com/more.asp?name=computer00&id=9501
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   OS_CORE                                                               02/25/2006 14:24:57 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE OS_CORE
OBJECT MODULE PLACED IN OS_core.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE OS_core.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*******************************************************
   2          *************基于51内核的圈圈操作系统*****************
   3          本程序只供学习使用,未经作者许可,不得用于其它任何用途
   4          
   5          OS_core.c file
   6          
   7          Created by Computer-lov
   8          Date: 2005.10.27
   9          
  10          Edit date:2006.2.24
  11          
  12          Version V1.0
  13          Copyright(C) Computer-lov 2005-2015
  14          All rigths reserved
  15          
  16          ******************************************************/
  17          
  18          #include "at89x52.h"
  19          
  20          #include "OS_core.h"
  21          #include "task_switch.h"
  22          #include "MAIN.H"
  23          
  24          #include "UART.H"
  25          
  26          
  27          //OS运行标志
  28          volatile unsigned char OS_Running;
  29          
  30          //运行时间
  31          volatile unsigned int OS_Run_Time;
  32          
  33          //程序控制块
  34          idata volatile PCB OS_pcb[MAX_TASK];
  35          
  36          //当前运行任务的ID号
  37          volatile unsigned char OS_Current_ID;
  38          
  39          //用来统计使用了多少次OS_Enter_Critical
  40          //以判断使用OS_Exit_Critical退出临界段时是否需要真的退出
  41          //如果没有这样的判断,当OS_Enter_Critical被嵌套使用时,
  42          //会因为中间的OS_Exit_Critical退出临界段,而导致后半部分得不到保护
  43          volatile unsigned char OS_En_Cr_Count;
  44          
  45          
  46          //一字节,用位来表志是否存在一个任务
  47          // 例如,0000 0101 表示0号跟2号任务存在
  48          volatile unsigned char OS_Task_List;
  49          
  50          
  51          //堆栈申请。堆栈被分成5个块。每个块大小为0x1B(即27字节)
  52          //在os_core.h中修改S_DEPTH宏可修改堆栈的大小
  53          //在os_core.h中修改MAX_TASK可改变最大任务数,注意:现在最多可支持8个任务
  54          unsigned char idata OS_Stack[MAX_TASK][S_DEPTH];
  55          
C51 COMPILER V7.06   OS_CORE                                                               02/25/2006 14:24:57 PAGE 2   

  56          
  57          ///////////////////////////////////挂起任务 ////////////////////////////////////////////////
  58          void OS_Suspend(void)
  59          {
  60   1       OS_Enter_Critical();          //进入临界段
  61   1       if(OS_Current_ID==0)              //任务0不能挂起!!!
  62   1        {
  63   2         OS_Exit_Critical();
  64   2         return;
  65   2        }
  66   1       OS_pcb[OS_Current_ID].Suspend=1;    //任务挂起
  67   1       OS_Exit_Critical();           //退出临界段
  68   1       OS_Task_Switch();                //任务切换
  69   1      }
  70          ////////////////////////////////////////////////////////////////////////////////////////////
  71          
  72          /////////////////////////////////////调用该函数使任务延时t个时钟节拍////////////////////////
  73          ///////////////////////////////////// 输入参数:0<t<256       //////////////////////////////
  74          /////////////////////////////////////  一个时钟节拍为10mS    ///////////////////////////////
  75          void OS_Delay(unsigned char t)
  76          {
  77   1       if(t==0)return;                     //如果t=0,则不延迟
  78   1       OS_Enter_Critical();                 //进入临界段
  79   1       if(OS_Current_ID==0)              //任务0不能延时!!!
  80   1        {
  81   2         OS_Exit_Critical();
  82   2         return;
  83   2        }
  84   1       OS_pcb[OS_Current_ID].Suspend=1;    //任务挂起
  85   1       OS_pcb[OS_Current_ID].Delay=t;      //设置延迟节拍数
  86   1       OS_Exit_Critical();                 //退出临界段
  87   1       OS_Task_Switch();                  //任务切换
  88   1      }
  89          ////////////////////////////////////////////////////////////////////////////////////////////
  90          
  91          
  92          //////////////////////////////// 等待消息  /////////////////////////////////////////////////
  93          ////////////////////////////////入口参数:等待超时时间 0-255 //////////////////////////////
  94          ///////////////////////////////返回:0-超时  1-不超时 //////////////////////////////////////
  95          unsigned char OS_Wait_Msg(unsigned char time_out)
  96          {
  97   1       if(time_out==0)         //如果超时时间设置为0
  98   1        {
  99   2         OS_Suspend();         //则无限等待
 100   2         return 1;               //返回
 101   2        }
 102   1       OS_Delay(time_out);             //等待直到超时或者被其它任务唤醒
 103   1       OS_Enter_Critical();            //进入临界段
 104   1       if(OS_pcb[OS_Current_ID].Delay==0)    //如果是因为由于时间到了而被唤醒,则超时
 105   1        {
 106   2         OS_Exit_Critical();           //退出临界段
 107   2         return 0;                     //返回0,表示等待超时
 108   2        }
 109   1       else                            //如果等待时间未到而被唤醒,则没有超时
 110   1        {
 111   2         OS_pcb[OS_Current_ID].Delay=0;      //将多余的时间清0
 112   2         OS_Exit_Critical();           //退出临界段
 113   2         return 1;                     //返回1,表示等待消息成功,不超时
 114   2        }
 115   1      }
 116          ////////////////////////////////////////////////////////////////////////////////////////////
 117          
C51 COMPILER V7.06   OS_CORE                                                               02/25/2006 14:24:57 PAGE 3   

 118          
 119          ///////////////////////////////////////  OS初始化 /////////////////////////////////////////
 120          void OS_Init(void)
 121          {
 122   1       OS_Running=0;              //任务未开始运行
 123   1       OS_Run_Time=0;             //运行时间为0            
 124   1       OS_Task_List=0;            //任务列表为0
 125   1       OS_En_Cr_Count=0;          //进入临界段0次
 126   1      }
 127          ///////////////////////////////////////////////////////////////////////////////////////////
 128          
 129          
 130          /////////////////////////////////////////创建一个任务////////////////////////////////////////////
 131          //////////////////////////////           Task_Priority  任务优先级     /////////////////////////
 132          ///////////////////////////////          Task_p    任务入口地址       //////////////////////////
 133          ///////////////////////////////          Msg_p     消息起始地址       ///////////////////////////
 134          unsigned int OS_Task_Create(unsigned char Task_Priority,unsigned int Task_p,unsigned char Msg_p)
 135          {
 136   1       static unsigned char i;
 137   1       static unsigned char OK_flag;
 138   1       static unsigned char Task_ID;
 139   1       static unsigned char Stack_p;
 140   1      
 141   1       OS_Enter_Critical();    //由于需要在运行过程中动态增加任务,所以需要临界段保护
 142   1       
 143   1       OK_flag=0;              //创建成功标志初始化为0,表示失败
 144   1       for(i=0;i<MAX_TASK;i++)   //查找资源

⌨️ 快捷键说明

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