📄 os_core.lst
字号:
\ 00000054 0010C0E5 STRB R1,[R0, #+0]
394 }
395 }
396 OS_EXIT_CRITICAL();
\ ??OSSchedLock_1:
\ 00000058 0400B0E1 MOVS R0,R4
\ 0000005C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
397 }
398 }
\ ??OSSchedLock_0:
\ 00000060 1080BDE8 POP {R4,PC} ;; return
399 #endif
400
401 /*$PAGE*/
402 /*
403 *********************************************************************************************************
404 * ENABLE SCHEDULING
405 *
406 * Description: This function is used to re-allow rescheduling.
407 *
408 * Arguments : none
409 *
410 * Returns : none
411 *
412 * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
413 * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
414 *********************************************************************************************************
415 */
416
417 #if OS_SCHED_LOCK_EN > 0
\ In segment CODE, align 4, keep-with-next
418 void OSSchedUnlock (void)
419 {
\ OSSchedUnlock:
\ 00000000 10402DE9 PUSH {R4,LR}
420 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
421 OS_CPU_SR cpu_sr = 0;
\ 00000004 0000A0E3 MOV R0,#+0
\ 00000008 0040B0E1 MOVS R4,R0
422 #endif
423
424
425
426 if (OSRunning == OS_TRUE) { /* Make sure multitasking is running */
\ 0000000C ........ LDR R0,??DataTable80 ;; OSRunning
\ 00000010 0000D0E5 LDRB R0,[R0, #+0]
\ 00000014 010050E3 CMP R0,#+1
\ 00000018 1E00001A BNE ??OSSchedUnlock_0
427 OS_ENTER_CRITICAL();
\ 0000001C ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000020 0040B0E1 MOVS R4,R0
428 if (OSLockNesting > 0) { /* Do not decrement if already 0 */
\ 00000024 ........ LDR R0,??DataTable96 ;; OSLockNesting
\ 00000028 0000D0E5 LDRB R0,[R0, #+0]
\ 0000002C 010050E3 CMP R0,#+1
\ 00000030 1600003A BCC ??OSSchedUnlock_1
429 OSLockNesting--; /* Decrement lock nesting level */
\ 00000034 ........ LDR R0,??DataTable96 ;; OSLockNesting
\ 00000038 ........ LDR R1,??DataTable96 ;; OSLockNesting
\ 0000003C 0010D1E5 LDRB R1,[R1, #+0]
\ 00000040 011051E2 SUBS R1,R1,#+1
\ 00000044 0010C0E5 STRB R1,[R0, #+0]
430 if (OSLockNesting == 0) { /* See if scheduler is enabled and ... */
\ 00000048 ........ LDR R0,??DataTable96 ;; OSLockNesting
\ 0000004C 0000D0E5 LDRB R0,[R0, #+0]
\ 00000050 000050E3 CMP R0,#+0
\ 00000054 0A00001A BNE ??OSSchedUnlock_2
431 if (OSIntNesting == 0) { /* ... not in an ISR */
\ 00000058 ........ LDR R0,??DataTable95 ;; OSIntNesting
\ 0000005C 0000D0E5 LDRB R0,[R0, #+0]
\ 00000060 000050E3 CMP R0,#+0
\ 00000064 0300001A BNE ??OSSchedUnlock_3
432 OS_EXIT_CRITICAL();
\ 00000068 0400B0E1 MOVS R0,R4
\ 0000006C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
433 OS_Sched(); /* See if a HPT is ready */
\ 00000070 ........ BL OS_Sched
\ 00000074 070000EA B ??OSSchedUnlock_0
434 } else {
435 OS_EXIT_CRITICAL();
\ ??OSSchedUnlock_3:
\ 00000078 0400B0E1 MOVS R0,R4
\ 0000007C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
\ 00000080 040000EA B ??OSSchedUnlock_0
436 }
437 } else {
438 OS_EXIT_CRITICAL();
\ ??OSSchedUnlock_2:
\ 00000084 0400B0E1 MOVS R0,R4
\ 00000088 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
\ 0000008C 010000EA B ??OSSchedUnlock_0
439 }
440 } else {
441 OS_EXIT_CRITICAL();
\ ??OSSchedUnlock_1:
\ 00000090 0400B0E1 MOVS R0,R4
\ 00000094 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
442 }
443 }
444 }
\ ??OSSchedUnlock_0:
\ 00000098 1080BDE8 POP {R4,PC} ;; return
445 #endif
446
447 /*$PAGE*/
448 /*
449 *********************************************************************************************************
450 * START MULTITASKING
451 *
452 * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
453 * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
454 * and you MUST have created at least one task.
455 *
456 * Arguments : none
457 *
458 * Returns : none
459 *
460 * Note : OSStartHighRdy() MUST:
461 * a) Call OSTaskSwHook() then,
462 * b) Set OSRunning to OS_TRUE.
463 * c) Load the context of the task pointed to by OSTCBHighRdy.
464 * d_ Execute the task.
465 *********************************************************************************************************
466 */
467
\ In segment CODE, align 4, keep-with-next
468 void OSStart (void)
469 {
\ OSStart:
\ 00000000 00402DE9 PUSH {LR}
470 if (OSRunning == OS_FALSE) {
\ 00000004 ........ LDR R0,??DataTable80 ;; OSRunning
\ 00000008 0000D0E5 LDRB R0,[R0, #+0]
\ 0000000C 000050E3 CMP R0,#+0
\ 00000010 1100001A BNE ??OSStart_0
471 OS_SchedNew(); /* Find highest priority's task priority number */
\ 00000014 ........ BL OS_SchedNew
472 OSPrioCur = OSPrioHighRdy;
\ 00000018 ........ LDR R0,??DataTable98 ;; OSPrioCur
\ 0000001C ........ LDR R1,??DataTable108 ;; OSPrioHighRdy
\ 00000020 0010D1E5 LDRB R1,[R1, #+0]
\ 00000024 0010C0E5 STRB R1,[R0, #+0]
473 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
\ 00000028 ........ LDR R0,??DataTable103 ;; OSTCBHighRdy
\ 0000002C ........ LDR R1,??DataTable108 ;; OSPrioHighRdy
\ 00000030 0010D1E5 LDRB R1,[R1, #+0]
\ 00000034 0420A0E3 MOV R2,#+4
\ 00000038 ........ LDR R3,??DataTable120 ;; OSTCBPrioTbl
\ 0000003C 923121E0 MLA R1,R2,R1,R3
\ 00000040 001091E5 LDR R1,[R1, #+0]
\ 00000044 001080E5 STR R1,[R0, #+0]
474 OSTCBCur = OSTCBHighRdy;
\ 00000048 ........ LDR R0,??DataTable91 ;; OSTCBCur
\ 0000004C ........ LDR R1,??DataTable103 ;; OSTCBHighRdy
\ 00000050 001091E5 LDR R1,[R1, #+0]
\ 00000054 001080E5 STR R1,[R0, #+0]
475 OSStartHighRdy(); /* Execute target specific code to start task */
\ 00000058 ........ _BLF OSStartHighRdy,??OSStartHighRdy??rA
476 }
477 }
\ ??OSStart_0:
\ 0000005C 0080BDE8 POP {PC} ;; return
478 /*$PAGE*/
479 /*
480 *********************************************************************************************************
481 * STATISTICS INITIALIZATION
482 *
483 * Description: This function is called by your application to establish CPU usage by first determining
484 * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
485 * during that time. CPU usage is then determined by a low priority task which keeps track
486 * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
487 * determined by:
488 *
489 * OSIdleCtr
490 * CPU Usage (%) = 100 * (1 - ------------)
491 * OSIdleCtrMax
492 *
493 * Arguments : none
494 *
495 * Returns : none
496 *********************************************************************************************************
497 */
498
499 #if OS_TASK_STAT_EN > 0
\ In segment CODE, align 4, keep-with-next
500 void OSStatInit (void)
501 {
\ OSStatInit:
\ 00000000 10402DE9 PUSH {R4,LR}
502 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
503 OS_CPU_SR cpu_sr = 0;
\ 00000004 0000A0E3 MOV R0,#+0
\ 00000008 0040B0E1 MOVS R4,R0
504 #endif
505
506
507
508 OSTimeDly(2); /* Synchronize with clock tick */
\ 0000000C 0200A0E3 MOV R0,#+2
\ 00000010 ........ _BLF OSTimeDly,??OSTimeDly??rA
509 OS_ENTER_CRITICAL();
\ 00000014 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000018 0040B0E1 MOVS R4,R0
510 OSIdleCtr = 0L; /* Clear idle counter */
\ 0000001C ........ LDR R0,??DataTable118 ;; OSIdleCtr
\ 00000020 0010A0E3 MOV R1,#+0
\ 00000024 001080E5 STR R1,[R0, #+0]
511 OS_EXIT_CRITICAL();
\ 00000028 0400B0E1 MOVS R0,R4
\ 0000002C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
512 OSTimeDly(OS_TICKS_PER_SEC / 10); /* Determine MAX. idle counter value for 1/10 second */
\ 00000030 6400A0E3 MOV R0,#+100
\ 00000034 ........ _BLF OSTimeDly,??OSTimeDly??rA
513 OS_ENTER_CRITICAL();
\ 00000038 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 0000003C 0040B0E1 MOVS R4,R0
514 OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
\ 00000040 ........ LDR R0,??DataTable119 ;; OSIdleCtrMax
\ 00000044 ........ LDR R1,??DataTable118 ;; OSIdleCtr
\ 00000048 001091E5 LDR R1,[R1, #+0]
\ 0000004C 001080E5 STR R1,[R0, #+0]
515 OSStatRdy = OS_TRUE;
\ 00000050 ........ LDR R0,??DataTable113 ;; OSStatRdy
\ 00000054 0110A0E3 MOV R1,#+1
\ 00000058 0010C0E5 STRB R1,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -