📄 test.lss
字号:
OSTaskRuning &= ~OSMapTbl[TaskId];
#else
if (TaskId < 8)
1be: e8 30 cpi r30, 0x08 ; 8
1c0: 60 f4 brcc .+24 ; 0x1da <OSClearSignal+0x34>
{
((uint8 *)(&OSTaskRuning))[LOW_BYTE] &= ~OSMapTbl[TaskId];
1c2: aa 0f add r26, r26
1c4: bb 1f adc r27, r27
1c6: a0 5a subi r26, 0xA0 ; 160
1c8: bf 4f sbci r27, 0xFF ; 255
1ca: 9c 91 ld r25, X
1cc: 90 95 com r25
1ce: 80 91 82 00 lds r24, 0x0082
1d2: 89 23 and r24, r25
1d4: 80 93 82 00 sts 0x0082, r24
1d8: 0d c0 rjmp .+26 ; 0x1f4 <OSClearSignal+0x4e>
}
else
{
((uint8 *)(&OSTaskRuning))[HIGH_BYTE] &= ~OSMapTbl[TaskId & 0x07];
1da: a7 70 andi r26, 0x07 ; 7
1dc: b0 70 andi r27, 0x00 ; 0
1de: aa 0f add r26, r26
1e0: bb 1f adc r27, r27
1e2: a0 5a subi r26, 0xA0 ; 160
1e4: bf 4f sbci r27, 0xFF ; 255
1e6: 9c 91 ld r25, X
1e8: 90 95 com r25
1ea: 80 91 83 00 lds r24, 0x0083
1ee: 89 23 and r24, r25
1f0: 80 93 83 00 sts 0x0083, r24
}
#endif
OSTaskRuning &= ~OSMapTbl[TaskId];
1f4: ff 27 eor r31, r31
1f6: ee 0f add r30, r30
1f8: ff 1f adc r31, r31
1fa: e0 5a subi r30, 0xA0 ; 160
1fc: ff 4f sbci r31, 0xFF ; 255
1fe: 20 81 ld r18, Z
200: 31 81 ldd r19, Z+1 ; 0x01
202: 20 95 com r18
204: 30 95 com r19
206: 80 91 82 00 lds r24, 0x0082
20a: 90 91 83 00 lds r25, 0x0083
20e: 82 23 and r24, r18
210: 93 23 and r25, r19
212: 90 93 83 00 sts 0x0083, r25
216: 80 93 82 00 sts 0x0082, r24
OS_EXIT_CRITICAL();
21a: 80 91 a9 00 lds r24, 0x00A9
21e: 81 50 subi r24, 0x01 ; 1
220: 80 93 a9 00 sts 0x00A9, r24
224: 88 23 and r24, r24
226: 09 f4 brne .+2 ; 0x22a <OSClearSignal+0x84>
228: 78 94 sei
22a: 08 95 ret
0000022c <OSSched>:
}
}
/*********************************************************************************************************
** 函数名称: OSIntExit
** 功能描述: 中断退出处理函数,在此进行中断后的任务切换
** 输 入: 无
** 输 出: 无
** 全局变量: OSIntNesting,OSNextTaskID
** 调用模块: OSIntCtxSw
**
** 作 者: 陈明计
** 日 期: 2002年6月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年9月4日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月19日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月2日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月30日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSIntExit(void)
{
uint8 temp;
OS_ENTER_CRITICAL();
/* 中断嵌套处理 */
#if EN_OS_INT_ENTER > 0
if (OSIntNesting > 0)
{
OSIntNesting--;
}
if (OSIntNesting == 0)
{
#endif
Os_Enter_Sum = 0; /* 因为在中断中,所以关中断计数器为0 */
#if OS_MAX_TASKS < 9
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning;
for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
OSIntCtxSw(); /* 进行任务调度 */
#else
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning % 256;
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
goto TaskSw;
}
temp = temp >> 1;
}
temp = OSTaskRuning / 256;
for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
TaskSw:
OSIntCtxSw(); /* 进行任务调度 */
#endif
#if EN_OS_INT_ENTER >0
}
#endif
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函数名称: OSSched
** 功能描述: 非中断的任务切换函数
** 输 入: 无
** 输 出: 无
** 全局变量: OSIntNesting,OSNextTaskID
** 调用模块: OS_TASK_SW
**
** 作 者: 陈明计
** 日 期: 2002年6月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年9月4日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月19日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月2日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月30日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSSched(void)
{
uint8 temp;
OS_ENTER_CRITICAL();
22c: f8 94 cli
22e: 80 91 a9 00 lds r24, 0x00A9
232: 8f 5f subi r24, 0xFF ; 255
234: 80 93 a9 00 sts 0x00A9, r24
#if EN_OS_INT_ENTER > 0
if (OSIntNesting == 0) /* 是否是中断中调用 */
238: 20 91 ac 00 lds r18, 0x00AC
23c: 22 23 and r18, r18
23e: 19 f5 brne .+70 ; 0x286 <OSSched+0x5a>
{
#endif
#if OS_MAX_TASKS < 9
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning;
for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
OS_TASK_SW(); /* 进行任务调度 */
#else
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning % 256;
240: 80 91 82 00 lds r24, 0x0082
244: 90 91 83 00 lds r25, 0x0083
248: 38 2f mov r19, r24
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
24a: 20 93 aa 00 sts 0x00AA, r18
{
if ((temp & 0x01) != 0)
24e: 30 fd sbrc r19, 0
250: 18 c0 rjmp .+48 ; 0x282 <OSSched+0x56>
{
goto TaskSw;
}
temp = temp >> 1;
252: 36 95 lsr r19
254: 20 91 aa 00 lds r18, 0x00AA
258: 2f 5f subi r18, 0xFF ; 255
25a: 20 93 aa 00 sts 0x00AA, r18
25e: 28 30 cpi r18, 0x08 ; 8
260: b0 f3 brcs .-20 ; 0x24e <OSSched+0x22>
}
temp = OSTaskRuning / 256 ;
262: 89 2f mov r24, r25
264: 99 27 eor r25, r25
266: 38 2f mov r19, r24
for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
268: 82 2f mov r24, r18
26a: 20 31 cpi r18, 0x10 ; 16
26c: 50 f4 brcc .+20 ; 0x282 <OSSched+0x56>
{
if ((temp & 0x01) != 0)
26e: 30 fd sbrc r19, 0
270: 06 c0 rjmp .+12 ; 0x27e <OSSched+0x52>
{
break;
}
temp = temp >> 1;
272: 36 95 lsr r19
274: 28 2f mov r18, r24
276: 2f 5f subi r18, 0xFF ; 255
278: 82 2f mov r24, r18
27a: 20 31 cpi r18, 0x10 ; 16
27c: c0 f3 brcs .-16 ; 0x26e <OSSched+0x42>
27e: 20 93 aa 00 sts 0x00AA, r18
}
TaskSw:
OS_TASK_SW(); /* 进行任务调度 */
282: 0e 94 14 02 call 0x428 <OSCtxSw>
#endif
#if EN_OS_INT_ENTER > 0
}
#endif
OS_EXIT_CRITICAL();
286: 80 91 a9 00 lds r24, 0x00A9
28a: 81 50 subi r24, 0x01 ; 1
28c: 80 93 a9 00 sts 0x00A9, r24
290: 88 23 and r24, r24
292: 09 f4 brne .+2 ; 0x296 <OSSched+0x6a>
294: 78 94 sei
296: 08 95 ret
00000298 <OSSendSignal>:
298: 0e 94 95 00 call 0x12a <OSIntSendSignal>
29c: 0e 94 16 01 call 0x22c <OSSched>
2a0: 08 95 ret
000002a2 <OSIntExit>:
2a2: f8 94 cli
2a4: 80 91 a9 00 lds r24, 0x00A9
2a8: 8f 5f subi r24, 0xFF ; 255
2aa: 80 93 a9 00 sts 0x00A9, r24
2ae: 80 91 ac 00 lds r24, 0x00AC
2b2: 88 23 and r24, r24
2b4: 19 f0 breq .+6 ; 0x2bc <OSIntExit+0x1a>
2b6: 81 50 subi r24, 0x01 ; 1
2b8: 80 93 ac 00 sts 0x00AC, r24
2bc: 20 91 ac 00 lds r18, 0x00AC
2c0: 22 23 and r18, r18
2c2: 29 f5 brne .+74 ; 0x30e <OSIntExit+0x6c>
2c4: 20 93 a9 00 sts 0x00A9, r18
2c8: 80 91 82 00 lds r24, 0x0082
2cc: 90 91 83 00 lds r25, 0x0083
2d0: 38 2f mov r19, r24
2d2: 20 93 aa 00 sts 0x00AA, r18
2d6: 30 fd sbrc r19, 0
2d8: 18 c0 rjmp .+48 ; 0x30a <OSIntExit+0x68>
2da: 36 95 lsr r19
2dc: 20 91 aa 00 lds r18, 0x00AA
2e0: 2f 5f subi r18, 0xFF ; 255
2e2: 20 93 aa 00 sts 0x00AA, r18
2e6: 28 30 cpi r18, 0x08 ; 8
2e8: b0 f3 brcs .-20 ; 0x2d6 <OSIntExit+0x34>
2ea: 89 2f mov r24, r25
2ec: 99 27 eor r25, r25
2ee: 38 2f mov r19, r24
2f0: 82 2f mov r24, r18
2f2: 20 31 cpi r18, 0x10 ; 16
2f4: 50 f4 brcc .+20 ; 0x30a <OSIntExit+0x68>
2f6: 30 fd sbrc r19, 0
2f8: 06 c0 rjmp .+12 ; 0x306 <OSIntExit+0x64>
2fa: 36 95 lsr r19
2fc: 28 2f mov r18, r24
2fe: 2f 5f subi r18, 0xFF ; 255
300: 82 2f mov r24, r18
302: 20 31 cpi r18, 0x10 ; 16
304: c0 f3 brcs .-16 ; 0x2f6 <OSIntExit+0x54>
306: 20 93 aa 00 sts 0x00AA, r18
30a: 0e 94 14 02 call 0x428 <OSCtxSw>
30e: 80 91 a9 00 lds r24, 0x00A9
312: 81 50 subi r24, 0x01 ; 1
314: 80 93 a9 00 sts 0x00A9, r24
318: 88 23 and r24, r24
31a: 09 f4 brne .+2 ; 0x31e <OSIntExit+0x7c>
31c: 78 94 sei
31e: 08 95 ret
00000320 <OSTimeTick>:
}
/*********************************************************************************************************
** 函数名称: OSTimeTick
** 功能描述: 系统时钟处理函数,处理各个任务的延时
** 输 入: 无
** 输 出: 无
** 全局变量: OSWaitTick
** 调用模块: OSIntSendSignal
**
** 作 者: 陈明计
** 日 期: 2002年6月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年9月4日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月30日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTimeTick(void)
{
320: 1f 93 push r17
322: cf 93 push r28
324: df 93 push r29
uint8 i;
for (i = 0; i < OS_MAX_TASKS; i++)
326: 10 e0 ldi r17, 0x00 ; 0
328: cd ea ldi r28, 0xAD ; 173
32a: d0 e0 ldi r29, 0x00 ; 0
{
if (OSWaitTick[i] != 0 )
32c: 88 81 ld r24, Y
32e: 88 23 and r24, r24
330: 39 f0 breq .+14 ; 0x340 <OSTimeTick+0x20>
{
OSWaitTick[i]--;
332: 81 50 subi r24, 0x01 ; 1
334: 88 83 st Y, r24
if (OSWaitTick[i] == 0)
336: 88 23 and r24, r24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -