📄 test.lss
字号:
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 + -