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

📄 os_core.lis

📁 1.将uC/OS-II操作系统移植到Mega16上 2.建立两个任务
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 0078 4F5F              subi R20,255  ; offset = 1
 007A 5F4F              sbci R21,255
 007C           L6:
 007C                   .dbline 92
 007C           ;     for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
 007C 4230              cpi R20,2
 007E E0E0              ldi R30,0
 0080 5E07              cpc R21,R30
 0082 98F3              brlo L3
 0084                   .dbline 96
 0084           ;         OSRdyTbl[i] = 0;
 0084           ;     }
 0084           ;                 
 0084           ;     OSPrioCur     = 0;
 0084 2224              clr R2
 0086 2092EB00          sts _OSPrioCur,R2
 008A                   .dbline 97
 008A           ;     OSPrioHighRdy = 0;                                           
 008A 2092EA00          sts _OSPrioHighRdy,R2
 008E                   .dbline 98
 008E           ;     OSTCBHighRdy  = (OS_TCB *)0;                                 /* TCB Initialization                 */
 008E 3324              clr R3
 0090 3092E000          sts _OSTCBHighRdy+1,R3
 0094 2092DF00          sts _OSTCBHighRdy,R2
 0098                   .dbline 99
 0098           ;     OSTCBCur      = (OS_TCB *)0;
 0098 3092E400          sts _OSTCBCur+1,R3
 009C 2092E300          sts _OSTCBCur,R2
 00A0                   .dbline 100
 00A0           ;     OSTCBList     = (OS_TCB *)0;
 00A0 3092DE00          sts _OSTCBList+1,R3
 00A4 2092DD00          sts _OSTCBList,R2
 00A8                   .dbline 101
 00A8 4427              clr R20
 00AA 5527              clr R21
 00AC 10C0              xjmp L10
 00AE           L7:
 00AE                   .dbline 101
 00AE                   .dbline 102
 00AE 02E0              ldi R16,2
 00B0 10E0              ldi R17,0
 00B2 9A01              movw R18,R20
 00B4 0E940000          xcall 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 2082              std z+0,R2
 00C8 3182              std z+1,R3
 00CA                   .dbline 103
 00CA           L8:
 00CA                   .dbline 101
 00CA 4F5F              subi R20,255  ; offset = 1
 00CC 5F4F              sbci R21,255
 00CE           L10:
 00CE                   .dbline 101
 00CE           ;     for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {                 /* Clear the priority table           */
 00CE 4031              cpi R20,16
 00D0 E0E0              ldi R30,0
 00D2 5E07              cpc R21,R30
 00D4 60F3              brlo L7
 00D6                   .dbline 104
 00D6 4427              clr R20
 00D8 5527              clr R21
 00DA 1AC0              xjmp L14
 00DC           L11:
 00DC                   .dbline 104
 00DC                   .dbline 105
 00DC 9A01              movw R18,R20
 00DE 2F5F              subi R18,255  ; offset = 1
 00E0 3F4F              sbci R19,255
 00E2 0EE0              ldi R16,14
 00E4 10E0              ldi R17,0
 00E6 0E940000          xcall empy16s
 00EA 1801              movw R2,R16
 00EC 80E0              ldi R24,<_OSTCBTbl
 00EE 90E0              ldi R25,>_OSTCBTbl
 00F0 280E              add R2,R24
 00F2 391E              adc R3,R25
 00F4 0EE0              ldi R16,14
 00F6 10E0              ldi R17,0
 00F8 9A01              movw R18,R20
 00FA 0E940000          xcall 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 2082              std z+0,R2
 010A 3182              std z+1,R3
 010C                   .dbline 106
 010C           L12:
 010C                   .dbline 104
 010C 4F5F              subi R20,255  ; offset = 1
 010E 5F4F              sbci R21,255
 0110           L14:
 0110                   .dbline 104
 0110           ;         OSTCBPrioTbl[i] = (OS_TCB *)0;
 0110           ;     }
 0110           ;     for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* Init. list of free TCBs            */
 0110 4530              cpi R20,5
 0112 E0E0              ldi R30,0
 0114 5E07              cpc R21,R30
 0116 10F3              brlo L11
 0118                   .dbline 107
 0118           ;         OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
 0118           ;     }
 0118           ;     OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;    /* Last OS_TCB             */
 0118 2224              clr R2
 011A 3324              clr R3
 011C 30924900          sts _OSTCBTbl+70+2+1,R3
 0120 20924800          sts _OSTCBTbl+70+2,R2
 0124                   .dbline 108
 0124           ;     OSTCBFreeList                                         = &OSTCBTbl[0];
 0124 80E0              ldi R24,<_OSTCBTbl
 0126 90E0              ldi R25,>_OSTCBTbl
 0128 9093E200          sts _OSTCBFreeList+1,R25
 012C 8093E100          sts _OSTCBFreeList,R24
 0130                   .dbline 111
 0130 4427              clr R20
 0132 5527              clr R21
 0134 1AC0              xjmp L21
 0136           L18:
 0136                   .dbline 111
 0136                   .dbline 112
 0136 9A01              movw R18,R20
 0138 2F5F              subi R18,255  ; offset = 1
 013A 3F4F              sbci R19,255
 013C 08E0              ldi R16,8
 013E 10E0              ldi R17,0
 0140 0E940000          xcall empy16s
 0144 1801              movw R2,R16
 0146 80E0              ldi R24,<_OSEventTbl
 0148 90E0              ldi R25,>_OSEventTbl
 014A 280E              add R2,R24
 014C 391E              adc R3,R25
 014E 08E0              ldi R16,8
 0150 10E0              ldi R17,0
 0152 9A01              movw R18,R20
 0154 0E940000          xcall 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 2082              std z+0,R2
 0164 3182              std z+1,R3
 0166                   .dbline 113
 0166           L19:
 0166                   .dbline 111
 0166 4F5F              subi R20,255  ; offset = 1
 0168 5F4F              sbci R21,255
 016A           L21:
 016A                   .dbline 111
 016A           ; 
 016A           ; #if OS_MAX_EVENTS >= 2
 016A           ;     for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {            /* Init. list of free EVENT control blocks  */
 016A 4130              cpi R20,1
 016C E0E0              ldi R30,0
 016E 5E07              cpc R21,R30
 0170 10F3              brlo L18
 0172                   .dbline 114
 0172           ;         OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
 0172           ;     }
 0172           ;     OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
 0172 2224              clr R2
 0174 3324              clr R3
 0176 3092FB00          sts _OSEventTbl+8+1,R3
 017A 2092FA00          sts _OSEventTbl+8,R2
 017E                   .dbline 115
 017E           ;     OSEventFreeList                          = &OSEventTbl[0];    
 017E 80E0              ldi R24,<_OSEventTbl
 0180 90E0              ldi R25,>_OSEventTbl
 0182 90930301          sts _OSEventFreeList+1,R25
 0186 80930201          sts _OSEventFreeList,R24
 018A                   .dbline 119
 018A           ; #endif
 018A           ; 
 018A           ; #if OS_STK_GROWTH == 1
 018A           ;     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
 018A 8FE0              ldi R24,15
 018C 8A83              std y+2,R24
 018E 80E0              ldi R24,<_OSTaskIdleStk+99
 0190 90E0              ldi R25,>_OSTaskIdleStk+99
 0192 8883              std y+0,R24
 0194 9983              std y+1,R25
 0196 2227              clr R18
 0198 3327              clr R19
 019A 00E0              ldi R16,<PL_OSTaskIdle
 019C 10E0              ldi R17,>PL_OSTaskIdle
 019E 0E940000          xcall _OSTaskCreate
 01A2                   .dbline -2
 01A2                   .dbline 124
 01A2           ; #else
 01A2           ;     OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
 01A2           ; #endif
 01A2           ; 
 01A2           ; }
 01A2           L2:
 01A2 2396              adiw R28,3
 01A4 0E940000          xcall pop_gset1
 01A8                   .dbline 0 ; func end
 01A8 0895              ret
 01AA                   .dbsym r i 20 i
 01AA                   .dbend
 01AA                   .dbfunc e OSIntExit _OSIntExit fV
                        .even
 01AA           _OSIntExit::
 01AA                   .dbline -1
 01AA                   .dbline 146
 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 50C0              xjmp 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
 020E 4092EA00          sts _OSPrioHighRdy,R4
 0212                   .dbline 151
 0212           ;         if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
 0212 2090EB00          lds R2,_OSPrioCur
 0216 4214              cp R4,R2

⌨️ 快捷键说明

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