⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_core.lis

📁 ucos如何移植到单片机mega128
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -