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

📄 main.lss

📁 用超声波来测量距离
💻 LSS
📖 第 1 页 / 共 5 页
字号:
\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 + -