📄 os-task-switch.lst
字号:
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 + -