📄 ucosii.lst
字号:
_OSTaskIdle:
pdata --> R16
02C8 930A ST R16,-Y
02C9 B70F IN R16,P3F
02CA 94F8 BCLR 7
02CB 930F PUSH R16
02CC 9109 LD R16,Y+
(0248) OSIdleCtr++;
02CD E081 LDI R24,1
02CE E090 LDI R25,0
02CF E0A0 LDI R26,0
02D0 E0B0 LDI R27,0
02D1 90400150 LDS R4,_OSIdleCtr+2
02D3 90500151 LDS R5,_OSIdleCtr+3
02D5 9020014E LDS R2,_OSIdleCtr
02D7 9030014F LDS R3,_OSIdleCtr+1
02D9 0E28 ADD R2,R24
02DA 1E39 ADC R3,R25
02DB 1E4A ADC R4,R26
02DC 1E5B ADC R5,R27
02DD 9230014F STS R3,_OSIdleCtr+1
02DF 9220014E STS R2,_OSIdleCtr
02E1 92500151 STS R5,_OSIdleCtr+3
02E3 92400150 STS R4,_OSIdleCtr+2
(0249) OS_EXIT_CRITICAL();
02E5 930A ST R16,-Y
02E6 910F POP R16
02E7 BF0F OUT P3F,R16
02E8 9109 LD R16,Y+
02E9 CFDE RJMP _OSTaskIdle
02EA 9508 RET
_OSTCBInit:
ptcb --> R20
opt --> Y+10
pext --> Y+8
stk_size --> Y+6
id --> Y+4
pbos --> Y+2
ptos --> R18
prio --> R16
02EB 940E0878 CALL push_gset1
(0250) }
(0251) }
(0252) /*$PAGE*/
(0253) /*
(0254) *********************************************************************************************************
(0255) * INITIALIZE TCB
(0256) *
(0257) * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
(0258) * a task is created (see OSTaskCreate() and OSTaskCreateExt()).
(0259) *
(0260) * Arguments : prio is the priority of the task being created
(0261) *
(0262) * ptos is a pointer to the task's top-of-stack assuming that the CPU registers
(0263) * have been placed on the stack. Note that the top-of-stack corresponds to a
(0264) * 'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
(0265) * location if OS_STK_GROWTH is set to 0. Note that stack growth is CPU
(0266) * specific.
(0267) *
(0268) * pbos is a pointer to the bottom of stack. A NULL pointer is passed if called by
(0269) * 'OSTaskCreate()'.
(0270) *
(0271) * id is the task's ID (0..65535)
(0272) *
(0273) * stk_size is the size of the stack (in 'stack units'). If the stack units are INT8Us
(0274) * then, 'stk_size' contains the number of bytes for the stack. If the stack
(0275) * units are INT32Us then, the stack contains '4 * stk_size' bytes. The stack
(0276) * units are established by the #define constant OS_STK which is CPU
(0277) * specific. 'stk_size' is 0 if called by 'OSTaskCreate()'.
(0278) *
(0279) * pext is a pointer to a user supplied memory area that is used to extend the task
(0280) * control block. This allows you to store the contents of floating-point
(0281) * registers, MMU registers or anything else you could find useful during a
(0282) * context switch. You can even assign a name to each task and store this name
(0283) * in this TCB extension. A NULL pointer is passed if called by OSTaskCreate().
(0284) *
(0285) * opt options as passed to 'OSTaskCreateExt()' or,
(0286) * 0 if called from 'OSTaskCreate()'.
(0287) *
(0288) * Returns : OS_NO_ERR if the call was successful
(0289) * OS_NO_MORE_TCB if there are no more free TCBs to be allocated and thus, the task cannot
(0290) * be created.
(0291) *
(0292) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0293) *********************************************************************************************************
(0294) */
(0295)
(0296) INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
(0297) {
(0298) OS_TCB *ptcb;
(0299)
(0300)
(0301) OS_ENTER_CRITICAL();
02ED 930A ST R16,-Y
02EE B70F IN R16,P3F
02EF 94F8 BCLR 7
02F0 930F PUSH R16
02F1 9109 LD R16,Y+
(0302) ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
02F2 91400141 LDS R20,_OSTCBFreeList
02F4 91500142 LDS R21,_OSTCBFreeList+1
(0303) if (ptcb != (OS_TCB *)0) {
02F6 3040 CPI R20,0
02F7 0745 CPC R20,R21
02F8 F409 BNE 0x02FA
02F9 C073 RJMP 0x036D
(0304) OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
02FA 01FA MOVW R30,R20
02FB 8022 LDD R2,2+Z
02FC 8033 LDD R3,3+Z
02FD 92300142 STS R3,_OSTCBFreeList+1
02FF 92200141 STS R2,_OSTCBFreeList
(0305) OS_EXIT_CRITICAL();
0301 930A ST R16,-Y
0302 910F POP R16
0303 BF0F OUT P3F,R16
0304 9109 LD R16,Y+
(0306) ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
0305 8320 STD R18,0+Z
0306 8331 STD R19,1+Z
(0307) ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
0307 8701 STD R16,9+Z
(0308) ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
0308 2422 CLR R2
0309 8620 STD R2,8+Z
(0309) ptcb->OSTCBDly = 0; /* Task is not delayed */
030A 2433 CLR R3
030B 8226 STD R2,6+Z
030C 8237 STD R3,7+Z
(0310)
(0311) pext = pext; /* Prevent compiler warning if not used */
(0312) stk_size = stk_size;
(0313) pbos = pbos;
(0314) opt = opt;
(0315) id = id;
(0316)
(0317) ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */
030D 2E20 MOV R2,R16
030E 9426 LSR R2
030F 9426 LSR R2
0310 9426 LSR R2
0311 8623 STD R2,11+Z
(0318) ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
0312 E686 LDI R24,0x66
0313 E090 LDI R25,0
0314 85E3 LDD R30,11+Z
0315 27FF CLR R31
0316 0FE8 ADD R30,R24
0317 1FF9 ADC R31,R25
0318 91E4 LD R30,R30
0319 01DA MOVW R26,R20
031A 961D ADIW R26,0xD
031B 93EC ST R30,0(X)
(0319) ptcb->OSTCBX = prio & 0x07;
031C 2F80 MOV R24,R16
031D 7087 ANDI R24,7
031E 01FA MOVW R30,R20
031F 8782 STD R24,10+Z
(0320) ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
0320 E686 LDI R24,0x66
0321 E090 LDI R25,0
0322 85E2 LDD R30,10+Z
0323 27FF CLR R31
0324 0FE8 ADD R30,R24
0325 1FF9 ADC R31,R25
0326 91E4 LD R30,R30
0327 01DA MOVW R26,R20
0328 961C ADIW R26,0xC
0329 93EC ST R30,0(X)
(0321)
(0322) OS_ENTER_CRITICAL();
032A 930A ST R16,-Y
032B B70F IN R16,P3F
032C 94F8 BCLR 7
032D 930F PUSH R16
032E 9109 LD R16,Y+
(0323) OSTCBPrioTbl[prio] = ptcb;
032F E082 LDI R24,2
0330 9F80 MUL R24,R16
0331 01F0 MOVW R30,R0
0332 E18D LDI R24,0x1D
0333 E091 LDI R25,1
0334 0FE8 ADD R30,R24
0335 1FF9 ADC R31,R25
0336 8340 STD R20,0+Z
0337 8351 STD R21,1+Z
(0324) ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
0338 9020013D LDS R2,_OSTCBList
033A 9030013E LDS R3,_OSTCBList+1
033C 01FA MOVW R30,R20
033D 8222 STD R2,2+Z
033E 8233 STD R3,3+Z
(0325) ptcb->OSTCBPrev = (OS_TCB *)0;
033F 2422 CLR R2
0340 2433 CLR R3
0341 8224 STD R2,4+Z
0342 8235 STD R3,5+Z
(0326) if (OSTCBList != (OS_TCB *)0) {
0343 9020013D LDS R2,_OSTCBList
0345 9030013E LDS R3,_OSTCBList+1
0347 2022 TST R2
0348 F411 BNE 0x034B
0349 2033 TST R3
034A F031 BEQ 0x0351
(0327) OSTCBList->OSTCBPrev = ptcb;
034B 91E0013D LDS R30,_OSTCBList
034D 91F0013E LDS R31,_OSTCBList+1
034F 8344 STD R20,4+Z
0350 8355 STD R21,5+Z
(0328) }
(0329) OSTCBList = ptcb;
0351 9350013E STS R21,_OSTCBList+1
0353 9340013D STS R20,_OSTCBList
(0330) OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
0355 01FA MOVW R30,R20
0356 8425 LDD R2,13+Z
0357 90300149 LDS R3,_OSRdyGrp
0359 2832 OR R3,R2
035A 92300149 STS R3,_OSRdyGrp
(0331) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
035C E487 LDI R24,0x47
035D E091 LDI R25,1
035E 8423 LDD R2,11+Z
035F 2433 CLR R3
0360 0E28 ADD R2,R24
0361 1E39 ADC R3,R25
0362 8444 LDD R4,12+Z
0363 01F1 MOVW R30,R2
0364 8050 LDD R5,0+Z
0365 2854 OR R5,R4
0366 8250 STD R5,0+Z
(0332) OS_EXIT_CRITICAL();
0367 930A ST R16,-Y
0368 910F POP R16
0369 BF0F OUT P3F,R16
036A 9109 LD R16,Y+
(0333) return (OS_NO_ERR);
036B 2700 CLR R16
036C C005 RJMP 0x0372
(0334) } else {
(0335) OS_EXIT_CRITICAL();
036D 930A ST R16,-Y
036E 910F POP R16
036F BF0F OUT P3F,R16
0370 9109 LD R16,Y+
(0336) return (OS_NO_MORE_TCB);
0371 E406 LDI R16,0x46
0372 940E087B CALL pop_gset1
0374 9508 RET
(0337) }
(0338) }
(0339) /*$PAGE*/
(0340) /*
(0341) *********************************************************************************************************
(0342) * PROCESS SYSTEM TICK
(0343) *
(0344) * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
(0345) * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
(0346) * called by a high priority task.
(0347) *
(0348) * Arguments : none
(0349) *
(0350) * Returns : none
(0351) *********************************************************************************************************
(0352) */
(0353)
(0354) void OSTimeTick (void)
(0355) {
(0356) OS_TCB *ptcb;
(0357)
(0358) ptcb = OSTCBList; /* Point at first TCB in TCB list */
_OSTimeTick:
ptcb --> R16
0375 9100013D LDS R16,_OSTCBList
0377 9110013E LDS R17,_OSTCBList+1
0379 C03B RJMP 0x03B5
(0359) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0360) OS_ENTER_CRITICAL();
037A 930A ST R16,-Y
037B B70F IN R16,P3F
037C 94F8 BCLR 7
037D 930F PUSH R16
037E 9109 LD R16,Y+
(0361) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
037F 01F8 MOVW R30,R16
0380 8026 LDD R2,6+Z
0381 8037 LDD R3,7+Z
0382 2022 TST R2
0383 F419 BNE 0x0387
0384 2033 TST R3
0385 F409 BNE 0x0387
0386 C027 RJMP 0x03AE
(0362) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
0387 01C8 MOVW R24,R16
0388 9606 ADIW R24,6
0389 01FC MOVW R30,R24
038A 8180 LDD R24,0+Z
038B 8191 LDD R25,1+Z
038C 9701 SBIW R24,1
038D 012C MOVW R4,R24
038E 8240 STD R4,0+Z
038F 8251 STD R5,1+Z
0390 3080 CPI R24,0
0391 0789 CPC R24,R25
0392 F4D9 BNE 0x03AE
(0363) if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
0393 01F8 MOVW R30,R16
0394 8420 LDD R2,8+Z
0395 FC23 SBRC R2,3
0396 C012 RJMP 0x03A9
(0364) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
0397 8425 LDD R2,13+Z
0398 90300149 LDS R3,_OSRdyGrp
039A 2832 OR R3,R2
039B 92300149 STS R3,_OSRdyGrp
(0365) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
039D E487 LDI R24,0x47
039E E091 LDI R25,1
039F 8423 LDD R2,11+Z
03A0 2433 CLR R3
03A1 0E28 ADD R2,R24
03A2 1E39 ADC R3,R25
03A3 8444 LDD R4,12+Z
03A4 01F1 MOVW R30,R2
03A5 8050 LDD R5,0+Z
03A6 2854 OR R5,R4
03A7 8250 STD R5,0+Z
(0366) } else { /* Yes, Leave 1 tick to prevent ... */
03A8 C005 RJMP 0x03AE
(0367) ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
03A9 E081 LDI R24,1
03AA E090 LDI R25,0
03AB 01F8 MOVW R30,R16
03AC 8386 STD R24,6+Z
03AD 8397 STD R25,7+Z
(0368) } /* ... suspension is removed. */
(0369) }
(0370) }
(0371) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
03AE 01F8 MOVW R30,R16
03AF 8102 LDD R16,2+Z
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -