?? arm_00_os_core.c
字號(hào):
/**********************************************************************************************
功能:刪除一個(gè)任務(wù)。
入口參數(shù)1:pcb。要?jiǎng)h除的任務(wù)的pcb。
返回:32位無(wú)符號(hào)整型。0表示刪除成功。非零表示刪除失敗,返回錯(cuò)誤代號(hào)。
備注:如果任務(wù)自己申請(qǐng)了內(nèi)存,一定要任務(wù)自己先釋放內(nèi)存,否則任務(wù)被刪除后,內(nèi)存沒(méi)有釋放,會(huì)導(dǎo)致內(nèi)存泄漏。
**********************************************************************************************/
uint32 OSTaskKill(OSpcb * pcb)
{
OSpcb * TempPcb;
OSEnterCritical(); //進(jìn)入臨界段
switch(pcb->Status) //根據(jù)狀態(tài)不同,做不同的處理
{
case OSInReadyStatus: //如果任務(wù)處于就緒態(tài)
{
TempPcb=OSReadyList; //從就緒表中查找
while(TempPcb->Next) //搜索整個(gè)就緒表
{
if(pcb==TempPcb) //如果搜索到
{
OSFreeResource(pcb); //釋放資源
DeleteFromReadyList(pcb); //將其從就緒態(tài)表中刪除
OSFree((uint32)pcb,pcb->StackLength); //釋放任務(wù)所占內(nèi)存
TaskAmount--; //任務(wù)數(shù)減1
OSExitCritical(); //退出臨界段
if(pcb==OSCurrentPcb) //如果刪除的是正在運(yùn)行的任務(wù)
{
OSTaskSwitch(); //則執(zhí)行任務(wù)切換
}
return 0; //返回0,表示刪除任務(wù)成功
}
TempPcb=TempPcb->Next; //TempPcb移動(dòng)到下一個(gè)
}
//如果在就緒表中找不到該任務(wù),則
OSExitCritical(); //退出臨界段
return NO_SUCH_A_TASK; //返回出錯(cuò)代碼,沒(méi)有這樣的任務(wù)
}
case OSInDelayStatus: //如果任務(wù)處于延時(shí)態(tài)
{
TempPcb=OSDelayList; //從延時(shí)態(tài)列表中搜索
while(TempPcb->Next) //搜索整個(gè)延時(shí)列表
{
if(pcb==TempPcb) //如果搜索到
{
OSFreeResource(pcb); //釋放資源
DeleteFromDelayList(pcb); //將其從延時(shí)態(tài)表中刪除
OSFree((uint32)pcb,pcb->StackLength); //釋放任務(wù)所占的內(nèi)存
TaskAmount--; //任務(wù)數(shù)減1
OSExitCritical(); //退出臨界段
return 0; //返回刪除成功
}
TempPcb=TempPcb->Next; //TempPcb移動(dòng)到下一個(gè)
}
//如果在延時(shí)態(tài)表中找不到該任務(wù),則
OSExitCritical(); //退出臨界段
return NO_SUCH_A_TASK; //返回出錯(cuò)代碼,沒(méi)有這樣的任務(wù)
}
case OSInSuspendStatus: //如果任務(wù)處于掛起態(tài)
{
TempPcb=OSSuspendList; //從掛起態(tài)表中搜索
while(TempPcb->Next) //搜索整個(gè)掛起態(tài)列表
{
if(pcb==TempPcb) //如果搜索到
{
OSFreeResource(pcb); //釋放資源
DeleteFromSuspendList(pcb); //將起從掛起態(tài)列表中刪除
OSFree((uint32)pcb,pcb->StackLength); //釋放任務(wù)所占的內(nèi)存
TaskAmount--; //任務(wù)數(shù)減1
OSExitCritical(); //退出臨界段
return 0; //返回刪除成功
}
TempPcb=TempPcb->Next; //TempPcb移動(dòng)到下一個(gè)
}
//如果在掛起態(tài)表中找不到該任務(wù),則
OSExitCritical(); //退出臨界段
return NO_SUCH_A_TASK; //返回出錯(cuò)代碼,沒(méi)有這樣的任務(wù)
}
default: //如果要?jiǎng)h除的任務(wù)不在這三種狀態(tài)中
{
OSExitCritical(); //退出臨界段
return NO_SUCH_A_TASK; //返回出錯(cuò)代碼,沒(méi)有這樣的任務(wù)
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
/**********************************************************************************************
功能:添加一個(gè)設(shè)備。
入口參數(shù)1:DeviceID。要添加設(shè)備的唯一的ID號(hào)。根據(jù)一個(gè)設(shè)備的ID號(hào),即可查找到該設(shè)備的信息的入口地址。
返回:32位無(wú)符號(hào)整型。0表示添加失敗。非0為指向設(shè)備的指針的值。
/*********************************************************************************************/
uint32 OSAddDevice(uint32 DeviceID)
{
OSdevice * TempDevice;
OSEnterCritical(); //進(jìn)入臨界段
TempDevice=(OSdevice *)OSMalloc(sizeof(OSdevice)); //申請(qǐng)內(nèi)存
if(TempDevice==(OSdevice *)0) //如果申請(qǐng)內(nèi)存失敗
{
OSExitCritical(); //退出臨界段,返回0。表示添加失敗失敗
return 0;
}
//將新建的設(shè)備插入到設(shè)備列表的頭部
TempDevice->Next=OSDeviceList; //被添加的設(shè)備的后趨設(shè)為OSDeviceList
TempDevice->User=(OSpcb *)0; //新建的設(shè)備初始化為沒(méi)有被使用
TempDevice->RequestCount=0; //新建的設(shè)備申請(qǐng)使用次數(shù)為0
TempDevice->DeviceID=DeviceID; //設(shè)置被添加設(shè)備的ID號(hào)
OSDeviceList=TempDevice; //修改OSDeviceList,使其指向表頭
OSExitCritical(); //退出臨界段
return (uint32)(TempDevice); //返回被添加的設(shè)備的地址
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:刪除一個(gè)設(shè)備。
入口參數(shù)1:DeviceID。要?jiǎng)h除的設(shè)備的ID號(hào)。
返回:32位無(wú)符號(hào)整型。返回0,刪除成功。非零(錯(cuò)誤代號(hào)),刪除錯(cuò)誤。
**********************************************************************************************/
uint32 OSDeleteDevice(uint32 DeviceID)
{
OSdevice * TempDevice;
OSEnterCritical(); //進(jìn)入臨界段
TempDevice=OSDeviceList; //查找設(shè)備列表
if(OSDeviceList->DeviceID==DeviceID) //如果要被刪除的設(shè)備在表中第一項(xiàng)
{
OSDeviceList=OSDeviceList->Next; //設(shè)備列表指向下一個(gè)
OSFree((uint32)TempDevice,sizeof(OSdevice)); //釋放內(nèi)存
OSExitCritical(); //退出臨界段
return 0; //返回0,刪除成功
}
while(TempDevice->Next) //搜索設(shè)備列表中其它設(shè)備
{
if(TempDevice->Next->DeviceID==DeviceID) //如果找到
{
TempDevice->Next=TempDevice->Next->Next; //將其中設(shè)備列表中刪除
OSFree((uint32)(TempDevice->Next),sizeof(OSdevice)); //釋放內(nèi)存
OSExitCritical(); //退出臨界段
return 0; //返回0,表示刪除成功
}
TempDevice=TempDevice->Next; //移到下一個(gè)
}
OSExitCritical(); //如果設(shè)備列表搜索完,仍未找到設(shè)備,則返回錯(cuò)誤代號(hào):沒(méi)有這個(gè)設(shè)備
return NO_SUCH_A_DEVICE;
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:根據(jù)設(shè)備的ID號(hào),獲取設(shè)備信息的入口地址。
入口參數(shù)1:DeviceID。設(shè)備的ID號(hào)。
返回:設(shè)備信息的入口地址
**********************************************************************************************/
uint32 OSGetDeviceAddr(uint32 DeviceID)
{
OSdevice * TempDevice;
OSEnterCritical(); //進(jìn)入臨界段
TempDevice=OSDeviceList; //從表頭開(kāi)始
while(TempDevice->Next) //直至表尾
{
if(TempDevice->DeviceID==DeviceID) //如果找到設(shè)備
{
OSExitCritical(); //退出臨界段
return (uint32)TempDevice; //返回設(shè)備信息的入口地址
}
TempDevice=TempDevice->Next; //移向下一個(gè)
}
OSExitCritical(); //退出臨界段
return 0; //返回0,表示獲取失敗
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:申請(qǐng)使用一個(gè)設(shè)備。
入口參數(shù)1:DeviceAddr。設(shè)備信息的入口地址。
入口參數(shù)2:DelayTicks。等待的時(shí)鐘節(jié)拍數(shù)。為0時(shí),永久等待。
返回:32位無(wú)符號(hào)整型。返回0,表示申請(qǐng)失敗,超時(shí)。返回1申請(qǐng)成功。
備注:如果一個(gè)設(shè)備被一個(gè)任務(wù)使用后,它將一直被占用,直到該設(shè)備被釋放為止
**********************************************************************************************/
uint32 OSRequestDevice(uint32 DeviceAddr,uint32 DelayTicks)
{
OSEnterCritical(); //進(jìn)入臨界段
if(((OSdevice *)DeviceAddr)->User==0) //如果該設(shè)備未使用
{
((OSdevice *)DeviceAddr)->User=OSCurrentPcb; //則使用該設(shè)備
OSExitCritical(); //退出臨界段
return 1; //返回1,申請(qǐng)成功
}
else //如果設(shè)備已被使用,
{
((OSdevice *)DeviceAddr)->RequestCount++; //則將請(qǐng)求的次數(shù)加1
OSCurrentPcb->WaitFor=((OSdevice *)DeviceAddr)->DeviceID; //設(shè)置任務(wù)等待的原因
if(DelayTicks) //如果延時(shí)的時(shí)鐘節(jié)拍數(shù)非0,
{
OSExitCritical(); //退出臨界段,
OSTaskDelay(DelayTicks); //延遲DelayTicks個(gè)時(shí)鐘節(jié)拍
if(OSCurrentPcb->Delay) //如果任務(wù)延遲時(shí)間未到就被喚醒,則說(shuō)明等待成功
{
OSEnterCritical(); //進(jìn)入臨界段
OSCurrentPcb->Delay=0; //將剩余的延遲時(shí)間設(shè)置為0
OSExitCritical(); //退出臨界段
return 1; //返回1,表示成功
}
else
{
return 0; //返回0,表示等待超時(shí)
}
}
else //如果DelayTicks為0,表示任務(wù)一直等待
{
OSExitCritical(); //退出臨界段
OSTaskSuspend(OSCurrentPcb); //將任務(wù)掛起
return 1; //被喚醒后,返回1。等待成功。
}
}
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:釋放一個(gè)設(shè)備的使用權(quán)。
入口參數(shù)1:DeviceAddr。設(shè)備信息的入口地址。
返回:無(wú)。
備注:設(shè)備被使用后,要調(diào)用該函數(shù)釋放設(shè)備。否則其它任務(wù)不能使用該設(shè)備。
**********************************************************************************************/
void OSFreeDevice(uint32 DeviceAddr)
{
OSpcb * TempPcb;
OSEnterCritical(); //進(jìn)入臨界段
if(((OSdevice *)DeviceAddr)->RequestCount) //如果有任務(wù)在等待使用該設(shè)備
{
((OSdevice *)DeviceAddr)->RequestCount--; //請(qǐng)求次數(shù)減1
TempPcb=OSSuspendList; //查找掛起態(tài)表,看是否有請(qǐng)求該設(shè)備的任務(wù)
while(TempPcb->Next) //直到掛起列表的尾部
{
if(TempPcb->WaitFor==((OSdevice *)DeviceAddr)->DeviceID) //如果找到等待該設(shè)備的任務(wù)
{
((OSdevice *)DeviceAddr)->User=TempPcb; //將設(shè)備的使用權(quán)給該任務(wù)
TempPcb->WaitFor=0; //清除該任務(wù)等待的原因
DeleteFromSuspendList(TempPcb); //將其從掛起態(tài)列表中刪除
InsertToReadyList(TempPcb); //插入到就緒表中
OSExitCritical(); //退出臨界段
OSTaskSwitch(); //任務(wù)切換
return; //返回
}
TempPcb=TempPcb->Next; //移到下一個(gè)
}
TempPcb=OSDelayList; //查找延時(shí)表
while(TempPcb->Next) //直到延時(shí)表的尾部
{
if(TempPcb->WaitFor==((OSdevice *)DeviceAddr)->DeviceID) //如果找到等待該設(shè)備的任務(wù)
{
((OSdevice *)DeviceAddr)->User=TempPcb; //將該設(shè)備使用權(quán)給該任務(wù)
TempPcb->WaitFor=0; //清除等待原因
DeleteFromDelayList(TempPcb); //將其從延時(shí)表中刪除
InsertToReadyList(TempPcb); //插入到就緒表中
OSExitCritical(); //退出臨界段
OSTaskSwitch(); //任務(wù)切換
return; //返回
}
TempPcb=TempPcb->Next; //移到下一個(gè)
}
}
//如果沒(méi)有其它任務(wù)申請(qǐng)使用該設(shè)備,則
((OSdevice *)DeviceAddr)->User=(OSpcb *)0; //該設(shè)備無(wú)任務(wù)使用
OSExitCritical(); //退出臨界段
return; //返回
}
//////////////////////////////////End of function//////////////////////////////////////////////
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -