📄 test.lss
字号:
5a0: 00 92 5f 00 sts 0x005F, r0
5a4: 60 92 5d 00 sts 0x005D, r6
000005a8 <OSCtxSw_11>:
5a8: 50 92 87 00 sts 0x0087, r5
5ac: 40 92 86 00 sts 0x0086, r4
5b0: 90 91 85 00 lds r25, 0x0085
5b4: 80 91 84 00 lds r24, 0x0084
5b8: 84 15 cp r24, r4
5ba: 95 05 cpc r25, r5
5bc: 08 f4 brcc .+2 ; 0x5c0 <OSCtxSw_11+0x18>
5be: 04 c0 rjmp .+8 ; 0x5c8 <OSCtxSw_11_1>
5c0: 50 92 85 00 sts 0x0085, r5
5c4: 40 92 84 00 sts 0x0084, r4
000005c8 <OSCtxSw_11_1>:
5c8: 0f 90 pop r0
5ca: 8f 91 pop r24
5cc: 80 93 a9 00 sts 0x00A9, r24
5d0: 88 23 and r24, r24
5d2: 19 f4 brne .+6 ; 0x5da <OSCtxSw_12>
5d4: 80 2d mov r24, r0
5d6: 80 68 ori r24, 0x80 ; 128
5d8: 08 2e mov r0, r24
000005da <OSCtxSw_12>:
5da: 0f be out 0x3f, r0 ; 63
5dc: df 91 pop r29
5de: cf 91 pop r28
5e0: 1f 91 pop r17
5e2: 0f 91 pop r16
5e4: ff 90 pop r15
5e6: ef 90 pop r14
5e8: df 90 pop r13
5ea: cf 90 pop r12
5ec: bf 90 pop r11
5ee: af 90 pop r10
5f0: 9f 90 pop r9
5f2: 8f 90 pop r8
5f4: 7f 90 pop r7
5f6: 6f 90 pop r6
5f8: 5f 90 pop r5
5fa: 4f 90 pop r4
5fc: 3f 90 pop r3
5fe: 2f 90 pop r2
600: 1f 90 pop r1
602: 0f 90 pop r0
604: 08 95 ret
00000606 <OSIdle>:
void OSIdle(void)
{
while(1)
{
MCUCR &= ~((1 << SM0) | (1 << SM1) | (1 << SM2));
606: 85 b7 in r24, 0x35 ; 53
608: 8f 74 andi r24, 0x4F ; 79
60a: 85 bf out 0x35, r24 ; 53
60c: fc cf rjmp .-8 ; 0x606 <OSIdle>
0000060e <OSStart>:
}
}
void OSStart(void)
{
60e: cf 93 push r28
610: df 93 push r29
uint8 *cp;
uint8 i,temp;
cp=STACK_START;
612: c4 e1 ldi r28, 0x14 ; 20
614: d3 e0 ldi r29, 0x03 ; 3
OSTaskStackBottom[0] = STACK_START;
616: d0 93 16 03 sts 0x0316, r29
61a: c0 93 15 03 sts 0x0315, r28
OSTaskStackBottom[OS_MAX_TASKS + 1] =STACK_END;
61e: 9e 01 movw r18, r28
620: 27 55 subi r18, 0x57 ; 87
622: 32 40 sbci r19, 0x02 ; 2
624: 30 93 38 03 sts 0x0338, r19
628: 20 93 37 03 sts 0x0337, r18
/* 初始化优先级最高的任务堆栈,使返回地址为任务开始地址 */
*cp-- = (uint8)((uint16)TaskFuction[0]); //返回地址低8位
62c: 82 ea ldi r24, 0xA2 ; 162
62e: 94 e0 ldi r25, 0x04 ; 4
630: 80 93 14 03 sts 0x0314, r24
*cp-- = (uint8)((uint16)TaskFuction[0]>>8); //返回地址高8位
634: 89 2f mov r24, r25
636: 99 27 eor r25, r25
638: 80 93 13 03 sts 0x0313, r24
63c: e9 01 movw r28, r18
63e: cb 5a subi r28, 0xAB ; 171
640: dd 4f sbci r29, 0xFD ; 253
SP = (uint16) cp;
642: de bf out 0x3e, r29 ; 62
644: cd bf out 0x3d, r28 ; 61
/* 初始化优先级最低的任务堆栈 */
cp = STACK_END;
646: e9 01 movw r28, r18
648: 85 e1 ldi r24, 0x15 ; 21
for(temp=0;temp<OS_TASK_STACK_INIT_SIZE-2;temp++)
{
*(++cp) = 0;
64a: 21 96 adiw r28, 0x01 ; 1
64c: 18 82 st Y, r1
64e: 81 50 subi r24, 0x01 ; 1
650: 87 ff sbrs r24, 7
652: fb cf rjmp .-10 ; 0x64a <OSStart+0x3c>
}
*(++cp) = (uint8)((uint16)OSIdle>>8); // 返回地址高8位
654: 23 e0 ldi r18, 0x03 ; 3
656: 33 e0 ldi r19, 0x03 ; 3
658: 83 2f mov r24, r19
65a: 99 27 eor r25, r25
65c: 80 93 d4 00 sts 0x00D4, r24
*(++cp) = (uint8)((uint16)OSIdle); //返回地址低8位
660: c5 ed ldi r28, 0xD5 ; 213
662: d0 e0 ldi r29, 0x00 ; 0
664: 20 93 d5 00 sts 0x00D5, r18
OSTaskStackBottom[OS_MAX_TASKS] =(uint8 *)cp;
668: d0 93 36 03 sts 0x0336, r29
66c: c0 93 35 03 sts 0x0335, r28
/* 初始化其它优先级的任务堆栈 */
for(i = OS_MAX_TASKS-1; i > 0; i--)
670: 2f e0 ldi r18, 0x0F ; 15
672: 85 e1 ldi r24, 0x15 ; 21
{
for(temp=0;temp<OS_TASK_STACK_INIT_SIZE-2;temp++)
{
*(++cp) = 0;
674: 21 96 adiw r28, 0x01 ; 1
676: 18 82 st Y, r1
678: 81 50 subi r24, 0x01 ; 1
67a: 87 ff sbrs r24, 7
67c: fb cf rjmp .-10 ; 0x674 <OSStart+0x66>
}
*(++cp) = (uint8)((uint16)TaskFuction[i]>>8); //返回地址高8位
67e: 21 96 adiw r28, 0x01 ; 1
680: e2 2f mov r30, r18
682: ff 27 eor r31, r31
684: ee 0f add r30, r30
686: ff 1f adc r31, r31
688: df 01 movw r26, r30
68a: a8 57 subi r26, 0x78 ; 120
68c: bf 4f sbci r27, 0xFF ; 255
68e: 8d 91 ld r24, X+
690: 9c 91 ld r25, X
692: 11 97 sbiw r26, 0x01 ; 1
694: 89 2f mov r24, r25
696: 99 27 eor r25, r25
698: 89 93 st Y+, r24
*(++cp) = (uint8)((uint16)TaskFuction[i]); //返回地址低8位
69a: 8c 91 ld r24, X
69c: 88 83 st Y, r24
OSTaskStackBottom[i] =(uint8 *)cp;
69e: eb 5e subi r30, 0xEB ; 235
6a0: fc 4f sbci r31, 0xFC ; 252
6a2: d1 83 std Z+1, r29 ; 0x01
6a4: c0 83 st Z, r28
6a6: 21 50 subi r18, 0x01 ; 1
6a8: 21 f7 brne .-56 ; 0x672 <OSStart+0x64>
}
/* 允许中断 */
Os_Enter_Sum = 1;
OS_EXIT_CRITICAL();
6aa: 20 93 a9 00 sts 0x00A9, r18
6ae: 78 94 sei
/* 函数返回优先级最高的任务 */
ret();
6b0: 08 95 ret
6b2: df 91 pop r29
6b4: cf 91 pop r28
6b6: 08 95 ret
000006b8 <OSQCreate>:
********************************************************************************************************/
uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf)
//Buf[0]:队列中字节数,Buf[1]:Buf总长度,Buf[2]:出对端,Buf[3](,Buf[4]):等待队列任务列表
{
6b8: fc 01 movw r30, r24
OS_ENTER_CRITICAL();
6ba: f8 94 cli
6bc: 80 91 a9 00 lds r24, 0x00A9
6c0: 8f 5f subi r24, 0xFF ; 255
6c2: 80 93 a9 00 sts 0x00A9, r24
if ((SizeOfBuf >= 5) && (Buf != NULL))
6c6: 65 30 cpi r22, 0x05 ; 5
6c8: 98 f0 brcs .+38 ; 0x6f0 <OSQCreate+0x38>
6ca: 30 97 sbiw r30, 0x00 ; 0
6cc: 89 f0 breq .+34 ; 0x6f0 <OSQCreate+0x38>
{
Buf[0] = 0; /* 队列中消息数目 */
6ce: 10 82 st Z, r1
Buf[1] = SizeOfBuf; /* 消息队列占用内存字节数 */
6d0: 61 83 std Z+1, r22 ; 0x01
#if OS_MAX_TASKS < 9
Buf[2] = 4; /* 将要出队的消息所在位置 */
#else
Buf[2] = 5; /* 将要出队的消息所在位置 */
6d2: 85 e0 ldi r24, 0x05 ; 5
6d4: 82 83 std Z+2, r24 ; 0x02
#endif
Buf[3] = 0; /* 消息队列的等待任务列表 */
6d6: 13 82 std Z+3, r1 ; 0x03
Buf[4] = 0; /* 任务数大于等于8时为等待任务列表的一部分, */
6d8: 14 82 std Z+4, r1 ; 0x04
/* 否则为消息缓冲区 */
OS_EXIT_CRITICAL();
6da: 80 91 a9 00 lds r24, 0x00A9
6de: 81 50 subi r24, 0x01 ; 1
6e0: 80 93 a9 00 sts 0x00A9, r24
6e4: 88 23 and r24, r24
6e6: 09 f4 brne .+2 ; 0x6ea <OSQCreate+0x32>
6e8: 78 94 sei
return OS_Q_OK;
6ea: 81 e0 ldi r24, 0x01 ; 1
6ec: 90 e0 ldi r25, 0x00 ; 0
6ee: 08 95 ret
}
else
{
OS_EXIT_CRITICAL();
6f0: 80 91 a9 00 lds r24, 0x00A9
6f4: 81 50 subi r24, 0x01 ; 1
6f6: 80 93 a9 00 sts 0x00A9, r24
6fa: 88 23 and r24, r24
6fc: 09 f4 brne .+2 ; 0x700 <OSQCreate+0x48>
6fe: 78 94 sei
return NOT_OK;
700: 8f ef ldi r24, 0xFF ; 255
702: 90 e0 ldi r25, 0x00 ; 0
}
}
704: 08 95 ret
00000706 <OSQPend>:
/*********************************************************************************************************
** 函数名称: OSQPend
** 功能描述: 等待消息队列中的消息
** 输 入: Ret:返回的消息
** Buf:指向队列的指针
** Tick:等待时间
** 输 出: NOT_OK:参数错误
** OS_Q_OK:收到消息
** OS_Q_TMO:超时到
** OS_Q_NOT_OK:无消息
** 全局变量: 无
** 调用模块: OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月9日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_PENT > 0
uint8 OSQPend(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick)
{
706: 0f 93 push r16
708: 1f 93 push r17
70a: cf 93 push r28
70c: df 93 push r29
70e: 8c 01 movw r16, r24
710: eb 01 movw r28, r22
#ifdef __C51__
uint8 data *cp;
#endif
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
OS_ENTER_CRITICAL();
712: f8 94 cli
714: 80 91 a9 00 lds r24, 0x00A9
718: 8f 5f subi r24, 0xFF ; 255
71a: 80 93 a9 00 sts 0x00A9, r24
OSWaitTick[OSRunningTaskID()] = Tick; /* 设置超时时间 */
71e: 80 91 ab 00 lds r24, 0x00AB
722: a8 2f mov r26, r24
724: bb 27 eor r27, r27
726: fd 01 movw r30, r26
728: e3 55 subi r30, 0x53 ; 83
72a: ff 4f sbci r31, 0xFF ; 255
72c: 40 83 st Z, r20
/* 可以优化寄存器的使用 */
/* 使用堆栈是为了使函数具有重入性 */
#ifdef __C51__
SP++;
*((uint8 data * data *)SP) = Ret;
#endif
/* 把任务加入等待任务队列 */
#if OS_MAX_TASKS < 9
Buf[3] |= OSMapTbl[OSRunningTaskID()];
#else
if (OSRunningTaskID() < 8)
72e: 88 30 cpi r24, 0x08 ; 8
730: 48 f4 brcc .+18 ; 0x744 <OSQPend+0x3e>
{
Buf[3] |= OSMapTbl[OSRunningTaskID()];
732: aa 0f add r26, r26
734: bb 1f adc r27, r27
736: a0 5a subi r26, 0xA0 ; 160
738: bf 4f sbci r27, 0xFF ; 255
73a: 8b 81 ldd r24, Y+3 ; 0x03
73c: 9c 91 ld r25, X
73e: 89 2b or r24, r25
740: 8b 83 std Y+3, r24 ; 0x03
742: 0a c0 rjmp .+20 ; 0x758 <OSQPend+0x52>
}
else
{
Buf[4] |= OSMapTbl[OSRunningTaskID() & 0x07];
744: a7 70 andi r26, 0x07 ; 7
746: b0 70 andi r27, 0x00 ; 0
748: aa 0f add r26, r26
74a: bb 1f adc r27, r27
74c: a0 5a subi r26, 0xA0 ; 160
74e: bf 4f sbci r27, 0xFF ; 255
750: 8c 81 ldd r24, Y+4 ; 0x04
752: 9c 91 ld r25, X
754: 89 2b or r24, r25
756: 8c 83 std Y+4, r24 ; 0x04
}
#endif
while (Buf[0] == 0) /* 消息队列中是否有消息 */
{
/* 无消息 */
#ifdef __C51__
SP = SP + sizeof(Buf);
*((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf))) = Buf;
#endif
OSClearSignal(OSRunningTaskID()); /* 任务进入等待状态 */
OSSched(); /* 运行下一个任务 */
#ifdef __C51__
Buf = *((uint8 OS_Q_MEM_SEL * data *)(SP + 1 - sizeof(Buf)));
SP = SP - sizeof(Buf);
#endif
/* 任务再次运行,如果超时到,退出循环 */
if (OSWaitTick[OSRunningTaskID()] == 0)
{
break;
758: 88 81 ld r24, Y
75a: 88 23 and r24, r24
75c: 79 f4 brne .+30 ; 0x77c <OSQPend+0x76>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -