📄 os-task-sem.lst
字号:
(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 + -