📄 os_core.lst
字号:
393 * Arguments : none
394 *
395 * Returns : none
396 *
397 * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
398 * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
399 *********************************************************************************************************
400 */
401
402 #if OS_SCHED_LOCK_EN > 0
\ In segment CODE, align 4, keep-with-next
403 void OSSchedUnlock (void)
404 {
\ OSSchedUnlock:
\ 00000000 00B5 PUSH {LR}
405 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
406 OS_CPU_SR cpu_sr;
407 #endif
408
409
410 if (OSRunning == TRUE) { /* Make sure multitasking is running */
\ 00000002 .... LDR R0,??DataTable34 ;; OSRunning
\ 00000004 0078 LDRB R0,[R0, #+0]
\ 00000006 0128 CMP R0,#+1
\ 00000008 1FD1 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,??DataTable32 ;; OSLockNesting
\ 00000010 0978 LDRB R1,[R1, #+0]
\ 00000012 0129 CMP R1,#+1
\ 00000014 17D3 BCC ??OSSchedUnlock_1
413 OSLockNesting--; /* Decrement lock nesting level */
\ 00000016 .... LDR R1,??DataTable32 ;; OSLockNesting
\ 00000018 .... LDR R2,??DataTable32 ;; 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 .... LDR R1,??DataTable32 ;; OSLockNesting
\ 00000022 0978 LDRB R1,[R1, #+0]
\ 00000024 0029 CMP R1,#+0
\ 00000026 0BD1 BNE ??OSSchedUnlock_2
415 if (OSIntNesting == 0) { /* ... not in an ISR */
\ 00000028 .... LDR R1,??DataTable33 ;; OSIntNesting
\ 0000002A 0978 LDRB R1,[R1, #+0]
\ 0000002C 0029 CMP R1,#+0
\ 0000002E 04D1 BNE ??OSSchedUnlock_3
416 OS_EXIT_CRITICAL();
\ 00000030 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
417 OS_Sched(); /* See if a HPT is ready */
\ 00000034 ........ BL OS_Sched
\ 00000038 07E0 B ??OSSchedUnlock_0
418 } else {
419 OS_EXIT_CRITICAL();
\ ??OSSchedUnlock_3:
\ 0000003A ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
\ 0000003E 04E0 B ??OSSchedUnlock_0
420 }
421 } else {
422 OS_EXIT_CRITICAL();
\ ??OSSchedUnlock_2:
\ 00000040 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
\ 00000044 01E0 B ??OSSchedUnlock_0
423 }
424 } else {
425 OS_EXIT_CRITICAL();
\ ??OSSchedUnlock_1:
\ 00000046 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
426 }
427 }
428 }
\ ??OSSchedUnlock_0:
\ 0000004A 01BC POP {R0}
\ 0000004C 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,??DataTable34 ;; OSRunning
\ 00000004 0078 LDRB R0,[R0, #+0]
\ 00000006 0028 CMP R0,#+0
\ 00000008 1FD1 BNE ??OSStart_0
459 y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
\ 0000000A .... LDR R0,??DataTable56 ;; OSRdyGrp
\ 0000000C 0078 LDRB R0,[R0, #+0]
\ 0000000E .... LDR R1,??DataTable38 ;; OSUnMapTbl
\ 00000010 085C LDRB R0,[R1, R0]
460 x = OSUnMapTbl[OSRdyTbl[y]];
\ 00000012 0006 LSLS R0,R0,#+24 ;; ZeroExtS R0,R0,#+24,#+24
\ 00000014 000E LSRS R0,R0,#+24
\ 00000016 .... LDR R1,??DataTable58 ;; OSRdyTbl
\ 00000018 095C LDRB R1,[R1, R0]
\ 0000001A .... LDR R2,??DataTable38 ;; OSUnMapTbl
\ 0000001C 515C LDRB R1,[R2, R1]
461 OSPrioHighRdy = (INT8U)((y << 3) + x);
\ 0000001E .... LDR R2,??DataTable43 ;; OSPrioHighRdy
\ 00000020 C000 LSLS R0,R0,#+3
\ 00000022 4018 ADDS R0,R0,R1
\ 00000024 1070 STRB R0,[R2, #+0]
462 OSPrioCur = OSPrioHighRdy;
\ 00000026 .... LDR R0,??DataTable40 ;; OSPrioCur
\ 00000028 .... LDR R1,??DataTable43 ;; OSPrioHighRdy
\ 0000002A 0978 LDRB R1,[R1, #+0]
\ 0000002C 0170 STRB R1,[R0, #+0]
463 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
\ 0000002E .... LDR R0,??DataTable46 ;; OSTCBHighRdy
\ 00000030 .... LDR R1,??DataTable43 ;; OSPrioHighRdy
\ 00000032 0978 LDRB R1,[R1, #+0]
\ 00000034 0422 MOVS R2,#+4
\ 00000036 5143 MULS R1,R2,R1
\ 00000038 .... LDR R2,??DataTable44 ;; OSTCBPrioTbl
\ 0000003A 5158 LDR R1,[R2, R1]
\ 0000003C 0160 STR R1,[R0, #+0]
464 OSTCBCur = OSTCBHighRdy;
\ 0000003E .... LDR R0,??DataTable85 ;; OSTCBCur
\ 00000040 .... LDR R1,??DataTable46 ;; OSTCBHighRdy
\ 00000042 0968 LDR R1,[R1, #+0]
\ 00000044 0160 STR R1,[R0, #+0]
465 OSStartHighRdy(); /* Execute target specific code to start task */
\ 00000046 ........ _BLF OSStartHighRdy,??OSStartHighRdy??rT
466 }
467 }
\ ??OSStart_0:
\ 0000004A 01BC POP {R0}
\ 0000004C 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,??DataTable49 ;; 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,??DataTable48 ;; OSIdleCtrMax
\ 00000022 .... LDR R2,??DataTable49 ;; OSIdleCtr
\ 00000024 1268 LDR R2,[R2, #+0]
\ 00000026 0A60 STR R2,[R1, #+0]
504 OSStatRdy = TRUE;
\ 00000028 .... LDR R1,??DataTable50 ;; 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*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -