📄 os_core.s79
字号:
CMP R1,#+255
BEQ ??OSSchedLock_1
// 379 OSLockNesting++; /* Increment lock nesting level */
LDR R1,??DataTable28 ;; OSLockNesting
LDR R2,??DataTable28 ;; OSLockNesting
LDRB R2,[R2, #+0]
ADDS R2,R2,#+1
STRB R2,[R1, #+0]
// 380 }
// 381 OS_EXIT_CRITICAL();
??OSSchedLock_1:
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 382 }
// 383 }
??OSSchedLock_0:
POP {R0}
BX R0 ;; return
CFI EndBlock cfiBlock11
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock12 Using cfiCommon0
CFI NoFunction
ARM
??OSSchedUnlock??rA:
ADD R12,PC,#+1
BX R12
CFI EndBlock cfiBlock12
REQUIRE OSSchedUnlock
// 384 #endif
// 385
// 386 /*$PAGE*/
// 387 /*
// 388 *********************************************************************************************************
// 389 * ENABLE SCHEDULING
// 390 *
// 391 * Description: This function is used to re-allow rescheduling.
// 392 *
// 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
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock13 Using cfiCommon1
CFI Function OSSchedUnlock
THUMB
// 403 void OSSchedUnlock (void)
// 404 {
OSSchedUnlock:
PUSH {LR}
CFI ?RET Frame(CFA, -4)
CFI CFA R13+4
// 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 */
LDR R0,??DataTable51 ;; OSRunning
LDRB R0,[R0, #+0]
CMP R0,#+1
BNE ??OSSchedUnlock_0
// 411 OS_ENTER_CRITICAL();
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
// 412 if (OSLockNesting > 0) { /* Do not decrement if already 0 */
LDR R1,??DataTable28 ;; OSLockNesting
LDRB R1,[R1, #+0]
CMP R1,#+0
BEQ ??OSSchedUnlock_1
// 413 OSLockNesting--; /* Decrement lock nesting level */
LDR R1,??DataTable28 ;; OSLockNesting
LDR R2,??DataTable28 ;; OSLockNesting
LDRB R2,[R2, #+0]
SUBS R2,R2,#+1
STRB R2,[R1, #+0]
// 414 if (OSLockNesting == 0) { /* See if scheduler is enabled and ... */
LDRB R1,[R1, #+0]
CMP R1,#+0
BNE ??OSSchedUnlock_2
// 415 if (OSIntNesting == 0) { /* ... not in an ISR */
LDR R1,??DataTable29 ;; OSIntNesting
LDRB R1,[R1, #+0]
CMP R1,#+0
BNE ??OSSchedUnlock_1
// 416 OS_EXIT_CRITICAL();
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 417 OS_Sched(); /* See if a HPT is ready */
BL OS_Sched
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:
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 426 }
// 427 }
// 428 }
??OSSchedUnlock_0:
POP {R0}
BX R0 ;; return
CFI EndBlock cfiBlock13
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable28:
DC32 OSLockNesting
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable29:
DC32 OSIntNesting
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock14 Using cfiCommon0
CFI NoFunction
ARM
??OSStart??rA:
ADD R12,PC,#+1
BX R12
CFI EndBlock cfiBlock14
REQUIRE OSStart
// 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
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock15 Using cfiCommon1
CFI Function OSStart
THUMB
// 452 void OSStart (void)
// 453 {
OSStart:
PUSH {LR}
CFI ?RET Frame(CFA, -4)
CFI CFA R13+4
// 454 INT8U y;
// 455 INT8U x;
// 456
// 457
// 458 if (OSRunning == FALSE) {
LDR R0,??DataTable51 ;; OSRunning
LDRB R0,[R0, #+0]
CMP R0,#+0
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);
LDR R0,??DataTable41 ;; OSPrioHighRdy
LDR R1,??DataTable54 ;; OSRdyGrp
LDRB R1,[R1, #+0]
LDR R2,??DataTable59 ;; OSUnMapTbl
LDRB R1,[R2, R1]
LSLS R1,R1,#+3
LDR R2,??DataTable54 ;; OSRdyGrp
LDRB R2,[R2, #+0]
LDR R3,??DataTable59 ;; OSUnMapTbl
LDRB R2,[R3, R2]
LDR R3,??DataTable65 ;; OSRdyTbl
LDRB R2,[R3, R2]
LDR R3,??DataTable59 ;; OSUnMapTbl
LDRB R2,[R3, R2]
ADDS R1,R1,R2
STRB R1,[R0, #+0]
// 462 OSPrioCur = OSPrioHighRdy;
LDR R0,??DataTable38 ;; OSPrioCur
LDR R1,??DataTable41 ;; OSPrioHighRdy
LDRB R1,[R1, #+0]
STRB R1,[R0, #+0]
// 463 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
LDR R0,??DataTable44 ;; OSTCBHighRdy
LDR R1,??DataTable41 ;; OSPrioHighRdy
LDRB R1,[R1, #+0]
LSLS R1,R1,#+2
LDR R2,??DataTable61 ;; OSTCBPrioTbl
LDR R1,[R2, R1]
STR R1,[R0, #+0]
// 464 OSTCBCur = OSTCBHighRdy;
LDR R0,??DataTable83 ;; OSTCBCur
LDR R1,??DataTable44 ;; OSTCBHighRdy
LDR R1,[R1, #+0]
STR R1,[R0, #+0]
// 465 OSStartHighRdy(); /* Execute target specific code to start task */
_BLF OSStartHighRdy,??OSStartHighRdy??rT
// 466 }
// 467 }
??OSStart_0:
POP {R0}
BX R0 ;; return
CFI EndBlock cfiBlock15
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable38:
DC32 OSPrioCur
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable41:
DC32 OSPrioHighRdy
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable44:
DC32 OSTCBHighRdy
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock16 Using cfiCommon0
CFI NoFunction
ARM
??OSStatInit??rA:
ADD R12,PC,#+1
BX R12
CFI EndBlock cfiBlock16
REQUIRE OSStatInit
// 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
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock17 Using cfiCommon1
CFI Function OSStatInit
THUMB
// 490 void OSStatInit (void)
// 491 {
OSStatInit:
PUSH {LR}
CFI ?RET Frame(CFA, -4)
CFI CFA R13+4
// 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 */
MOVS R0,#+2
_BLF OSTimeDly,??OSTimeDly??rT
// 498 OS_ENTER_CRITICAL();
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
// 499 OSIdleCtr = 0L; /* Clear idle counter */
LDR R1,??DataTable47 ;; OSIdleCtr
MOVS R2,#+0
STR R2,[R1, #+0]
// 500 OS_EXIT_CRITICAL();
_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 */
MOVS R0,#+10
_BLF OSTimeDly,??OSTimeDly??rT
// 502 OS_ENTER_CRITICAL();
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
// 503 OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
LDR R1,??DataTable46 ;; OSIdleCtrMax
LDR R2,??DataTable47 ;; OSIdleCtr
LDR R2,[R2, #+0]
STR R2,[R1, #+0]
// 504 OSStatRdy = TRUE;
LDR R1,??DataTable48 ;; OSStatRdy
MOVS R2,#+1
STRB R2,[R1, #+0]
// 505 OS_EXIT_CRITICAL();
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 506 }
POP {R0}
BX R0 ;; return
CFI EndBlock cfiBlock17
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable46:
DC32 OSIdleCtrMax
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable47:
DC32 OSIdleCtr
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable48:
DC32 OSStatRdy
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock18 Using cfiCommon0
CFI NoFunction
ARM
??OSTimeTick??rA:
ADD R12,PC,#+1
BX R12
CFI EndBlock cfiBlock18
REQUIRE OSTimeTick
// 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 t
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -