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

📄 arm_00_os_core.lst

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


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

stmt  level    source

    1          /**********************************************************************************************
    2          本程序只供学习使用,不得用于其它任何用途,否则后果自负。
    3          
    4            ARM_00_OS_Core.c file
    5             
    6            作者:Computer-lov
    7            建立日期:2006-5-1
    8            修改日期:2006-5-15
    9            版本:V1.0
   10            版权所有,盗版必究。
   11            任何技术问题可到我的博客上留言:    http://computer00.21ic.org
   12            Copyright(C) Computer-lov 2006-2016
   13            All rights reserved
   14          **********************************************************************************************/
   15          
   16          #include <ADuC7027.H>
   17          
   18          #include "interrupt.h"
   19          #include "LED.H"
   20          #include "ARM_00_OS_TaskSwitch.H"
   21          #include "my_type.h"
   22          #include "ARM_00_OS_Core.H"
   23          #include "UART.H"
   24          #include "KEYS.H"
   25          #include "Task.h"
   26          
   27          OSpcb * OSReadyList;    //就绪态任务表表头
   28          OSpcb * OSSuspendList;  //挂起态任务表表头
   29          OSpcb * OSDelayList;    //延时态任务表表头
   30          OSpcb * OSCurrentPcb;   //当前运行的任务
   31          
   32          
   33          OSpcb OSSystemIdlePcb;  //系统空闲任务
   34          OSShortPcb OSSuspendListBottom;    //挂起态列表表底
   35          OSShortPcb OSDelayListBottom;      //延时态列表表底 
   36          
   37          
   38          OSdevice OSDeviceBottom;       //设备列表的底部
   39          OSdevice * OSDeviceList;       //设备列表
   40          
   41          
   42          volatile uint32 CopyOfIRQEN;    //用来备份IRQEN的状态
   43          volatile uint32 CopyOfFIQEN;    //用来备份FIQEN的状态
   44          volatile uint32 OSEnCrCount;    //用来统计进入临界代码段次数
   45          
   46          
   47          volatile uint32 TaskAmount;    //用来统计共有多少个任务
   48          
   49          
   50          volatile uint32 TimeOfTaskStart;  //用来保存一个任务刚被切换到运行态的时刻
   51          
   52          #define OSMemoryLack       0x0000000100000000  /*错误号:内存资源不足*/
   53          
   54          /**********************************************************************************************
   55          功能:内存管理。
   56          入口参数1:Operation。操作方式。可以设置为MEMORY_ALLOCATION(分配)、MEMORY_FREE(释放)、统计使用量(MEM
             -ORY_STATISTIC)
   57          入口参数2:StartAddr。起始地址,释放内存时使用。
   58          入口参数3:Length。申请内存或释放内存时的长度,单位为字节。但实际分配时,是按块分配的,所以分配时,
ARM COMPILER V2.50a,  ARM_00_OS_Core                                                       16/05/06  14:55:44  PAGE 2   

   59                     实际分配到的数量可能会比指定的多,所以分配时,最好按块的整数倍大小来指定分配长度。
   60                     
   61          返回:32无符号型整数。
   62                当操作为分配内存时,返回32位的内存首地址,返回0表示无足够多的可以用内存。
   63                当操作为释放内存时,返回1表示释放成功。返回0表示释放出错。
   64                当操作为统计内存使用量时,返回的是内存被使用的字节数。
   65                当操作为获取缓冲池大小时,返回的是内存缓冲池大小。
   66          
   67          备注:缓冲池大小由OSSizeOfMemoryPool指定。每块的大小由OSSizePerBlock指定             
   68          **********************************************************************************************/
   69          uint32 OSMemoryManage(uint32 Operation,uint32 StartAddr,uint32 Length)
   70          {
   71   1        //内存分配表
   72   1        //内存分配表是32位整数的一维数组。用每一位来表示一块是否被使用。当某位设置为1时,表示那一块被使用。
   73   1        //当某位为0时,表示那一块可用。
   74   1       static uint32  OSMemoryTable[OSSizeOfMemoryPool/OSSizePerBlock/32];
   75   1                                                                            
   76   1       static uint32 OSMemoryPool[OSSizeOfMemoryPool/4]; //内存缓冲池。内存缓冲池为一个大是数组
   77   1       
   78   1       uint32 BlankCount;    //统计空块的计数器
   79   1       uint32 Mask;          //分配内存时用的掩码
   80   1       volatile uint32 i,j;  //循环用的变量
   81   1      
   82   1       OSEnterCritical();   //进入临界段
   83   1       
   84   1       switch(Operation)     //根据操作码,选择不同的操作
   85   1        {
   86   2         case MEMORY_INIT:   //如果是内存初始化
   87   2          {
   88   3           for(i=0;i<OSSizeOfMemoryPool/OSSizePerBlock/32;i++)
   89   3            {
   90   4             OSMemoryTable[i]=0;  //则将整张内存分配表清0
   91   4            }
   92   3           OSExitCritical();  //退出临界段
   93   3           return 1;   //返回1
   94   3          }
   95   2      
   96   2         case MEMORY_ALLOCATION:  //如果是内存分配,则
   97   2          {
   98   3           BlankCount=0;   //先将内存空块的数量清0
   99   3           for(i=0;i<(OSSizeOfMemoryPool/OSSizePerBlock/32);i++)  //扫描整个内存分配表
  100   3            {
  101   4             Mask=1;   //掩码被设置为1,即最低位为1,其它位为0。
  102   4             if(OSMemoryTable[i]==0xFFFFFFFF)  //如果该字中的所以位都为1,表示该字节对应的所有块都被占用
  103   4              {
  104   5               BlankCount=0;  //空块计数器置0
  105   5               continue;      //退出本次循环,查找下一个字
  106   5              }
  107   4             for(j=0;j<32;j++)  //扫描一个字的32个bit是否有空闲的RAM
  108   4              {
  109   5               if((Mask & OSMemoryTable[i])==0)  //如果该位为0,表示该块空闲
  110   5                {
  111   6                 BlankCount++;   //空块计数器加1。
  112   6                }
  113   5               else
  114   5                {
  115   6                 BlankCount=0;  //如果遇到非空块,则空块计数器置0。
  116   6                }
  117   5               if((BlankCount*OSSizePerBlock)>=Length)  //如果空闲的RAM,大于或者等于需要的长度,那么分配成功
  118   5                {
  119   6                 //计算被分配到的内存的起始地址,并将其保存在StartAddr中。
  120   6                 StartAddr=((uint32)OSMemoryPool)+(i*32+j+1)*OSSizePerBlock-OSSizePerBlock*BlankCount;
  121   6                 while(1)  //设置被使用的块为1
  122   6                  {
  123   7                   OSMemoryTable[i] |=Mask;  //将已经被分配的标志为1
  124   7                   Mask>>=1;   //调整掩码的值
ARM COMPILER V2.50a,  ARM_00_OS_Core                                                       16/05/06  14:55:44  PAGE 3   

  125   7                   if(j==0)   //如果已到最低位
  126   7                    {
  127   8                     Mask=0x80000000; //则掩码调整为第31位为1
  128   8                     j=32;
  129   8                     i--;  //移到下一位
  130   8                    }
  131   7                   BlankCount--;  //空块计数减1
  132   7                   j--;   //移到下一个字
  133   7                   if(BlankCount==0)  //如果空块计数器减到0,则标志完毕
  134   7                    {
  135   8                     OSExitCritical();
  136   8                     return StartAddr;   //将启始地址StartAddr返回
  137   8                    }
  138   7                  }
  139   6                }
  140   5               Mask<<=1;  //掩码调整,移动到下一个块
  141   5              }
  142   4            }
  143   3           OSExitCritical();
  144   3           return 0;  //如果没有足够大的内存块可用,则返回0,分配失败
  145   3          }
  146   2      
  147   2         case MEMORY_FREE:  //如果操作码是释放内存
  148   2          {
  149   3           if(Length==0)   //如果要释放的内存长度为0 
  150   3            {
  151   4             OSExitCritical();  //退出临界段
  152   4             return 1;    //返回1,释放成功
  153   4            }
  154   3           i=(StartAddr-(uint32)OSMemoryPool)/(32*OSSizePerBlock);   //计算出指定地址内存在内存分配表中的位置
  155   3           j=(StartAddr-(uint32)OSMemoryPool-i*32*OSSizePerBlock)/OSSizePerBlock;
  156   3           Mask=1<<j;   //将掩码调整到对应的值
  157   3           while(Length)  //直到全部被释放为止
  158   3            {
  159   4             if((OSMemoryTable[i])&(Mask)==0)   //如果该内存并未被分配,则说明发生了错误,
  160   4              {
  161   5               OSExitCritical();  //推出临界段
  162   5               return 0;      //返回0,表示释放失败
  163   5              }
  164   4             OSMemoryTable[i] &=~Mask;  //清除对应的位,即释放该块内存
  165   4             j++;      //调整到下一块
  166   4             Mask<<=1;   //掩码调整到下一块的位置
  167   4             if(j==32)  //如果已经到最高位
  168   4              {
  169   5               Mask=1;  //掩码设置为1
  170   5               j=0;    //j回到最低位
  171   5               i++;    //调整下一个字
  172   5              }
  173   4             if(Length<=OSSizePerBlock)  //如果释放完毕
  174   4              {
  175   5               Length=0;  //则Length设置为0,退出循环
  176   5              }
  177   4             else  //如果没释放完毕
  178   4              {
  179   5               Length-=OSSizePerBlock;  //则长度减小一个块的量
  180   5              }
  181   4            }
  182   3           OSExitCritical();  //退出临界段
  183   3           return 1;  //返回1,表示释放成功
  184   3          }
  185   2      
  186   2         case MEMORY_STATISTIC:  //如果操作码是统计内存使用量
  187   2          {
  188   3           Length=0;  //清Length
  189   3           for(i=0;i<OSSizeOfMemoryPool/OSSizePerBlock/32;i++)   //扫描整张内存分配表
  190   3            {
ARM COMPILER V2.50a,  ARM_00_OS_Core                                                       16/05/06  14:55:44  PAGE 4   

  191   4             if(OSMemoryTable[i]==0)    //如果当前字是全0,则该字对应的内存都未被分配,
  192   4              {
  193   5               continue;   //则跳过本次循环
  194   5              }
  195   4             if(OSMemoryTable[i]==0xFFFFFFFF)   //如果当前字是全1,则该字对应的内存全部被分配
  196   4              {
  197   5               Length+=32*OSSizePerBlock;   //Length累加上32块的长度
  198   5               continue;  //退出本次循环
  199   5              }
  200   4             Mask=1;   //掩码设置为1
  201   4             for(j=0;j<32;j++)  //扫描当前字的32bit,看是否有内存被使用
  202   4              {
  203   5               if(OSMemoryTable[i]&Mask)  //如果该块被使用
  204   5                {
  205   6                 Length+=OSSizePerBlock;  //则Length累加一块的长度
  206   6                }
  207   5               Mask<<=1;  //调整掩码到下一位
  208   5              }
  209   4            }
  210   3           OSExitCritical();  //退出临界段

⌨️ 快捷键说明

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