📄 ucos_ii.lis
字号:
0168 ;
0168 ;
0168 ; if (OSRunning == TRUE) { /* Make sure multitasking is running */
0168 80913D0A lds R24,_OSRunning
016C 8130 cpi R24,1
016E 09F5 brne L24
0170 X13:
0170 .dbline 410
0170 .dbline 411
0170 ; OS_ENTER_CRITICAL();
0170 0E940000 xcall _OS_CPU_SR_Save
0174 A02E mov R10,R16
0176 .dbline 412
0176 ; if (OSLockNesting > 0) { /* Do not decrement if already 0 */
0176 80E0 ldi R24,0
0178 2090490A lds R2,_OSLockNesting
017C 8215 cp R24,R2
017E B0F4 brsh L26
0180 X14:
0180 .dbline 412
0180 .dbline 413
0180 ; OSLockNesting--; /* Decrement lock nesting level */
0180 822D mov R24,R2
0182 8150 subi R24,1
0184 8093490A sts _OSLockNesting,R24
0188 .dbline 414
0188 ; if (OSLockNesting == 0) { /* See if scheduler is enabled and ... */
0188 8823 tst R24
018A 61F4 brne L28
018C X15:
018C .dbline 414
018C .dbline 415
018C ; if (OSIntNesting == 0) { /* ... not in an ISR */
018C 20904B0A lds R2,_OSIntNesting
0190 2220 tst R2
0192 21F4 brne L30
0194 X16:
0194 .dbline 415
0194 .dbline 416
0194 ; OS_EXIT_CRITICAL();
0194 0E940000 xcall _OS_CPU_SR_Restore
0198 .dbline 417
0198 ; OS_Sched(); /* See if a HPT is ready */
0198 88D2 xcall _OS_Sched
019A .dbline 418
019A ; } else {
019A 0BC0 xjmp L27
019C L30:
019C .dbline 418
019C .dbline 419
019C ; OS_EXIT_CRITICAL();
019C 0A2D mov R16,R10
019E 0E940000 xcall _OS_CPU_SR_Restore
01A2 .dbline 420
01A2 ; }
01A2 .dbline 421
01A2 ; } else {
01A2 07C0 xjmp L27
01A4 L28:
01A4 .dbline 421
01A4 .dbline 422
01A4 ; OS_EXIT_CRITICAL();
01A4 0A2D mov R16,R10
01A6 0E940000 xcall _OS_CPU_SR_Restore
01AA .dbline 423
01AA ; }
01AA .dbline 424
01AA ; } else {
01AA 03C0 xjmp L27
01AC L26:
01AC .dbline 424
01AC .dbline 425
01AC ; OS_EXIT_CRITICAL();
01AC 0A2D mov R16,R10
01AE 0E940000 xcall _OS_CPU_SR_Restore
01B2 .dbline 426
01B2 ; }
01B2 L27:
01B2 .dbline 427
01B2 ; }
01B2 L24:
01B2 .dbline -2
01B2 L23:
01B2 .dbline 0 ; func end
01B2 A990 ld R10,y+
01B4 0895 ret
01B6 .dbsym r cpu_sr 10 c
01B6 .dbend
01B6 .dbfunc e OSStart _OSStart fV
01B6 ; x -> R12
01B6 ; y -> R10
.even
01B6 _OSStart::
01B6 AA92 st -y,R10
01B8 CA92 st -y,R12
01BA .dbline -1
01BA .dbline 453
01BA ; }
01BA ; #endif
01BA ;
01BA ; /*$PAGE*/
01BA ; /*
01BA ; *********************************************************************************************************
01BA ; * START MULTITASKING
01BA ; *
01BA ; * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
01BA ; * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
01BA ; * and you MUST have created at least one task.
01BA ; *
01BA ; * Arguments : none
01BA ; *
01BA ; * Returns : none
01BA ; *
01BA ; * Note : OSStartHighRdy() MUST:
01BA ; * a) Call OSTaskSwHook() then,
01BA ; * b) Set OSRunning to TRUE.
01BA ; * c) Load the context of the task pointed to by OSTCBHighRdy.
01BA ; * d_ Execute the task.
01BA ; *********************************************************************************************************
01BA ; */
01BA ;
01BA ; void OSStart (void)
01BA ; {
01BA .dbline 458
01BA ; INT8U y;
01BA ; INT8U x;
01BA ;
01BA ;
01BA ; if (OSRunning == FALSE) {
01BA 20903D0A lds R2,_OSRunning
01BE 2220 tst R2
01C0 09F0 breq X18
01C2 3AC0 xjmp L33
01C4 X18:
01C4 X17:
01C4 .dbline 458
01C4 .dbline 459
01C4 ; y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
01C4 80E0 ldi R24,<_OSUnMapTbl
01C6 90E0 ldi R25,>_OSUnMapTbl
01C8 E091460A lds R30,_OSRdyGrp
01CC FF27 clr R31
01CE E80F add R30,R24
01D0 F91F adc R31,R25
01D2 A690 elpm R10,Z
01D4 .dbline 460
01D4 ; x = OSUnMapTbl[OSRdyTbl[y]];
01D4 80E0 ldi R24,<_OSRdyTbl
01D6 90E0 ldi R25,>_OSRdyTbl
01D8 EA2D mov R30,R10
01DA FF27 clr R31
01DC E80F add R30,R24
01DE F91F adc R31,R25
01E0 E081 ldd R30,z+0
01E2 FF27 clr R31
01E4 80E0 ldi R24,<_OSUnMapTbl
01E6 90E0 ldi R25,>_OSUnMapTbl
01E8 E80F add R30,R24
01EA F91F adc R31,R25
01EC C690 elpm R12,Z
01EE .dbline 461
01EE ; OSPrioHighRdy = (INT8U)((y << 3) + x);
01EE 2C2C mov R2,R12
01F0 3324 clr R3
01F2 4A2C mov R4,R10
01F4 5524 clr R5
01F6 440C lsl R4
01F8 551C rol R5
01FA 440C lsl R4
01FC 551C rol R5
01FE 440C lsl R4
0200 551C rol R5
0202 420C add R4,R2
0204 531C adc R5,R3
0206 4092470A sts _OSPrioHighRdy,R4
020A .dbline 462
020A ; OSPrioCur = OSPrioHighRdy;
020A 242C mov R2,R4
020C 2092480A sts _OSPrioCur,R2
0210 .dbline 463
0210 ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
0210 80E0 ldi R24,<_OSTCBPrioTbl
0212 90E0 ldi R25,>_OSTCBPrioTbl
0214 E42D mov R30,R4
0216 FF27 clr R31
0218 EE0F lsl R30
021A FF1F rol R31
021C E80F add R30,R24
021E F91F adc R31,R25
0220 2080 ldd R2,z+0
0222 3180 ldd R3,z+1
0224 30923309 sts _OSTCBHighRdy+1,R3
0228 20923209 sts _OSTCBHighRdy,R2
022C .dbline 464
022C ; OSTCBCur = OSTCBHighRdy;
022C 30923709 sts _OSTCBCur+1,R3
0230 20923609 sts _OSTCBCur,R2
0234 .dbline 465
0234 ; OSStartHighRdy(); /* Execute target specific code to start task */
0234 0E940000 xcall _OSStartHighRdy
0238 .dbline 466
0238 ; }
0238 L33:
0238 .dbline -2
0238 L32:
0238 .dbline 0 ; func end
0238 C990 ld R12,y+
023A A990 ld R10,y+
023C 0895 ret
023E .dbsym r x 12 c
023E .dbsym r y 10 c
023E .dbend
023E .dbfunc e OSTimeTick _OSTimeTick fV
023E .dbstruct 0 14 os_event
023E .dbfield 0 OSEventType c
023E .dbfield 1 OSEventGrp c
023E .dbfield 2 OSEventCnt i
023E .dbfield 4 OSEventPtr pV
023E .dbfield 6 OSEventTbl A[8:8]c
023E .dbend
023E .dbstruct 0 34 os_tcb
023E .dbfield 0 OSTCBStkPtr pc
023E .dbfield 2 OSTCBNext pS[os_tcb]
023E .dbfield 4 OSTCBPrev pS[os_tcb]
023E .dbfield 6 OSTCBEventPtr pS[os_event]
023E .dbfield 8 OSTCBDly i
023E .dbfield 10 OSTCBStat c
023E .dbfield 11 OSTCBPrio c
023E .dbfield 12 OSTCBX c
023E .dbfield 13 OSTCBY c
023E .dbfield 14 OSTCBBitX c
023E .dbfield 15 OSTCBBitY c
023E .dbfield 16 OSTCBCtxSwCtr l
023E .dbfield 20 OSTCBCyclesTot l
023E .dbfield 24 OSTCBCyclesStart l
023E .dbfield 28 OSTCBStkBase pc
023E .dbfield 30 OSTCBStkUsed l
023E .dbend
023E ; step -> R20
023E ; cpu_sr -> R10
023E ; ptcb -> R20,R21
.even
023E _OSTimeTick::
023E 0E940000 xcall push_xgsetF03C
0242 .dbline -1
0242 .dbline 524
0242 ; }
0242 ; /*$PAGE*/
0242 ; /*
0242 ; *********************************************************************************************************
0242 ; * STATISTICS INITIALIZATION
0242 ; *
0242 ; * Description: This function is called by your application to establish CPU usage by first determining
0242 ; * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
0242 ; * during that time. CPU usage is then determined by a low priority task which keeps track
0242 ; * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
0242 ; * determined by:
0242 ; *
0242 ; * OSIdleCtr
0242 ; * CPU Usage (%) = 100 * (1 - ------------)
0242 ; * OSIdleCtrMax
0242 ; *
0242 ; * Arguments : none
0242 ; *
0242 ; * Returns : none
0242 ; *********************************************************************************************************
0242 ; */
0242 ;
0242 ; #if OS_TASK_STAT_EN > 0
0242 ; void OSStatInit (void)
0242 ; {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -