📄 os-task-switch.lst
字号:
(0271) ;
(0272) ; 2) The stack frame of the task to suspend looks as follows:
(0273) ;
(0274) ; SP +0 --> LSB of return address of OSIntCtxSw() (Low memory)
(0275) ; +1 MSB of return address of OSIntCtxSw()
(0276) ; +2 LSB of return address of OSIntExit()
(0277) ; +3 MSB of return address of OSIntExit()
(0278) ; +4 LSB of task code address
(0279) ; +5 MSB of task code address (High memory)
(0280) ;
(0281) ; 3) The saved context of the task to resume looks as follows:
(0282) ;
(0283) ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low mem)
(0284) ; MSB of (return) stack pointer
(0285) ; Flags to load in status register
(0286) ; R31
(0287) ; R30
(0288) ; R7
(0289) ; .
(0290) ; .
(0291) ; .
(0292) ; R0 (High memory)
(0293) ;*******************************************************************************
(0294)
(0295) _OSIntCtxSw::
(0296) IN R30,SPL ; Z = SP
_OSIntCtxSw:
0067 B7ED IN R30,P3D
(0297) IN R31,SPH
0068 B7FE IN R31,P3E
(0298) ; ADIW R30,4 ; (Uncomment if OS_CRITICAL_METHOD is 1, see OS_CPU.H)
(0299) ADIW R30,5 ; Adjust Z to point to task return address
0069 9635 ADIW R30,5
(0300) ST -Y,R31 ; Save SP
006A 93FA ST R31,-Y
(0301) ST -Y,R30 ;
006B 93EA ST R30,-Y
006C D383 RCALL 0x03F0
(0302)
(0303) LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
(0304) LDS R31,_OSTCBCur+1 ;
(0305) ST Z+,R28 ; Save Y pointer
006D 93C1 ST R28,Z+
(0306) ST Z+,R29 ;
006E 93D1 ST R29,Z+
(0307)
(0308) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
006F 910001F6 LDS R16,_OSPrioHighRdy
(0309) STS _OSPrioCur,R16 ;
0071 930001F7 STS R16,_OSPrioCur
0073 D381 RCALL 0x03F5
(0310)
(0311) LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
(0312) LDS R31,_OSTCBHighRdy+1 ;
(0313) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
0074 93E001F4 STS R30,_OSTCBCur
(0314) STS _OSTCBCur+1,R31 ;
0076 93F001F5 STS R31,_OSTCBCur+1
(0315)
(0316) LD R28,Z+ ; Restore Y pointer
0078 91C1 LD R28,Z+
(0317) LD R29,Z+ ;
0079 91D1 LD R29,Z+
007A 9109 LD R16,Y+
007B BF0D OUT P3D,R16
007C 9109 LD R16,Y+
007D BF0E OUT P3E,R16
007E D316 RCALL 0x0395
(0318)
(0319) POPSP ; Restore stack pointer
(0320) POPSREG ; Restore status register
(0321) POPRS ; Restore saved registers
(0322) SEI
007F 9478 BSET 7
(0323) RET
0080 9508 RET
_main:
err --> R20
0081 9727 SBIW R28,7
FILE: G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-switch\test1.c
(0001) //test1.c
(0002) #include "includes.h"
(0003)
(0004) void main(void)
(0005) {
(0006) INT8U err;
(0007) ProgramStart();
0082 D20D RCALL _ProgramStart
(0008) OSInit();
0083 D047 RCALL _OSInit
(0009) //create task1
(0010) err=OSTaskCreate(&tcb_task1,task1,(void*)(int)1,
0084 2422 CLR R2
0085 822E STD R2,6+Y
0086 D364 RCALL 0x03EB
0087 ED8F LDI R24,0xDF
0088 E091 LDI R25,1
0089 838A STD R24,2+Y
008A 839B STD R25,3+Y
008B E081 LDI R24,1
008C E090 LDI R25,0
008D 8388 STD R24,0+Y
008E 8399 STD R25,1+Y
008F E12E LDI R18,0x1E
0090 E030 LDI R19,0
0091 EE0C LDI R16,0xEC
0092 E011 LDI R17,1
0093 D057 RCALL _OSTaskCreate
0094 2F40 MOV R20,R16
(0011) &stk_task1[OS_TASK_STACK_SIZE-1],
(0012) OS_TASK_STACK_SIZE,
(0013) 0);
(0014) #if OS_STRICT
(0015) if(OS_NO_ERR!=err)
0095 2300 TST R16
0096 F011 BEQ 0x0099
(0016) OSError(0);
0097 2700 CLR R16
0098 D208 RCALL _OSError
(0017) #endif
(0018) //create task2
(0019) err=OSTaskCreate(&tcb_task2,task2,(void*)(int)2,
0099 E081 LDI R24,1
009A 838E STD R24,6+Y
009B D34F RCALL 0x03EB
009C E58F LDI R24,0x5F
009D E091 LDI R25,1
009E 838A STD R24,2+Y
009F 839B STD R25,3+Y
00A0 E082 LDI R24,2
00A1 E090 LDI R25,0
00A2 8388 STD R24,0+Y
00A3 8399 STD R25,1+Y
00A4 E12C LDI R18,0x1C
00A5 E030 LDI R19,0
00A6 EE06 LDI R16,0xE6
00A7 E011 LDI R17,1
00A8 D042 RCALL _OSTaskCreate
00A9 2F40 MOV R20,R16
(0020) &stk_task2[OS_TASK_STACK_SIZE-1],
(0021) OS_TASK_STACK_SIZE,
(0022) 1);
(0023) #if OS_STRICT
(0024) if(OS_NO_ERR!=err)
00AA 2300 TST R16
00AB F011 BEQ 0x00AE
(0025) OSError(0);
00AC 2700 CLR R16
00AD D1F3 RCALL _OSError
(0026) #endif
(0027)
(0028) //create task3
(0029) err=OSTaskCreate(&tcb_task3,task3,(void*)(int)3,
00AE E082 LDI R24,2
00AF 838E STD R24,6+Y
00B0 D33A RCALL 0x03EB
00B1 ED8F LDI R24,0xDF
00B2 E090 LDI R25,0
00B3 838A STD R24,2+Y
00B4 839B STD R25,3+Y
00B5 E083 LDI R24,3
00B6 E090 LDI R25,0
00B7 8388 STD R24,0+Y
00B8 8399 STD R25,1+Y
00B9 E12A LDI R18,0x1A
00BA E030 LDI R19,0
00BB EE00 LDI R16,0xE0
00BC E011 LDI R17,1
00BD D02D RCALL _OSTaskCreate
00BE 2F40 MOV R20,R16
(0030) &stk_task3[OS_TASK_STACK_SIZE-1],
(0031) OS_TASK_STACK_SIZE,
(0032) 2);
(0033) #if OS_STRICT
(0034) if(OS_NO_ERR!=err)
00BF 2300 TST R16
00C0 F011 BEQ 0x00C3
(0035) OSError(0);
00C1 2700 CLR R16
00C2 D1DE RCALL _OSError
(0036) #endif
(0037) //////////
(0038) TC2_Init();
00C3 D1A0 RCALL _TC2_Init
(0039) SEI();
00C4 9478 BSET 7
(0040) OSStart(); // start multitasking
00C5 D0CD RCALL _OSStart
(0041)
(0042) #if OS_STRICT
(0043) OSError(0);
00C6 2700 CLR R16
00C7 D1D9 RCALL _OSError
(0044) #endif
(0045) while(1)
00C8 CFFF RJMP 0x00C8
(0046) ;
(0047) }
00C9 9627 ADIW R28,7
00CA 9508 RET
FILE: G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-switch\os-task-switch.c
(0001) //os主要代码
(0002) #define OS_GLOBALS /* Declare GLOBAL variables */
(0003) #include "includes.h"
(0004)
(0005) #define OS_MASTER_FILE /* Prevent the following files from including includes.h */
(0006)
(0007) void OSInit(void)
(0008) {
(0009) INT8U i;
(0010)
(0011) OSIntNesting=0; /* Interrupt nesting level */
_OSInit:
i --> R16
00CB 2422 CLR R2
00CC 922001F9 STS R2,_OSIntNesting
(0012) OSLockNesting=0; /* Multitasking lock nesting level */
00CE 922001F8 STS R2,_OSLockNesting
(0013) OSPrioCur=0xff; /* Priority of current task */
00D0 EF8F LDI R24,0xFF
00D1 938001F7 STS R24,_OSPrioCur
(0014) OSPrioHighRdy=0xff; /* Priority of highest priority task */
00D3 938001F6 STS R24,_OSPrioHighRdy
(0015) OSRunning = FALSE;
00D5 92200200 STS R2,_OSRunning
(0016)
(0017) OSTCBCur=0; /* Pointer to currently running TCB */
00D7 2433 CLR R3
00D8 D331 RCALL 0x040A
(0018) OSTCBHighRdy=0; /* Pointer to highest priority TCB ready to run */
00D9 923001F3 STS R3,_OSTCBHighRdy+1
00DB 922001F2 STS R2,_OSTCBHighRdy
(0019) /*init task tcb pointers list*/
(0020) for(i=0;i<OS_TASK_COUNT;i++)
00DD 2700 CLR R16
00DE C009 RJMP 0x00E8
(0021) OSpTCBList[i]=(OS_TCB*)0;
00DF EF8A LDI R24,0xFA
00E0 E091 LDI R25,1
00E1 2FE0 MOV R30,R16
00E2 D2F3 RCALL 0x03D6
00E3 2422 CLR R2
00E4 2433 CLR R3
00E5 8220 STD R2,0+Z
00E6 8231 STD R3,1+Z
00E7 9503 INC R16
00E8 3003 CPI R16,3
00E9 F3A8 BCS 0x00DF
(0022) }
00EA 9508 RET
_OSTaskCreate:
psp --> R10
err --> R20
prio --> R22
stk_size --> Y+14
ptos --> Y+12
pdata --> Y+10
task --> R10
ptcb --> R20
00EB D282 RCALL push_gset3
00EC 2EA2 MOV R10,R18
00ED 2EB3 MOV R11,R19
00EE 2F40 MOV R20,R16
00EF 2F51 MOV R21,R17
00F0 9724 SBIW R28,4
00F1 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 */
00F2 E082 LDI R24,2
00F3 1786 CP R24,R22
00F4 F410 BCC 0x00F7
(0034) return (OSERR_PRIO_INVALID);
00F5 E001 LDI R16,1
00F6 C03B RJMP 0x0132
(0035) }
(0036) OS_ENTER_CRITICAL();
00F7 930A ST R16,-Y
00F8 B70F IN R16,P3F
00F9 94F8 BCLR 7
00FA 930F PUSH R16
00FB 9109 LD R16,Y+
(0037) if (OSpTCBList[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
00FC EF8A LDI R24,0xFA
00FD E091 LDI R25,1
00FE 2FE6 MOV R30,R22
00FF D2D6 RCALL 0x03D6
0100 8020 LDD R2,0+Z
0101 8031 LDD R3,1+Z
0102 2022 TST R2
0103 F549 BNE 0x012D
0104 2033 TST R3
0105 F539 BNE 0x012D
(0038) OSpTCBList[prio] = ptcb; /* Reserve the priority to prevent others from doing ... */
0106 EF8A LDI R24,0xFA
0107 E091 LDI R25,1
0108 2FE6 MOV R30,R22
0109 D2CC RCALL 0x03D6
010A 8340 STD R20,0+Z
010B 8351 STD R21,1+Z
(0039) OS_EXIT_CRITICAL();
010C 930A ST R16,-Y
010D 910F POP R16
010E BF0F OUT P3F,R16
010F 9109 LD R16,Y+
0110 D2EF RCALL 0x0400
(0040) psp = (void *)OSTaskStkInit(task, pdata, ptos, stk_size); /* Initialize the task's stack */
0111 840C LDD R0,12+Y
0112 841D LDD R1,13+Y
0113 8208 STD R0,0+Y
0114 8219 STD R1,1+Y
0115 852A LDD R18,10+Y
0116 853B LDD R19,11+Y
0117 2D0A MOV R16,R10
0118 2D1B MOV R17,R11
0119 D1AA RCALL _OSTaskStkInit
011A 2EA0 MOV R10,R16
011B 2EB1 MOV R11,R17
011C D2E3 RCALL 0x0400
(0041) err = OSTCBInit(ptcb,prio, psp,stk_size);
011D 82A8 STD R10,0+Y
011E 82B9 STD R11,1+Y
011F 2F26 MOV R18,R22
0120 2F04 MOV R16,R20
0121 2F15 MOV R17,R21
0122 D012 RCALL _OSTCBInit
0123 2F40 MOV R20,R16
(0042) if (err == OS_NO_ERR) {
0124 2300 TST R16
0125 F429 BNE 0x012B
(0043) if (OSRunning) { /* Find highest priority task if multitasking has started */
0126 90200200 LDS R2,_OSRunning
0128 2022 TST R2
0129 F009 BEQ 0x012B
(0044) OSSched();
012A D041 RCALL _OSSched
(0045) }
(0046) } else {
(0047) }
(0048) return (err);
012B 2F04 MOV R16,R20
012C C005 RJMP 0x0132
(0049) } else {
(0050) OS_EXIT_CRITICAL();
012D 930A ST R16,-Y
012E 910F POP R16
012F BF0F OUT P3F,R16
0130 9109 LD R16,Y+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -