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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? arm_00_os_core.c

?? 一個(gè)基于arm的
?? C
?? 第 1 頁 / 共 4 頁
字號(hào):
/**********************************************************************************************
本程序只供學(xué)習(xí)使用,不得用于其它任何用途,否則后果自負(fù)。

  ARM_00_OS_Core.c file
   
  作者:Computer-lov
  建立日期:2006-5-1
  修改日期:2006-5-15
  版本:V1.0
  版權(quán)所有,盜版必究。
  任何技術(shù)問題可到我的博客上留言:    http://computer00.21ic.org
  Copyright(C) Computer-lov 2006-2016
  All rights reserved
**********************************************************************************************/

#include <ADuC7027.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;    //就緒態(tài)任務(wù)表表頭
OSpcb * OSSuspendList;  //掛起態(tài)任務(wù)表表頭
OSpcb * OSDelayList;    //延時(shí)態(tài)任務(wù)表表頭
OSpcb * OSCurrentPcb;   //當(dāng)前運(yùn)行的任務(wù)


OSpcb OSSystemIdlePcb;  //系統(tǒng)空閑任務(wù)
OSShortPcb OSSuspendListBottom;    //掛起態(tài)列表表底
OSShortPcb OSDelayListBottom;      //延時(shí)態(tài)列表表底 


OSdevice OSDeviceBottom;       //設(shè)備列表的底部
OSdevice * OSDeviceList;       //設(shè)備列表


volatile uint32 CopyOfIRQEN;    //用來備份IRQEN的狀態(tài)
volatile uint32 CopyOfFIQEN;    //用來備份FIQEN的狀態(tài)
volatile uint32 OSEnCrCount;    //用來統(tǒng)計(jì)進(jìn)入臨界代碼段次數(shù)


volatile uint32 TaskAmount;    //用來統(tǒng)計(jì)共有多少個(gè)任務(wù)


volatile uint32 TimeOfTaskStart;  //用來保存一個(gè)任務(wù)剛被切換到運(yùn)行態(tài)的時(shí)刻

#define OSMemoryLack       0x0000000100000000  /*錯(cuò)誤號(hào):內(nèi)存資源不足*/

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

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

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

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

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

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

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

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


/**********************************************************************************************
功能:進(jìn)入臨界段。
入口參數(shù):無。
返回:無。
備注:該函數(shù)使用的是將中斷分配寄存器清0的方法來關(guān)中斷。比起用軟中斷,運(yùn)行速度要快。
      如果要開某個(gè)中斷,則應(yīng)該先調(diào)用一次該函數(shù),然后再修改中斷備份變量CopyOfIRQEN跟CopyOfFIQEN
	  的值,而不能直接修改IRQEN跟FIQEN的值。否則會(huì)出錯(cuò)。
**********************************************************************************************/
void OSEnterCritical(void)
{
 if(OSEnCrCount==0)   //如果前面未關(guān)中斷

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜亚洲精品羞羞网站| 91高清在线观看| 久久综合资源网| 懂色av一区二区三区免费看| 337p粉嫩大胆色噜噜噜噜亚洲 | 日韩女优毛片在线| 国产传媒欧美日韩成人| 国产精品久久久久久久久免费樱桃 | 国产成人av福利| 亚洲免费观看高清完整版在线观看熊 | 日韩美女视频在线| 成人黄色一级视频| 日韩和欧美的一区| 26uuu国产日韩综合| 色香色香欲天天天影视综合网| 丝袜亚洲精品中文字幕一区| 欧美一区二区三区四区在线观看| 精品一区二区成人精品| 一区二区三区欧美视频| 亚洲精品一区二区三区香蕉 | 色婷婷国产精品久久包臀| 日韩1区2区日韩1区2区| 国产精品久久久久久久久果冻传媒| 99re8在线精品视频免费播放| 人人爽香蕉精品| 亚洲一区在线播放| 欧美激情一区二区在线| 欧美一区二区三区爱爱| 欧美伊人精品成人久久综合97| 国产激情视频一区二区三区欧美| 一区二区三区日韩| 国产精品久久久久久久久久久免费看| 宅男在线国产精品| 欧美又粗又大又爽| av中文字幕在线不卡| 成人一区二区三区视频在线观看| 久久精品国产精品青草| 日韩1区2区3区| 香蕉成人伊视频在线观看| 亚洲欧美电影一区二区| 综合色中文字幕| 国产精品视频一二三区| 久久欧美中文字幕| 国产精品妹子av| 亚洲日本乱码在线观看| 一个色妞综合视频在线观看| 亚洲一区视频在线观看视频| 亚洲午夜国产一区99re久久| 视频一区二区三区中文字幕| 麻豆国产欧美日韩综合精品二区 | 国产精品免费人成网站| 亚洲人成网站在线| 亚洲午夜电影在线观看| 麻豆精品视频在线观看视频| 国产乱码精品一区二区三区av| 成人精品免费看| 欧美日韩一区二区三区四区五区 | 欧美电视剧免费观看| 日韩一区欧美一区| 97久久精品人人爽人人爽蜜臀| 国产寡妇亲子伦一区二区| 在线观看日韩av先锋影音电影院| 国产亚洲欧美中文| 国内偷窥港台综合视频在线播放| 成人精品一区二区三区四区 | 欧美男男青年gay1069videost| 99视频一区二区三区| 日本高清免费不卡视频| 欧美艳星brazzers| 日韩美女主播在线视频一区二区三区 | 欧美日韩成人综合在线一区二区| 日韩一区二区三| 中文字幕中文字幕一区二区| 成人激情校园春色| 日韩欧美一区在线| 亚洲成av人片| 99麻豆久久久国产精品免费| 精品粉嫩aⅴ一区二区三区四区| 亚洲一区二区三区视频在线| 99久久国产综合精品麻豆| 精品国产区一区| 偷拍自拍另类欧美| 91久久香蕉国产日韩欧美9色| 久久精品视频在线看| 亚洲v日本v欧美v久久精品| 成人精品国产福利| 久久久五月婷婷| 美女视频一区二区三区| 91麻豆精品国产无毒不卡在线观看| 亚洲六月丁香色婷婷综合久久| 成人黄色一级视频| 国产精品久久99| eeuss鲁片一区二区三区在线看| 久久综合久久综合九色| 国产91精品精华液一区二区三区 | 欧美变态tickle挠乳网站| 国产一区二区福利视频| 一区二区三区在线视频免费观看 | 韩国女主播成人在线| 亚洲免费在线视频| 日韩一区二区精品葵司在线| 菠萝蜜视频在线观看一区| 日韩精品视频网| 精品少妇一区二区三区免费观看| 国产成人自拍在线| 亚洲精品写真福利| 欧美成人vps| 99久久久久久| 久久超级碰视频| 亚洲人成网站色在线观看 | 欧美视频一区二区三区在线观看| 青青国产91久久久久久| 国产精品久久久久婷婷二区次| 欧美在线综合视频| 国产精品一二三四| 香蕉av福利精品导航| 亚洲欧洲99久久| 精品剧情v国产在线观看在线| 色呦呦一区二区三区| 国产精品一区二区你懂的| 日韩成人精品在线| 一区二区三区国产| 国产精品国产三级国产aⅴ入口| 日韩欧美激情一区| 69堂成人精品免费视频| 色综合久久综合网97色综合| 风间由美一区二区三区在线观看| 视频一区二区三区在线| 亚洲国产日韩精品| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 欧美色倩网站大全免费| 91丨porny丨国产| 91视频xxxx| 97se亚洲国产综合在线| 国产成人一级电影| 国产一区二区0| 国产成人a级片| 丁香五精品蜜臀久久久久99网站 | 久久久99久久精品欧美| 久久综合国产精品| 久久久久亚洲蜜桃| 久久久国产综合精品女国产盗摄| 久久一区二区三区国产精品| 久久综合久久综合九色| 国产精品色哟哟| 中文字幕在线视频一区| 一区二区高清在线| 日韩成人免费电影| 国产精品小仙女| 91一区二区三区在线播放| 欧美偷拍一区二区| 欧美大度的电影原声| 国产精品美女久久久久aⅴ| 一区二区三区在线观看网站| 午夜影院在线观看欧美| 国产酒店精品激情| 日本精品视频一区二区三区| 欧美一区二区三区在线观看| 久久久久久久久久美女| 亚洲精品乱码久久久久久日本蜜臀| 亚洲人吸女人奶水| 精品亚洲porn| 色婷婷亚洲婷婷| 久久精品在这里| 午夜精品久久久| 不卡av在线免费观看| 欧美一区二区三区喷汁尤物| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 日韩三级视频中文字幕| 国产精品免费aⅴ片在线观看| 日韩av电影免费观看高清完整版 | 国产欧美日产一区| 日本中文字幕一区| 色婷婷综合久久久中文一区二区| 久久一区二区三区国产精品| 日韩精品一二三| 色偷偷一区二区三区| 国产日韩欧美精品电影三级在线| 喷白浆一区二区| 69精品人人人人| 亚洲成在人线免费| 欧美专区亚洲专区| 亚洲欧洲三级电影| 成a人片亚洲日本久久| 国产欧美日韩激情| 成人免费高清在线观看| 中文字幕第一页久久| 丁香六月久久综合狠狠色| 国产午夜精品理论片a级大结局 | 一区二区三区国产精华| 在线看国产日韩| 亚洲综合一区二区三区| 欧美自拍丝袜亚洲| 日韩综合小视频| 日韩欧美电影在线| 国产一区二区按摩在线观看| 国产日韩在线不卡| 欧美性大战久久久久久久蜜臀 | 精品一区二区三区视频| 欧美视频一区二区三区四区 |