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

📄 os-task-switch.lst

📁 ucos-ii-at90S-icc-avr
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0295 2700      CLR	R16
    0296 DFEF      RCALL	_ProgramStart_Flash
(0051)   ProgramStart_Flash(0xff);
    0297 EF0F      LDI	R16,0xFF
    0298 DFED      RCALL	_ProgramStart_Flash
(0052)   ProgramStart_Flash(0);
    0299 2700      CLR	R16
    029A DFEB      RCALL	_ProgramStart_Flash
(0053)   ProgramStart_Flash(0xff);
    029B EF0F      LDI	R16,0xFF
    029C DFE9      RCALL	_ProgramStart_Flash
(0054)   ProgramStart_Flash(0);
    029D 2700      CLR	R16
    029E DFE7      RCALL	_ProgramStart_Flash
(0055)   ProgramStart_Flash(0xff);
    029F EF0F      LDI	R16,0xFF
(0056) }
    02A0 CFE5      RJMP	_ProgramStart_Flash
_OSError:
  i                    --> R20
  err                  --> R16
    02A1 D0B2      RCALL	push_gset1
(0057) 
(0058) #if OS_STRICT
(0059) void OSError(INT8U err)
(0060) {
(0061)   INT8U i=err;
    02A2 2F40      MOV	R20,R16
    02A3 C001      RJMP	0x02A5
(0062)   while(1)
(0063)     i=err;
    02A4 2F40      MOV	R20,R16
    02A5 CFFE      RJMP	0x02A4
(0064) }
    02A6 D0B0      RCALL	pop_gset1
    02A7 9508      RET
_task1:
  i                    --> R20
  pdata                --> R22
    02A8 D0C2      RCALL	push_gset2
    02A9 D165      RCALL	0x040F
(0065) #endif
(0066) 
(0067) void task1(void *pdata)
(0068) {
(0069)   INT8U i=0;
(0070)   DDRA=0xff;
    02AA BB8A      OUT	P1A,R24
    02AB C005      RJMP	0x02B1
(0071)   while(1)
(0072)   {
(0073) //     SEI();
(0074)      i++;
    02AC 9543      INC	R20
(0075) 	 PORTA=i;
    02AD BB4B      OUT	P1B,R20
(0076) 	 //task_Delay();
(0077) 	 OSTimeDly(3);
    02AE E003      LDI	R16,3
    02AF E010      LDI	R17,0
    02B0 DEFC      RCALL	_OSTimeDly
    02B1 CFFA      RJMP	0x02AC
(0078)   }
(0079) }
    02B2 D0C1      RCALL	pop_gset2
    02B3 9508      RET
_task2:
  i                    --> R20
  pdata                --> R22
    02B4 D0B6      RCALL	push_gset2
    02B5 D159      RCALL	0x040F
(0080) 
(0081) void task2(void *pdata)
(0082) {
(0083)   unsigned char i=0;
(0084)   DDRC=0xff;
    02B6 BB84      OUT	P14,R24
    02B7 C005      RJMP	0x02BD
(0085)   while(1)
(0086)   {
(0087) //     SEI();
(0088)      i++;
    02B8 9543      INC	R20
(0089)      PORTC=i;
    02B9 BB45      OUT	P15,R20
(0090) 	// task_Delay();
(0091) 	 OSTimeDly(3);
    02BA E003      LDI	R16,3
    02BB E010      LDI	R17,0
    02BC DEF0      RCALL	_OSTimeDly
    02BD CFFA      RJMP	0x02B8
(0092)   }
(0093) }
    02BE D0B5      RCALL	pop_gset2
    02BF 9508      RET
(0094) 
(0095) void task3(void *pdata)
(0096) {
_task3:
  pdata                --> R16
    02C0 C001      RJMP	0x02C2
(0097)   while(1)
(0098)   {
(0099)      SEI();
    02C1 9478      BSET	7
    02C2 CFFE      RJMP	0x02C1
(0100)     asm("nop");
(0101)   }
(0102) }
    02C3 9508      RET
_OSTaskStkInit:
  stks                 --> R10
  tmp                  --> R22
  stk                  --> R20
  stk_size             --> Y+10
  ptos                 --> Y+8
  pdata                --> R12
  task                 --> R22
    02C4 D0AC      RCALL	push_gset4
    02C5 2EC2      MOV	R12,R18
    02C6 2ED3      MOV	R13,R19
    02C7 2F60      MOV	R22,R16
    02C8 2F71      MOV	R23,R17
FILE: G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-switch\os_cpu_c.c
(0001) #include "includes.h"
(0002) 
(0003) /*
(0004) ********************************************************************************
(0005) *                     INITIALIZE A TASK'S STACK
(0006) *
(0007) * Description:
(0008) *	This function is called by either OSTaskCreate() or OSTaskCreateExt() to
(0009) *	initialize the stack frame of the task being created. This function is
(0010) *	highly processor specific.
(0011) *
(0012) * Arguments:
(0013) *	task - 	is a pointer to the task code
(0014) *
(0015) *	pdata -	is a pointer to a user supplied data area that will be passed to the
(0016) *			 task when the task first executes.
(0017) *
(0018) *	ptos - 	is a pointer to the top of stack. It is assumed that 'ptos' points to
(0019) *			the highest valid address on the stack.
(0020) *
(0021) *	opt - 	specifies options that can be used to alter the behavior of 
(0022) 			OSTaskStkInit(). (see uCOS_II.H for OS_TASK_OPT_???).
(0023) *
(0024) * Returns:
(0025) *	Always returns the location of the new top-of-stack' once the processor 
(0026) *	registers have been placed on the stack in the proper order.
(0027) *
(0028) * Note(s):
(0029) *	Interrupts are enabled when your task starts executing. You can change this 
(0030) * 	by setting the SREG to 0x00 instead. In this case, interrupts would be 
(0031) *	disabled upon task startup. The application code would be responsible for 
(0032) *	enabling interrupts at the beginning of the task code. You will need to 
(0033) *	modify OSTaskIdle() and OSTaskStat() so that they enable interrupts. Failure
(0034) *	to do this will make your system crash! The AVR return stack is placed 64 
(0035) *	bytes above the start of the (512 byte) stack. This provides 32 levels of 
(0036) *	function call nesting which should be more than enough for most applications
(0037) *	(see the "read.me" file for more info).
(0038) *
(0039) ********************************************************************************
(0040) */
(0041) OS_STK *OSTaskStkInit (void (*task)(void *pd),
(0042) 						 void *pdata, OS_STK *ptos, INT16U stk_size){
(0043)     INT8U  *stk;
(0044)     INT8U  *stks;		// Temp. variable used for setting up AVR hardware stack
(0045)     INT16U tmp;
(0046) 
(0047) 
(0048)     stk     = (INT8U *)ptos;
    02C9 8548      LDD	R20,8+Y
    02CA 8559      LDD	R21,9+Y
(0049) 	// AVR return stack ("hardware stack")
(0050)     //from IAR C
(0051)     //stks    = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-64);/* AVR return stack ("hardware stack")          */
(0052)     //from ICC AVR C
(0053)     //stks    = (INT8U *)(ptos)-(OS_TASK_DEF_STK_SIZE-32);
(0054)     stks    = (INT8U *)(ptos)-(stk_size - OS_HARDWARE_STACK_SIZE);
    02CB 858A      LDD	R24,10+Y
    02CC 859B      LDD	R25,11+Y
    02CD 5480      SUBI	R24,0x40
    02CE 4090      SBCI	R25,0
    02CF 84A8      LDD	R10,8+Y
    02D0 84B9      LDD	R11,9+Y
    02D1 1AA8      SUB	R10,R24
    02D2 0AB9      SBC	R11,R25
(0055) #if OS_STRICT
(0056)     if((0==task)||(ptos==0)||((INT16U)ptos<stk_size)||(stk_size<OS_HARDWARE_STACK_SIZE+40))
    02D3 3060      CPI	R22,0
    02D4 0767      CPC	R22,R23
    02D5 F089      BEQ	0x02E7
    02D6 8428      LDD	R2,8+Y
    02D7 8439      LDD	R3,9+Y
    02D8 2022      TST	R2
    02D9 F411      BNE	0x02DC
    02DA 2033      TST	R3
    02DB F059      BEQ	0x02E7
    02DC 840A      LDD	R0,10+Y
    02DD 841B      LDD	R1,11+Y
    02DE 1420      CP	R2,R0
    02DF 0431      CPC	R3,R1
    02E0 F030      BCS	0x02E7
    02E1 858A      LDD	R24,10+Y
    02E2 859B      LDD	R25,11+Y
    02E3 3688      CPI	R24,0x68
    02E4 E0E0      LDI	R30,0
    02E5 079E      CPC	R25,R30
    02E6 F410      BCC	0x02E9
(0057) 	  OSError(0);
    02E7 2700      CLR	R16
    02E8 DFB8      RCALL	_OSError
(0058) #endif	
(0059) 	// the function address has an extra level of indirection. Fetch the
(0060)     // actual address.
(0061)     //    
(0062)     tmp = *(INT16U const *)task;
    02E9 2F06      MOV	R16,R22
    02EA 2F17      MOV	R17,R23
    02EB D08E      RCALL	lpm16
    02EC 2F60      MOV	R22,R16
    02ED 2F71      MOV	R23,R17
(0063)    
(0064) 	// 36 Bytes
(0065)     *stks-- = (INT8U)tmp;	//Put task start address on top of hardware stack
    02EE 2C2A      MOV	R2,R10
    02EF 2C3B      MOV	R3,R11
    02F0 2D82      MOV	R24,R2
    02F1 2D93      MOV	R25,R3
    02F2 9701      SBIW	R24,1
    02F3 2DE2      MOV	R30,R2
    02F4 2DF3      MOV	R31,R3
    02F5 8360      STD	R22,0+Z
(0066)     *stks-- = (INT8U)(tmp >> 8);
    02F6 2E28      MOV	R2,R24
    02F7 2E39      MOV	R3,R25
    02F8 9701      SBIW	R24,1
    02F9 2EA8      MOV	R10,R24
    02FA 2EB9      MOV	R11,R25
    02FB D0E0      RCALL	0x03DC
    02FC D093      RCALL	0x0390
(0067) 
(0068)     *stk-- = (INT8U)0x00;		// R0  = 0x00
    02FD 2444      CLR	R4
    02FE 2DE2      MOV	R30,R2
    02FF 2DF3      MOV	R31,R3
    0300 8240      STD	R4,0+Z
    0301 D08E      RCALL	0x0390
(0069)     *stk-- = (INT8U)0x01; 
    0302 E081      LDI	R24,1
    0303 D084      RCALL	<created procedures>
(0070)     *stk-- = (INT8U)0x02;
    0304 E082      LDI	R24,2
    0305 D082      RCALL	<created procedures>
(0071)     *stk-- = (INT8U)0x03;
    0306 E083      LDI	R24,3
    0307 D080      RCALL	<created procedures>
(0072)     *stk-- = (INT8U)0x04;
    0308 E084      LDI	R24,4
    0309 D07E      RCALL	<created procedures>
(0073)     *stk-- = (INT8U)0x05;
    030A E085      LDI	R24,5
    030B D07C      RCALL	<created procedures>
(0074)     *stk-- = (INT8U)0x06;
    030C E086      LDI	R24,6
    030D D07A      RCALL	<created procedures>
(0075)     *stk-- = (INT8U)0x07;
    030E E087      LDI	R24,7
    030F D078      RCALL	<created procedures>
(0076)     *stk-- = (INT8U)0x08;
    0310 E088      LDI	R24,0x8
    0311 D076      RCALL	<created procedures>
(0077)     *stk-- = (INT8U)0x09;
    0312 E089      LDI	R24,0x9
    0313 D074      RCALL	<created procedures>
(0078)     *stk-- = (INT8U)0x10;
    0314 E180      LDI	R24,0x10
    0315 D072      RCALL	<created procedures>
(0079)     *stk-- = (INT8U)0x11;
    0316 E181      LDI	R24,0x11
    0317 D070      RCALL	<created procedures>
(0080)     *stk-- = (INT8U)0x12;
    0318 E182      LDI	R24,0x12
    0319 D06E      RCALL	<created procedures>
(0081)     *stk-- = (INT8U)0x13;
    031A E183      LDI	R24,0x13
    031B D06C      RCALL	<created procedures>
(0082)     *stk-- = (INT8U)0x14;
    031C E184      LDI	R24,0x14
    031D D06A      RCALL	<created procedures>
(0083)     *stk-- = (INT8U)0x15;
    031E E185      LDI	R24,0x15
    031F 2DE2      MOV	R30,R2
    0320 2DF3      MOV	R31,R3
    0321 8380      STD	R24,0+Z
(0084)     tmp    = (INT16U)pdata;
    0322 2D6C      MOV	R22,R12
    0323 2D7D      MOV	R23,R13
    0324 D06B      RCALL	0x0390
(0085)     *stk-- = (INT8U)tmp;	//Simulate call to function with argument
    0325 2DE2      MOV	R30,R2
    0326 2DF3      MOV	R31,R3
    0327 8360      STD	R22,0+Z
    0328 D067      RCALL	0x0390
    0329 D0B2      RCALL	0x03DC
    032A D065      RCALL	0x0390
(0086)     *stk-- = (INT8U)(tmp >> 8);
(0087)     *stk-- = (INT8U)0x18;
    032B E188      LDI	R24,0x18
    032C D05B      RCALL	<created procedures>
(0088)     *stk-- = (INT8U)0x19;
    032D E189      LDI	R24,0x19
    032E D059      RCALL	<created procedures>
(0089)     *stk-- = (INT8U)0x20;
    032F E280      LDI	R24,0x20
    0330 D057      RCALL	<created procedures>
(0090)     *stk-- = (INT8U)0x21;
    0331 E281      LDI	R24,0x21
    0332 D055      RCALL	<created procedures>
(0091)     *stk-- = (INT8U)0x22;
    0333 E282      LDI	R24,0x22
    0334 D053      RCALL	<created procedures>
(0092)     *stk-- = (INT8U)0x23;
    0335 E283      LDI	R24,0x23
    0336 D051      RCALL	<created procedures>
(0093)     *stk-- = (INT8U)0x24;
    0337 E284      LDI	R24,0x24
    0338 D04F      RCALL	<created procedures>
(0094)     *stk-- = (INT8U)0x25;
    0339 E285      LDI	R24,0x25
    033A D04D      RCALL	<created procedures>
(0095)     *stk-- = (INT8U)0x26;
    033B E286      LDI	R24,0x26
    033C D04B      RCALL	<created procedures>
(0096)     *stk-- = (INT8U)0x27;
    033D E287      LDI	R24,0x27
    033E D049      RCALL	<created procedures>
(0097) 	// the heap pointer Y=R29:R28 will not be stored
(0098)     *stk-- = (INT8U)0x30;
    033F E380      LDI	R24,0x30
    0340 D047      RCALL	<created procedures>
(0099)     *stk-- = (INT8U)0x31;
    0341 E381      LDI	R24,0x31
    0342 D045      RCALL	<created procedures>
(0100)     *stk-- = (INT8U)0x3B;
    0343 E38B      LDI	R24,0x3B
    0344 D043      RCALL	<created procedures>
(0101)     *stk-- = (INT8U)0x80;	//SREG = Interrupts enabled
    0345 E880      LDI	R24,0x80
    0346 2DE2      MOV	R30,R2
    0347 2DF3      MOV	R31,R3
    0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -