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

📄 os-task-sem.lst

📁 ucos-ii-at90S-icc-avr
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0010) 
(0011)   OSIntNesting=0;             /* Interrupt nesting level                              */
_OSInit:
  i                    --> R16
    014A 2422      CLR	R2
    014B 92200202  STS	R2,_OSIntNesting
(0012)   OSLockNesting=0;            /* Multitasking lock nesting level                      */
    014D 92200201  STS	R2,_OSLockNesting
(0013)   OSPrioCur=0xff;                /* Priority of current task                             */
    014F EF8F      LDI	R24,0xFF
    0150 93800200  STS	R24,_OSPrioCur
(0014)   OSPrioHighRdy=0xff;            /* Priority of highest priority task                    */
    0152 938001FF  STS	R24,_OSPrioHighRdy
(0015)   OSRunning = FALSE;
    0154 92200209  STS	R2,_OSRunning
(0016) 
(0017)   OSTCBCur=0;                        /* Pointer to currently running TCB              */
    0156 2433      CLR	R3
    0157 D51D      RCALL	0x0675
(0018)   OSTCBHighRdy=0;                    /* Pointer to highest priority TCB ready to run  */
    0158 923001FC  STS	R3,_OSTCBHighRdy+1
    015A 922001FB  STS	R2,_OSTCBHighRdy
(0019) /*init task tcb pointers list*/
(0020)   for(i=0;i<OS_TASK_COUNT;i++)
    015C 2700      CLR	R16
    015D C006      RJMP	0x0164
(0021)     OSpTCBList[i]=(OS_TCB*)0;
    015E E083      LDI	R24,3
    015F E092      LDI	R25,2
    0160 2FE0      MOV	R30,R16
    0161 D4A6      RCALL	0x0608
    0162 D4E8      RCALL	0x064B
    0163 9503      INC	R16
    0164 3003      CPI	R16,3
    0165 F3C0      BCS	0x015E
(0022) }
    0166 9508      RET
_OSTaskCreate:
  psp                  --> R10
  err                  --> R20
  prio                 --> R22
  stk_size             --> Y+14
  ptos                 --> Y+12
  pdata                --> Y+10
  task                 --> R10
  ptcb                 --> R20
    0167 D43F      RCALL	push_gset3
    0168 2EA2      MOV	R10,R18
    0169 2EB3      MOV	R11,R19
    016A 2F40      MOV	R20,R16
    016B 2F51      MOV	R21,R17
    016C 9724      SBIW	R28,4
    016D 8968      LDD	R22,16+Y
(0023) /*
(0024) OS_STK *	OSTaskStkInit (void (*task)(void *pd),void *pdata, OS_STK *ptos);
(0025) INT8U       OSTCBInit(OS_TCB *ptcb,INT8U prio, OS_STK *ptos,INT16U stk_size);
(0026) */
(0027) 
(0028) INT8U       OSTaskCreate(OS_TCB *ptcb,void (*task)(void *pd), void *pdata, OS_STK *ptos,INT16U stk_size, INT8U prio)
(0029) {
(0030)     void   *psp;
(0031)     INT8U   err;
(0032) 
(0033)     if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
    016E E082      LDI	R24,2
    016F 1786      CP	R24,R22
    0170 F410      BCC	0x0173
(0034)         return (OSERR_PRIO_INVALID);
    0171 E001      LDI	R16,1
    0172 C03B      RJMP	0x01AE
(0035)     }
(0036)     OS_ENTER_CRITICAL();
    0173 930A      ST	R16,-Y
    0174 B70F      IN	R16,P3F
    0175 94F8      BCLR	7
    0176 930F      PUSH	R16
    0177 9109      LD	R16,Y+
(0037)     if (OSpTCBList[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
    0178 E083      LDI	R24,3
    0179 E092      LDI	R25,2
    017A 2FE6      MOV	R30,R22
    017B D48C      RCALL	0x0608
    017C 8020      LDD	R2,0+Z
    017D 8031      LDD	R3,1+Z
    017E 2022      TST	R2
    017F F549      BNE	0x01A9
    0180 2033      TST	R3
    0181 F539      BNE	0x01A9
(0038)         OSpTCBList[prio] = ptcb;    /* Reserve the priority to prevent others from doing ...  */
    0182 E083      LDI	R24,3
    0183 E092      LDI	R25,2
    0184 2FE6      MOV	R30,R22
    0185 D482      RCALL	0x0608
    0186 8340      STD	R20,0+Z
    0187 8351      STD	R21,1+Z
(0039)         OS_EXIT_CRITICAL();
    0188 930A      ST	R16,-Y
    0189 910F      POP	R16
    018A BF0F      OUT	P3F,R16
    018B 9109      LD	R16,Y+
    018C D4DE      RCALL	0x066B
(0040)         psp = (void *)OSTaskStkInit(task, pdata, ptos, stk_size); /* Initialize the task's stack              */
    018D 840C      LDD	R0,12+Y
    018E 841D      LDD	R1,13+Y
    018F 8208      STD	R0,0+Y
    0190 8219      STD	R1,1+Y
    0191 852A      LDD	R18,10+Y
    0192 853B      LDD	R19,11+Y
    0193 2D0A      MOV	R16,R10
    0194 2D1B      MOV	R17,R11
    0195 D367      RCALL	_OSTaskStkInit
    0196 2EA0      MOV	R10,R16
    0197 2EB1      MOV	R11,R17
    0198 D4D2      RCALL	0x066B
(0041)         err = OSTCBInit(ptcb,prio, psp,stk_size);         
    0199 82A8      STD	R10,0+Y
    019A 82B9      STD	R11,1+Y
    019B 2F26      MOV	R18,R22
    019C 2F04      MOV	R16,R20
    019D 2F15      MOV	R17,R21
    019E D012      RCALL	_OSTCBInit
    019F 2F40      MOV	R20,R16
(0042)         if (err == OS_NO_ERR) {
    01A0 2300      TST	R16
    01A1 F429      BNE	0x01A7
(0043)             if (OSRunning) {                 /* Find highest priority task if multitasking has started */
    01A2 90200209  LDS	R2,_OSRunning
    01A4 2022      TST	R2
    01A5 F009      BEQ	0x01A7
(0044)                 OSSched();
    01A6 D041      RCALL	_OSSched
(0045)             }
(0046)         } else {
(0047)         }
(0048)         return (err);
    01A7 2F04      MOV	R16,R20
    01A8 C005      RJMP	0x01AE
(0049)     } else {
(0050)         OS_EXIT_CRITICAL();
    01A9 930A      ST	R16,-Y
    01AA 910F      POP	R16
    01AB BF0F      OUT	P3F,R16
    01AC 9109      LD	R16,Y+
(0051)         return (OSERR_PRIO_EXIST);
    01AD E003      LDI	R16,3
    01AE 9624      ADIW	R28,4
    01AF D3FF      RCALL	pop_gset3
    01B0 9508      RET
_OSTCBInit:
  stk_size             --> Y+6
  ptos                 --> Y+4
  prio                 --> R22
  ptcb                 --> R20
    01B1 D3F2      RCALL	push_gset2
    01B2 2F62      MOV	R22,R18
    01B3 D478      RCALL	0x062C
(0052)     }
(0053) }
(0054) 
(0055) /*
(0056) *********************************************************************************************************
(0057) *                                            INITIALIZE TCB
(0058) *
(0059) * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
(0060) *              a task is created (see OSTaskCreate() and OSTaskCreateExt()).
(0061) *
(0062) * Arguments  : prio          is the priority of the task being created
(0063) *
(0064) *              ptos          is a pointer to the task's top-of-stack assuming that the CPU registers
(0065) *                            have been placed on the stack.  Note that the top-of-stack corresponds to a 
(0066) *                            'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
(0067) *                            location if OS_STK_GROWTH is set to 0.  Note that stack growth is CPU
(0068) *                            specific.
(0069) *
(0070) *              pbos          is a pointer to the bottom of stack.  A NULL pointer is passed if called by
(0071) *                            'OSTaskCreate()'.
(0072) *
(0073) *              id            is the task's ID (0..65535)
(0074) *
(0075) *              stk_size      is the size of the stack (in 'stack units').  If the stack units are INT8Us
(0076) *                            then, 'stk_size' contains the number of bytes for the stack.  If the stack
(0077) *                            units are INT32Us then, the stack contains '4 * stk_size' bytes.  The stack
(0078) *                            units are established by the #define constant OS_STK which is CPU
(0079) *                            specific.  'stk_size' is 0 if called by 'OSTaskCreate()'.
(0080) *
(0081) *              pext          is a pointer to a user supplied memory area that is used to extend the task
(0082) *                            control block.  This allows you to store the contents of floating-point
(0083) *                            registers, MMU registers or anything else you could find useful during a 
(0084) *                            context switch.  You can even assign a name to each task and store this name
(0085) *                            in this TCB extension.  A NULL pointer is passed if called by OSTaskCreate().
(0086) *
(0087) *              opt           options as passed to 'OSTaskCreateExt()' or, 
(0088) *                            0 if called from 'OSTaskCreate()'.
(0089) *
(0090) * Returns    : OS_NO_ERR         if the call was successful
(0091) *              OS_NO_MORE_TCB    if there are no more free TCBs to be allocated and thus, the task cannot
(0092) *                                be created.
(0093) *
(0094) * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
(0095) *********************************************************************************************************
(0096) */
(0097) 
(0098) INT8U OSTCBInit (OS_TCB *ptcb,INT8U prio, OS_STK *ptos, INT16U stk_size)
(0099) {
(0100) #if OS_STRICT
(0101)   if((0==ptcb)||(prio>OS_LOWEST_PRIO)||((INT16U)ptos<OS_HARDWARE_STACK_SIZE+40)||(stk_size<OS_HARDWARE_STACK_SIZE+40))
    01B4 F079      BEQ	0x01C4
    01B5 E082      LDI	R24,2
    01B6 1786      CP	R24,R22
    01B7 F060      BCS	0x01C4
    01B8 818C      LDD	R24,4+Y
    01B9 819D      LDD	R25,5+Y
    01BA 3688      CPI	R24,0x68
    01BB E0E0      LDI	R30,0
    01BC 079E      CPC	R25,R30
    01BD F030      BCS	0x01C4
    01BE 818E      LDD	R24,6+Y
    01BF 819F      LDD	R25,7+Y
    01C0 3688      CPI	R24,0x68
    01C1 E0E0      LDI	R30,0
    01C2 079E      CPC	R25,R30
    01C3 F410      BCC	0x01C6
(0102)     OSError(0);
    01C4 2700      CLR	R16
    01C5 D2CB      RCALL	_OSError
(0103) #endif
(0104)     OS_ENTER_CRITICAL();
    01C6 930A      ST	R16,-Y
    01C7 B70F      IN	R16,P3F
    01C8 94F8      BCLR	7
    01C9 930F      PUSH	R16
    01CA 9109      LD	R16,Y+
(0105)     if ((OS_TCB *)0!=ptcb) {
    01CB 3040      CPI	R20,0
    01CC 0745      CPC	R20,R21
    01CD F099      BEQ	0x01E1
(0106)         OS_EXIT_CRITICAL();
    01CE 930A      ST	R16,-Y
    01CF 910F      POP	R16
    01D0 BF0F      OUT	P3F,R16
    01D1 9109      LD	R16,Y+
(0107)         ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
    01D2 2FE4      MOV	R30,R20
    01D3 2FF5      MOV	R31,R21
    01D4 800C      LDD	R0,4+Y
    01D5 801D      LDD	R1,5+Y
    01D6 8200      STD	R0,0+Z
    01D7 8211      STD	R1,1+Z
(0108)         ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
    01D8 8365      STD	R22,5+Z
(0109)         ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
    01D9 E081      LDI	R24,1
    01DA 8384      STD	R24,4+Z
(0110)         ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
    01DB 2422      CLR	R2
    01DC 2433      CLR	R3
    01DD 8222      STD	R2,2+Z
    01DE 8233      STD	R3,3+Z
(0111) 
(0112)         return (OS_NO_ERR);
    01DF 2700      CLR	R16
    01E0 C005      RJMP	0x01E6
(0113)     } else {
(0114)         OS_EXIT_CRITICAL();
    01E1 930A      ST	R16,-Y
    01E2 910F      POP	R16
    01E3 BF0F      OUT	P3F,R16
    01E4 9109      LD	R16,Y+
(0115)         return (OSERR_TCB_INVALID);
    01E5 E002      LDI	R16,2
    01E6 D3C6      RCALL	pop_gset2
    01E7 9508      RET
(0116)     }
(0117) }
(0118) 
(0119) /*
(0120) *********************************************************************************************************
(0121) *                                              SCHEDULER
(0122) *
(0123) * Description: This function is called by other uC/OS-II services to determine whether a new, high
(0124) *              priority task has been made ready to run.  This function is invoked by TASK level code
(0125) *              and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
(0126) *
(0127) * Arguments  : none
(0128) *
(0129) * Returns    : none
(0130) *
(0131) * Notes      : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
(0132) *              2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
(0133) *********************************************************************************************************
(0134) */
(0135) 
(0136) void OSSched (void)
(0137) {
(0138)     OS_ENTER_CRITICAL();
_OSSched:
    01E8 930A      ST	R16,-Y
    01E9 B70F      IN	R16,P3F
    01EA 94F8      BCLR	7
    01EB 930F      PUSH	R16
    01EC 9109      LD	R16,Y+
(0139)     if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
    01ED 90200202  LDS	R2,_OSIntNesting
    01EF 90300201  LDS	R3,_OSLockNesting
    01F1 2832      OR	R3,R2
    01F2 F4B9      BNE	0x020A
(0140)         OSPrioHighRdy=OSGetPrioRdy();
    01F3 D047      RCALL	_OSGetPrioRdy
    01F4 930001FF  STS	R16,_OSPrioHighRdy
(0141) 		if(OSPrioHighRdy>OS_LOWEST_PRIO)
    01F6 E082      LDI	R24,2
    01F7 1780      CP	R24,R16
    01F8 F418      BCC	0x01FC
(0142) 		{
(0143) #if OS_STRICT
(0144) 		  OSError(0);
    01F9 2700      CLR	R16
    01FA D296      RCALL	_OSError
(0145) #endif
(0146) 		}else if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
    01FB C00E      RJMP	0x020A
    01FC D45D      RCALL	0x065A
    01FD F061      BEQ	0x020A
(0147)             OSTCBHighRdy = OSpTCBList[OSPrioHighRdy];
    01FE E083      LDI	R24,3
    01FF E092      LDI	R25,2
    0200 2DE3      MOV	R30,R3
    0201 D406      RCALL	0x0608
    0202 D418      RCALL	0x061B
(0148) #if OS_STRICT
(0149) 		  	if(0==OSTCBHighRdy)
    0203 2022      TST	R2
    0204 F421      BNE	0x0209
    0205 2033      TST	R3
    0206 F411      BNE	0x0209
(0150) 			  OSError(0);
    0207 2700      CLR	R16
    0208 D288      RCALL	_OSError
(0151) #endif			
(0152) 			OS_TASK_SW();                        /* Perform a context switch                           */
    0209 DE53      RCALL	_OSCtxSw
(0153)         }//end OSPrioHighRdy != OSPrioCur
(0154)     }//end nesting==0
(0155)     OS_EXIT_CRITICAL();
    020A 930A      ST	R16,-Y
    020B 910F      POP	R16
    020C BF0F      OUT	P3F,R16
    020D 9109      LD	R16,Y+
(0156) }
    020E 9508      RET
(0157) 
(0158) /*
(0159) *********************************************************************************************************

⌨️ 快捷键说明

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