亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? arm_00_os_core.c

?? uCOS在LPC213X上的移植。適合ARM嵌入式系統初學者。
?? C
?? 第 1 頁 / 共 4 頁
字號:
/**********************************************************************************************
本程序只供學習使用,不得用于其它任何用途,否則后果自負。

  ARM_OS_main.c file

  LPC213x上的操作系統——ARM_OS

  作者:heciang
  聯系電話:13811129591
  QQ:176780142
  Email:heciang@126.com
  建立日期:2006-5-1
  修改日期:2006-5-15
  最后修改時間:2006-08-25
  版本:V1.0
 
  Copyright(C) Computer-lov 2006-2016
  All rights reserved
**********************************************************************************************/

#include "CPU.H"

#include "interrupt.h"
#include "LED.H"
#include "ARM_00_OS_TaskSwitch.H"
#include "my_type.h"
#include "ARM_00_OS_Core.H"
#include "UART.H"
#include "KEYS.H"
#include "Task.h"

OSpcb * OSReadyList;    //就緒態任務表表頭
OSpcb * OSSuspendList;  //掛起態任務表表頭
OSpcb * OSDelayList;    //延時態任務表表頭
OSpcb * OSCurrentPcb;   //當前運行的任務


OSpcb OSSystemIdlePcb;  //系統空閑任務
OSShortPcb OSSuspendListBottom;    //掛起態列表表底
OSShortPcb OSDelayListBottom;      //延時態列表表底 


OSdevice OSDeviceBottom;       //設備列表的底部
OSdevice * OSDeviceList;       //設備列表

volatile uint32 CopyOfVICIntEnable;    //用來備份CopyOfVICIntEnable的狀態

//volatile uint32 CopyOfIRQEN;    //用來備份IRQEN的狀態
//volatile uint32 CopyOfFIQEN;    //用來備份FIQEN的狀態


volatile uint32 OSEnCrCount;    //用來統計進入臨界代碼段次數


volatile uint32 TaskAmount;    //用來統計共有多少個任務


volatile uint32 TimeOfTaskStart;  //用來保存一個任務剛被切換到運行態的時刻

#define OSMemoryLack       0x0000000100000000  /*錯誤號:內存資源不足*/

/**********************************************************************************************
功能:內存管理。
入口參數1:Operation。操作方式。可以設置為MEMORY_ALLOCATION(分配)、MEMORY_FREE(釋放)、統計使用量(MEMORY_STATISTIC)
入口參數2:StartAddr。起始地址,釋放內存時使用。
入口參數3:Length。申請內存或釋放內存時的長度,單位為字節。但實際分配時,是按塊分配的,所以分配時,
           實際分配到的數量可能會比指定的多,所以分配時,最好按塊的整數倍大小來指定分配長度。
		   
返回:32無符號型整數。
      當操作為分配內存時,返回32位的內存首地址,返回0表示無足夠多的可以用內存。
      當操作為釋放內存時,返回1表示釋放成功。返回0表示釋放出錯。
	  當操作為統計內存使用量時,返回的是內存被使用的字節數。
      當操作為獲取緩沖池大小時,返回的是內存緩沖池大小。

備注:緩沖池大小由OSSizeOfMemoryPool指定。每塊的大小由OSSizePerBlock指定             
**********************************************************************************************/
uint32 OSMemoryManage(uint32 Operation,uint32 StartAddr,uint32 Length)
{
  //內存分配表
  //內存分配表是32位整數的一維數組。用每一位來表示一塊是否被使用。當某位設置為1時,表示那一塊被使用。
  //當某位為0時,表示那一塊可用。
 static uint32  OSMemoryTable[OSSizeOfMemoryPool/OSSizePerBlock/32];
                                                                      
 static uint32 OSMemoryPool[OSSizeOfMemoryPool/4]; //內存緩沖池。內存緩沖池為一個大是數組
 
 uint32 BlankCount;    //統計空塊的計數器
 uint32 Mask;          //分配內存時用的掩碼
 volatile uint32 i,j;  //循環用的變量

 OSEnterCritical();   //進入臨界段
 
 switch(Operation)     //根據操作碼,選擇不同的操作
  {
   case MEMORY_INIT:   //如果是內存初始化
    {
     for(i=0;i<OSSizeOfMemoryPool/OSSizePerBlock/32;i++)
      {
       OSMemoryTable[i]=0;  //則將整張內存分配表清0
      }
     OSExitCritical();  //退出臨界段
     return 1;   //返回1
    }

   case MEMORY_ALLOCATION:  //如果是內存分配,則
    {
     BlankCount=0;   //先將內存空塊的數量清0
     for(i=0;i<(OSSizeOfMemoryPool/OSSizePerBlock/32);i++)  //掃描整個內存分配表
      {
       Mask=1;   //掩碼被設置為1,即最低位為1,其它位為0。
       if(OSMemoryTable[i]==0xFFFFFFFF)  //如果該字中的所以位都為1,表示該字節對應的所有塊都被占用
        {
         BlankCount=0;  //空塊計數器置0
         continue;      //退出本次循環,查找下一個字
        }
       for(j=0;j<32;j++)  //掃描一個字的32個bit是否有空閑的RAM
        {
         if((Mask & OSMemoryTable[i])==0)  //如果該位為0,表示該塊空閑
          {
           BlankCount++;   //空塊計數器加1。
          }
         else
          {
           BlankCount=0;  //如果遇到非空塊,則空塊計數器置0。
          }
         if((BlankCount*OSSizePerBlock)>=Length)  //如果空閑的RAM,大于或者等于需要的長度,那么分配成功
          {
           //計算被分配到的內存的起始地址,并將其保存在StartAddr中。
           StartAddr=((uint32)OSMemoryPool)+(i*32+j+1)*OSSizePerBlock-OSSizePerBlock*BlankCount;
           while(1)  //設置被使用的塊為1
            {
             OSMemoryTable[i] |=Mask;  //將已經被分配的標志為1
             Mask>>=1;   //調整掩碼的值
             if(j==0)   //如果已到最低位
              {
               Mask=0x80000000; //則掩碼調整為第31位為1
               j=32;
               i--;  //移到下一位
              }
             BlankCount--;  //空塊計數減1
             j--;   //移到下一個字
             if(BlankCount==0)  //如果空塊計數器減到0,則標志完畢
              {
               OSExitCritical();
               return StartAddr;   //將啟始地址StartAddr返回
              }
            }
          }
         Mask<<=1;  //掩碼調整,移動到下一個塊
        }
      }
     OSExitCritical();
     return 0;  //如果沒有足夠大的內存塊可用,則返回0,分配失敗
    }

   case MEMORY_FREE:  //如果操作碼是釋放內存
    {
     if(Length==0)   //如果要釋放的內存長度為0 
      {
       OSExitCritical();  //退出臨界段
       return 1;    //返回1,釋放成功
      }
     i=(StartAddr-(uint32)OSMemoryPool)/(32*OSSizePerBlock);   //計算出指定地址內存在內存分配表中的位置
     j=(StartAddr-(uint32)OSMemoryPool-i*32*OSSizePerBlock)/OSSizePerBlock;
     Mask=1<<j;   //將掩碼調整到對應的值
     while(Length)  //直到全部被釋放為止
      {
       if((OSMemoryTable[i])&(Mask)==0)   //如果該內存并未被分配,則說明發生了錯誤,
        {
         OSExitCritical();  //推出臨界段
         return 0;      //返回0,表示釋放失敗
        }
       OSMemoryTable[i] &=~Mask;  //清除對應的位,即釋放該塊內存
       j++;      //調整到下一塊
       Mask<<=1;   //掩碼調整到下一塊的位置
       if(j==32)  //如果已經到最高位
        {
         Mask=1;  //掩碼設置為1
         j=0;    //j回到最低位
         i++;    //調整下一個字
        }
       if(Length<=OSSizePerBlock)  //如果釋放完畢
        {
         Length=0;  //則Length設置為0,退出循環
        }
       else  //如果沒釋放完畢
        {
         Length-=OSSizePerBlock;  //則長度減小一個塊的量
        }
      }
     OSExitCritical();  //退出臨界段
     return 1;  //返回1,表示釋放成功
    }

   case MEMORY_STATISTIC:  //如果操作碼是統計內存使用量
    {
     Length=0;  //清Length
     for(i=0;i<OSSizeOfMemoryPool/OSSizePerBlock/32;i++)   //掃描整張內存分配表
      {
       if(OSMemoryTable[i]==0)    //如果當前字是全0,則該字對應的內存都未被分配,
        {
         continue;   //則跳過本次循環
        }
       if(OSMemoryTable[i]==0xFFFFFFFF)   //如果當前字是全1,則該字對應的內存全部被分配
        {
         Length+=32*OSSizePerBlock;   //Length累加上32塊的長度
         continue;  //退出本次循環
        }
       Mask=1;   //掩碼設置為1
       for(j=0;j<32;j++)  //掃描當前字的32bit,看是否有內存被使用
        {
         if(OSMemoryTable[i]&Mask)  //如果該塊被使用
          {
           Length+=OSSizePerBlock;  //則Length累加一塊的長度
          }
         Mask<<=1;  //調整掩碼到下一位
        }
      }
     OSExitCritical();  //退出臨界段
     return Length;   //返回使用的內存數量
    }

   case GET_MEMORY_POOL_SIZE:  //如果是獲取緩沖池大小,
    {
     OSExitCritical();  //退出臨界段
     return OSSizeOfMemoryPool;  //返回緩沖池的字節數
    }

   case MEMORY_TEST:  //如果是內存檢測
    {
     j=0xFF;  //標志j為非0,即初始化成功
     prints("Memory testing. ",1);  //顯示信息
     for(i=0;i<OSSizeOfMemoryPool/4;i++)  //檢測整個內存緩沖池
      {
       OSMemoryPool[i]=0x55555555;   //寫入0x55555555
       if(OSMemoryPool[i]!=0x55555555)  //如果讀回的不是0x55555555
        {
         j=0;  //則測試失敗
        }
       OSMemoryPool[i]=0xAAAAAAAA;   //寫入0xAAAAAAAA
       if(OSMemoryPool[i]!=0xAAAAAAAA)  //如果讀回的不是0xAAAAAAAA
        {
         j=0;  //則測試失敗
        }
       OSMemoryPool[i]=0;   //寫入0
       if(OSMemoryPool[i]!=0)  //如果讀回的不是0
        {
         j=0;  //則測試失敗
        }
       if(i%(OSSizeOfMemoryPool/4/80)==0)  //顯示測試進度。共顯示80個>
        {
         prints(">",0);
        }
      }
     prints("",1);
     if(j)  //如果測試成功
      {
       prints("Memory test passed.",1);  //顯示成功
      }
     else  //否則,
      {
       prints("Memroy test failed.",1);  //顯示測試失敗
      }
     OSExitCritical();  //退出臨界段
     return j;  //返回是否成功
    }
   default: OSExitCritical();return 0;
  }
}
//////////////////////////////////End of function//////////////////////////////////////////////


/**********************************************************************************************
功能:進入臨界段。
入口參數:無。
返回:無。
備注:該函數使用的是將中斷分配寄存器清0的方法來關中斷。比起用軟中斷,運行速度要快。
      如果要開某個中斷,則應該先調用一次該函數,然后再修改中斷備份變量CopyOfVICIntEnable
	  的值,而不能直接修改VICIntEnable的值。否則會出錯。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品精品国产高清a毛片牛牛 | 国产91精品久久久久久久网曝门| 99久久综合狠狠综合久久| 欧美福利一区二区| 国产精品久久久久7777按摩| 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩av电影天堂| 成人永久免费视频| 91麻豆精品国产91久久久资源速度| 国产精品久久久久一区二区三区| 麻豆国产91在线播放| 亚洲777理论| 91亚洲国产成人精品一区二三 | 99在线精品免费| 欧美一区二区三区男人的天堂 | 8x8x8国产精品| 亚洲欧美日韩在线播放| 国产成人av电影在线播放| 欧美一区二区三区男人的天堂| 一区二区成人在线| 99精品视频中文字幕| 国产亚洲欧洲997久久综合 | 夜夜嗨av一区二区三区四季av| 国产精品66部| 精品欧美一区二区在线观看| 欧美激情中文字幕| 在线播放中文字幕一区| 日韩1区2区3区| 免费在线欧美视频| 国产成人亚洲综合a∨猫咪| 欧美一级久久久久久久大片| 五月综合激情日本mⅴ| 在线精品观看国产| 中文乱码免费一区二区| 国产在线精品一区二区夜色 | 精彩视频一区二区| 日韩视频一区在线观看| 日韩国产在线一| 欧美经典一区二区三区| 欧美精品一区二区三区蜜桃视频| 日韩精品电影一区亚洲| 欧美人牲a欧美精品| 亚洲6080在线| 69久久夜色精品国产69蝌蚪网| 亚洲午夜精品久久久久久久久| 色老头久久综合| 亚洲一区在线视频观看| 欧亚一区二区三区| 亚洲一区成人在线| 欧美日韩大陆在线| 免费国产亚洲视频| 精品少妇一区二区三区免费观看| 久久精品99国产精品| 2021中文字幕一区亚洲| 国产成人鲁色资源国产91色综| 欧美精彩视频一区二区三区| 97精品久久久午夜一区二区三区 | 久久久久久久久久久99999| 国产一区二区三区av电影 | 欧美三区在线观看| 天天av天天翘天天综合网色鬼国产| 欧美伦理电影网| 琪琪一区二区三区| 久久久久久亚洲综合影院红桃| 久久成人久久爱| 精品国产乱码久久久久久蜜臀| 国内精品在线播放| 欧美国产乱子伦| eeuss影院一区二区三区| ...av二区三区久久精品| 欧美在线不卡一区| 国产精品一色哟哟哟| 精品剧情在线观看| 成人av在线播放网址| 亚洲精品久久久蜜桃| 成人精品视频网站| 亚洲综合色婷婷| 日韩欧美激情四射| 成人高清视频在线观看| 亚洲午夜免费福利视频| 欧美大胆一级视频| 成人涩涩免费视频| 亚洲国产精品一区二区尤物区| 8v天堂国产在线一区二区| 国模娜娜一区二区三区| 亚洲欧美日韩在线播放| 日韩精品一区二区三区中文不卡| 国内欧美视频一区二区| 亚洲视频香蕉人妖| 91精品欧美一区二区三区综合在| 国产精品主播直播| 亚洲综合无码一区二区| 精品国产一区久久| 色av一区二区| 久久电影国产免费久久电影| 国产精品二三区| 91精品久久久久久久久99蜜臂| 国产东北露脸精品视频| 亚洲国产精品视频| 久久久久免费观看| 欧美日韩一区二区三区在线看| 九色综合狠狠综合久久| 亚洲日本va午夜在线电影| 日韩欧美电影一区| 91美女片黄在线观看91美女| 免费不卡在线观看| 亚洲视频在线一区二区| 日韩精品一区二区三区视频在线观看 | 亚洲精品一区二区三区福利| 99久久99久久综合| 老司机精品视频线观看86| 亚洲欧美日本韩国| 久久久综合网站| 欧美性受xxxx| 国产成人精品亚洲日本在线桃色| 亚洲国产精品一区二区久久 | 精品久久久久久久久久久久久久久| 99在线精品视频| 国内成人自拍视频| 亚洲va中文字幕| 中文字幕日韩av资源站| 精品日韩一区二区三区| 欧美麻豆精品久久久久久| 91首页免费视频| 国产福利一区二区三区| 日本欧美在线观看| 一区二区三区日本| 国产精品私房写真福利视频| 日韩一卡二卡三卡四卡| 欧美视频一区二区三区在线观看| 成人激情综合网站| 精品一区二区影视| 日日夜夜精品视频免费| 一区二区三区免费看视频| 国产精品蜜臀在线观看| 2021中文字幕一区亚洲| 日韩一区二区中文字幕| 欧美日韩国产大片| 日本道色综合久久| 92精品国产成人观看免费 | 五月天亚洲婷婷| 亚洲精品成a人| 成人免费在线视频| 国产精品99久久久| 国产香蕉久久精品综合网| 欧美一级免费大片| 7777精品伊人久久久大香线蕉的| 在线观看成人小视频| 色一区在线观看| 91免费在线视频观看| 99久免费精品视频在线观看| 菠萝蜜视频在线观看一区| 国产999精品久久久久久绿帽| 久久99国产精品免费网站| 蜜臀av性久久久久蜜臀aⅴ| 日韩国产精品91| 天天色 色综合| 天天操天天干天天综合网| 天堂资源在线中文精品| 丝袜美腿亚洲色图| 日一区二区三区| 免费成人结看片| 国内精品伊人久久久久av一坑| 久久99国产精品久久99果冻传媒| 免费欧美日韩国产三级电影| 午夜精品久久久久影视| 婷婷夜色潮精品综合在线| 婷婷国产v国产偷v亚洲高清| 日韩专区欧美专区| 日本强好片久久久久久aaa| 久久91精品国产91久久小草 | 亚洲欧洲精品天堂一级 | 日韩免费福利电影在线观看| 日韩三级精品电影久久久| 精品久久久久香蕉网| 精品美女被调教视频大全网站| 欧美大胆人体bbbb| 国产人久久人人人人爽| 中文字幕日韩av资源站| 一区二区三区四区在线免费观看| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 欧美亚洲丝袜传媒另类| 欧美精品久久天天躁| 欧美成人国产一区二区| 337p粉嫩大胆噜噜噜噜噜91av| 国产清纯在线一区二区www| 国产精品不卡视频| 懂色av一区二区在线播放| 亚洲va欧美va人人爽午夜| 欧美aaa在线| 精品一区精品二区高清| 成人免费观看av| 91行情网站电视在线观看高清版| 欧美日韩在线播| 精品欧美一区二区久久| 成人欧美一区二区三区小说| 丝袜亚洲精品中文字幕一区| 国产一区二区中文字幕| av电影在线观看一区| 欧美日本在线播放|