📄 os_core.lis
字号:
0126 09F0 breq X3
0128 39C0 xjmp L19
012A X3:
012A .dbline 299
012A .dbline 300
012A 80E0 ldi R24,<_OSUnMapTbl
012C 90E0 ldi R25,>_OSUnMapTbl
012E E0912701 lds R30,_OSRdyGrp
0132 FF27 clr R31
0134 E80F add R30,R24
0136 F91F adc R31,R25
0138 4491 lpm R20,Z
013A .dbline 301
013A 80E0 ldi R24,<_OSRdyTbl
013C 90E0 ldi R25,>_OSRdyTbl
013E E42F mov R30,R20
0140 FF27 clr R31
0142 E80F add R30,R24
0144 F91F adc R31,R25
0146 E081 ldd R30,z+0
0148 FF27 clr R31
014A 80E0 ldi R24,<_OSUnMapTbl
014C 90E0 ldi R25,>_OSUnMapTbl
014E E80F add R30,R24
0150 F91F adc R31,R25
0152 6491 lpm R22,Z
0154 .dbline 302
0154 262E mov R2,R22
0156 3324 clr R3
0158 442E mov R4,R20
015A 5524 clr R5
015C 440C lsl R4
015E 551C rol R5
0160 440C lsl R4
0162 551C rol R5
0164 440C lsl R4
0166 551C rol R5
0168 420C add R4,R2
016A 531C adc R5,R3
016C 40922801 sts _OSPrioHighRdy,R4
0170 .dbline 303
0170 242C mov R2,R4
0172 20922901 sts _OSPrioCur,R2
0176 .dbline 304
0176 82E0 ldi R24,2
0178 829D mul R24,R2
017A F001 movw R30,R0
017C 80E0 ldi R24,<_OSTCBPrioTbl
017E 90E0 ldi R25,>_OSTCBPrioTbl
0180 E80F add R30,R24
0182 F91F adc R31,R25
0184 2080 ldd R2,z+0
0186 3180 ldd R3,z+1
0188 30929900 sts _OSTCBHighRdy+1,R3
018C 20929800 sts _OSTCBHighRdy,R2
0190 .dbline 305
0190 30929D00 sts _OSTCBCur+1,R3
0194 20929C00 sts _OSTCBCur,R2
0198 .dbline 306
0198 0E940000 xcall _OSStartHighRdy
019C .dbline 307
019C L19:
019C .dbline -2
019C L18:
019C 0E940000 xcall pop_gset2
01A0 .dbline 0 ; func end
01A0 0895 ret
01A2 .dbsym r x 22 c
01A2 .dbsym r y 20 c
01A2 .dbend
01A2 .dbfunc e OSTimeTick _OSTimeTick fV
01A2 .dbstruct 0 10 .2
01A2 .dbfield 0 OSFlagNodeNext pV
01A2 .dbfield 2 OSFlagNodePrev pV
01A2 .dbfield 4 OSFlagNodeTCB pV
01A2 .dbfield 6 OSFlagNodeFlagGrp pV
01A2 .dbfield 8 OSFlagNodeFlags c
01A2 .dbfield 9 OSFlagNodeWaitType c
01A2 .dbend
01A2 .dbstruct 0 18 os_tcb
01A2 .dbfield 0 OSTCBStkPtr pc
01A2 .dbfield 2 OSTCBNext pS[os_tcb]
01A2 .dbfield 4 OSTCBPrev pS[os_tcb]
01A2 .dbfield 6 OSTCBFlagNode pS[.2]
01A2 .dbfield 8 OSTCBFlagsRdy c
01A2 .dbfield 9 OSTCBDly i
01A2 .dbfield 11 OSTCBStat c
01A2 .dbfield 12 OSTCBPrio c
01A2 .dbfield 13 OSTCBX c
01A2 .dbfield 14 OSTCBY c
01A2 .dbfield 15 OSTCBBitX c
01A2 .dbfield 16 OSTCBBitY c
01A2 .dbfield 17 OSTCBDelReq c
01A2 .dbend
01A2 ; ptcb -> R20,R21
.even
01A2 _OSTimeTick::
01A2 0E940000 xcall push_gset1
01A6 .dbline -1
01A6 .dbline 365
01A6 ; OS_EXIT_CRITICAL();
01A6 ; }
01A6 ; }
01A6 ;
01A6 ; /*
01A6 ; *********************************************************************************************************
01A6 ; * PREVENT SCHEDULING
01A6 ; *
01A6 ; * Description: This function is used to prevent rescheduling to take place. This allows your application
01A6 ; * to prevent context switches until you are ready to permit context switching.
01A6 ; *
01A6 ; * Arguments : none
01A6 ; *
01A6 ; * Returns : none
01A6 ; *
01A6 ; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
01A6 ; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
01A6 ; *********************************************************************************************************
01A6 ; */
01A6 ;
01A6 ; #if OS_SCHED_LOCK_EN > 0
01A6 ; void OSSchedLock (void)
01A6 ; {
01A6 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
01A6 ; OS_CPU_SR cpu_sr;
01A6 ; #endif
01A6 ;
01A6 ;
01A6 ; if (OSRunning == TRUE) { /* Make sure multitasking is running */
01A6 ; OS_ENTER_CRITICAL();
01A6 ; if (OSLockNesting < 255) { /* Prevent OSLockNesting from wrapping back to 0 */
01A6 ; OSLockNesting++; /* Increment lock nesting level */
01A6 ; }
01A6 ; OS_EXIT_CRITICAL();
01A6 ; }
01A6 ; }
01A6 ; #endif
01A6 ;
01A6 ;
01A6 ; /*
01A6 ; *********************************************************************************************************
01A6 ; * ENABLE SCHEDULING
01A6 ; *
01A6 ; * Description: This function is used to re-allow rescheduling.
01A6 ; *
01A6 ; * Arguments : none
01A6 ; *
01A6 ; * Returns : none
01A6 ; *
01A6 ; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
01A6 ; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
01A6 ; *********************************************************************************************************
01A6 ; */
01A6 ;
01A6 ; #if OS_SCHED_LOCK_EN > 0
01A6 ; void OSSchedUnlock (void)
01A6 ; {
01A6 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
01A6 ; OS_CPU_SR cpu_sr;
01A6 ; #endif
01A6 ;
01A6 ;
01A6 ; if (OSRunning == TRUE) { /* Make sure multitasking is running */
01A6 ; OS_ENTER_CRITICAL();
01A6 ; if (OSLockNesting > 0) { /* Do not decrement if already 0 */
01A6 ; OSLockNesting--; /* Decrement lock nesting level */
01A6 ; if ((OSLockNesting == 0) && (OSIntNesting == 0)) { /* See if sched. enabled and not an ISR */
01A6 ; OS_EXIT_CRITICAL();
01A6 ; OS_Sched(); /* See if a HPT is ready */
01A6 ; } else {
01A6 ; OS_EXIT_CRITICAL();
01A6 ; }
01A6 ; } else {
01A6 ; OS_EXIT_CRITICAL();
01A6 ; }
01A6 ; }
01A6 ; }
01A6 ; #endif
01A6 ;
01A6 ;
01A6 ; /*
01A6 ; *********************************************************************************************************
01A6 ; * START MULTITASKING
01A6 ; *
01A6 ; * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
01A6 ; * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
01A6 ; * and you MUST have created at least one task.
01A6 ; *
01A6 ; * Arguments : none
01A6 ; *
01A6 ; * Returns : none
01A6 ; *
01A6 ; * Note : OSStartHighRdy() MUST:
01A6 ; * a) Call OSTaskSwHook() then,
01A6 ; * b) Set OSRunning to TRUE.
01A6 ; * c) Load the context of the task pointed to by OSTCBHighRdy.
01A6 ; * d_ Execute the task.
01A6 ; *********************************************************************************************************
01A6 ; */
01A6 ;
01A6 ; void OSStart (void)
01A6 ; {
01A6 ; INT8U y;
01A6 ; INT8U x;
01A6 ;
01A6 ;
01A6 ; if (OSRunning == FALSE) {
01A6 ; y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
01A6 ; x = OSUnMapTbl[OSRdyTbl[y]];
01A6 ; OSPrioHighRdy = (INT8U)((y << 3) + x);
01A6 ; OSPrioCur = OSPrioHighRdy;
01A6 ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
01A6 ; OSTCBCur = OSTCBHighRdy;
01A6 ; OSStartHighRdy(); /* Execute target specific code to start task */
01A6 ; }
01A6 ; }
01A6 ;
01A6 ; /*
01A6 ; *********************************************************************************************************
01A6 ; * STATISTICS INITIALIZATION
01A6 ; *
01A6 ; * Description: This function is called by your application to establish CPU usage by first determining
01A6 ; * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
01A6 ; * during that time. CPU usage is then determined by a low priority task which keeps track
01A6 ; * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
01A6 ; * determined by:
01A6 ; *
01A6 ; * OSIdleCtr
01A6 ; * CPU Usage (%) = 100 * (1 - ------------)
01A6 ; * OSIdleCtrMax
01A6 ; *
01A6 ; * Arguments : none
01A6 ; *
01A6 ; * Returns : none
01A6 ; *********************************************************************************************************
01A6 ; */
01A6 ;
01A6 ; #if OS_TASK_STAT_EN > 0
01A6 ; void OSStatInit (void)
01A6 ; {
01A6 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
01A6 ; OS_CPU_SR cpu_sr;
01A6 ; #endif
01A6 ;
01A6 ;
01A6 ; OSTimeDly(2); /* Synchronize with clock tick */
01A6 ; OS_ENTER_CRITICAL();
01A6 ; OSIdleCtr = 0L; /* Clear idle counter */
01A6 ; OS_EXIT_CRITICAL();
01A6 ; OSTimeDly(OS_TICKS_PER_SEC); /* Determine MAX. idle counter value for 1 second */
01A6 ; OS_ENTER_CRITICAL();
01A6 ; OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1 second */
01A6 ; OSStatRdy = TRUE;
01A6 ; OS_EXIT_CRITICAL();
01A6 ; }
01A6 ; #endif
01A6 ;
01A6 ; /*
01A6 ; *********************************************************************************************************
01A6 ; * PROCESS SYSTEM TICK
01A6 ; *
01A6 ; * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
01A6 ; * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
01A6 ; * called by a high priority task.
01A6 ; *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -