📄 os_core.lst
字号:
\ 00000004 0078 LDRB R0,[R0, #+0]
\ 00000006 0128 CMP R0,#+1
\ 00000008 18D1 BNE ??OSSchedUnlock_0
411 OS_ENTER_CRITICAL();
\ 0000000A ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
412 if (OSLockNesting > 0) { /* Do not decrement if already 0 */
\ 0000000E .... LDR R1,??DataTable28 ;; OSLockNesting
\ 00000010 0978 LDRB R1,[R1, #+0]
\ 00000012 0029 CMP R1,#+0
\ 00000014 10D0 BEQ ??OSSchedUnlock_1
413 OSLockNesting--; /* Decrement lock nesting level */
\ 00000016 .... LDR R1,??DataTable28 ;; OSLockNesting
\ 00000018 .... LDR R2,??DataTable28 ;; OSLockNesting
\ 0000001A 1278 LDRB R2,[R2, #+0]
\ 0000001C 521E SUBS R2,R2,#+1
\ 0000001E 0A70 STRB R2,[R1, #+0]
414 if (OSLockNesting == 0) { /* See if scheduler is enabled and ... */
\ 00000020 0978 LDRB R1,[R1, #+0]
\ 00000022 0029 CMP R1,#+0
\ 00000024 08D1 BNE ??OSSchedUnlock_2
415 if (OSIntNesting == 0) { /* ... not in an ISR */
\ 00000026 .... LDR R1,??DataTable29 ;; OSIntNesting
\ 00000028 0978 LDRB R1,[R1, #+0]
\ 0000002A 0029 CMP R1,#+0
\ 0000002C 04D1 BNE ??OSSchedUnlock_1
416 OS_EXIT_CRITICAL();
\ 0000002E ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
417 OS_Sched(); /* See if a HPT is ready */
\ 00000032 ........ BL OS_Sched
\ 00000036 01E0 B ??OSSchedUnlock_0
418 } else {
419 OS_EXIT_CRITICAL();
420 }
421 } else {
422 OS_EXIT_CRITICAL();
423 }
424 } else {
425 OS_EXIT_CRITICAL();
\ ??OSSchedUnlock_2:
\ ??OSSchedUnlock_1:
\ 00000038 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
426 }
427 }
428 }
\ ??OSSchedUnlock_0:
\ 0000003C 01BC POP {R0}
\ 0000003E 0047 BX R0 ;; return
429 #endif
430
431 /*$PAGE*/
432 /*
433 *********************************************************************************************************
434 * START MULTITASKING
435 *
436 * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
437 * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
438 * and you MUST have created at least one task.
439 *
440 * Arguments : none
441 *
442 * Returns : none
443 *
444 * Note : OSStartHighRdy() MUST:
445 * a) Call OSTaskSwHook() then,
446 * b) Set OSRunning to TRUE.
447 * c) Load the context of the task pointed to by OSTCBHighRdy.
448 * d_ Execute the task.
449 *********************************************************************************************************
450 */
451
\ In segment CODE, align 4, keep-with-next
452 void OSStart (void)
453 {
\ OSStart:
\ 00000000 00B5 PUSH {LR}
454 INT8U y;
455 INT8U x;
456
457
458 if (OSRunning == FALSE) {
\ 00000002 .... LDR R0,??DataTable51 ;; OSRunning
\ 00000004 0078 LDRB R0,[R0, #+0]
\ 00000006 0028 CMP R0,#+0
\ 00000008 20D1 BNE ??OSStart_0
459 y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
460 x = OSUnMapTbl[OSRdyTbl[y]];
461 OSPrioHighRdy = (INT8U)((y << 3) + x);
\ 0000000A .... LDR R0,??DataTable41 ;; OSPrioHighRdy
\ 0000000C .... LDR R1,??DataTable54 ;; OSRdyGrp
\ 0000000E 0978 LDRB R1,[R1, #+0]
\ 00000010 .... LDR R2,??DataTable59 ;; OSUnMapTbl
\ 00000012 515C LDRB R1,[R2, R1]
\ 00000014 C900 LSLS R1,R1,#+3
\ 00000016 .... LDR R2,??DataTable54 ;; OSRdyGrp
\ 00000018 1278 LDRB R2,[R2, #+0]
\ 0000001A .... LDR R3,??DataTable59 ;; OSUnMapTbl
\ 0000001C 9A5C LDRB R2,[R3, R2]
\ 0000001E .... LDR R3,??DataTable65 ;; OSRdyTbl
\ 00000020 9A5C LDRB R2,[R3, R2]
\ 00000022 .... LDR R3,??DataTable59 ;; OSUnMapTbl
\ 00000024 9A5C LDRB R2,[R3, R2]
\ 00000026 8918 ADDS R1,R1,R2
\ 00000028 0170 STRB R1,[R0, #+0]
462 OSPrioCur = OSPrioHighRdy;
\ 0000002A .... LDR R0,??DataTable38 ;; OSPrioCur
\ 0000002C .... LDR R1,??DataTable41 ;; OSPrioHighRdy
\ 0000002E 0978 LDRB R1,[R1, #+0]
\ 00000030 0170 STRB R1,[R0, #+0]
463 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
\ 00000032 .... LDR R0,??DataTable44 ;; OSTCBHighRdy
\ 00000034 .... LDR R1,??DataTable41 ;; OSPrioHighRdy
\ 00000036 0978 LDRB R1,[R1, #+0]
\ 00000038 8900 LSLS R1,R1,#+2
\ 0000003A .... LDR R2,??DataTable61 ;; OSTCBPrioTbl
\ 0000003C 5158 LDR R1,[R2, R1]
\ 0000003E 0160 STR R1,[R0, #+0]
464 OSTCBCur = OSTCBHighRdy;
\ 00000040 .... LDR R0,??DataTable83 ;; OSTCBCur
\ 00000042 .... LDR R1,??DataTable44 ;; OSTCBHighRdy
\ 00000044 0968 LDR R1,[R1, #+0]
\ 00000046 0160 STR R1,[R0, #+0]
465 OSStartHighRdy(); /* Execute target specific code to start task */
\ 00000048 ........ _BLF OSStartHighRdy,??OSStartHighRdy??rT
466 }
467 }
\ ??OSStart_0:
\ 0000004C 01BC POP {R0}
\ 0000004E 0047 BX R0 ;; return
468 /*$PAGE*/
469 /*
470 *********************************************************************************************************
471 * STATISTICS INITIALIZATION
472 *
473 * Description: This function is called by your application to establish CPU usage by first determining
474 * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
475 * during that time. CPU usage is then determined by a low priority task which keeps track
476 * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
477 * determined by:
478 *
479 * OSIdleCtr
480 * CPU Usage (%) = 100 * (1 - ------------)
481 * OSIdleCtrMax
482 *
483 * Arguments : none
484 *
485 * Returns : none
486 *********************************************************************************************************
487 */
488
489 #if OS_TASK_STAT_EN > 0
\ In segment CODE, align 4, keep-with-next
490 void OSStatInit (void)
491 {
\ OSStatInit:
\ 00000000 00B5 PUSH {LR}
492 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
493 OS_CPU_SR cpu_sr;
494 #endif
495
496
497 OSTimeDly(2); /* Synchronize with clock tick */
\ 00000002 0220 MOVS R0,#+2
\ 00000004 ........ _BLF OSTimeDly,??OSTimeDly??rT
498 OS_ENTER_CRITICAL();
\ 00000008 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
499 OSIdleCtr = 0L; /* Clear idle counter */
\ 0000000C .... LDR R1,??DataTable47 ;; OSIdleCtr
\ 0000000E 0022 MOVS R2,#+0
\ 00000010 0A60 STR R2,[R1, #+0]
500 OS_EXIT_CRITICAL();
\ 00000012 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
501 OSTimeDly(OS_TICKS_PER_SEC / 10); /* Determine MAX. idle counter value for 1/10 second */
\ 00000016 0A20 MOVS R0,#+10
\ 00000018 ........ _BLF OSTimeDly,??OSTimeDly??rT
502 OS_ENTER_CRITICAL();
\ 0000001C ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
503 OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
\ 00000020 .... LDR R1,??DataTable46 ;; OSIdleCtrMax
\ 00000022 .... LDR R2,??DataTable47 ;; OSIdleCtr
\ 00000024 1268 LDR R2,[R2, #+0]
\ 00000026 0A60 STR R2,[R1, #+0]
504 OSStatRdy = TRUE;
\ 00000028 .... LDR R1,??DataTable48 ;; OSStatRdy
\ 0000002A 0122 MOVS R2,#+1
\ 0000002C 0A70 STRB R2,[R1, #+0]
505 OS_EXIT_CRITICAL();
\ 0000002E ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
506 }
\ 00000032 01BC POP {R0}
\ 00000034 0047 BX R0 ;; return
507 #endif
508 /*$PAGE*/
509 /*
510 *********************************************************************************************************
511 * PROCESS SYSTEM TICK
512 *
513 * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
514 * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
515 * called by a high priority task.
516 *
517 * Arguments : none
518 *
519 * Returns : none
520 *********************************************************************************************************
521 */
522
\ In segment CODE, align 4, keep-with-next
523 void OSTimeTick (void)
524 {
\ OSTimeTick:
\ 00000000 30B5 PUSH {R4,R5,LR}
525 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
526 OS_CPU_SR cpu_sr;
527 #endif
528 OS_TCB *ptcb;
529 BOOLEAN step;
530
531
532 #if OS_TIME_TICK_HOOK_EN > 0
533 OSTimeTickHook();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -