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

📄 test.lss

📁 在M16上动行的Small RTOS
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 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 + -