📄 main.lss
字号:
8d0: 81 60 ori r24, 0x01 ; 1
8d2: 89 bf out 0x39, r24 ; 57
TCNT0=39;//5ms
8d4: 87 e2 ldi r24, 0x27 ; 39
8d6: 82 bf out 0x32, r24 ; 50
8d8: 08 95 ret
000008da <OSTaskCreate>:
void OSTaskCreate(void (*Task)(void),unsigned char *Stack,unsigned char TaskID)
{
8da: db 01 movw r26, r22
unsigned char i;
*Stack--=(unsigned int)Task; //将任务的地址低位压入堆栈,
8dc: 8c 93 st X, r24
*Stack--=(unsigned int)Task>>8; //将任务的地址高位压入堆栈
8de: 89 2f mov r24, r25
8e0: 99 27 eor r25, r25
8e2: 8e 93 st -X, r24
*Stack--=0x00; //R1 __zero_reg__
8e4: 1e 92 st -X, r1
*Stack--=0x00; //R0 __tmp_reg__
8e6: 1e 92 st -X, r1
*Stack--=0x80; //psw
8e8: 80 e8 ldi r24, 0x80 ; 128
8ea: 8e 93 st -X, r24
8ec: 11 97 sbiw r26, 0x01 ; 1
8ee: 8d e1 ldi r24, 0x1D ; 29
//SREG 在任务中,开启全局中断
for(i=0;i<30;i++) //在 avr-libc 中的 FAQ中的 What registers are used by the C compiler?
*Stack--=0; //描述了寄存器的作用
8f0: 1c 92 st X, r1
8f2: 11 97 sbiw r26, 0x01 ; 1
8f4: 81 50 subi r24, 0x01 ; 1
8f6: 87 ff sbrs r24, 7
8f8: fb cf rjmp .-10 ; 0x8f0
TCB[TaskID].OSTaskStackTop=(unsigned int)Stack; //将人工堆栈的栈顶,保存到堆栈的数组中 但是这并不是的栈顶
8fa: 24 2f mov r18, r20
8fc: 33 27 eor r19, r19
8fe: f9 01 movw r30, r18
900: ee 0f add r30, r30
902: ff 1f adc r31, r31
904: ee 0f add r30, r30
906: ff 1f adc r31, r31
908: e9 51 subi r30, 0x19 ; 25
90a: fa 4f sbci r31, 0xFA ; 250
90c: a0 83 st Z, r26
90e: b1 83 std Z+1, r27 ; 0x01
OSRdyTbl|=1<<TaskID; //任务就绪表已经准备好
910: 81 e0 ldi r24, 0x01 ; 1
912: 90 e0 ldi r25, 0x00 ; 0
914: 02 c0 rjmp .+4 ; 0x91a
916: 88 0f add r24, r24
918: 99 1f adc r25, r25
91a: 2a 95 dec r18
91c: e2 f7 brpl .-8 ; 0x916
91e: 20 91 a1 07 lds r18, 0x07A1
922: 28 2b or r18, r24
924: 20 93 a1 07 sts 0x07A1, r18
928: 08 95 ret
0000092a <OSSched>:
{
// 根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况
// __asm__ __volatile__("fisrt_last_OSSched: \n\t");
__asm__ __volatile__("PUSH __zero_reg__ \n\t"); //R1
92a: 1f 92 push r1
__asm__ __volatile__("PUSH __tmp_reg__ \n\t"); //R0
92c: 0f 92 push r0
__asm__ __volatile__("IN __tmp_reg__,__SREG__ \n\t"); //保存状态寄存器SREG
92e: 0f b6 in r0, 0x3f ; 63
__asm__ __volatile__("PUSH __tmp_reg__ \n\t"); //保存状态寄存器SREG
930: 0f 92 push r0
__asm__ __volatile__("CLR __zero_reg__ \n\t"); //R1重新清零
932: 11 24 eor r1, r1
__asm__ __volatile__("PUSH R2 \n\t");
934: 2f 92 push r2
__asm__ __volatile__("PUSH R3 \n\t");
936: 3f 92 push r3
__asm__ __volatile__("PUSH R4 \n\t");
938: 4f 92 push r4
__asm__ __volatile__("PUSH R5 \n\t");
93a: 5f 92 push r5
__asm__ __volatile__("PUSH R6 \n\t");
93c: 6f 92 push r6
__asm__ __volatile__("PUSH R7 \n\t");
93e: 7f 92 push r7
__asm__ __volatile__("PUSH R8 \n\t");
940: 8f 92 push r8
__asm__ __volatile__("PUSH R9 \n\t");
942: 9f 92 push r9
__asm__ __volatile__("PUSH R10 \n\t");
944: af 92 push r10
__asm__ __volatile__("PUSH R11 \n\t");
946: bf 92 push r11
__asm__ __volatile__("PUSH R12 \n\t");
948: cf 92 push r12
__asm__ __volatile__("PUSH R13 \n\t");
94a: df 92 push r13
__asm__ __volatile__("PUSH R14 \n\t");
94c: ef 92 push r14
__asm__ __volatile__("PUSH R15 \n\t");
94e: ff 92 push r15
__asm__ __volatile__("PUSH R16 \n\t");
950: 0f 93 push r16
__asm__ __volatile__("PUSH R17 \n\t");
952: 1f 93 push r17
__asm__ __volatile__("PUSH R18 \n\t");
954: 2f 93 push r18
__asm__ __volatile__("PUSH R19 \n\t");
956: 3f 93 push r19
__asm__ __volatile__("PUSH R20 \n\t");
958: 4f 93 push r20
__asm__ __volatile__("PUSH R21 \n\t");
95a: 5f 93 push r21
__asm__ __volatile__("PUSH R22 \n\t");
95c: 6f 93 push r22
__asm__ __volatile__("PUSH R23 \n\t");
95e: 7f 93 push r23
__asm__ __volatile__("PUSH R24 \n\t");
960: 8f 93 push r24
__asm__ __volatile__("PUSH R25 \n\t");
962: 9f 93 push r25
__asm__ __volatile__("PUSH R26 \n\t");
964: af 93 push r26
__asm__ __volatile__("PUSH R27 \n\t");
966: bf 93 push r27
//__asm__ __volatile__("PUSH R28 \n\t");
//__asm__ __volatile__("PUSH R29 \n\t");
__asm__ __volatile__("PUSH R30 \n\t");
968: ef 93 push r30
__asm__ __volatile__("PUSH R31 \n\t");
96a: ff 93 push r31
__asm__ __volatile__("PUSH R28 \n\t"); //R28与R29用于建立在堆栈上的指针
96c: cf 93 push r28
__asm__ __volatile__("PUSH R29 \n\t"); //入栈完成
96e: df 93 push r29
00000970 <Interrupt_OSSched>:
//===========================================
__asm__ __volatile__("Interrupt_OSSched: \n\t");
TCB[OSTaskRunningPrio].OSTaskStackTop=SP; //将正在运行的任务的堆栈底保存
970: 20 91 ab 07 lds r18, 0x07AB
974: e2 2f mov r30, r18
976: ff 27 eor r31, r31
978: ee 0f add r30, r30
97a: ff 1f adc r31, r31
97c: ee 0f add r30, r30
97e: ff 1f adc r31, r31
980: e9 51 subi r30, 0x19 ; 25
982: fa 4f sbci r31, 0xFA ; 250
984: 8d b7 in r24, 0x3d ; 61
986: 9e b7 in r25, 0x3e ; 62
988: 80 83 st Z, r24
98a: 91 83 std Z+1, r25 ; 0x01
//=============================================
unsigned char OSNextTaskPrio,j=0;
98c: 30 e0 ldi r19, 0x00 ; 0
OSNextTaskPrio=OSTaskRunningPrio;
OSRdyTbl &= ~(0x01<<idle_id);//挂起os_idle task
98e: 80 91 a1 07 lds r24, 0x07A1
992: 8e 7f andi r24, 0xFE ; 254
994: 80 93 a1 07 sts 0x07A1, r24
//******
next_task_id: if(++OSNextTaskPrio>=OS_TASKS) //轮流运行各个任务,没有优先级
998: 2f 5f subi r18, 0xFF ; 255
99a: 22 30 cpi r18, 0x02 ; 2
99c: 08 f0 brcs .+2 ; 0x9a0
OSNextTaskPrio=0;
99e: 20 e0 ldi r18, 0x00 ; 0
if(++j>OS_TASKS) OSRdyTbl |= (0x01<<idle_id); //如果所有的任务都是挂起的,那么就进入idle
9a0: 3f 5f subi r19, 0xFF ; 255
9a2: 33 30 cpi r19, 0x03 ; 3
9a4: 28 f0 brcs .+10 ; 0x9b0
9a6: 80 91 a1 07 lds r24, 0x07A1
9aa: 81 60 ori r24, 0x01 ; 1
9ac: 80 93 a1 07 sts 0x07A1, r24
if(! (OSRdyTbl & (0x01<<OSNextTaskPrio))) goto next_task_id;
9b0: 80 91 a1 07 lds r24, 0x07A1
9b4: 99 27 eor r25, r25
9b6: 02 2e mov r0, r18
9b8: 02 c0 rjmp .+4 ; 0x9be
9ba: 95 95 asr r25
9bc: 87 95 ror r24
9be: 0a 94 dec r0
9c0: e2 f7 brpl .-8 ; 0x9ba
9c2: 80 ff sbrs r24, 0
9c4: e9 cf rjmp .-46 ; 0x998
//*****
OSTaskRunningPrio=OSNextTaskPrio;
9c6: 20 93 ab 07 sts 0x07AB, r18
//***********************
cli(); //保护堆栈转换
9ca: f8 94 cli
SP=TCB[OSTaskRunningPrio].OSTaskStackTop;
9cc: 80 91 ab 07 lds r24, 0x07AB
9d0: e8 2f mov r30, r24
9d2: ff 27 eor r31, r31
9d4: ee 0f add r30, r30
9d6: ff 1f adc r31, r31
9d8: ee 0f add r30, r30
9da: ff 1f adc r31, r31
9dc: e9 51 subi r30, 0x19 ; 25
9de: fa 4f sbci r31, 0xFA ; 250
9e0: 80 81 ld r24, Z
9e2: 91 81 ldd r25, Z+1 ; 0x01
9e4: 9e bf out 0x3e, r25 ; 62
9e6: 8d bf out 0x3d, r24 ; 61
sei();
9e8: 78 94 sei
//===========================================
//根据中断时的出栈次序
__asm__ __volatile__("POP R29 \n\t");
9ea: df 91 pop r29
__asm__ __volatile__("POP R28 \n\t");
9ec: cf 91 pop r28
//===============================
__asm__ __volatile__("POP R31 \n\t");
9ee: ff 91 pop r31
__asm__ __volatile__("POP R30 \n\t");
9f0: ef 91 pop r30
__asm__ __volatile__("POP R27 \n\t");
9f2: bf 91 pop r27
__asm__ __volatile__("POP R26 \n\t");
9f4: af 91 pop r26
__asm__ __volatile__("POP R25 \n\t");
9f6: 9f 91 pop r25
__asm__ __volatile__("POP R24 \n\t");
9f8: 8f 91 pop r24
__asm__ __volatile__("POP R23 \n\t");
9fa: 7f 91 pop r23
__asm__ __volatile__("POP R22 \n\t");
9fc: 6f 91 pop r22
__asm__ __volatile__("POP R21 \n\t");
9fe: 5f 91 pop r21
__asm__ __volatile__("POP R20 \n\t");
a00: 4f 91 pop r20
__asm__ __volatile__("POP R19 \n\t");
a02: 3f 91 pop r19
__asm__ __volatile__("POP R18 \n\t");
a04: 2f 91 pop r18
__asm__ __volatile__("POP R17 \n\t");
a06: 1f 91 pop r17
__asm__ __volatile__("POP R16 \n\t");
a08: 0f 91 pop r16
__asm__ __volatile__("POP R15 \n\t");
a0a: ff 90 pop r15
__asm__ __volatile__("POP R14 \n\t");
a0c: ef 90 pop r14
__asm__ __volatile__("POP R13 \n\t");
a0e: df 90 pop r13
__asm__ __volatile__("POP R12 \n\t");
a10: cf 90 pop r12
__asm__ __volatile__("POP R11 \n\t");
a12: bf 90 pop r11
__asm__ __volatile__("POP R10 \n\t");
a14: af 90 pop r10
__asm__ __volatile__("POP R9 \n\t");
a16: 9f 90 pop r9
__asm__ __volatile__("POP R8 \n\t");
a18: 8f 90 pop r8
__asm__ __volatile__("POP R7 \n\t");
a1a: 7f 90 pop r7
__asm__ __volatile__("POP R6 \n\t");
a1c: 6f 90 pop r6
__asm__ __volatile__("POP R5 \n\t");
a1e: 5f 90 pop r5
__asm__ __volatile__("POP R4 \n\t");
a20: 4f 90 pop r4
__asm__ __volatile__("POP R3 \n\t");
a22: 3f 90 pop r3
__asm__ __volatile__("POP R2 \n\t");
a24: 2f 90 pop r2
__asm__ __volatile__("POP __tmp_reg__ \n\t"); //SERG 出栈并恢复
a26: 0f 90 pop r0
__asm__ __volatile__("OUT __SREG__,__tmp_reg__ \n\t"); //
a28: 0f be out 0x3f, r0 ; 63
__asm__ __volatile__("POP __tmp_reg__ \n\t"); //R0 出栈
a2a: 0f 90 pop r0
__asm__ __volatile__("POP __zero_reg__ \n\t"); //R1 出栈
a2c: 1f 90 pop r1
__asm__ __volatile__("RETI \n\t"); //返回并开中断
a2e: 18 95 reti
a30: 08 95 ret
00000a32 <OSStartTask>:
//中断时出栈完成
}
//开始任务调度
void OSStartTask(uint8 id)
{
OSTaskRunningPrio=id;
a32: 80 93 ab 07 sts 0x07AB, r24
SP=TCB[id].OSTaskStackTop;
a36: e8 2f mov r30, r24
a38: ff 27 eor r31, r31
a3a: ee 0f add r30, r30
a3c: ff 1f adc r31, r31
a3e: ee 0f add r30, r30
a40: ff 1f adc r31, r31
a42: e9 51 subi r30, 0x19 ; 25
a44: fa 4f sbci r31, 0xFA ; 250
a46: 80 81 ld r24, Z
a48: 91 81 ldd r25, Z+1 ; 0x01
a4a: 9e bf out 0x3e, r25 ; 62
a4c: 8d bf out 0x3d, r24 ; 61
__asm__ __volatile__("RJMP Interrupt_OSSched \n\t"); //重新调度
a4e: 90 cf rjmp .-224 ; 0x970
a50: 08 95 ret
00000a52 <IntSwitch>:
//调用子函数时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -