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

📄 test.lss

📁 在M16上动行的Small RTOS
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 75e:	80 91 ab 00 	lds	r24, 0x00AB
 762:	0e 94 d3 00 	call	0x1a6 <OSClearSignal>
 766:	0e 94 16 01 	call	0x22c <OSSched>
 76a:	80 91 ab 00 	lds	r24, 0x00AB
 76e:	e8 2f       	mov	r30, r24
 770:	ff 27       	eor	r31, r31
 772:	e3 55       	subi	r30, 0x53	; 83
 774:	ff 4f       	sbci	r31, 0xFF	; 255
 776:	80 81       	ld	r24, Z
 778:	88 23       	and	r24, r24
 77a:	71 f7       	brne	.-36     	; 0x758 <OSQPend+0x52>
        }
    }

                /* 将任务从等待队列中清除(可以删除) */
#if OS_MAX_TASKS < 9
    Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
#else
    if (OSRunningTaskID() < 8)
 77c:	80 91 ab 00 	lds	r24, 0x00AB
 780:	e8 2f       	mov	r30, r24
 782:	ff 27       	eor	r31, r31
 784:	88 30       	cpi	r24, 0x08	; 8
 786:	50 f4       	brcc	.+20     	; 0x79c <OSQPend+0x96>
    {
        Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
 788:	ee 0f       	add	r30, r30
 78a:	ff 1f       	adc	r31, r31
 78c:	e0 5a       	subi	r30, 0xA0	; 160
 78e:	ff 4f       	sbci	r31, 0xFF	; 255
 790:	90 81       	ld	r25, Z
 792:	90 95       	com	r25
 794:	8b 81       	ldd	r24, Y+3	; 0x03
 796:	89 23       	and	r24, r25
 798:	8b 83       	std	Y+3, r24	; 0x03
 79a:	0b c0       	rjmp	.+22     	; 0x7b2 <OSQPend+0xac>
    }
    else
    {
        Buf[4] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
 79c:	e7 70       	andi	r30, 0x07	; 7
 79e:	f0 70       	andi	r31, 0x00	; 0
 7a0:	ee 0f       	add	r30, r30
 7a2:	ff 1f       	adc	r31, r31
 7a4:	e0 5a       	subi	r30, 0xA0	; 160
 7a6:	ff 4f       	sbci	r31, 0xFF	; 255
 7a8:	90 81       	ld	r25, Z
 7aa:	90 95       	com	r25
 7ac:	8c 81       	ldd	r24, Y+4	; 0x04
 7ae:	89 23       	and	r24, r25
 7b0:	8c 83       	std	Y+4, r24	; 0x04
    }
#endif
                /* 判断消息队列中是否有消息 */
    if (Buf[0] > 0)
 7b2:	88 81       	ld	r24, Y
 7b4:	88 23       	and	r24, r24
 7b6:	d9 f0       	breq	.+54     	; 0x7ee <OSQPend+0xe8>
    {
                /* 有,消息出队 */
        Buf[0]--;           /* 队列的消息数目减一 */
 7b8:	81 50       	subi	r24, 0x01	; 1
 7ba:	88 83       	st	Y, r24
                /* 指向下一个出队位置 */
        Buf[2]++;
 7bc:	8a 81       	ldd	r24, Y+2	; 0x02
 7be:	8f 5f       	subi	r24, 0xFF	; 255
 7c0:	8a 83       	std	Y+2, r24	; 0x02
        if (Buf[2] >= Buf[1] )
 7c2:	99 81       	ldd	r25, Y+1	; 0x01
 7c4:	89 17       	cp	r24, r25
 7c6:	10 f0       	brcs	.+4      	; 0x7cc <OSQPend+0xc6>
        {
#if OS_MAX_TASKS < 9
            Buf[2] = 4;
#else
            Buf[2] = 5;
 7c8:	85 e0       	ldi	r24, 0x05	; 5
 7ca:	8a 83       	std	Y+2, r24	; 0x02
#endif
        }
#ifdef __C51__
        cp = (uint8 data *)(*((uint8 data *)SP));
        SP--;
        *cp = Buf[Buf[2]];
#else
        *Ret = Buf[Buf[2]];
 7cc:	8a 81       	ldd	r24, Y+2	; 0x02
 7ce:	c8 0f       	add	r28, r24
 7d0:	d1 1d       	adc	r29, r1
 7d2:	88 81       	ld	r24, Y
 7d4:	f8 01       	movw	r30, r16
 7d6:	80 83       	st	Z, r24
#endif
        OS_EXIT_CRITICAL();
 7d8:	80 91 a9 00 	lds	r24, 0x00A9
 7dc:	81 50       	subi	r24, 0x01	; 1
 7de:	80 93 a9 00 	sts	0x00A9, r24
 7e2:	88 23       	and	r24, r24
 7e4:	09 f4       	brne	.+2      	; 0x7e8 <OSQPend+0xe2>
 7e6:	78 94       	sei
        return OS_Q_OK;
 7e8:	81 e0       	ldi	r24, 0x01	; 1
 7ea:	90 e0       	ldi	r25, 0x00	; 0
 7ec:	0a c0       	rjmp	.+20     	; 0x802 <OSQPend+0xfc>
    }
    else
    {
                /* 无,返回错误码 */
#ifdef __C51__
        SP--;
#endif

        OS_EXIT_CRITICAL();
 7ee:	80 91 a9 00 	lds	r24, 0x00A9
 7f2:	81 50       	subi	r24, 0x01	; 1
 7f4:	80 93 a9 00 	sts	0x00A9, r24
 7f8:	88 23       	and	r24, r24
 7fa:	09 f4       	brne	.+2      	; 0x7fe <OSQPend+0xf8>
 7fc:	78 94       	sei
        return OS_Q_TMO;
 7fe:	82 e0       	ldi	r24, 0x02	; 2
 800:	90 e0       	ldi	r25, 0x00	; 0
 802:	df 91       	pop	r29
 804:	cf 91       	pop	r28
 806:	1f 91       	pop	r17
 808:	0f 91       	pop	r16
 80a:	08 95       	ret

0000080c <OSQIntPost>:
    }
}
#endif

/*********************************************************************************************************
** 函数名称: OSQAccept
** 功能描述: 无等待从消息队列中取得消息
** 输 入: Ret:返回的消息
**         Buf:指向队列的指针
** 输 出: NOT_OK:参数错误
**         OS_Q_OK:收到消息
**         OS_Q_TMO:超时到
**         OS_Q_NOT_OK:无消息
** 全局变量: 无
** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_ACCEPT > 0
        uint8 OSQAccept(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf)
{
#if EN_OS_Q_CHK > 0
    if (Buf == NULL)
    {
        return NOT_OK;
    }
#endif

    OS_ENTER_CRITICAL();

                /* 判断消息队列中是否有消息 */
    if (*Buf != 0)
    {
                /* 有,消息出队 */
        Buf[0]--;
        Buf[2]++;
        if (Buf[2] >= Buf[1])
        {
#if OS_MAX_TASKS < 9
            Buf[2] = 4;
#else
            Buf[2] = 5;
#endif
        }
        *Ret = Buf[Buf[2]];
        OS_EXIT_CRITICAL();
        return OS_Q_OK;
    }
    else
    {
                /* 无,返回错误码 */
        OS_EXIT_CRITICAL();
        return OS_Q_NOT_OK;
    }
}
#endif


/*********************************************************************************************************
** 函数名称: OSQIntPost
** 功能描述: 中断中FIFO方式发送消息
** 输 入: Buf:指向队列的指针
**         Data:消息数据
** 输 出: OS_Q_FULL:队列满
**         OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年9月9日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月26日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年6月8日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_INT_POST > 0  || EN_OS_Q_POST > 0
        uint8 OSQIntPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
 80c:	dc 01       	movw	r26, r24
    uint8 temp,i;

#if EN_OS_Q_CHK > 0
    if (Buf == NULL)
    {
        return NOT_OK;
    }
#endif

    OS_ENTER_CRITICAL();
 80e:	f8 94       	cli
 810:	40 91 a9 00 	lds	r20, 0x00A9
 814:	4f 5f       	subi	r20, 0xFF	; 255
 816:	40 93 a9 00 	sts	0x00A9, r20
 81a:	41 50       	subi	r20, 0x01	; 1

                /* 队列是否已满 */
#if OS_MAX_TASKS < 9
    if (Buf[0] < (Buf[1] - 4))
#else
    if (Buf[0] < (Buf[1] - 5))
 81c:	5c 91       	ld	r21, X
 81e:	25 2f       	mov	r18, r21
 820:	33 27       	eor	r19, r19
 822:	fc 01       	movw	r30, r24
 824:	71 81       	ldd	r23, Z+1	; 0x01
 826:	87 2f       	mov	r24, r23
 828:	99 27       	eor	r25, r25
 82a:	05 97       	sbiw	r24, 0x05	; 5
 82c:	28 17       	cp	r18, r24
 82e:	39 07       	cpc	r19, r25
 830:	0c f0       	brlt	.+2      	; 0x834 <OSQIntPost+0x28>
 832:	51 c0       	rjmp	.+162    	; 0x8d6 <OSQIntPost+0xca>
#endif
    {
                /* 使用堆栈是为了使函数具有重入性 */
#ifdef __C51__
        SP++;
        *((uint8 data *)SP) = Data;
#endif
                /* 计算新入队消息存储位置 */
        temp = Buf[2] + Buf[0] + 1;
 834:	82 81       	ldd	r24, Z+2	; 0x02
 836:	85 0f       	add	r24, r21
 838:	8f 5f       	subi	r24, 0xFF	; 255
        if (temp <= Buf[0] || temp >= Buf[1])
 83a:	58 17       	cp	r21, r24
 83c:	10 f4       	brcc	.+4      	; 0x842 <OSQIntPost+0x36>
 83e:	87 17       	cp	r24, r23
 840:	10 f0       	brcs	.+4      	; 0x846 <OSQIntPost+0x3a>
        {
#if OS_MAX_TASKS < 9
            temp = temp - Buf[1] + 4;
#else
            temp = temp - Buf[1] + 5;
 842:	87 1b       	sub	r24, r23
 844:	8b 5f       	subi	r24, 0xFB	; 251
#endif
        }
                /* 存储消息 */
#ifdef __C51__
        Buf[temp] = *((uint8 data *)SP);
        SP--;
#else
        Buf[temp] = Data;
 846:	fd 01       	movw	r30, r26
 848:	e8 0f       	add	r30, r24
 84a:	f1 1d       	adc	r31, r1
 84c:	60 83       	st	Z, r22
#endif

        Buf[0]++;               /* 消息数目加一 */
 84e:	8c 91       	ld	r24, X
 850:	8f 5f       	subi	r24, 0xFF	; 255
 852:	8c 93       	st	X, r24
                /* 判断消息入队前消息队列是否为空 */
        if (Buf[0] == 1)
 854:	81 30       	cpi	r24, 0x01	; 1
 856:	a1 f5       	brne	.+104    	; 0x8c0 <OSQIntPost+0xb4>
        {
                /* 为空,可能有任务等待消息,查找之 */
            temp = Buf[3];
 858:	fd 01       	movw	r30, r26
 85a:	93 81       	ldd	r25, Z+3	; 0x03
 85c:	89 2f       	mov	r24, r25
#if OS_MAX_TASKS < 9
            for (i = 0; i < OS_MAX_TASKS; i++)
            {
                if ((temp & 0x01) != 0)
                {
                    break;
                }
                temp = temp >> 1;
            }
            if (i < OS_MAX_TASKS )
            {
                /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
                Buf[3] &= ~OSMapTbl[i];
                OSIntSendSignal(i);
            }
#else
            for (i = 0; i < 8; i++)
 85e:	20 e0       	ldi	r18, 0x00	; 0
            {
                if ((temp & 0x01) != 0)
 860:	80 fd       	sbrc	r24, 0
 862:	04 c0       	rjmp	.+8      	; 0x86c <OSQIntPost+0x60>
                {
                    break;
                }
                temp = temp >> 1;
 864:	86 95       	lsr	r24
 866:	2f 5f       	subi	r18, 0xFF	; 255
 868:	28 30       	cpi	r18, 0x08	; 8
 86a:	d0 f3       	brcs	.-12     	; 0x860 <OSQIntPost+0x54>
            }
            if (i >= 8 )
 86c:	28 30       	cpi	r18, 0x08	; 8
 86e:	48 f0       	brcs	.+18     	; 0x882 <OSQIntPost+0x76>
            {
                temp = Buf[4];
 870:	fd 01       	movw	r30, r26
 872:	84 81       	ldd	r24, Z+4	; 0x04
                for (; i < OS_MAX_TASKS; i++)
 874:	20 31       	cpi	r18, 0x10	; 16
 876:	28 f4       	brcc	.+10     	; 0x882 <OSQIntPost+0x76>
                {
                    if ((temp & 0x01) != 0)
 878:	80 fd       	sbrc	r24, 0
 87a:	03 c0       	rjmp	.+6      	; 0x882 <OSQIntPost+0x76>
                    {
                        break;
                    }
                    temp = temp >> 1;
 87c:	86 95       	lsr	r24
 87e:	2f 5f       	subi	r18, 0xFF	; 255
 880:	f9 cf       	rjmp	.-14     	; 0x874 <OSQIntPost+0x68>
                }
            }
            if (i < OS_MAX_TASKS )
 882:	20 31       	cpi	r18, 0x10	; 16
 884:	e8 f4       	brcc	.+58     	; 0x8c0 <OSQIntPost+0xb4>
 886:	e2 2f       	mov	r30, r18
 888:	ff 27       	eor	r31, r31
            {
                /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
                if (i < 8)
 88a:	28 30       	cpi	r18, 0x08	; 8
 88c:	50 f4       	brcc	.+20     	; 0x8a2 <OSQIntPost+0x96>
                {
                    Buf[3] &= ~OSMapTbl[i];
 88e:	ee 0f       	add	r30, r30
 890:	ff 1f       	adc	r31, r31
 892:	e0 5a       	subi	r30, 0xA0	; 160
 894:	ff 4f       	sbci	r31, 0xFF	; 255
 896:	80 81       	ld	r24, Z
 898:	80 95       	com	r24
 89a:	98 23       	and	r25, r24
 89c:	fd 01       	movw	r30, r26
 89e:	93 83       	std	Z+3, r25	; 0x03
 8a0:	0c c0       	rjmp	.+24     	; 0x8ba <OSQIntPost+0xae>
         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -