00001 /******************** 00002 *Project: 80X86 32BIT MULTI TASKING OPERATING SYSTEM 00003 *Description: Resource management of multi-tasking kernel 00004 * 00005 *Filename:os_resource.c 00006 *Author: Book Chen 00007 *Date: 2010.01.01 00008 *********************/ 00009 #include "includes.h" 00010 00011 OS_RESOURCE_CONTROL OsResourceCtrl; 00012 00013 void OsResourceInit(void){ 00014 OsResourceCtrl.ResourceNumber=0; 00015 OsResourceCtrl.ResourceList=(OS_RESOURCE *)OS_NULL; 00016 } 00017 00018 OS_BOOL OsResourceAdd(OS_RESOURCE *pResource,U8 *pResourceName,U32 ResourceType){ 00019 OS_RESOURCE *pOsResource; 00020 U8 i; 00021 #if(OS_CRITICAL_METHOD==3) 00022 U32 CpuEflags; 00023 #endif 00024 00025 if(pResource==(OS_RESOURCE *)OS_NULL) return OS_FALSE; 00026 OsEnterCritical(); 00027 for(i=0;i<OS_NAME_STRING_MAX;i++) pResource->Name[i]=0; 00028 if(pResourceName==(U8 *)OS_NULL) OsLibStringCopy(&pResource->Name,OsUnkown); 00029 else OsLibStringCopy(&pResource->Name,pResourceName); 00030 pResource->InUse=OS_FALSE; 00031 pResource->pUser=(U32 *)OS_NULL; 00032 pResource->Type=ResourceType; 00033 pResource->ListHead=(U32 *)OS_NULL; 00034 pResource->ListTail=(U32 *)OS_NULL; 00035 pResource->EntryNumber=0; 00036 pResource->Prev=(OS_RESOURCE *)OS_NULL; 00037 pResource->Next=(OS_RESOURCE *)OS_NULL; 00038 if(OsResourceCtrl.ResourceList==(OS_RESOURCE *)OS_NULL){ 00039 OsResourceCtrl.ResourceList=pResource; 00040 } 00041 else{ 00042 pOsResource=OsResourceCtrl.ResourceList; 00043 pOsResource->Prev=pResource; 00044 pResource->Next=pOsResource; 00045 OsResourceCtrl.ResourceList=pResource; 00046 } 00047 OsExitCritical(); 00048 return OS_TRUE; 00049 } 00050 00051 OS_BOOL OsResourceDelete(OS_RESOURCE *pResource){ 00052 OS_RESOURCE *pOsResource; 00053 #if(OS_CRITICAL_METHOD==3) 00054 U32 CpuEflags; 00055 #endif 00056 00057 if(pResource==(OS_RESOURCE *)OS_NULL) return OS_FALSE; // event is null 00058 if(OsResourceCtrl.ResourceList==(OS_RESOURCE *)OS_NULL) return OS_FALSE; // no event in event list 00059 OsEnterCritical(); 00060 pOsResource=OsResourceCtrl.ResourceList; 00061 while(pOsResource!=(OS_RESOURCE *)OS_NULL){ 00062 if(pOsResource==pResource){ 00063 if(pOsResource==OsResourceCtrl.ResourceList){ 00064 if(OsResourceCtrl.ResourceList->Next!=(OS_RESOURCE *)OS_NULL){ 00065 OsResourceCtrl.ResourceList->Next->Prev=(OS_RESOURCE *)OS_NULL; 00066 } 00067 OsResourceCtrl.ResourceList=OsResourceCtrl.ResourceList->Next; 00068 } 00069 else{ 00070 pOsResource->Prev->Next=pOsResource->Next; 00071 pOsResource->Next->Prev=pOsResource->Prev; 00072 pOsResource->Prev=(OS_RESOURCE *)OS_NULL; 00073 pOsResource->Next=(OS_RESOURCE *)OS_NULL; 00074 } 00075 return OS_TRUE; 00076 } 00077 else pOsResource=pOsResource->Next; 00078 } 00079 OsExitCritical(); 00080 return OS_FALSE; 00081 } 00082 00083 OS_BOOL OsResourceTaskPut(OS_RESOURCE *pResource,OS_TASKENTRY *pTask){ 00084 OS_TASKENTRY **pListHead; 00085 OS_TASKENTRY **pListTail; 00086 OS_TASKENTRY *pHeadTask; 00087 OS_TASKENTRY *pTailTask; 00088 00089 if(pResource==(OS_RESOURCE *)OS_NULL) return OS_FALSE; 00090 if(pTask==(OS_TASKENTRY *)OS_NULL) return OS_FALSE; 00091 pTask->Next=(OS_TASKENTRY *)OS_NULL; 00092 pTask->Prev=(OS_TASKENTRY *)OS_NULL; 00093 pListHead=(OS_TASKENTRY **)(&pResource->ListHead); 00094 pListTail=(OS_TASKENTRY **)(&pResource->ListTail); 00095 pHeadTask=(OS_TASKENTRY *)pResource->ListHead; 00096 pTailTask=(OS_TASKENTRY *)pResource->ListTail; 00097 if(pHeadTask==(OS_TASKENTRY *)OS_NULL){ 00098 *pListHead=pTask; 00099 *pListTail=pTask; 00100 } 00101 else{ 00102 pTask->Prev=pTailTask; 00103 pTailTask->Next=pTask; 00104 *pListTail=pTask; 00105 } 00106 return OS_TRUE; 00107 } 00108 00109 OS_TASKENTRY *OsResourceTaskGet(OS_RESOURCE *pResource){ 00110 OS_TASKENTRY **pListHead; 00111 OS_TASKENTRY **pListTail; 00112 OS_TASKENTRY *pHeadTask; 00113 OS_TASKENTRY *pTailTask; 00114 OS_TASKENTRY *pOsTask; 00115 00116 if(pResource==(OS_RESOURCE *)OS_NULL) return (OS_TASKENTRY *)OS_NULL; 00117 if(pResource->ListHead==(U32 *)OS_NULL) return (OS_TASKENTRY *)OS_NULL; 00118 pListHead=(OS_TASKENTRY **)(&pResource->ListHead); 00119 pListTail=(OS_TASKENTRY **)(&pResource->ListTail); 00120 pHeadTask=(OS_TASKENTRY *)pResource->ListHead; 00121 pTailTask=(OS_TASKENTRY *)pResource->ListTail; 00122 if(pHeadTask==pTailTask){ 00123 pOsTask=pHeadTask; 00124 *pListHead=(OS_TASKENTRY *)OS_NULL; 00125 *pListTail=(OS_TASKENTRY *)OS_NULL; 00126 } 00127 else{ 00128 pOsTask=pHeadTask; 00129 pHeadTask=pHeadTask->Next; 00130 pHeadTask->Prev=(OS_TASKENTRY *)OS_NULL; 00131 *pListHead=pHeadTask; 00132 } 00133 pOsTask->Next=(OS_TASKENTRY *)OS_NULL; 00134 pOsTask->Prev=(OS_TASKENTRY *)OS_NULL; 00135 return pOsTask; 00136 } 00137 00138 OS_BOOL OsResourceAllocate(OS_RESOURCE *pResource,U16 TimeTick){ 00139 OS_TASKENTRY *pOsTask; 00140 #if(OS_CRITICAL_METHOD==3) 00141 U32 CpuEflags; 00142 #endif 00143 00144 if(pResource==(OS_RESOURCE *)OS_NULL) return OS_FALSE; 00145 OsEnterCritical(); 00146 pOsTask=(OS_TASKENTRY *)OsTaskCurrent; 00147 if(pResource->InUse==OS_TRUE){ 00148 if(TimeTick==0){ 00149 OsExitCritical(); 00150 return OS_FALSE; 00151 } 00152 pOsTask->Status=OS_TASK_PENDING; 00153 pOsTask->PendingType=OS_PENDING_RESOURCE; 00154 pOsTask->TimeDelay=TimeTick; 00155 OsResourceTaskPut(pResource,pOsTask); 00156 OsTaskSwitchOut(); 00157 if((pResource->InUse=OS_TRUE)&&(pResource->pUser==(U32 *)pOsTask)){ 00158 OsExitCritical(); 00159 return OS_TRUE; 00160 } 00161 if(pOsTask->TimeDelay==0){ 00162 OsExitCritical(); 00163 return OS_FALSE; 00164 } 00165 } 00166 pResource->InUse=OS_TRUE; 00167 pResource->pUser=(U32 *)pOsTask; 00168 OsExitCritical(); 00169 return OS_TRUE; 00170 } 00171 00172 OS_BOOL OsResourceRelease(OS_RESOURCE *pResource){ 00173 OS_TASKENTRY *pOsTask; 00174 #if(OS_CRITICAL_METHOD==3) 00175 U32 CpuEflags; 00176 #endif 00177 00178 if(pResource==(OS_RESOURCE *)OS_NULL) return OS_FALSE; 00179 OsEnterCritical(); 00180 pOsTask=(OS_TASKENTRY *)OsTaskCurrent; 00181 if(pResource->InUse==OS_FALSE){ 00182 OsExitCritical(); 00183 return OS_TRUE; 00184 } 00185 if(pResource->pUser!=(U32 *)pOsTask){ 00186 OsExitCritical(); 00187 return OS_FALSE; 00188 } 00189 pResource->InUse=OS_FALSE; 00190 pResource->pUser=(U32 *)OS_NULL; 00191 pOsTask=OsResourceTaskGet(pResource); 00192 if(pOsTask==(OS_TASKENTRY *)OS_NULL){ 00193 OsExitCritical(); 00194 return OS_TRUE; 00195 } 00196 pResource->InUse=OS_TRUE; 00197 pResource->pUser=(U32 *)pOsTask; 00198 OsTaskReadyTaskPut(pOsTask); 00199 OsExitCritical(); 00200 } 00201 00202 OS_BOOL OsResourceUserCheck(OS_RESOURCE *pResource){ 00203 if(pResource->pUser==OsTaskCurrent) return OS_TRUE; 00204 else return OS_FALSE; 00205 } 00206 00207 OS_BOOL OsResourceTaskFind(U8 *pTaskName){ 00208 OS_RESOURCE *pOsResource; 00209 OS_TASKENTRY *pOsTask; 00210 00211 pOsResource=OsResourceCtrl.ResourceList; 00212 while(pOsResource!=(OS_RESOURCE *)OS_NULL){ 00213 pOsTask=(OS_TASKENTRY *)pOsResource->ListHead; 00214 while(pOsTask!=(OS_TASKENTRY *)OS_NULL){ 00215 if(OsLibStringCompare((U8 *)pOsTask->Name,pTaskName)==OS_TRUE){ 00216 return OS_TRUE; 00217 } 00218 else pOsTask=pOsTask->Next; 00219 } 00220 pOsResource=pOsResource->Next; 00221 } 00222 return OS_FALSE; 00223 } 00224 00225 OS_BOOL OsResourceTaskDelete(U8 *pTaskName){ 00226 OS_RESOURCE *pOsResource; 00227 OS_TASKENTRY *pOsTask; 00228 00229 pOsResource=OsResourceCtrl.ResourceList; 00230 while(pOsResource!=(OS_RESOURCE *)OS_NULL){ 00231 pOsTask=(OS_TASKENTRY *)pOsResource->ListHead; 00232 while(pOsTask!=(OS_TASKENTRY *)OS_NULL){ 00233 if(OsLibStringCompare((U8 *)pOsTask->Name,pTaskName)==OS_TRUE){ 00234 if(pOsTask==(OS_TASKENTRY *)pOsResource->ListHead){ 00235 if(pOsTask==(OS_TASKENTRY *)pOsResource->ListTail){ 00236 pOsResource->ListHead=(U32 *)OS_NULL; 00237 pOsResource->ListTail=(U32 *)OS_NULL; 00238 OsTaskFreeTaskPut(pOsTask); 00239 } 00240 else{ 00241 pOsTask->Next->Prev=(OS_TASKENTRY *)OS_NULL; 00242 pOsResource->ListHead=(U32 *)pOsTask->Next; 00243 OsTaskFreeTaskPut(pOsTask); 00244 } 00245 } 00246 else if(pOsTask==(OS_TASKENTRY *)pOsResource->ListTail){ 00247 pOsTask->Prev->Next=(OS_TASKENTRY *)OS_NULL; 00248 pOsResource->ListTail=(U32 *)pOsTask->Prev; 00249 OsTaskFreeTaskPut(pOsTask); 00250 } 00251 else{ 00252 pOsTask->Prev->Next=pOsTask->Next; 00253 pOsTask->Next->Prev=pOsTask->Prev; 00254 OsTaskFreeTaskPut(pOsTask); 00255 } 00256 if((pOsResource->InUse==OS_TRUE)&&(pOsResource->pUser==(U32 *)pOsTask)){ 00257 pOsResource->InUse=OS_FALSE; 00258 pOsResource->pUser=(U32 *)OS_NULL; 00259 pOsTask=OsResourceTaskGet(pOsResource); 00260 if(pOsTask==(OS_TASKENTRY *)OS_NULL){ 00261 return OS_TRUE; 00262 } 00263 pOsResource->InUse=OS_TRUE; 00264 pOsResource->pUser=(U32 *)pOsTask; 00265 OsTaskReadyTaskPut(pOsTask); 00266 } 00267 return OS_TRUE; 00268 } 00269 else pOsTask=pOsTask->Next; 00270 } 00271 pOsResource=pOsResource->Next; 00272 } 00273 return OS_FALSE; 00274 }
1.5.9