📄 os-task-sem.lst
字号:
008F 9059 LD R5,Y+
0090 9049 LD R4,Y+
0091 9039 LD R3,Y+
0092 9029 LD R2,Y+
0093 9019 LD R1,Y+
0094 9009 LD R0,Y+
(0227)
(0228) POPSP ; Restore stack pointer
(0229) POPSREG ; Restore status register
(0230) POPRS ; Restore all registers
(0231) RET
0095 9508 RET
_OSTickISR:
0096 D551 RCALL 0x05E8
(0232)
(0233) _OSTickISR::
(0234) PUSHRS ; Save interrupted task's context
(0235)
(0236) IN R16,SREG
(0237) SBR R16,0x80 ; Set interrupt bit in status reg and save
0097 6800 ORI R16,0x80
(0238) ST -Y,R16
0098 930A ST R16,-Y
(0239) ; PUSHSP
(0240)
(0241) ;avr-gcc ->11059200
(0242) LDI R16,256-(8000000/50/1024) ; Reload timer to overflow at a rate of 50Hz
0099 E604 LDI R16,0x64
(0243) OUT TCNT0,R16 ; at a prescaler of 1024 and 7.3728 MHz AVR clock
009A BF02 OUT P32,R16
(0244)
(0245) LDS R16,_OSIntNesting ; Notify uC/OS-II of ISR
009B 91000202 LDS R16,_OSIntNesting
(0246) INC R16 ;
009D 9503 INC R16
(0247) STS _OSIntNesting,R16 ;
009E 93000202 STS R16,_OSIntNesting
(0248)
(0249) ;why?
(0250) ; SEI ; Enable interrupts
(0251) RCALL _OSTimeTick ; RCALL uC/OS-II's tick updating function
00A0 D1D8 RCALL _OSTimeTick
(0252) RCALL _OSIntExit ; Notify uC/OS-II about end of ISR
00A1 D1FA RCALL _OSIntExit
00A2 9109 LD R16,Y+
00A3 BF0F OUT P3F,R16
00A4 91F9 LD R31,Y+
00A5 91E9 LD R30,Y+
00A6 91B9 LD R27,Y+
00A7 91A9 LD R26,Y+
00A8 9199 LD R25,Y+
00A9 9189 LD R24,Y+
00AA 9179 LD R23,Y+
00AB 9169 LD R22,Y+
00AC 9159 LD R21,Y+
00AD 9149 LD R20,Y+
00AE 9139 LD R19,Y+
00AF 9129 LD R18,Y+
00B0 9119 LD R17,Y+
00B1 9109 LD R16,Y+
00B2 90F9 LD R15,Y+
00B3 90E9 LD R14,Y+
00B4 90D9 LD R13,Y+
00B5 90C9 LD R12,Y+
00B6 90B9 LD R11,Y+
00B7 90A9 LD R10,Y+
00B8 9099 LD R9,Y+
00B9 9089 LD R8,Y+
00BA 9079 LD R7,Y+
00BB 9069 LD R6,Y+
00BC 9059 LD R5,Y+
00BD 9049 LD R4,Y+
00BE 9039 LD R3,Y+
00BF 9029 LD R2,Y+
00C0 9019 LD R1,Y+
00C1 9009 LD R0,Y+
(0253)
(0254) ; POPSP
(0255) POPSREG ; Restore status register
(0256) POPRS ; Restore all registers
(0257) ; SEI
(0258) RET ; Note: RET instead of RETI
00C2 9508 RET
(0259)
(0260) ;*******************************************************************************
(0261) ; INTERRUPT LEVEL CONTEXT SWITCH
(0262) ;
(0263) ; Description : This function is called by OSIntExit() to perform a context
(0264) ; switch to a task that has been made ready-to-run by an ISR.
(0265) ;
(0266) ; Note(s):
(0267) ; 1) Upon entry,
(0268) ; OSTCBCur points to the OS_TCB of the task to suspend
(0269) ; OSTCBHighRdy points to the OS_TCB of the task to resume
(0270) ;
(0271) ; 2) The stack frame of the task to suspend looks as follows:
(0272) ;
(0273) ; SP +0 --> LSB of return address of OSIntCtxSw() (Low memory)
(0274) ; +1 MSB of return address of OSIntCtxSw()
(0275) ; +2 LSB of return address of OSIntExit()
(0276) ; +3 MSB of return address of OSIntExit()
(0277) ; +4 LSB of task code address
(0278) ; +5 MSB of task code address (High memory)
(0279) ;
(0280) ; 3) The saved context of the task to resume looks as follows:
(0281) ;
(0282) ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low mem)
(0283) ; MSB of (return) stack pointer
(0284) ; Flags to load in status register
(0285) ; R31
(0286) ; R30
(0287) ; R7
(0288) ; .
(0289) ; .
(0290) ; .
(0291) ; R0 (High memory)
(0292) ;*******************************************************************************
(0293)
(0294) _OSIntCtxSw::
(0295) IN R30,SPL ; Z = SP
_OSIntCtxSw:
00C3 B7ED IN R30,P3D
(0296) IN R31,SPH
00C4 B7FE IN R31,P3E
(0297) ; ADIW R30,4 ; (Uncomment if OS_CRITICAL_METHOD is 1, see OS_CPU.H)
(0298) ADIW R30,5 ; Adjust Z to point to task return address
00C5 9635 ADIW R30,5
(0299) ST -Y,R31 ; Save SP
00C6 93FA ST R31,-Y
(0300) ST -Y,R30 ;
00C7 93EA ST R30,-Y
00C8 D545 RCALL 0x060E
(0301)
(0302) LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
(0303) LDS R31,_OSTCBCur+1 ;
(0304) ST Z+,R28 ; Save Y pointer
00C9 93C1 ST R28,Z+
(0305) ST Z+,R29 ;
00CA 93D1 ST R29,Z+
(0306)
(0307) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
00CB 910001FF LDS R16,_OSPrioHighRdy
(0308) STS _OSPrioCur,R16 ;
00CD 93000200 STS R16,_OSPrioCur
00CF D580 RCALL 0x0650
(0309)
(0310) LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
(0311) LDS R31,_OSTCBHighRdy+1 ;
(0312) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
00D0 93E001FD STS R30,_OSTCBCur
(0313) STS _OSTCBCur+1,R31 ;
00D2 93F001FE STS R31,_OSTCBCur+1
(0314)
(0315) LD R28,Z+ ; Restore Y pointer
00D4 91C1 LD R28,Z+
(0316) LD R29,Z+ ;
00D5 91D1 LD R29,Z+
00D6 9109 LD R16,Y+
00D7 BF0D OUT P3D,R16
00D8 9109 LD R16,Y+
00D9 BF0E OUT P3E,R16
00DA 9109 LD R16,Y+
00DB BF0F OUT P3F,R16
00DC 91F9 LD R31,Y+
00DD 91E9 LD R30,Y+
00DE 91B9 LD R27,Y+
00DF 91A9 LD R26,Y+
00E0 9199 LD R25,Y+
00E1 9189 LD R24,Y+
00E2 9179 LD R23,Y+
00E3 9169 LD R22,Y+
00E4 9159 LD R21,Y+
00E5 9149 LD R20,Y+
00E6 9139 LD R19,Y+
00E7 9129 LD R18,Y+
00E8 9119 LD R17,Y+
00E9 9109 LD R16,Y+
00EA 90F9 LD R15,Y+
00EB 90E9 LD R14,Y+
00EC 90D9 LD R13,Y+
00ED 90C9 LD R12,Y+
00EE 90B9 LD R11,Y+
00EF 90A9 LD R10,Y+
00F0 9099 LD R9,Y+
00F1 9089 LD R8,Y+
00F2 9079 LD R7,Y+
00F3 9069 LD R6,Y+
00F4 9059 LD R5,Y+
00F5 9049 LD R4,Y+
00F6 9039 LD R3,Y+
00F7 9029 LD R2,Y+
00F8 9019 LD R1,Y+
00F9 9009 LD R0,Y+
(0317)
(0318) POPSP ; Restore stack pointer
(0319) POPSREG ; Restore status register
(0320) POPRS ; Restore saved registers
(0321) ; SEI
(0322) RET
00FA 9508 RET
_main:
err --> R20
00FB 9727 SBIW R28,7
FILE: G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-sem\test1.c
(0001) //test1.c
(0002) #include "includes.h"
(0003)
(0004) void main(void)
(0005) {
(0006) INT8U err;
(0007) #if PROGRAM_START_FLASH_EN
(0008) ProgramStart();
00FC D383 RCALL _ProgramStart
(0009) #endif
(0010) OSInit();
00FD D04C RCALL _OSInit
(0011) //create task1
(0012) err=OSTaskCreate(&tcb_task1,task1,(void*)(int)1,
00FE 2422 CLR R2
00FF 822E STD R2,6+Y
0100 D554 RCALL 0x0655
0101 EE88 LDI R24,0xE8
0102 E091 LDI R25,1
0103 838A STD R24,2+Y
0104 839B STD R25,3+Y
0105 E081 LDI R24,1
0106 E090 LDI R25,0
0107 8388 STD R24,0+Y
0108 8399 STD R25,1+Y
0109 E12E LDI R18,0x1E
010A E030 LDI R19,0
010B EF05 LDI R16,0xF5
010C E011 LDI R17,1
010D D059 RCALL _OSTaskCreate
010E 2F40 MOV R20,R16
(0013) &stk_task1[OS_TASK_STACK_SIZE-1],
(0014) OS_TASK_STACK_SIZE,
(0015) 0);
(0016) #if OS_STRICT
(0017) if(OS_NO_ERR!=err)
010F 2300 TST R16
0110 F011 BEQ 0x0113
(0018) OSError(0);
0111 2700 CLR R16
0112 D37E RCALL _OSError
(0019) #endif
(0020) //create task2
(0021) err=OSTaskCreate(&tcb_task2,task2,(void*)(int)2,
0113 E081 LDI R24,1
0114 838E STD R24,6+Y
0115 D53F RCALL 0x0655
0116 E688 LDI R24,0x68
0117 E091 LDI R25,1
0118 838A STD R24,2+Y
0119 839B STD R25,3+Y
011A E082 LDI R24,2
011B E090 LDI R25,0
011C 8388 STD R24,0+Y
011D 8399 STD R25,1+Y
011E E12C LDI R18,0x1C
011F E030 LDI R19,0
0120 EE0F LDI R16,0xEF
0121 E011 LDI R17,1
0122 D044 RCALL _OSTaskCreate
0123 2F40 MOV R20,R16
(0022) &stk_task2[OS_TASK_STACK_SIZE-1],
(0023) OS_TASK_STACK_SIZE,
(0024) 1);
(0025) #if OS_STRICT
(0026) if(OS_NO_ERR!=err)
0124 2300 TST R16
0125 F011 BEQ 0x0128
(0027) OSError(0);
0126 2700 CLR R16
0127 D369 RCALL _OSError
(0028) #endif
(0029)
(0030) //create task3
(0031) err=OSTaskCreate(&tcb_task3,task3,(void*)(int)3,
0128 E082 LDI R24,2
0129 838E STD R24,6+Y
012A D52A RCALL 0x0655
012B EE88 LDI R24,0xE8
012C E090 LDI R25,0
012D 838A STD R24,2+Y
012E 839B STD R25,3+Y
012F E083 LDI R24,3
0130 E090 LDI R25,0
0131 8388 STD R24,0+Y
0132 8399 STD R25,1+Y
0133 E12A LDI R18,0x1A
0134 E030 LDI R19,0
0135 EE09 LDI R16,0xE9
0136 E011 LDI R17,1
0137 D02F RCALL _OSTaskCreate
0138 2F40 MOV R20,R16
(0032) &stk_task3[OS_TASK_STACK_SIZE-1],
(0033) OS_TASK_STACK_SIZE,
(0034) 2);
(0035) #if OS_STRICT
(0036) if(OS_NO_ERR!=err)
0139 2300 TST R16
013A F011 BEQ 0x013D
(0037) OSError(0);
013B 2700 CLR R16
013C D354 RCALL _OSError
(0038) #endif
(0039)
(0040) #if OS_SEM_EN
(0041) OSSemCreate(&uart_sem,1);
013D E021 LDI R18,1
013E E030 LDI R19,0
013F E600 LDI R16,0x60
0140 E010 LDI R17,0
0141 D232 RCALL _OSSemCreate
(0042) #if LCD_EN
(0043) lcd_init();
(0044) lcd_puts("hi,sem test!");
(0045) #if DEBUG_IN_AVR_STUDIO==0
(0046) Delay();
(0047) #endif
(0048) lcd_clear();
(0049) #endif//LCD_EN
(0050) #endif//OS_SEM_EN
(0051) //////////
(0052) TC2_Init();
0142 D308 RCALL _TC2_Init
(0053) SEI();
0143 9478 BSET 7
(0054) OSStart(); // start multitasking
0144 D0CA RCALL _OSStart
(0055)
(0056) #if OS_STRICT
(0057) OSError(0);
0145 2700 CLR R16
0146 D34A RCALL _OSError
(0058) #endif
(0059) while(1)
0147 CFFF RJMP 0x0147
(0060) ;
(0061) }
0148 9627 ADIW R28,7
0149 9508 RET
FILE: G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-sem\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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -