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

📄 arm_00_ostaskmanager.lst

📁 看看ARM菜鸟在ARM7上写的操作系统——ARM圈圈操作系统 最近在ADuC7027上写了一个ARM_00_OS
💻 LST
字号:
ARM COMPILER V2.50a,  ARM_00_OSTaskManager                                                 16/05/06  14:55:45  PAGE 1   


ARM COMPILER V2.50a, COMPILATION OF MODULE ARM_00_OSTaskManager
OBJECT MODULE PLACED IN ARM_00_OSTaskManager.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe ARM_00_OSTaskManager.c THUMB WARNINGLEVEL(3) BROWSE DEBUG TABS(4) 

stmt  level    source

    1          /**********************************************************************************************
    2            ARM_00_OSTaskManager.c file
    3             
    4            作者:Computer-lov
    5            建立日期:2006-5-13
    6            修改日期:2006-5-15
    7            版本:V1.0
    8            版权所有,盗版必究。
    9            任何技术问题可到我的博客上留言:    http://computer00.21ic.org
   10            Copyright(C) Computer-lov 2006-2016
   11            All rights reserved
   12          **********************************************************************************************/
   13          
   14          
   15          #include <ADuC7026.H>
   16          #include "my_type.h"
   17          
   18          #include "ARM_00_OS_TaskSwitch.H"
   19          #include "ARM_00_OS_Core.H"
   20          #include "UART.H"
   21          #include "KEYS.H"
   22          #include "Task.h"
   23          #include "ADC.H"
   24          
   25          /**********************************************************************************************
   26          功能:显示任务的PID号。
   27          入口参数1:pcb。要显示的任务的进程控制块地址。
   28          返回:无。
   29          **********************************************************************************************/
   30          void DisplayPID(OSpcb * pcb)
   31          {
   32   1       print_uint32(pcb->PID);  //显示任务ID号(PID)
   33   1       send_a_byte(' ');
   34   1      }
   35          //////////////////////////////////End of function//////////////////////////////////////////////
   36          
   37          
   38          /**********************************************************************************************
   39          功能:显示任务的CPU使用率。
   40          入口参数1:pcb。要显示的任务的进程控制块地址。
   41          返回:无。
   42          **********************************************************************************************/
   43          void DisplayCPU(OSpcb * pcb)
   44          {
   45   1       uint32 CpuUsedRatio;
   46   1      
   47   1       CpuUsedRatio=((pcb->RunTimeInThisRefreshPeriod)*100+TotalTime/2)/TotalTime;  //计算CPU使用率。加TotalTim
             -e/2是为了四舍无入
   48   1       pcb->TotalRunTime+=pcb->RunTimeInThisRefreshPeriod;  //累加任务的CPU使用总时间
   49   1       pcb->RunTimeInThisRefreshPeriod=0;   //清本次统计的时间
   50   1       if(CpuUsedRatio>=100)  //如果统计的结果大于100
   51   1        {
   52   2         CpuUsedRatio=99;  //结果为99
   53   2        }
   54   1       send_a_byte((CpuUsedRatio/10)+'0');  //显示结果
   55   1       send_a_byte((CpuUsedRatio%10)+'0');
   56   1       send_a_byte('%');
   57   1       send_a_byte(' ');
   58   1       send_a_byte(' ');
ARM COMPILER V2.50a,  ARM_00_OSTaskManager                                                 16/05/06  14:55:45  PAGE 2   

   59   1      }
   60          //////////////////////////////////End of function//////////////////////////////////////////////
   61          
   62          
   63          /**********************************************************************************************
   64          功能:显示任务使用CPU的总时间。
   65          入口参数1:pcb。要显示的任务的进程控制块地址。
   66          返回:无。
   67          **********************************************************************************************/
   68          void DisplayCPUTime(OSpcb * pcb)
   69          {
   70   1       uint32 Time;   //用来保存时间
   71   1       uint8 H,M,S;   //用来保存时,分,秒
   72   1       
   73   1       Time=(uint32)((pcb->TotalRunTime)/((MaxOfTimer0+1)*100));  //计算总时间。结果为多少秒。
   74   1       S=Time%60;   //计算秒
   75   1       Time/=60;
   76   1       M=Time%(60);  //计算分
   77   1       Time/=60;
   78   1       H=Time%(24);  //计算时
   79   1       
   80   1       send_a_byte((H/10)+'0'); //显示时
   81   1       send_a_byte((H%10)+'0');
   82   1       send_a_byte(':');
   83   1       send_a_byte((M/10)+'0'); //显示分
   84   1       send_a_byte((M%10)+'0');
   85   1       send_a_byte(':');
   86   1       send_a_byte((S/10)+'0'); //显示秒
   87   1       send_a_byte((S%10)+'0');
   88   1       send_a_byte(' ');
   89   1       send_a_byte(' ');
   90   1      }
   91          //////////////////////////////////End of function//////////////////////////////////////////////
   92          
   93          
   94          /**********************************************************************************************
   95          功能:显示内存使用量
   96          入口参数1:pcb。要显示的任务的进程控制块地址。
   97          返回:无。
   98          **********************************************************************************************/
   99          void DispalyMemroyUsed(OSpcb * pcb)
  100          {
  101   1       print_uint32(pcb->StackLength);   //显示内存使用量
  102   1       send_a_byte('B');               //显示单位
  103   1       send_a_byte(' ');
  104   1       send_a_byte(' ');
  105   1      }
  106          //////////////////////////////////End of function//////////////////////////////////////////////
  107          
  108          
  109          /**********************************************************************************************
  110          功能:显示任务所处的状态。
  111          入口参数1:pcb。要显示的任务的进程控制块地址。
  112          返回:无。
  113          **********************************************************************************************/
  114          void DispalyStatus(OSpcb * pcb)
  115          {
  116   1       switch(pcb->Status)    //根据状态来显示
  117   1        {
  118   2         case OSInReadyStatus:      prints("Ready  ",0);break;  //就绪态
  119   2         case OSInDelayStatus:      prints("Delay  ",0);break;  //延时态
  120   2         case OSInSuspendStatus:    prints("Suspend",0);break;  //挂起态
  121   2         default:break;
  122   2        }
  123   1      }
  124          //////////////////////////////////End of function//////////////////////////////////////////////
ARM COMPILER V2.50a,  ARM_00_OSTaskManager                                                 16/05/06  14:55:45  PAGE 3   

  125          
  126          
  127          
  128          #define REF_VOL  2.5
  129          
  130          //////////////////////////////显示内核电压////////////////////////////////////
  131          void DisplayCoreVoltage(void)
  132          {
  133   1       uint16 value;
  134   1       uint32 result;
  135   1       uint8 s_result[10];
  136   1      
  137   1       prints("Core voltage: ",0);
  138   1       value=2*read_ADC(0x13);      //通道号为0x13的电压为1/2电源电压
  139   1       result=REF_VOL*10000;        //换算成电压,结果为多少mV的10倍
  140   1       result=result*value/4095;
  141   1       s_result[9]=0;               //将结果转换成字符串
  142   1       s_result[8]=' ';
  143   1       s_result[7]='V';
  144   1       s_result[6]='m';
  145   1       s_result[5]='0'+result%10;
  146   1       result/=10;
  147   1       s_result[4]='.';
  148   1       s_result[3]='0'+result%10;
  149   1       result/=10;
  150   1       s_result[2]='0'+result%10;
  151   1       result/=10;
  152   1       s_result[1]='0'+result%10;
  153   1       result/=10;
  154   1       s_result[0]='0'+result%10;
  155   1       prints("    ",0);
  156   1       prints(s_result,0);         //显示电压
  157   1       prints("  ",0);
  158   1      }
  159          //////////////////////////////////////////////////////////////////////////////
  160          
  161          //////////////////////////////////显示内核温度////////////////////////////////
  162          void DisplayCoreTemperature(void)
  163          {
  164   1       uint16 value;
  165   1       sint32 result;
  166   1       uint8 s_result[10];
  167   1      
  168   1       prints("Core temperature: ",0);
  169   1       value=read_ADC(0x10);         //通道号为0x10的是温度传感器电压
  170   1       result=REF_VOL*10000;         //换算成电压,结果为多少mV的10倍
  171   1       result=result*value/4095;
  172   1       result=((7800-result)*10/13)+250;   //温度是25℃时,输出电压为780mV,每升高1℃,输出电压降低1.3mV
  173   1                                           //计算结果为多少度的10倍
  174   1       if(result<0)                  //如果温度小于0度
  175   1        {
  176   2         s_result[0]='-';         //显示负号
  177   2         result*=-1;              //将结果换成正的
  178   2        }
  179   1       else
  180   1        {
  181   2         s_result[0]=' ';        //不显示负号
  182   2        }
  183   1       s_result[6]=0;            //将温度值转换成字符串,供显示用
  184   1       s_result[5]='0'+result%10;
  185   1       result/=10;
  186   1       s_result[4]='.';
  187   1       s_result[3]='0'+result%10;
  188   1       result/=10;
  189   1       s_result[2]='0'+result%10;
  190   1       result/=10;
ARM COMPILER V2.50a,  ARM_00_OSTaskManager                                                 16/05/06  14:55:45  PAGE 4   

  191   1       s_result[1]='0'+result%10;
  192   1       prints(s_result,0);        //显示温度结果
  193   1       prints("℃",1);
  194   1      }
  195          //////////////////////////////////////////////////////////////////////////////
  196          
  197          
  198          /**********************************************************************************************
  199          功能:任务管理器。
  200          入口参数:无。
  201          返回:无。
  202          备注:优先级被设置为1,处于高的优先级。
  203          **********************************************************************************************/
  204          void OSTaskManager(void)
  205          {
  206   1       OSpcb * pcb;    //
  207   1       uint32 TempTime;    //TempTime用来保存 在显示任务管理器信息所花费的时间
  208   1       uint32 DelayCount=RefreshPeriod;   //延时多少个时钟节拍刷新一次任务管理器
  209   1       uint32 * p;     //
  210   1       uint32 i;       //
  211   1       uint32 CpuUsedRatio;   //保存CPU使用率
  212   1       uint32 nBytes;         //保存申请内存的字节数
  213   1       
  214   1       uint32 PrinterDeviceAddr;   //打印机设备的入口地址
  215   1       
  216   1       PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID);  //获取打印机设备的入口地址
  217   1       OSRequestDevice(PrinterDeviceAddr,0);   //申请使用打印机
  218   1       
  219   1       prints("",1);                   //显示任务启动
  220   1       prints(OSCurrentPcb->Title,0);
  221   1       prints(" Start.",1);
  222   1       
  223   1       OSFreeDevice(PrinterDeviceAddr);   //释放打印机
  224   1       
  225   1       ADC_init();   //ADC初始化。用来检测内核电压以及温度
  226   1      
  227   1       while(1)
  228   1        {
  229   2         OSTaskDelay(DelayCount);    //延时DelayCount个时钟节拍
  230   2         
  231   2         pcb=OSCurrentPcb;       //当前运行的任务。即任务管理器本身
  232   2         TempTime=pcb->RunTimeInThisRefreshPeriod;   //保存这时的时间
  233   2         
  234   2         OSRequestDevice(PrinterDeviceAddr,0);   //申请使用打印机
  235   2         
  236   2         prints("",1);       //换行
  237   2         prints("",1);
  238   2         prints("TaskName              PID  CPU   CPUTime    MemoryUsed   Status",1);   //显示表头
  239   2         prints("---------------------------------------------------------------",1);
  240   2         
  241   2         nBytes=OSSizePerBlock*(((TaskAmount+1)*sizeof(p)+OSSizePerBlock-1)/OSSizePerBlock);  //计算需要申请多

⌨️ 快捷键说明

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