?? arm_00_os_core.lst
字號:
212 5 }
213 4 }
214 3 OSExitCritical(); //退出臨界段
215 3 return Length; //返回使用的內存數量
216 3 }
217 2
218 2 case GET_MEMORY_POOL_SIZE: //如果是獲取緩沖池大小,
219 2 {
220 3 OSExitCritical(); //退出臨界段
221 3 return OSSizeOfMemoryPool; //返回緩沖池的字節數
222 3 }
223 2
224 2 case MEMORY_TEST: //如果是內存檢測
225 2 {
226 3 j=0xFF; //標志j為非0,即初始化成功
227 3 prints("Memory testing. ",1); //顯示信息
228 3 for(i=0;i<OSSizeOfMemoryPool/4;i++) //檢測整個內存緩沖池
229 3 {
230 4 OSMemoryPool[i]=0x55555555; //寫入0x55555555
231 4 if(OSMemoryPool[i]!=0x55555555) //如果讀回的不是0x55555555
232 4 {
233 5 j=0; //則測試失敗
234 5 }
235 4 OSMemoryPool[i]=0xAAAAAAAA; //寫入0xAAAAAAAA
236 4 if(OSMemoryPool[i]!=0xAAAAAAAA) //如果讀回的不是0xAAAAAAAA
237 4 {
238 5 j=0; //則測試失敗
239 5 }
240 4 OSMemoryPool[i]=0; //寫入0
241 4 if(OSMemoryPool[i]!=0) //如果讀回的不是0
242 4 {
243 5 j=0; //則測試失敗
244 5 }
245 4 if(i%(OSSizeOfMemoryPool/4/80)==0) //顯示測試進度。共顯示80個>
246 4 {
247 5 prints(">",0);
248 5 }
249 4 }
250 3 prints("",1);
251 3 if(j) //如果測試成功
252 3 {
253 4 prints("Memory test passed.",1); //顯示成功
254 4 }
255 3 else //否則,
256 3 {
ARM COMPILER V2.50a, ARM_00_OS_Core 28/08/06 09:18:53 PAGE 5
257 4 prints("Memroy test failed.",1); //顯示測試失敗
258 4 }
259 3 OSExitCritical(); //退出臨界段
260 3 return j; //返回是否成功
261 3 }
262 2 default: OSExitCritical();return 0;
263 2 }
264 1 }
265 //////////////////////////////////End of function//////////////////////////////////////////////
266
267
268 /**********************************************************************************************
269 功能:進入臨界段。
270 入口參數:無。
271 返回:無。
272 備注:該函數使用的是將中斷分配寄存器清0的方法來關中斷。比起用軟中斷,運行速度要快。
273 如果要開某個中斷,則應該先調用一次該函數,然后再修改中斷備份變量CopyOfVICIntEnable
274 的值,而不能直接修改VICIntEnable的值。否則會出錯。
275 **********************************************************************************************/
276 void OSEnterCritical(void)
277 {
278 1 if(OSEnCrCount==0) //如果前面未關中斷
279 1 {
280 2 // CopyOfVICIntEnable=VICIntEnable; //則將VICIntEnable值保存到備份中/*可能有潛在的bug,所以將其刪除了*
-/
281 2 VICIntEnClr=0xFFFFFFFF; //將VICIntEnable清除,禁止中斷
282 2 }
283 1 OSEnCrCount++; //進入臨界段次數加1
284 1 }
285 //////////////////////////////////End of function//////////////////////////////////////////////
286
287
288 /**********************************************************************************************
289 功能:退出臨界段
290 入口參數:無。
291 返回:無。
292 備注:無。
293 **********************************************************************************************/
294 void OSExitCritical(void)
295 {
296 1 if(OSEnCrCount>=1) //如果進入臨界段的次數大于等于1次
297 1 {
298 2 OSEnCrCount--; //則次數減1
299 2 if(OSEnCrCount==0) //如果減次數減到0,則要開中斷
300 2 {
301 3 VICIntEnable=CopyOfVICIntEnable; //打開所需要開的中斷
302 3 }
303 2 }
304 1 }
305 //////////////////////////////////End of function//////////////////////////////////////////////
306
307
308 /**********************************************************************************************
309 功能:將pcb指向的任務從延時列表中刪除
310 入口參數1:pcb。被指定的任務。
311 返回:0:刪除失敗。非0:刪除成功。
312 備注:該函數使用前,應先進入臨界段。
313 **********************************************************************************************/
314 uint32 DeleteFromDelayList(OSpcb *pcb)
315 {
316 1 if(pcb->Next==0){return 0;} //如果被刪除的任務為表底,則不能刪除,返回刪除失敗
317 1 if(pcb==OSDelayList) //如果被刪除的pcb處于表頭
318 1 {
319 2 OSDelayList=pcb->Next; //則延時表指向被刪除任務pcb的下一個
320 2 OSDelayList->Prior=OSDelayList; //延時表的前趨指向它本身
321 2 }
ARM COMPILER V2.50a, ARM_00_OS_Core 28/08/06 09:18:53 PAGE 6
322 1 else //如果被刪除的任務pcb處于中間,則
323 1 {
324 2 pcb->Prior->Next=pcb->Next; //pcb的前趨的后趨,設置為pcb的后趨
325 2 pcb->Next->Prior=pcb->Prior; //pcb的后趨的前趨,設置為pcb的前趨
326 2 }
327 1 return (uint32)pcb; //返回被刪除的任務pcb
328 1 }
329 //////////////////////////////////End of function//////////////////////////////////////////////
330
331
332 /**********************************************************************************************
333 功能:將pcb指向的任務從就緒態列表中刪除
334 入口參數1:pcb。被指定的任務。
335 返回:0:刪除失敗。非0:刪除成功。
336 備注:該函數使用前,應先進入臨界段。
337 **********************************************************************************************/
338 uint32 DeleteFromReadyList(OSpcb * pcb)
339 {
340 1 if(pcb->Next==0)return 0; //如果被刪除的任務為表底,則不能刪除,返回刪除失敗
341 1 if(pcb==OSReadyList) //如果被刪除的pcb處于表頭
342 1 {
343 2 OSReadyList=pcb->Next; //則就緒表指向被刪除任務pcb的下一個
344 2 OSReadyList->Prior=OSReadyList; //就緒表的前趨指向它本身
345 2 }
346 1 else //如果被刪除的任務pcb處于中間,則
347 1 {
348 2 pcb->Prior->Next=pcb->Next; //pcb的前趨的后趨,設置為pcb的后趨
349 2 pcb->Next->Prior=pcb->Prior; //pcb的后趨的前趨,設置為pcb的前趨
350 2 }
351 1 return (uint32)pcb; //返回被刪除的任務pcb
352 1 }
353 //////////////////////////////////End of function//////////////////////////////////////////////
354
355
356 /**********************************************************************************************
357 功能:將pcb指向的任務從掛起列表中刪除
358 入口參數1:pcb。被指定的任務。
359 返回:0:刪除失敗。非0:刪除成功。
360 備注:該函數使用前,應先進入臨界段。
361 **********************************************************************************************/
362 uint32 DeleteFromSuspendList(OSpcb *pcb)
363 {
364 1 if(pcb->Next==0)return 0; //如果被刪除的任務為表底,則不能刪除,返回刪除失敗
365 1 if(pcb==OSSuspendList) //如果被刪除的pcb處于表頭
366 1 {
367 2 OSSuspendList=pcb->Next; //則掛起態表指向被刪除任務pcb的下一個
368 2 OSSuspendList->Prior=OSSuspendList; //掛起態表的前趨指向它本身
369 2 }
370 1 else //如果被刪除的任務pcb處于中間,則
371 1 {
372 2 pcb->Prior->Next=pcb->Next; //pcb的前趨的后趨,設置為pcb的后趨
373 2 pcb->Next->Prior=pcb->Prior; //pcb的后趨的前趨,設置為pcb的前趨
374 2 }
375 1 return (uint32)pcb; //返回被刪除的任務pcb
376 1 }
377 //////////////////////////////////End of function//////////////////////////////////////////////
378
379
380 /**********************************************************************************************
381 功能:將pcb指向的任務插入到掛起列表中
382 入口參數1:pcb。被指定的任務。
383 返回:無。
384 備注:該函數使用前,應先進入臨界段。
385 **********************************************************************************************/
386 void InsertToSuspendList(OSpcb * pcb)
387 {
ARM COMPILER V2.50a, ARM_00_OS_Core 28/08/06 09:18:53 PAGE 7
388 1 pcb->Status=OSInSuspendStatus; //指定任務的狀態設置為掛起狀態
389 1 pcb->Next=OSSuspendList; //指定任務的后趨指向掛起態列表的表頭
390 1 OSSuspendList->Prior=pcb; //掛起態任務列表的前趨指向指定任務pcb
391 1 OSSuspendList=pcb; //掛起態列表的表頭設置為剛插入的指定任務
392 1 OSSuspendList->Prior=OSSuspendList; //掛起態列表表頭的前趨指向它本身
393 1 }
394 //////////////////////////////////End of function//////////////////////////////////////////////
395
396
397 /**********************************************************************************************
398 功能:將pcb指向的任務插入到延時列表中
399 入口參數1:pcb。被指定的任務。
400 返回:無。
401 備注:該函數使用前,應先進入臨界段。
402 **********************************************************************************************/
403 void InsertToDelayList(OSpcb * pcb)
404 {
405 1 pcb->Status=OSInDelayStatus; //指定任務的狀態設置為延時狀態
406 1 pcb->Next=OSDelayList; //指定任務的后趨指向延時態列表的表頭
407 1 OSDelayList->Prior=pcb; //延時態任務列表的前趨指向指定任務pcb
408 1 OSDelayList=pcb; //延時態列表的表頭設置為剛插入的指定任務
409 1 OSDelayList->Prior=OSDelayList; //延時態列表表頭的前趨指向它本身
410 1 }
411 //////////////////////////////////End of function//////////////////////////////////////////////
412
413
414 /**********************************************************************************************
415 功能:將pcb指向的任務插入到就緒表中
416 入口參數1:pcb。被指定的任務。
417 返回:無。
418 備注:該函數使用前,應先進入臨界段。
419 **********************************************************************************************/
420 void InsertToReadyList(OSpcb *pcb)
421 {
422 1 OSpcb * TempPcb; //用來查找就緒表,確定該插入到何處
423 1
424 1 pcb->Status=OSInReadyStatus; //指定任務的狀態設置為就緒態
425 1
426 1 TempPcb=OSReadyList; //設置為就緒表表頭
427 1
428 1 do
429 1 {
430 2 if((pcb->Priority)<=(TempPcb->Priority)) //如果要插入的任務優先級高于或者等于被查找到的任務,則將其
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -