📄 project.lst
字号:
(0099) *
(0100) * Description : This is an example of a startup task. As mentioned in the book's text, you MUST
(0101) * initialize the ticker only once multitasking has started.
(0102) *
(0103) * Arguments : p_arg is the argument passed to 'AppStartTask()' by 'OSTaskCreate()'.
(0104) *
(0105) * Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
(0106) * used. The compiler should not generate any code for this statement.
(0107) *********************************************************************************************************
(0108) */
(0109)
(0110) static void AppTaskStart (void *p_arg)
(0111) {
(0112) p_arg = p_arg; /* Prevent compiler warnings */
(0113)
(0114) OSTickISR_Init(); /* Initialize the ticker */
02A8 D06E RCALL _OSTickISR_Init
(0115)
(0116) AppIOInit(); /* Initialize the I/Os */
02A9 D069 RCALL _AppIOInit
(0117)
(0118) AppTaskCreate();
02AA D00B RCALL _AppTaskCreate
02AB C006 RJMP 0x02B2
(0119)
(0120) while (TRUE) { /* Task body, always written as an infinite loop. */
(0121) LED_Toggle(1);
02AC E001 LDI R16,1
02AD D072 RCALL _LED_Toggle
(0122) OSTimeDly(OS_TICKS_PER_SEC / 10);
02AE E005 LDI R16,5
02AF E010 LDI R17,0
02B0 940E0351 CALL _OSTimeDly
02B2 CFF9 RJMP 0x02AC
(0123) }
(0124) }
02B3 940E0E61 CALL pop_gset1
02B5 9508 RET
_AppTaskCreate:
02B6 9723 SBIW R28,3
(0125)
(0126)
(0127) /*
(0128) *********************************************************************************************************
(0129) * CREATE APPLICATION TASKS
(0130) *
(0131) * Description : This function creates the application tasks.
(0132) *
(0133) * Arguments : p_arg is the argument passed to 'AppStartTask()' by 'OSTaskCreate()'.
(0134) *
(0135) * Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
(0136) * used. The compiler should not generate any code for this statement.
(0137) *********************************************************************************************************
(0138) */
(0139)
(0140) static void AppTaskCreate (void)
(0141) {
(0142) /*---- Task initialization code goes HERE! --------------------------------------------------------*/
(0143) OSTaskStkSize = OS_TASK_1_STK_SIZE; /* Setup the default stack size */
02B7 E080 LDI R24,0
02B8 E091 LDI R25,1
02B9 93900103 STS _OSTaskStkSize+1,R25
02BB 93800102 STS _OSTaskStkSize,R24
(0144) OSTaskHardStkSize = OS_TASK_1_HARD_STK_SIZE; /* Setup the default hardware stack size */
02BD E480 LDI R24,0x40
02BE E090 LDI R25,0
02BF 93900101 STS _OSTaskHardStkSize+1,R25
02C1 93800100 STS _OSTaskHardStkSize,R24
(0145) OSTaskCreate(AppTask1, (void *)0, (OS_STK *)&AppTask1Stk[OSTaskStkSize - 1], 1);
02C3 E081 LDI R24,1
02C4 838A STD Y+2,R24
02C5 E084 LDI R24,4
02C6 E092 LDI R25,2
02C7 91E00102 LDS R30,_OSTaskStkSize
02C9 91F00103 LDS R31,_OSTaskStkSize+1
02CB 9731 SBIW R30,1
02CC 0FE8 ADD R30,R24
02CD 1FF9 ADC R31,R25
02CE 83F9 STD Y+1,R31
02CF 83E8 STD Y+0,R30
02D0 2722 CLR R18
02D1 2733 CLR R19
02D2 E80E LDI R16,0x8E
02D3 E010 LDI R17,0
02D4 940E0C05 CALL _OSTaskCreate
(0146)
(0147) OSTaskStkSize = OS_TASK_2_STK_SIZE; /* Setup the default stack size */
02D6 E080 LDI R24,0
02D7 E091 LDI R25,1
02D8 93900103 STS _OSTaskStkSize+1,R25
02DA 93800102 STS _OSTaskStkSize,R24
(0148) OSTaskHardStkSize = OS_TASK_2_HARD_STK_SIZE; /* Setup the default hardware stack size */
02DC E480 LDI R24,0x40
02DD E090 LDI R25,0
02DE 93900101 STS _OSTaskHardStkSize+1,R25
02E0 93800100 STS _OSTaskHardStkSize,R24
(0149) OSTaskCreate(AppTask2, (void *)0, (OS_STK *)&AppTask2Stk[OSTaskStkSize - 1], 2);
02E2 E082 LDI R24,2
02E3 838A STD Y+2,R24
02E4 E084 LDI R24,4
02E5 E091 LDI R25,1
02E6 91E00102 LDS R30,_OSTaskStkSize
02E8 91F00103 LDS R31,_OSTaskStkSize+1
02EA 9731 SBIW R30,1
02EB 0FE8 ADD R30,R24
02EC 1FF9 ADC R31,R25
02ED 83F9 STD Y+1,R31
02EE 83E8 STD Y+0,R30
02EF 2722 CLR R18
02F0 2733 CLR R19
02F1 E80C LDI R16,0x8C
02F2 E010 LDI R17,0
02F3 940E0C05 CALL _OSTaskCreate
(0150) }
02F5 9623 ADIW R28,3
02F6 9508 RET
_AppTask1:
p_arg --> R20
02F7 940E0E5E CALL push_gset1
02F9 01A8 MOVW R20,R16
(0151)
(0152) /*
(0153) *********************************************************************************************************
(0154) * TASK #1
(0155) *********************************************************************************************************
(0156) */
(0157)
(0158) static void AppTask1(void *p_arg)
(0159) {
(0160) p_arg = p_arg;
02FA C006 RJMP 0x0301
(0161) while (TRUE) {
(0162) LED_Toggle(2);
02FB E002 LDI R16,2
02FC D023 RCALL _LED_Toggle
(0163) OSTimeDly(OS_TICKS_PER_SEC / 5);
02FD E00A LDI R16,0xA
02FE E010 LDI R17,0
02FF 940E0351 CALL _OSTimeDly
0301 CFF9 RJMP 0x02FB
(0164) }
(0165) }
0302 940E0E61 CALL pop_gset1
0304 9508 RET
_AppTask2:
p_arg --> R20
0305 940E0E5E CALL push_gset1
0307 01A8 MOVW R20,R16
(0166)
(0167) /*
(0168) *********************************************************************************************************
(0169) * TASK #2
(0170) *********************************************************************************************************
(0171) */
(0172)
(0173) static void AppTask2(void *p_arg)
(0174) {
(0175) p_arg = p_arg;
0308 C006 RJMP 0x030F
(0176) while (TRUE) {
(0177) LED_Toggle(3);
0309 E003 LDI R16,3
030A D015 RCALL _LED_Toggle
(0178) OSTimeDly(OS_TICKS_PER_SEC / 2);
030B E109 LDI R16,0x19
030C E010 LDI R17,0
030D 940E0351 CALL _OSTimeDly
030F CFF9 RJMP 0x0309
(0179) }
(0180) }
0310 940E0E61 CALL pop_gset1
0312 9508 RET
(0181)
(0182) /*
(0183) *********************************************************************************************************
(0184) * SETUP THE I/Os
(0185) *********************************************************************************************************
(0186) */
(0187)
(0188) static void AppIOInit (void)
(0189) {
(0190) DDRD = 0xFF; /* All PORTD pins are outputs */
_AppIOInit:
0313 EF8F LDI R24,0xFF
0314 BB81 OUT 0x11,R24
(0191) PORTD = 0xFF;
0315 BB82 OUT 0x12,R24
(0192) }
0316 9508 RET
(0193)
(0194) /*
(0195) *********************************************************************************************************
(0196) * SETUP THE TICK RATE
(0197) *********************************************************************************************************
(0198) */
(0199)
(0200) void OSTickISR_Init (void)
(0201) {
(0202) TCCR0 = 0x07; /* Set TIMER0 prescaler to CLK/1024 */
_OSTickISR_Init:
0317 E087 LDI R24,7
0318 BF83 OUT 0x33,R24
(0203) TIMSK = 0x01; /* Enable TIMER0 overflow interrupt */
0319 E081 LDI R24,1
031A BF87 OUT 0x37,R24
(0204) }
031B 9508 RET
(0205)
(0206)
(0207) /*
(0208) *********************************************************************************************************
(0209) * SETUP THE TICK RATE
(0210) *********************************************************************************************************
(0211) */
(0212)
(0213) void OSTickISR_Handler (void)
(0214) {
(0215) TCNT0 = 256 - (CPU_CLK_FREQ / OS_TICKS_PER_SEC / 1024);
_OSTickISR_Handler:
031C EB89 LDI R24,0xB9
031D BF82 OUT 0x32,R24
(0216) OSTimeTick();
(0217) }
031E 940C0550 JMP _OSTimeTick
_LED_Toggle:
cpu_sr --> R20
led --> R22
0320 940E0E75 CALL push_gset2
0322 2F60 MOV R22,R16
(0218)
(0219) /*
(0220) *********************************************************************************************************
(0221) * TOGGLE LED
(0222) *********************************************************************************************************
(0223) */
(0224)
(0225) static void LED_Toggle (INT8U led)
(0226) {
(0227) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0228) OS_CPU_SR cpu_sr;
(0229) #endif
(0230)
(0231)
(0232) OS_ENTER_CRITICAL();
0323 940E0C7F CALL _OS_CPU_SR_Save
0325 2F40 MOV R20,R16
(0233) switch (led) {
0326 2777 CLR R23
0327 3061 CPI R22,1
0328 E0E0 LDI R30,0
0329 077E CPC R23,R30
032A F069 BEQ 0x0338
032B 3062 CPI R22,2
032C E0E0 LDI R30,0
032D 077E CPC R23,R30
032E F071 BEQ 0x033D
032F 3063 CPI R22,3
0330 E0E0 LDI R30,0
0331 077E CPC R23,R30
0332 F079 BEQ 0x0342
0333 3064 CPI R22,4
0334 E0E0 LDI R30,0
0335 077E CPC R23,R30
0336 F081 BEQ 0x0347
0337 C013 RJMP 0x034B
(0234) case 1:
(0235) PORTD ^= 0x01;
0338 E081 LDI R24,1
0339 B222 IN R2,0x12
033A 2628 EOR R2,R24
033B BA22 OUT 0x12,R2
(0236) break;
033C C00E RJMP 0x034B
(0237)
(0238) case 2:
(0239) PORTD ^= 0x02;
033D E082 LDI R24,2
033E B222 IN R2,0x12
033F 2628 EOR R2,R24
0340 BA22 OUT 0x12,R2
(0240) break;
0341 C009 RJMP 0x034B
(0241)
(0242) case 3:
(0243) PORTD ^= 0x04;
0342 E084 LDI R24,4
0343 B222 IN R2,0x12
0344 2628 EOR R2,R24
0345 BA22 OUT 0x12,R2
(0244) break;
0346 C004 RJMP 0x034B
(0245)
(0246) case 4:
(0247) PORTD ^= 0x08;
0347 E088 LDI R24,0x8
0348 B222 IN R2,0x12
0349 2628 EOR R2,R24
034A BA22 OUT 0x12,R2
(0248) break;
(0249) }
(0250) OS_EXIT_CRITICAL();
034B 2F04 MOV R16,R20
034C 940E0C82 CALL _OS_CPU_SR_Restore
(0251) }
034E 940E0E52 CALL pop_gset2
0350 9508 RET
_OSTimeDly:
y --> R10
cpu_sr --> R20
ticks --> R22
0351 940E0E79 CALL push_gset3
0353 01B8 MOVW R22,R16
FILE: C:\MICRIUM\Software\uCOS-II\Source\os_time.c
(0001) /*
(0002) *********************************************************************************************************
(0003) * uC/OS-II
(0004) * The Real-Time Kernel
(0005) * TIME MANAGEMENT
(0006) *
(0007) *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -