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

📄 arm_00_os_core.lst

📁 看看ARM菜鸟在ARM7上写的操作系统——ARM圈圈操作系统 最近在ADuC7027上写了一个ARM_00_OS
💻 LST
📖 第 1 页 / 共 2 页
字号:
  211   3           return Length;   //返回使用的内存数量
  212   3          }
  213   2      
  214   2         case GET_MEMORY_POOL_SIZE:  //如果是获取缓冲池大小,
  215   2          {
  216   3           OSExitCritical();  //退出临界段
  217   3           return OSSizeOfMemoryPool;  //返回缓冲池的字节数
  218   3          }
  219   2      
  220   2         case MEMORY_TEST:  //如果是内存检测
  221   2          {
  222   3           j=0xFF;  //标志j为非0,即初始化成功
  223   3           prints("Memory testing. ",1);  //显示信息
  224   3           for(i=0;i<OSSizeOfMemoryPool/4;i++)  //检测整个内存缓冲池
  225   3            {
  226   4             OSMemoryPool[i]=0x55555555;   //写入0x55555555
  227   4             if(OSMemoryPool[i]!=0x55555555)  //如果读回的不是0x55555555
  228   4              {
  229   5               j=0;  //则测试失败
  230   5              }
  231   4             OSMemoryPool[i]=0xAAAAAAAA;   //写入0xAAAAAAAA
  232   4             if(OSMemoryPool[i]!=0xAAAAAAAA)  //如果读回的不是0xAAAAAAAA
  233   4              {
  234   5               j=0;  //则测试失败
  235   5              }
  236   4             OSMemoryPool[i]=0;   //写入0
  237   4             if(OSMemoryPool[i]!=0)  //如果读回的不是0
  238   4              {
  239   5               j=0;  //则测试失败
  240   5              }
  241   4             if(i%(OSSizeOfMemoryPool/4/80)==0)  //显示测试进度。共显示80个>
  242   4              {
  243   5               prints(">",0);
  244   5              }
  245   4            }
  246   3           prints("",1);
  247   3           if(j)  //如果测试成功
  248   3            {
  249   4             prints("Memory test passed.",1);  //显示成功
  250   4            }
  251   3           else  //否则,
  252   3            {
  253   4             prints("Memroy test failed.",1);  //显示测试失败
  254   4            }
  255   3           OSExitCritical();  //退出临界段
  256   3           return j;  //返回是否成功
ARM COMPILER V2.50a,  ARM_00_OS_Core                                                       16/05/06  14:55:44  PAGE 5   

  257   3          }
  258   2         default: OSExitCritical();return 0;
  259   2        }
  260   1      }
  261          //////////////////////////////////End of function//////////////////////////////////////////////
  262          
  263          
  264          /**********************************************************************************************
  265          功能:进入临界段。
  266          入口参数:无。
  267          返回:无。
  268          备注:该函数使用的是将中断分配寄存器清0的方法来关中断。比起用软中断,运行速度要快。
  269                如果要开某个中断,则应该先调用一次该函数,然后再修改中断备份变量CopyOfIRQEN跟CopyOfFIQEN
  270                的值,而不能直接修改IRQEN跟FIQEN的值。否则会出错。
  271          **********************************************************************************************/
  272          void OSEnterCritical(void)
  273          {
  274   1       if(OSEnCrCount==0)   //如果前面未关中断
  275   1        {
  276   2         CopyOfIRQEN=IRQEN;  //则将IRQEN跟FIQEN的值保存到备份中
  277   2         CopyOfFIQEN=FIQEN;
  278   2         FIQCLR=0xFFFFFFFF;
  279   2         IRQCLR=0xFFFFFFFF;  //将FIQEN跟IQREN清除
  280   2        }
  281   1       OSEnCrCount++;  //进入临界段次数加1
  282   1      }
  283          //////////////////////////////////End of function//////////////////////////////////////////////
  284          
  285          
  286          /**********************************************************************************************
  287          功能:退出临界段
  288          入口参数:无。
  289          返回:无。
  290          备注:无。
  291          **********************************************************************************************/
  292          void OSExitCritical(void)
  293          {
  294   1       if(OSEnCrCount>=1)  //如果进入临界段的次数大于等于1次
  295   1        {
  296   2         OSEnCrCount--;    //则次数减1
  297   2         if(OSEnCrCount==0)  //如果减次数减到0,则要开中断
  298   2          {
  299   3           FIQEN=CopyOfFIQEN;  //设置所需要开的中断
  300   3           IRQEN=CopyOfIRQEN;
  301   3          }
  302   2        }
  303   1      }
  304          //////////////////////////////////End of function//////////////////////////////////////////////
  305          
  306          
  307          /**********************************************************************************************
  308          功能:将pcb指向的任务从延时列表中删除
  309          入口参数1:pcb。被指定的任务。
  310          返回:0:删除失败。非0:删除成功。
  311          备注:该函数使用前,应先进入临界段。
  312          **********************************************************************************************/
  313          uint32 DeleteFromDelayList(OSpcb *pcb)
  314          {
  315   1       if(pcb->Next==0){return 0;}   //如果被删除的任务为表底,则不能删除,返回删除失败
  316   1       if(pcb==OSDelayList)   //如果被删除的pcb处于表头
  317   1        {
  318   2         OSDelayList=pcb->Next;  //则延时表指向被删除任务pcb的下一个
  319   2         OSDelayList->Prior=OSDelayList;  //延时表的前趋指向它本身
  320   2        }
  321   1       else  //如果被删除的任务pcb处于中间,则
  322   1        {
ARM COMPILER V2.50a,  ARM_00_OS_Core                                                       16/05/06  14:55:44  PAGE 6   

  323   2         pcb->Prior->Next=pcb->Next;   //pcb的前趋的后趋,设置为pcb的后趋
  324   2         pcb->Next->Prior=pcb->Prior;  //pcb的后趋的前趋,设置为pcb的前趋
  325   2        }
  326   1       return (uint32)pcb;   //返回被删除的任务pcb
  327   1      }
  328          //////////////////////////////////End of function//////////////////////////////////////////////
  329          
  330          
  331          /**********************************************************************************************
  332          功能:将pcb指向的任务从就绪态列表中删除
  333          入口参数1:pcb。被指定的任务。
  334          返回:0:删除失败。非0:删除成功。
  335          备注:该函数使用前,应先进入临界段。
  336          **********************************************************************************************/
  337          uint32 DeleteFromReadyList(OSpcb * pcb)
  338          {
  339   1       if(pcb->Next==0)return 0;  //如果被删除的任务为表底,则不能删除,返回删除失败
  340   1       if(pcb==OSReadyList)       //如果被删除的pcb处于表头
  341   1        {
  342   2         OSReadyList=pcb->Next;   //则就绪表指向被删除任务pcb的下一个
  343   2         OSReadyList->Prior=OSReadyList;  //就绪表的前趋指向它本身
  344   2        }
  345   1       else              //如果被删除的任务pcb处于中间,则
  346   1        {
  347   2         pcb->Prior->Next=pcb->Next;   //pcb的前趋的后趋,设置为pcb的后趋
  348   2         pcb->Next->Prior=pcb->Prior;   //pcb的后趋的前趋,设置为pcb的前趋
  349   2        }
  350   1       return (uint32)pcb;   //返回被删除的任务pcb
  351   1      }
  352          //////////////////////////////////End of function//////////////////////////////////////////////
  353          
  354          
  355          /**********************************************************************************************
  356          功能:将pcb指向的任务从挂起列表中删除
  357          入口参数1:pcb。被指定的任务。
  358          返回:0:删除失败。非0:删除成功。
  359          备注:该函数使用前,应先进入临界段。
  360          **********************************************************************************************/
  361          uint32 DeleteFromSuspendList(OSpcb *pcb)
  362          {
  363   1       if(pcb->Next==0)return 0;  //如果被删除的任务为表底,则不能删除,返回删除失败
  364   1       if(pcb==OSSuspendList)       //如果被删除的pcb处于表头
  365   1        {
  366   2         OSSuspendList=pcb->Next;   //则挂起态表指向被删除任务pcb的下一个
  367   2         OSSuspendList->Prior=OSSuspendList;  //挂起态表的前趋指向它本身
  368   2        }
  369   1       else              //如果被删除的任务pcb处于中间,则
  370   1        {
  371   2         pcb->Prior->Next=pcb->Next;   //pcb的前趋的后趋,设置为pcb的后趋
  372   2         pcb->Next->Prior=pcb->Prior;   //pcb的后趋的前趋,设置为pcb的前趋
  373   2        }
  374   1       return (uint32)pcb;   //返回被删除的任务pcb
  375   1      }
  376          //////////////////////////////////End of function//////////////////////////////////////////////
  377          
  378          
  379          /**********************************************************************************************
  380          功能:将pcb指向的任务插入到挂起列表中
  381          入口参数1:pcb。被指定的任务。
  382          返回:无。
  383          备注:该函数使用前,应先进入临界段。
  384          **********************************************************************************************/
  385          void InsertToSuspendList(OSpcb * pcb)
  386          {
  387   1       pcb->Status=OSInSuspendStatus;  //指定任务的状态设置为挂起状态
  388   1       pcb->Next=OSSuspendList;           //指定任务的后趋指向挂起态列表的表头
ARM COMPILER V2.50a,  ARM_00_OS_Core                                                       16/05/06  14:55:44  PAGE 7   

  389   1       OSSuspendList->Prior=pcb;          //挂起态任务列表的前趋指向指定任务pcb
  390   1       OSSuspendList=pcb;                 //挂起态列表的表头设置为刚插入的指定任务
  391   1       OSSuspendList->Prior=OSSuspendList; //挂起态列表表头的前趋指向它本身
  392   1      }
  393          //////////////////////////////////End of function//////////////////////////////////////////////
  394          
  395          
  396          /**********************************************************************************************
  397          功能:将pcb指向的任务插入到延时列表中
  398          入口参数1:pcb。被指定的任务。
  399          返回:无。
  400          备注:该函数使用前,应先进入临界段。
  401          **********************************************************************************************/
  402          void InsertToDelayList(OSpcb * pcb)
  403          {
  404   1       pcb->Status=OSInDelayStatus;   //指定任务的状态设置为延时状态
  405   1       pcb->Next=OSDelayList;         //指定任务的后趋指向延时态列表的表头
  406   1       OSDelayList->Prior=pcb;        //延时态任务列表的前趋指向指定任务pcb
  407   1       OSDelayList=pcb;               //延时态列表的表头设置为刚插入的指定任务
  408   1       OSDelayList->Prior=OSDelayList; //延时态列表表头的前趋指向它本身
  409   1      }
  410          //////////////////////////////////End of function//////////////////////////////////////////////
  411          
  412          
  413          /**********************************************************************************************
  414          功能:将pcb指向的任务插入到就绪表中
  415          入口参数1:pcb。被指定的任务。
  416          返回:无。
  417          备注:该函数使用前,应先进入临界段。
  418          **********************************************************************************************/
  419          void InsertToReadyList(OSpcb *pcb)
  420          {
  421   1       OSpcb * TempPcb;   //用来查找就绪表,确定该插入到何处
  422   1       
  423   1       pcb->Status=OSInReadyStatus;     //指定任务的状态设置为就绪态
  424   1       
  425   1       TempPcb=OSReadyList;   //设置为就绪表表头
  426   1      
  427   1       do
  428   1        {
  429   2         if((pcb->Priority)<=(TempPcb->Priority))   //如果要插入的任务优先级高于或者等于被查找到的任务,则将其

⌨️ 快捷键说明

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