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

📄 os_core.lis

📁 使用mega8和iccavr编译器的一段ucos操作系统程序
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0078 0196              adiw R24,1
 007A 5C01              movw R10,R24
 007C           L6:
 007C                   .dbline 92
 007C           ;     for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
 007C C501              movw R24,R10
 007E 8230              cpi R24,2
 0080 E0E0              ldi R30,0
 0082 9E07              cpc R25,R30
 0084 88F3              brlo L3
 0086                   .dbline 96
 0086           ;         OSRdyTbl[i] = 0;
 0086           ;     }
 0086           ;                 
 0086           ;     OSPrioCur     = 0;
 0086 2224              clr R2
 0088 2092EB00          sts _OSPrioCur,R2
 008C                   .dbline 97
 008C           ;     OSPrioHighRdy = 0;                                           
 008C 2092EA00          sts _OSPrioHighRdy,R2
 0090                   .dbline 98
 0090           ;     OSTCBHighRdy  = (OS_TCB *)0;                                 /* TCB Initialization                 */
 0090 3324              clr R3
 0092 3092E000          sts _OSTCBHighRdy+1,R3
 0096 2092DF00          sts _OSTCBHighRdy,R2
 009A                   .dbline 99
 009A           ;     OSTCBCur      = (OS_TCB *)0;
 009A 3092E400          sts _OSTCBCur+1,R3
 009E 2092E300          sts _OSTCBCur,R2
 00A2                   .dbline 100
 00A2           ;     OSTCBList     = (OS_TCB *)0;
 00A2 3092DE00          sts _OSTCBList+1,R3
 00A6 2092DD00          sts _OSTCBList,R2
 00AA                   .dbline 101
 00AA AA24              clr R10
 00AC BB24              clr R11
 00AE 10C0              rjmp L10
 00B0           L7:
 00B0                   .dbline 101
 00B0                   .dbline 102
 00B0 02E0              ldi R16,2
 00B2 10E0              ldi R17,0
 00B4 9501              movw R18,R10
 00B6 00D0              rcall empy16s
 00B8 F801              movw R30,R16
 00BA 80E0              ldi R24,<_OSTCBPrioTbl
 00BC 90E0              ldi R25,>_OSTCBPrioTbl
 00BE E80F              add R30,R24
 00C0 F91F              adc R31,R25
 00C2 2224              clr R2
 00C4 3324              clr R3
 00C6 3182              std z+1,R3
 00C8 2082              std z+0,R2
 00CA                   .dbline 103
 00CA           L8:
 00CA                   .dbline 101
 00CA C501              movw R24,R10
 00CC 0196              adiw R24,1
 00CE 5C01              movw R10,R24
 00D0           L10:
 00D0                   .dbline 101
 00D0           ;     for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {                 /* Clear the priority table           */
 00D0 C501              movw R24,R10
 00D2 8031              cpi R24,16
 00D4 E0E0              ldi R30,0
 00D6 9E07              cpc R25,R30
 00D8 58F3              brlo L7
 00DA                   .dbline 104
 00DA AA24              clr R10
 00DC BB24              clr R11
 00DE 19C0              rjmp L14
 00E0           L11:
 00E0                   .dbline 104
 00E0                   .dbline 105
 00E0 9501              movw R18,R10
 00E2 2F5F              subi R18,255  ; offset = 1
 00E4 3F4F              sbci R19,255
 00E6 0EE0              ldi R16,14
 00E8 10E0              ldi R17,0
 00EA 00D0              rcall empy16s
 00EC 1801              movw R2,R16
 00EE 80E0              ldi R24,<_OSTCBTbl
 00F0 90E0              ldi R25,>_OSTCBTbl
 00F2 280E              add R2,R24
 00F4 391E              adc R3,R25
 00F6 0EE0              ldi R16,14
 00F8 10E0              ldi R17,0
 00FA 9501              movw R18,R10
 00FC 00D0              rcall empy16s
 00FE F801              movw R30,R16
 0100 80E0              ldi R24,<_OSTCBTbl+2
 0102 90E0              ldi R25,>_OSTCBTbl+2
 0104 E80F              add R30,R24
 0106 F91F              adc R31,R25
 0108 3182              std z+1,R3
 010A 2082              std z+0,R2
 010C                   .dbline 106
 010C           L12:
 010C                   .dbline 104
 010C C501              movw R24,R10
 010E 0196              adiw R24,1
 0110 5C01              movw R10,R24
 0112           L14:
 0112                   .dbline 104
 0112           ;         OSTCBPrioTbl[i] = (OS_TCB *)0;
 0112           ;     }
 0112           ;     for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* Init. list of free TCBs            */
 0112 C501              movw R24,R10
 0114 8530              cpi R24,5
 0116 E0E0              ldi R30,0
 0118 9E07              cpc R25,R30
 011A 10F3              brlo L11
 011C                   .dbline 107
 011C           ;         OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
 011C           ;     }
 011C           ;     OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;    /* Last OS_TCB             */
 011C 2224              clr R2
 011E 3324              clr R3
 0120 30924900          sts _OSTCBTbl+70+2+1,R3
 0124 20924800          sts _OSTCBTbl+70+2,R2
 0128                   .dbline 108
 0128           ;     OSTCBFreeList                                         = &OSTCBTbl[0];
 0128 80E0              ldi R24,<_OSTCBTbl
 012A 90E0              ldi R25,>_OSTCBTbl
 012C 9093E200          sts _OSTCBFreeList+1,R25
 0130 8093E100          sts _OSTCBFreeList,R24
 0134                   .dbline 111
 0134 AA24              clr R10
 0136 BB24              clr R11
 0138 19C0              rjmp L21
 013A           L18:
 013A                   .dbline 111
 013A                   .dbline 112
 013A 9501              movw R18,R10
 013C 2F5F              subi R18,255  ; offset = 1
 013E 3F4F              sbci R19,255
 0140 08E0              ldi R16,8
 0142 10E0              ldi R17,0
 0144 00D0              rcall empy16s
 0146 1801              movw R2,R16
 0148 80E0              ldi R24,<_OSEventTbl
 014A 90E0              ldi R25,>_OSEventTbl
 014C 280E              add R2,R24
 014E 391E              adc R3,R25
 0150 08E0              ldi R16,8
 0152 10E0              ldi R17,0
 0154 9501              movw R18,R10
 0156 00D0              rcall empy16s
 0158 F801              movw R30,R16
 015A 80E0              ldi R24,<_OSEventTbl
 015C 90E0              ldi R25,>_OSEventTbl
 015E E80F              add R30,R24
 0160 F91F              adc R31,R25
 0162 3182              std z+1,R3
 0164 2082              std z+0,R2
 0166                   .dbline 113
 0166           L19:
 0166                   .dbline 111
 0166 C501              movw R24,R10
 0168 0196              adiw R24,1
 016A 5C01              movw R10,R24
 016C           L21:
 016C                   .dbline 111
 016C           ; 
 016C           ; #if OS_MAX_EVENTS >= 2
 016C           ;     for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {            /* Init. list of free EVENT control blocks  */
 016C C501              movw R24,R10
 016E 8130              cpi R24,1
 0170 E0E0              ldi R30,0
 0172 9E07              cpc R25,R30
 0174 10F3              brlo L18
 0176                   .dbline 114
 0176           ;         OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
 0176           ;     }
 0176           ;     OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
 0176 2224              clr R2
 0178 3324              clr R3
 017A 3092FB00          sts _OSEventTbl+8+1,R3
 017E 2092FA00          sts _OSEventTbl+8,R2
 0182                   .dbline 115
 0182           ;     OSEventFreeList                          = &OSEventTbl[0];    
 0182 80E0              ldi R24,<_OSEventTbl
 0184 90E0              ldi R25,>_OSEventTbl
 0186 90930301          sts _OSEventFreeList+1,R25
 018A 80930201          sts _OSEventFreeList,R24
 018E                   .dbline 119
 018E           ; #endif
 018E           ; 
 018E           ; #if OS_STK_GROWTH == 1
 018E           ;     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
 018E 8FE0              ldi R24,15
 0190 8A83              std y+2,R24
 0192 80E0              ldi R24,<_OSTaskIdleStk+99
 0194 90E0              ldi R25,>_OSTaskIdleStk+99
 0196 9983              std y+1,R25
 0198 8883              std y+0,R24
 019A 2227              clr R18
 019C 3327              clr R19
 019E 00E0              ldi R16,<PL_OSTaskIdle
 01A0 10E0              ldi R17,>PL_OSTaskIdle
 01A2 00D0              rcall _OSTaskCreate
 01A4                   .dbline -2
 01A4           L2:
 01A4 2396              adiw R28,3
 01A6 00D0              rcall pop_gset3x
 01A8                   .dbline 0 ; func end
 01A8 0895              ret
 01AA                   .dbsym r i 10 i
 01AA                   .dbend
 01AA                   .dbfunc e OSIntExit _OSIntExit fV
                        .even
 01AA           _OSIntExit::
 01AA                   .dbline -1
 01AA                   .dbline 146
 01AA           ; #else
 01AA           ;     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
 01AA           ; #endif
 01AA           ; 
 01AA           ; }
 01AA           ; /*$PAGE*/
 01AA           ; /*
 01AA           ; *********************************************************************************************************
 01AA           ; *                                               EXIT ISR
 01AA           ; *
 01AA           ; * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR.  When 
 01AA           ; *              the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
 01AA           ; *              a new, high-priority task, is ready to run.
 01AA           ; *
 01AA           ; * Arguments  : none
 01AA           ; *
 01AA           ; * Returns    : none
 01AA           ; *
 01AA           ; * Notes      : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call
 01AA           ; *                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
 01AA           ; *                 end of the ISR.
 01AA           ; *              2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
 01AA           ; *********************************************************************************************************
 01AA           ; */
 01AA           ; 
 01AA           ; void OSIntExit (void)
 01AA           ; {
 01AA                   .dbline 147
 01AA           ;     OS_ENTER_CRITICAL();
 01AA 0A93              st -y,r16
 01AC 0FB7              in r16,0x3F
 01AE F894              cli
 01B0 0F93              push r16
 01B2 0991              ld r16,y+
 01B4                   .dbline 147
 01B4                   .dbline 148
 01B4           ;     if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
 01B4 8091ED00          lds R24,_OSIntNesting
 01B8 8150              subi R24,1
 01BA 282E              mov R2,R24
 01BC 2092ED00          sts _OSIntNesting,R2
 01C0 4090EC00          lds R4,_OSLockNesting
 01C4 2428              or R2,R4
 01C6 09F0              breq X0
 01C8 4FC0              rjmp L25
 01CA           X0:
 01CA                   .dbline 148
 01CA                   .dbline 149
 01CA           ;         OSIntExitY    = OSUnMapTbl[OSRdyGrp];
 01CA 80E0              ldi R24,<_OSUnMapTbl
 01CC 90E0              ldi R25,>_OSUnMapTbl
 01CE E091E900          lds R30,_OSRdyGrp
 01D2 FF27              clr R31
 01D4 E80F              add R30,R24
 01D6 F91F              adc R31,R25
 01D8 E491              lpm R30,Z
 01DA E093B800          sts _OSIntExitY,R30
 01DE                   .dbline 150
 01DE           ;         OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
 01DE 80E0              ldi R24,<_OSRdyTbl
 01E0 90E0              ldi R25,>_OSRdyTbl
 01E2 FF27              clr R31
 01E4 E80F              add R30,R24
 01E6 F91F              adc R31,R25
 01E8 E081              ldd R30,z+0
 01EA FF27              clr R31
 01EC 80E0              ldi R24,<_OSUnMapTbl
 01EE 90E0              ldi R25,>_OSUnMapTbl
 01F0 E80F              add R30,R24
 01F2 F91F              adc R31,R25
 01F4 2490              lpm R2,Z
 01F6 3324              clr R3
 01F8 4090B800          lds R4,_OSIntExitY
 01FC 5524              clr R5
 01FE 440C              lsl R4
 0200 551C              rol R5
 0202 440C              lsl R4
 0204 551C              rol R5
 0206 440C              lsl R4
 0208 551C              rol R5
 020A 420C              add R4,R2
 020C 531C              adc R5,R3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -