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

📄 arm_00_os_core.lst

📁 嵌入式系统OS2 在ARM LPC213X 平台上的模板
💻 LST
📖 第 1 页 / 共 2 页
字号:
  213   6                 Length+=OSSizePerBlock;  //则Length累加一块的长度
  214   6                }
  215   5               Mask<<=1;  //调整掩码到下一位
  216   5              }
  217   4            }
  218   3           OSExitCritical();  //退出临界段
  219   3           return Length;   //返回使用的内存数量
  220   3          }
  221   2      
  222   2         case GET_MEMORY_POOL_SIZE:  //如果是获取缓冲池大小,
  223   2          {
  224   3           OSExitCritical();  //退出临界段
  225   3           return OSSizeOfMemoryPool;  //返回缓冲池的字节数
  226   3          }
  227   2      
  228   2         case MEMORY_TEST:  //如果是内存检测
  229   2          {
  230   3           j=0xFF;  //标志j为非0,即初始化成功
  231   3           prints("Memory testing. ",1);  //显示信息
  232   3           for(i=0;i<OSSizeOfMemoryPool/4;i++)  //检测整个内存缓冲池
  233   3            {
  234   4             OSMemoryPool[i]=0x55555555;   //写入0x55555555
  235   4             if(OSMemoryPool[i]!=0x55555555)  //如果读回的不是0x55555555
  236   4              {
  237   5               j=0;  //则测试失败
  238   5              }
  239   4             OSMemoryPool[i]=0xAAAAAAAA;   //写入0xAAAAAAAA
  240   4             if(OSMemoryPool[i]!=0xAAAAAAAA)  //如果读回的不是0xAAAAAAAA
  241   4              {
  242   5               j=0;  //则测试失败
  243   5              }
  244   4             OSMemoryPool[i]=0;   //写入0
  245   4             if(OSMemoryPool[i]!=0)  //如果读回的不是0
  246   4              {
  247   5               j=0;  //则测试失败
  248   5              }
  249   4             if(i%(OSSizeOfMemoryPool/4/80)==0)  //显示测试进度。共显示80个>
  250   4              {
  251   5               prints(">",0);
  252   5              }
  253   4            }
  254   3           prints("",1);
  255   3           if(j)  //如果测试成功
  256   3            {
ARM COMPILER V2.00d,  ARM_00_OS_Core                                                       22/12/07  19:56:45  PAGE 5   

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

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

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

⌨️ 快捷键说明

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