os-task-switch.lst
来自「ucos-ii-at90S-icc-avr」· LST 代码 · 共 1,781 行 · 第 1/5 页
LST
1,781 行
(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:
0064 B7ED IN R30,P3D
(0297) IN R31,SPH
0065 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
0066 9635 ADIW R30,5
(0300) ST -Y,R31 ; Save SP
0067 93FA ST R31,-Y
(0301) ST -Y,R30 ;
0068 93EA ST R30,-Y
0069 D375 RCALL 0x03DF
(0302)
(0303) LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
(0304) LDS R31,_OSTCBCur+1 ;
(0305) ST Z+,R28 ; Save Y pointer
006A 93C1 ST R28,Z+
(0306) ST Z+,R29 ;
006B 93D1 ST R29,Z+
(0307)
(0308) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
006C 910001F6 LDS R16,_OSPrioHighRdy
(0309) STS _OSPrioCur,R16 ;
006E 930001F7 STS R16,_OSPrioCur
0070 D373 RCALL 0x03E4
(0310)
(0311) LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
(0312) LDS R31,_OSTCBHighRdy+1 ;
(0313) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
0071 93E001F4 STS R30,_OSTCBCur
(0314) STS _OSTCBCur+1,R31 ;
0073 93F001F5 STS R31,_OSTCBCur+1
(0315)
(0316) LD R28,Z+ ; Restore Y pointer
0075 91C1 LD R28,Z+
(0317) LD R29,Z+ ;
0076 91D1 LD R29,Z+
0077 9109 LD R16,Y+
0078 BF0D OUT P3D,R16
0079 9109 LD R16,Y+
007A BF0E OUT P3E,R16
007B D30C RCALL 0x0388
(0318)
(0319) POPSP ; Restore stack pointer
(0320) POPSREG ; Restore status register
(0321) POPRS ; Restore saved registers
(0322) SEI
007C 9478 BSET 7
(0323) RET
007D 9508 RET
_main:
err --> R20
007E 9727 SBIW R28,7
FILE: H:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\UCOS-II\ucos2_iccavr\iccavr\os-task-switch\test1.c
(0001) //test1.c
(0002) #include "includes.h"
(0003)
(0004) void main(void)
(0005) {
(0006) INT8U err;
(0007) ProgramStart();
007F D212 RCALL _ProgramStart
(0008) OSInit();
0080 D047 RCALL _OSInit
(0009) //create task1
(0010) err=OSTaskCreate(&tcb_task1,task1,(void*)(int)1,
0081 2422 CLR R2
0082 822E STD R2,6+Y
0083 D365 RCALL 0x03E9
0084 ED8F LDI R24,0xDF
0085 E091 LDI R25,1
0086 838A STD R24,2+Y
0087 839B STD R25,3+Y
0088 E081 LDI R24,1
0089 E090 LDI R25,0
008A 8388 STD R24,0+Y
008B 8399 STD R25,1+Y
008C E12E LDI R18,0x1E
008D E030 LDI R19,0
008E EE0C LDI R16,0xEC
008F E011 LDI R17,1
0090 D057 RCALL _OSTaskCreate
0091 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)
0092 2300 TST R16
0093 F011 BEQ 0x0096
(0016) OSError(0);
0094 2700 CLR R16
0095 D1FD RCALL _OSError
(0017) #endif
(0018) //create task2
(0019) err=OSTaskCreate(&tcb_task2,task2,(void*)(int)2,
0096 E081 LDI R24,1
0097 838E STD R24,6+Y
0098 D350 RCALL 0x03E9
0099 E58F LDI R24,0x5F
009A E091 LDI R25,1
009B 838A STD R24,2+Y
009C 839B STD R25,3+Y
009D E082 LDI R24,2
009E E090 LDI R25,0
009F 8388 STD R24,0+Y
00A0 8399 STD R25,1+Y
00A1 E12C LDI R18,0x1C
00A2 E030 LDI R19,0
00A3 EE06 LDI R16,0xE6
00A4 E011 LDI R17,1
00A5 D042 RCALL _OSTaskCreate
00A6 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)
00A7 2300 TST R16
00A8 F011 BEQ 0x00AB
(0025) OSError(0);
00A9 2700 CLR R16
00AA D1E8 RCALL _OSError
(0026) #endif
(0027)
(0028) //create task3
(0029) err=OSTaskCreate(&tcb_task3,task3,(void*)(int)3,
00AB E082 LDI R24,2
00AC 838E STD R24,6+Y
00AD D33B RCALL 0x03E9
00AE ED8F LDI R24,0xDF
00AF E090 LDI R25,0
00B0 838A STD R24,2+Y
00B1 839B STD R25,3+Y
00B2 E083 LDI R24,3
00B3 E090 LDI R25,0
00B4 8388 STD R24,0+Y
00B5 8399 STD R25,1+Y
00B6 E12A LDI R18,0x1A
00B7 E030 LDI R19,0
00B8 EE00 LDI R16,0xE0
00B9 E011 LDI R17,1
00BA D02D RCALL _OSTaskCreate
00BB 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)
00BC 2300 TST R16
00BD F011 BEQ 0x00C0
(0035) OSError(0);
00BE 2700 CLR R16
00BF D1D3 RCALL _OSError
(0036) #endif
(0037) //////////
(0038) TC2_Init();
00C0 D1A0 RCALL _TC2_Init
(0039) SEI();
00C1 9478 BSET 7
(0040) OSStart(); // start multitasking
00C2 D0CD RCALL _OSStart
(0041)
(0042) #if OS_STRICT
(0043) OSError(0);
00C3 2700 CLR R16
00C4 D1CE RCALL _OSError
(0044) #endif
(0045) while(1)
00C5 CFFF RJMP 0x00C5
(0046) ;
(0047) }
00C6 9627 ADIW R28,7
00C7 9508 RET
FILE: H:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\UCOS-II\ucos2_iccavr\iccavr\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
00C8 2422 CLR R2
00C9 922001F9 STS R2,_OSIntNesting
(0012) OSLockNesting=0; /* Multitasking lock nesting level */
00CB 922001F8 STS R2,_OSLockNesting
(0013) OSPrioCur=0xff; /* Priority of current task */
00CD EF8F LDI R24,0xFF
00CE 938001F7 STS R24,_OSPrioCur
(0014) OSPrioHighRdy=0xff; /* Priority of highest priority task */
00D0 938001F6 STS R24,_OSPrioHighRdy
(0015) OSRunning = FALSE;
00D2 92200200 STS R2,_OSRunning
(0016)
(0017) OSTCBCur=0; /* Pointer to currently running TCB */
00D4 2433 CLR R3
00D5 D328 RCALL 0x03FE
(0018) OSTCBHighRdy=0; /* Pointer to highest priority TCB ready to run */
00D6 923001F3 STS R3,_OSTCBHighRdy+1
00D8 922001F2 STS R2,_OSTCBHighRdy
(0019) /*init task tcb pointers list*/
(0020) for(i=0;i<OS_TASK_COUNT;i++)
00DA 2700 CLR R16
00DB C009 RJMP 0x00E5
(0021) OSpTCBList[i]=(OS_TCB*)0;
00DC EF8A LDI R24,0xFA
00DD E091 LDI R25,1
00DE 2FE0 MOV R30,R16
00DF D2EA RCALL 0x03CA
00E0 2422 CLR R2
00E1 2433 CLR R3
00E2 8220 STD R2,0+Z
00E3 8231 STD R3,1+Z
00E4 9503 INC R16
00E5 3003 CPI R16,3
00E6 F3A8 BCS 0x00DC
(0022) }
00E7 9508 RET
_OSTaskCreate:
psp --> R10
err --> R20
prio --> R22
stk_size --> Y+14
ptos --> Y+12
pdata --> Y+10
task --> R10
ptcb --> R20
00E8 D278 RCALL push_gset3
00E9 2EA2 MOV R10,R18
00EA 2EB3 MOV R11,R19
00EB 2F40 MOV R20,R16
00EC 2F51 MOV R21,R17
00ED 9724 SBIW R28,4
00EE 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 */
00EF E082 LDI R24,2
00F0 1786 CP R24,R22
00F1 F410 BCC 0x00F4
(0034) return (OSERR_PRIO_INVALID);
00F2 E001 LDI R16,1
00F3 C03B RJMP 0x012F
(0035) }
(0036) OS_ENTER_CRITICAL();
00F4 930A ST R16,-Y
00F5 B70F IN R16,P3F
00F6 94F8 BCLR 7
00F7 930F PUSH R16
00F8 9109 LD R16,Y+
(0037) if (OSpTCBList[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
00F9 EF8A LDI R24,0xFA
00FA E091 LDI R25,1
00FB 2FE6 MOV R30,R22
00FC D2CD RCALL 0x03CA
00FD 8020 LDD R2,0+Z
00FE 8031 LDD R3,1+Z
00FF 2022 TST R2
0100 F549 BNE 0x012A
0101 2033 TST R3
0102 F539 BNE 0x012A
(0038) OSpTCBList[prio] = ptcb; /* Reserve the priority to prevent others from doing ... */
0103 EF8A LDI R24,0xFA
0104 E091 LDI R25,1
0105 2FE6 MOV R30,R22
0106 D2C3 RCALL 0x03CA
0107 8340 STD R20,0+Z
0108 8351 STD R21,1+Z
(0039) OS_EXIT_CRITICAL();
0109 930A ST R16,-Y
010A 910F POP R16
010B BF0F OUT P3F,R16
010C 9109 LD R16,Y+
010D D2E6 RCALL 0x03F4
(0040) psp = (void *)OSTaskStkInit(task, pdata, ptos, stk_size); /* Initialize the task's stack */
010E 840C LDD R0,12+Y
010F 841D LDD R1,13+Y
0110 8208 STD R0,0+Y
0111 8219 STD R1,1+Y
0112 852A LDD R18,10+Y
0113 853B LDD R19,11+Y
0114 2D0A MOV R16,R10
0115 2D1B MOV R17,R11
0116 D1A0 RCALL _OSTaskStkInit
0117 2EA0 MOV R10,R16
0118 2EB1 MOV R11,R17
0119 D2DA RCALL 0x03F4
(0041) err = OSTCBInit(ptcb,prio, psp,stk_size);
011A 82A8 STD R10,0+Y
011B 82B9 STD R11,1+Y
011C 2F26 MOV R18,R22
011D 2F04 MOV R16,R20
011E 2F15 MOV R17,R21
011F D012 RCALL _OSTCBInit
0120 2F40 MOV R20,R16
(0042) if (err == OS_NO_ERR) {
0121 2300 TST R16
0122 F429 BNE 0x0128
(0043) if (OSRunning) { /* Find highest priority task if multitasking has started */
0123 90200200 LDS R2,_OSRunning
0125 2022 TST R2
0126 F009 BEQ 0x0128
(0044) OSSched();
0127 D041 RCALL _OSSched
(0045) }
(0046) } else {
(0047) }
(0048) return (err);
0128 2F04 MOV R16,R20
0129 C005 RJMP 0x012F
(0049) } else {
(0050) OS_EXIT_CRITICAL();
012A 930A ST R16,-Y
012B 910F POP R16
012C BF0F OUT P3F,R16
012D 9109 LD R16,Y+
(0051) return (OSERR_PRIO_EXIST);
012E E003 LDI R16,3
012F 9624 ADIW R28,4
0130 D238 RCALL pop_gset3
0131 9508 RET
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?