📄 main.lss
字号:
\t");
__asm__ __volatile__("POP R26 \
17a: af 91 pop r26
\t");
__asm__ __volatile__("POP R25 \
17c: 9f 91 pop r25
\t");
__asm__ __volatile__("POP R24 \
17e: 8f 91 pop r24
\t");
__asm__ __volatile__("POP R23 \
180: 7f 91 pop r23
\t");
__asm__ __volatile__("POP R22 \
182: 6f 91 pop r22
\t");
__asm__ __volatile__("POP R21 \
184: 5f 91 pop r21
\t");
__asm__ __volatile__("POP R20 \
186: 4f 91 pop r20
\t");
__asm__ __volatile__("POP R19 \
188: 3f 91 pop r19
\t");
__asm__ __volatile__("POP R18 \
18a: 2f 91 pop r18
\t");
__asm__ __volatile__("POP __tmp_reg__ \
18c: 0f 90 pop r0
\t"); //SERG 出栈并恢复
__asm__ __volatile__("OUT __SREG__,__tmp_reg__ \
18e: 0f be out 0x3f, r0 ; 63
\t"); //
__asm__ __volatile__("POP __tmp_reg__ \
190: 0f 90 pop r0
\t"); //R0 出栈
__asm__ __volatile__("POP __zero_reg__ \
192: 1f 90 pop r1
\t"); //R1 出栈
//中断时出栈完成
__asm__ __volatile__("CLI \
194: f8 94 cli
\t"); //关中断
__asm__ __volatile__("SBRC R16,1 \
196: 01 fd sbrc r16, 1
\t"); //SBRC当寄存器位为0刚跳过下一条指令
//检查是在调度时,是否有中断要求任务调度 0x02是中断要求调度的标志位
__asm__ __volatile__("RJMP OSSched \
198: a9 cf rjmp .-174 ; 0xec <OSSched>
\t"); //重新调度
__asm__ __volatile__("LDI R16,0x00 \
19a: 00 e0 ldi r16, 0x00 ; 0
\t");
//清除中断要求任务切换的标志位,清除正在任务切换标志位
__asm__ __volatile__("RETI \
19c: 18 95 reti
19e: 08 95 ret
000001a0 <IntSwitch>:
\t"); //返回并开中断
}
/*******************************************************
** 函数名: IntSwitch()
** 子函数: OSSched()
** 输 入: 无
** 输 出: 无
** 功 能: 从中断退出并进行调度
--------------------------------------------------------
*******************************************************/
void IntSwitch(void)
{
//当中断无嵌套,并且没有在切换任务的过程中,直接进行任务切换
if(OSCoreState == 0x02 && IntNum==0)
1a0: 02 30 cpi r16, 0x02 ; 2
1a2: 31 f4 brne .+12 ; 0x1b0 <IntSwitch+0x10>
1a4: 44 20 and r4, r4
1a6: 21 f4 brne .+8 ; 0x1b0 <IntSwitch+0x10>
{
//进入中断时,已经保存了SREG和R0,R1,R18~R27,R30,R31
__asm__ __volatile__("POP R31 \
1a8: ff 91 pop r31
\t"); //去除因调用子程序IntSwitch()而入栈的PC
__asm__ __volatile__("POP R31 \
1aa: ff 91 pop r31
\t");
__asm__ __volatile__("LDI R16,0x01 \
1ac: 01 e0 ldi r16, 0x01 ; 1
\t"); //清除中断要求任务切换的标志位,设置正在任务切换标志位
__asm__ __volatile__("RJMP Int_OSSched \
1ae: b1 cf rjmp .-158 ; 0x112 <Int_OSSched>
1b0: 08 95 ret
000001b2 <OSTaskSuspend>:
\t"); //重新调度
}
}
////////////////////////////////////////////任务处理
/*******************************************************
** 函数名: OSTaskSuspend()
** 子函数: OSSched();
** 输 入: prio 要挂起的任务ID
** 输 出: 无
** 功 能: 挂起任务,即从任务就绪表上去除标志位
--------------------------------------------------------
*******************************************************/
void OSTaskSuspend(unsigned char prio)
{
1b2: 48 2f mov r20, r24
TCB[prio].OSWaitTick=0;
1b4: 28 2f mov r18, r24
1b6: 33 27 eor r19, r19
1b8: f9 01 movw r30, r18
1ba: ee 0f add r30, r30
1bc: ff 1f adc r31, r31
1be: ee 0f add r30, r30
1c0: ff 1f adc r31, r31
1c2: eb 5f subi r30, 0xFB ; 251
1c4: fe 4f sbci r31, 0xFE ; 254
1c6: 13 82 std Z+3, r1 ; 0x03
1c8: 12 82 std Z+2, r1 ; 0x02
OSRdyTbl &= ~(0x01<<prio); //从任务就绪表上去除标志位
1ca: 81 e0 ldi r24, 0x01 ; 1
1cc: 90 e0 ldi r25, 0x00 ; 0
1ce: 02 c0 rjmp .+4 ; 0x1d4 <OSTaskSuspend+0x22>
1d0: 88 0f add r24, r24
1d2: 99 1f adc r25, r25
1d4: 2a 95 dec r18
1d6: e2 f7 brpl .-8 ; 0x1d0 <OSTaskSuspend+0x1e>
1d8: 80 95 com r24
1da: 28 22 and r2, r24
if(OSTaskRunningPrio==prio) //当要挂起的任务为当前任务
1dc: 34 16 cp r3, r20
1de: 11 f4 brne .+4 ; 0x1e4 <OSTaskSuspend+0x32>
OSSched(); //从新调度
1e0: 0e 94 76 00 call 0xec <OSSched>
1e4: 08 95 ret
000001e6 <OSTaskResume>:
}
/*******************************************************
** 函数名: OSTaskResume()
** 子函数: OSSched();
** 输 入: prio 要恢复的任务ID
** 输 出: 无
** 功 能: 恢复任务 可以让被OSTaskSuspend或 OSTimeDly暂停的任务恢复
--------------------------------------------------------
*******************************************************/
//
void OSTaskResume(unsigned char prio)
{
1e6: 28 2f mov r18, r24
OSRdyTbl |= 0x01<<prio; //从任务就绪表上重置标志位
1e8: e8 2f mov r30, r24
1ea: ff 27 eor r31, r31
1ec: 81 e0 ldi r24, 0x01 ; 1
1ee: 90 e0 ldi r25, 0x00 ; 0
1f0: 0e 2e mov r0, r30
1f2: 02 c0 rjmp .+4 ; 0x1f8 <OSTaskResume+0x12>
1f4: 88 0f add r24, r24
1f6: 99 1f adc r25, r25
1f8: 0a 94 dec r0
1fa: e2 f7 brpl .-8 ; 0x1f4 <OSTaskResume+0xe>
1fc: 28 2a or r2, r24
TCB[prio].OSWaitTick=0; //将时间计时设为0,到时
1fe: ee 0f add r30, r30
200: ff 1f adc r31, r31
202: ee 0f add r30, r30
204: ff 1f adc r31, r31
206: eb 5f subi r30, 0xFB ; 251
208: fe 4f sbci r31, 0xFE ; 254
20a: 13 82 std Z+3, r1 ; 0x03
20c: 12 82 std Z+2, r1 ; 0x02
if(OSTaskRunningPrio>prio) //当要当前任务的优先级低于重置位的任务的优先级
20e: 23 15 cp r18, r3
210: 10 f4 brcc .+4 ; 0x216 <OSTaskResume+0x30>
OSSched(); //从新调度
212: 0e 94 76 00 call 0xec <OSSched>
216: 08 95 ret
00000218 <OSTimeDly>:
}
/*******************************************************
** 函数名: OSTimeDly()
** 子函数: OSSched();
** 输 入: ticks 延迟的时钟节拍数
** 输 出: 无
** 功 能: 任务延时
--------------------------------------------------------
*******************************************************/
void OSTimeDly(unsigned int ticks)
{
218: 9c 01 movw r18, r24
if(ticks) //当延时有效,即ticks!=0
21a: 89 2b or r24, r25
21c: b1 f0 breq .+44 ; 0x24a <OSTimeDly+0x32>
{
OSRdyTbl &= ~(0x01<<OSTaskRunningPrio); //清就绪标志
21e: e3 2d mov r30, r3
220: ff 27 eor r31, r31
222: 81 e0 ldi r24, 0x01 ; 1
224: 90 e0 ldi r25, 0x00 ; 0
226: 0e 2e mov r0, r30
228: 02 c0 rjmp .+4 ; 0x22e <OSTimeDly+0x16>
22a: 88 0f add r24, r24
22c: 99 1f adc r25, r25
22e: 0a 94 dec r0
230: e2 f7 brpl .-8 ; 0x22a <OSTimeDly+0x12>
232: 80 95 com r24
234: 28 22 and r2, r24
TCB[OSTaskRunningPrio].OSWaitTick=ticks;//赋时钟节拍数
236: ee 0f add r30, r30
238: ff 1f adc r31, r31
23a: ee 0f add r30, r30
23c: ff 1f adc r31, r31
23e: eb 5f subi r30, 0xFB ; 251
240: fe 4f sbci r31, 0xFE ; 254
242: 33 83 std Z+3, r19 ; 0x03
244: 22 83 std Z+2, r18 ; 0x02
OSSched(); //从新调度
246: 0e 94 76 00 call 0xec <OSSched>
24a: 08 95 ret
0000024c <OSSemCreat>:
}
}
/***********************
** 信号量 **
***********************/
struct SemBlk
{
unsigned char OSEventType; //型号 0,信号量独占型;1信号量共享型
unsigned char OSEventState; //状态 0,不可用;1,可用
unsigned char OSTaskPendTbl; //等待信号量的任务列表
} Sem[10];
/*******************************************************
** 函数名: OSSemCreat()
** 子函数: 无
** 输 入: Index任务ID Type信号量类型
** 输 出: 无
** 功 能: 初始化信号量
--------------------------------------------------------
*******************************************************/
void OSSemCreat(unsigned char Index,unsigned char Type)
{
Sem[Index].OSEventType=Type; //型号 0,信号量独占型;1信号量共享型
24c: 99 27 eor r25, r25
24e: fc 01 movw r30, r24
250: ee 0f add r30, r30
252: ff 1f adc r31, r31
254: e8 0f add r30, r24
256: f9 1f adc r31, r25
258: e3 55 subi r30, 0x53 ; 83
25a: fd 4f sbci r31, 0xFD ; 253
25c: 60 83 st Z, r22
Sem[Index].OSTaskPendTbl=0;
25e: 12 82 std Z+2, r1 ; 0x02
Sem[Index].OSEventState=0;
260: 11 82 std Z+1, r1 ; 0x01
262: 08 95 ret
00000264 <OSTaskSemPend>:
}
/***********************************************************************
** 函数名: OSTaskSemPend()
** 子函数: 无
** 输 入: Index任务ID Timeout等待时间
** 输 出: 无
** 功 能: 任务等待信号量,挂起 当Timeout==0xffff时,为无限延时
------------------------------------------------------------------------
************************************************************************/
unsigned char OSTaskSemPend(unsigned char Index,unsigned int Timeout)
{
264: cf 93 push r28
266: df 93 push r29
//unsigned char i=0;
if(Sem[Index].OSEventState) //信号量有效
268: 99 27 eor r25, r25
26a: dc 01 movw r26, r24
26c: aa 0f add r26, r26
26e: bb 1f adc r27, r27
270: a8 0f add r26, r24
272: b9 1f adc r27, r25
274: a3 55 subi r26, 0x53 ; 83
276: bd 4f sbci r27, 0xFD ; 253
278: ed 01 movw r28, r26
27a: 89 81 ldd r24, Y+1 ; 0x01
27c: 88 23 and r24, r24
27e: 29 f0 breq .+10 ; 0x28a <OSTaskSemPend+0x26>
{
if(Sem[Index].OSEventType==0) //如果为独占型
280: 8c 91 ld r24, X
282: 88 23 and r24, r24
284: 49 f5 brne .+82 ; 0x2d8 <OSTaskSemPend+0x74>
Sem[Index].OSEventState = 0x00; //信号量被独占,不可用
286: 89 83 std Y+1, r24 ; 0x01
288: 27 c0 rjmp .+78 ; 0x2d8 <OSTaskSemPend+0x74>
}
else
{ //加入信号的任务等待表
Sem[Index].OSTaskPendTbl |= 0x01<<OSTaskRunningPrio;
28a: e3 2d mov r30, r3
28c: ff 27 eor r31, r31
28e: 21 e0 ldi r18, 0x01 ; 1
290: 30 e0 ldi r19, 0x00 ; 0
292: 0e 2e mov r0, r30
294: 02 c0 rjmp .+4 ; 0x29a <OSTaskSemPend+0x36>
296: 22 0f add r18, r18
298: 33 1f adc r19, r19
29a: 0a 94 dec r0
29c: e2 f7 brpl .-8 ; 0x296 <OSTaskSemPend+0x32>
29e: ed 01 movw r28, r26
2a0: 8a 81 ldd r24, Y+2 ; 0x02
2a2: 82 2b or r24, r18
2a4: 8a 83 std Y+2, r24 ; 0x02
TCB[OSTaskRunningPrio].OSWaitTick=Timeout; //如延时为0,刚无限等待
2a6: ee 0f add r30, r30
2a8: ff 1f adc r31, r31
2aa: ee 0f add r30, r30
2ac: ff 1f adc r31, r31
2ae: eb 5f subi r30, 0xFB ; 251
2b0: fe 4f sbci r31, 0xFE ; 254
2b2: 73 83 std Z+3, r23 ; 0x03
2b4: 62 83 std Z+2, r22 ; 0x02
OSRdyTbl &= ~(0x01<<OSTaskRunningPrio); //从任务就绪表中去除
2b6: 82 2f mov r24, r18
2b8: 80 95 com r24
2ba: 28 22 and r2, r24
OSSched(); //从新调度
2bc: 0e 94 76 00 call 0xec <OSSched>
if(TCB[OSTaskRunningPrio].OSWaitTick==0 ) //超时,未能拿到资源
2c0: e3 2d mov r30, r3
2c2: ff 27 eor r31, r31
2c4: ee 0f add r30, r30
2c6: ff 1f adc r31, r31
2c8: ee 0f add r30, r30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -