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 + -
显示快捷键?