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

📄 arm_00_os_core.lst

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

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

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

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

⌨️ 快捷键说明

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