⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os-task-switch.lst

📁 ucos-ii-at90S-icc-avr
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -