?? arm_00_os_core.c
字號:
while(TempPcb->Next) //直到結(jié)束
{
if(TempPcb==pcb) //如果找到,
{
DeleteFromReadyList(pcb); //將其從就緒表中刪除
InsertToSuspendList(pcb); //插入掛起列表
OSExitCritical(); //退出臨界段
if(pcb==OSCurrentPcb) //如果要掛起的是自己
{
OSTaskSwitch(); //則需要運行任務(wù)切換
}
return 0; //返回0,表示成功
}
TempPcb=TempPcb->Next;
}
return NO_SUCH_A_TASK; //如果沒找到,則返回錯誤
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:發(fā)送一則消息
入口參數(shù)1:pcb。消息的接收者。指向任務(wù)的pcb的指針。
入口參數(shù)2:pMsg。消息指針。指向消息結(jié)構(gòu)體的指針。
返回:消息是否發(fā)送成功。0:發(fā)送成功;錯誤代碼 NO_SUCH_A_TASK:沒有這個任務(wù);
**********************************************************************************************/
uint32 OSSendMsg(OSpcb * pcb,OSMsg * pMsg)
{
OSpcb * TempPcb;
OSEnterCritical(); //進入臨界段
pMsg->Sender=OSCurrentPcb; //消息的發(fā)送者
switch(pcb->Status) //判斷任務(wù)所處的狀態(tài)
{
case OSInReadyStatus: //如果任務(wù)處于就緒態(tài)
{
TempPcb=OSReadyList; //在就緒表中查找
while(TempPcb->Next) //搜索整個就緒表
{
if(pcb==TempPcb) //如果找到
{
pcb->Msg=pMsg; //將消息放入任務(wù)的消息指針中
OSExitCritical(); //退出臨界段
return 0; //返回0,發(fā)送消息成功
}
TempPcb=TempPcb->Next; //TempPcb移動到下一個
}
//如果在就緒表中找不到該任務(wù),則
OSExitCritical(); //退出臨界段
return NO_SUCH_A_TASK; //返回錯誤代號:沒有這樣的任務(wù)。
}
case OSInDelayStatus: //如果任務(wù)處于延時態(tài)
{
TempPcb=OSDelayList; //在延時態(tài)表中查找
while(TempPcb->Next) //搜索整個延時表
{
if(pcb==TempPcb) //如果找到
{
pcb->Msg=pMsg; //將消息放入任務(wù)的消息指針中
pcb->Delay=0; //取消任務(wù)的延時
DeleteFromDelayList(pcb); //將任務(wù)從延時列表中刪除
InsertToReadyList(pcb); //將任務(wù)插入到就緒表中
OSExitCritical(); //退出臨界段
OSTaskSwitch(); //有任務(wù)被喚醒,需要任務(wù)切換
return 0; //返回0,表示發(fā)送消息成功
}
TempPcb=TempPcb->Next; //TempPcb移動到下一個
}
//如果在延時表中找不到該任務(wù),則
OSExitCritical(); //退出臨界段
return NO_SUCH_A_TASK; //返回錯誤代號:沒有這樣的任務(wù)。
}
case OSInSuspendStatus: //如果任務(wù)處于掛起態(tài)
{
TempPcb=OSSuspendList; //在掛起態(tài)表中查找
while(TempPcb->Next) //搜索整個掛起態(tài)表
{
if(pcb==TempPcb) //如果找到
{
pcb->Msg=pMsg; //將消息放入任務(wù)的消息指針中
DeleteFromSuspendList(pcb); //將任務(wù)從掛起態(tài)列表中刪除
InsertToReadyList(pcb); //將任務(wù)插入到就緒表中
OSExitCritical(); //退出臨界段
OSTaskSwitch(); //有任務(wù)被喚醒,需要任務(wù)切換
return 0; //返回0,表示消息發(fā)送成功
}
TempPcb=TempPcb->Next; //TempPcb移動到下一個
}
//如果在掛起態(tài)表中找不到該任務(wù),則
OSExitCritical(); //退出臨界段
return NO_SUCH_A_TASK; //返回錯誤代號:沒有這樣的任務(wù)。
}
default: //如果任務(wù)處于其它狀態(tài)
{
OSExitCritical(); //退出臨界段
return NO_SUCH_A_TASK; //返回錯誤代號:沒有這樣的任務(wù)。
}
}
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:定時器0初始化。用來產(chǎn)生10mS的時鐘節(jié)拍。并將其分配為FIQ中斷
入口參數(shù):無。
返回:無。
備注:無。
**********************************************************************************************/
void Timer0Init(void)
{
T0CTCR=0; //設(shè)置T0為計數(shù)器模式
T0TCR=1; //使能T0
T0PR=255; //T0預(yù)分頻器設(shè)置為255,所以T0的計數(shù)時鐘為11059200*5/(255+1)=216000Hz
T0MR0=MaxOfTimer0; //匹配寄存器設(shè)置為1/100秒觸發(fā)中斷一次。MaxOfTimer0=216000/100-1
T0MCR&=~0x04;
T0MCR|=0x00000003; //MR0匹配時,發(fā)生中斷,并且復(fù)位T0
CopyOfVICIntEnable |= (1<<TIMER0); //打開TIMER0中斷
VICIntSelect |=(1<<TIMER0); //將定時器0分配為FIQ中斷
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:系統(tǒng)時鐘節(jié)拍初始化。用來產(chǎn)生10mS的時鐘節(jié)拍。
入口參數(shù):無。
返回:無。
備注:無。
**********************************************************************************************/
void OSTickInit(void)
{
Timer0Init(); //調(diào)用函數(shù)Timer0Init()設(shè)置時鐘節(jié)拍
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
顯示ARM_00_OS的數(shù)組
**********************************************************************************************/
const uint8 ARM_00_OS_LOGO[7][78]={
" __ _____ __ __ _____ _____ ____ __ ",
" //\\\\ ||~~~\\\\ ||\\\\ //|| //~~~\\\\ //~~~\\\\ //~~~~\\\\ //~~\\\\ ",
" // \\\\ || || || \\\\ // || || /|| || /|| || || || ",
"||____|| ||===// || \\\\// || || / || || / || || || \\\\___ ",
"||====|| || \\\\ || ~~ || || / || || / || || || ~~~\\\\",
"|| || || \\\\ || || ___ \\\\/__// \\\\/__// ___ \\\\____// \\\\___//",
"~~ ~~ ~~ ~~ ~~ ~~ ~~~ ~~~ ~~~ ~~~ ~~~~ ~~~ "
};
///////////////////////////////////////////////////////////////////////////////////////////////
/**********************************************************************************************
功能:操作系統(tǒng)初始化。
入口參數(shù):無。
返回:無。
備注:任務(wù)調(diào)度前,必須調(diào)用該函數(shù)初始化好一些參數(shù)
**********************************************************************************************/
void OSInit(void)
{
uint32 i;
const uint8 Title1[]={"SystemIdle"}; //系統(tǒng)空閑任務(wù)的標題
CopyOfVICIntEnable=0; //VICIntEnable備份被設(shè)置為0
// CopyOfFIQEN=0; //FIQEN備份被設(shè)置為0
// CopyOfIRQEN=0; //IRQEN備份被設(shè)置為0
OSEnCrCount=0; //進入臨界段次數(shù)為0
prints("",1);
prints("The MCU type is: LPC",0); //顯示CPU信息
print_uint32(CPU_TYPE);
prints("",1);
prints("",1);
OSMemoryInit(); //內(nèi)存初始化
OSMemoryTest(); //內(nèi)存測試
OSDeviceBottom.Next=0; //設(shè)備列表表底初始化
OSDeviceBottom.User=0;
OSDeviceBottom.RequestCount=0;
OSDeviceBottom.DeviceID=0;
OSDeviceList=&OSDeviceBottom; //設(shè)備列表初始化指向低部
//系統(tǒng)空閑任務(wù)(即就緒列表底部)初始化
//系統(tǒng)空閑任務(wù)的優(yōu)先級最低,無其它任務(wù)運行時,就運行系統(tǒng)空閑任務(wù)
//注意,永遠不要掛起系統(tǒng)空閑任務(wù),否則會出錯
OSSystemIdlePcb.Prior=&OSSystemIdlePcb; //系統(tǒng)初始化,現(xiàn)在只有系統(tǒng)空閑任務(wù)
OSSystemIdlePcb.Next=0; //系統(tǒng)空閑任務(wù)沒有后一個任務(wù)
OSSystemIdlePcb.Priority=~0; //系統(tǒng)空閑任務(wù)的優(yōu)先級最低(即0xFFFFFFFF)
OSSystemIdlePcb.Status=OSInReadyStatus; //系統(tǒng)空閑任務(wù)永遠處于就緒態(tài)
OSSystemIdlePcb.Delay=0; //系統(tǒng)空閑任務(wù)永遠不得延時
OSSystemIdlePcb.PID=(uint32)&OSSystemIdlePcb; //系統(tǒng)空閑任務(wù)的PID
OSSystemIdlePcb.StackLength=0; //系統(tǒng)空閑任務(wù)的堆棧長度設(shè)置為0字節(jié),因為空閑任務(wù)并未使用緩沖池
OSSystemIdlePcb.TotalRunTime=0; //系統(tǒng)空閑任務(wù)的總運行時間初始化為0
OSSystemIdlePcb.RunTimeInThisRefreshPeriod=0; //系統(tǒng)空閑任務(wù)的當(dāng)前運行時間初始化為0
OSSystemIdlePcb.Msg=0; //初始化無接收消息
OSSystemIdlePcb.WaitFor=0; //初始化無等待資源
for(i=0;i<15;i++) //設(shè)置標題
{
OSSystemIdlePcb.Title[i]=Title1[i];
if(Title1[i]==0)break;
}
for(;i<15;i++) //不足的補空格
{
OSSystemIdlePcb.Title[i]=' ';
}
OSSystemIdlePcb.Title[15]=0;
TaskAmount=1; //任務(wù)總數(shù)為1,即只有一個系統(tǒng)空閑任務(wù)
OSReadyList=&OSReadyListBottom; //就緒任務(wù)表的起始設(shè)置為OSSReadyListBottom,現(xiàn)在只有一個任務(wù)
//掛起態(tài)任務(wù)列表底部初始化
//該底部是一個短的Pcb,即只有Prior,Next,Delay,Priority,PID這幾個參數(shù)
//該底部沒有實際的任務(wù)對應(yīng),只是一個空表,方便任務(wù)喚醒時查找任務(wù)使用
//永遠不要將掛起態(tài)列表底部投入到就緒表中,否則會出錯
OSSuspendListBottom.Prior=(OSpcb *)&OSSuspendListBottom; //現(xiàn)在只有一個掛起任務(wù),所以前趨指向自己
OSSuspendListBottom.Next=(OSpcb *)0; //掛起態(tài)任務(wù)列表底部沒有下一個任務(wù)
OSSuspendListBottom.PID=0; //PID為0
OSSuspendListBottom.Priority=~0; //優(yōu)先級最低
OSSuspendListBottom.Delay=0; //不得延時
OSSuspendList=(OSpcb *)&OSSuspendListBottom; //掛起列表的起始為列表低部,因為現(xiàn)在只有底部一個
//延時態(tài)任務(wù)列表底部初始化
//該底部是一個短的Pcb,即只有Prior,Next,Delay,Priority,PID這幾個參數(shù)
//該底部沒有實際的任務(wù)對應(yīng),只是一個空表,方便任務(wù)喚醒時查找任務(wù)使用
//永遠不要將延時態(tài)列表底部投入到就緒表中,否則會出錯
OSDelayListBottom.Prior=(OSpcb *)&OSSuspendListBottom; //現(xiàn)在只有一個延時態(tài)任務(wù),所以前趨指向自己
OSDelayListBottom.Next=(OSpcb *)0; //延時態(tài)任務(wù)列表底部沒有下一個任務(wù)
OSDelayListBottom.PID=0; //PID為0
OSDelayListBottom.Priority=~0; //優(yōu)先級最低
OSDelayListBottom.Delay=0; //不得延時
OSDelayList=(OSpcb *)&OSDelayListBottom; //掛起列表的起始為列表低部,因為現(xiàn)在只有底部一個
prints("",1);
prints("Welcome to",1);
for(i=0;i<7;i++) //顯示LOGO
{
prints(ARM_00_OS_LOGO[i],1);
}
prints("",1);
prints("Date created: ",0); //顯示創(chuàng)建日期
prints(__DATE__,1);
prints("Time created: ",0); //顯示創(chuàng)建時間
prints(__TIME__,1);
prints(" Designer: Computer00",1);
prints(" My Blog: Http://computer00.21ic.org",1);
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:釋放所占用的資源。
入口參數(shù):pcb。任務(wù)的進程控制塊地址。
返回:無。
**********************************************************************************************/
void OSFreeResource(OSpcb * pcb)
{
OSdevice * pDevice;
pDevice=OSDeviceList; //從設(shè)備列表頭部開始
while(pDevice->Next) //直到設(shè)備列表的表尾
{
if(pDevice->User==pcb) //如果該設(shè)備被該任務(wù)使用,
{
OSFreeDevice((uint32)pDevice); //則釋放它
}
}
}
//////////////////////////////////End of function//////////////////////////////////////////////
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -