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

📄 main.lss

📁 在基于avr内核的单片机上实现MP3播放器的功能
💻 LSS
📖 第 1 页 / 共 4 页
字号:
     8d0:	81 60       	ori	r24, 0x01	; 1
     8d2:	89 bf       	out	0x39, r24	; 57
TCNT0=39;//5ms
     8d4:	87 e2       	ldi	r24, 0x27	; 39
     8d6:	82 bf       	out	0x32, r24	; 50
     8d8:	08 95       	ret

000008da <OSTaskCreate>:



void OSTaskCreate(void (*Task)(void),unsigned char *Stack,unsigned char TaskID) 
{ 
     8da:	db 01       	movw	r26, r22
  unsigned char i;                      

*Stack--=(unsigned int)Task;         //将任务的地址低位压入堆栈, 
     8dc:	8c 93       	st	X, r24
*Stack--=(unsigned int)Task>>8;    //将任务的地址高位压入堆栈
     8de:	89 2f       	mov	r24, r25
     8e0:	99 27       	eor	r25, r25
     8e2:	8e 93       	st	-X, r24
  *Stack--=0x00;                     //R1 __zero_reg__             
     8e4:	1e 92       	st	-X, r1
  *Stack--=0x00;                     //R0 __tmp_reg__ 
     8e6:	1e 92       	st	-X, r1
  *Stack--=0x80;                      //psw                  
     8e8:	80 e8       	ldi	r24, 0x80	; 128
     8ea:	8e 93       	st	-X, r24
     8ec:	11 97       	sbiw	r26, 0x01	; 1
     8ee:	8d e1       	ldi	r24, 0x1D	; 29

//SREG 在任务中,开启全局中断         
  for(i=0;i<30;i++)    //在 avr-libc 中的 FAQ中的 What registers are used by the C compiler? 
    *Stack--=0;                    //描述了寄存器的作用     
     8f0:	1c 92       	st	X, r1
     8f2:	11 97       	sbiw	r26, 0x01	; 1
     8f4:	81 50       	subi	r24, 0x01	; 1
     8f6:	87 ff       	sbrs	r24, 7
     8f8:	fb cf       	rjmp	.-10     	; 0x8f0
  TCB[TaskID].OSTaskStackTop=(unsigned int)Stack;    //将人工堆栈的栈顶,保存到堆栈的数组中 但是这并不是的栈顶
     8fa:	24 2f       	mov	r18, r20
     8fc:	33 27       	eor	r19, r19
     8fe:	f9 01       	movw	r30, r18
     900:	ee 0f       	add	r30, r30
     902:	ff 1f       	adc	r31, r31
     904:	ee 0f       	add	r30, r30
     906:	ff 1f       	adc	r31, r31
     908:	e9 51       	subi	r30, 0x19	; 25
     90a:	fa 4f       	sbci	r31, 0xFA	; 250
     90c:	a0 83       	st	Z, r26
     90e:	b1 83       	std	Z+1, r27	; 0x01
  OSRdyTbl|=1<<TaskID;      //任务就绪表已经准备好 
     910:	81 e0       	ldi	r24, 0x01	; 1
     912:	90 e0       	ldi	r25, 0x00	; 0
     914:	02 c0       	rjmp	.+4      	; 0x91a
     916:	88 0f       	add	r24, r24
     918:	99 1f       	adc	r25, r25
     91a:	2a 95       	dec	r18
     91c:	e2 f7       	brpl	.-8      	; 0x916
     91e:	20 91 a1 07 	lds	r18, 0x07A1
     922:	28 2b       	or	r18, r24
     924:	20 93 a1 07 	sts	0x07A1, r18
     928:	08 95       	ret

0000092a <OSSched>:
{  
   //  根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况 

 // __asm__ __volatile__("fisrt_last_OSSched: \n\t"); 
  __asm__ __volatile__("PUSH __zero_reg__         \n\t");  //R1 
     92a:	1f 92       	push	r1
  __asm__ __volatile__("PUSH __tmp_reg__          \n\t");  //R0  
     92c:	0f 92       	push	r0
  __asm__ __volatile__("IN   __tmp_reg__,__SREG__ \n\t");  //保存状态寄存器SREG 
     92e:	0f b6       	in	r0, 0x3f	; 63
  __asm__ __volatile__("PUSH __tmp_reg__          \n\t");  //保存状态寄存器SREG 
     930:	0f 92       	push	r0
  __asm__ __volatile__("CLR  __zero_reg__         \n\t");  //R1重新清零 
     932:	11 24       	eor	r1, r1
  __asm__ __volatile__("PUSH R2                  \n\t");   
     934:	2f 92       	push	r2
  __asm__ __volatile__("PUSH R3                  \n\t"); 
     936:	3f 92       	push	r3
  __asm__ __volatile__("PUSH R4                  \n\t"); 
     938:	4f 92       	push	r4
  __asm__ __volatile__("PUSH R5                  \n\t"); 
     93a:	5f 92       	push	r5
  __asm__ __volatile__("PUSH R6                  \n\t"); 
     93c:	6f 92       	push	r6
  __asm__ __volatile__("PUSH R7                  \n\t"); 
     93e:	7f 92       	push	r7
  __asm__ __volatile__("PUSH R8                  \n\t"); 
     940:	8f 92       	push	r8
  __asm__ __volatile__("PUSH R9                  \n\t"); 
     942:	9f 92       	push	r9
  __asm__ __volatile__("PUSH R10                  \n\t"); 
     944:	af 92       	push	r10
  __asm__ __volatile__("PUSH R11                  \n\t"); 
     946:	bf 92       	push	r11
  __asm__ __volatile__("PUSH R12                  \n\t"); 
     948:	cf 92       	push	r12
  __asm__ __volatile__("PUSH R13                  \n\t");     
     94a:	df 92       	push	r13
  __asm__ __volatile__("PUSH R14                  \n\t"); 
     94c:	ef 92       	push	r14
  __asm__ __volatile__("PUSH R15                  \n\t"); 
     94e:	ff 92       	push	r15
  __asm__ __volatile__("PUSH R16                  \n\t"); 
     950:	0f 93       	push	r16
  __asm__ __volatile__("PUSH R17                  \n\t");     
     952:	1f 93       	push	r17
  __asm__ __volatile__("PUSH R18                  \n\t");  
     954:	2f 93       	push	r18
  __asm__ __volatile__("PUSH R19                  \n\t"); 
     956:	3f 93       	push	r19
  __asm__ __volatile__("PUSH R20                  \n\t"); 
     958:	4f 93       	push	r20
  __asm__ __volatile__("PUSH R21                  \n\t"); 
     95a:	5f 93       	push	r21
  __asm__ __volatile__("PUSH R22                  \n\t"); 
     95c:	6f 93       	push	r22
  __asm__ __volatile__("PUSH R23                  \n\t"); 
     95e:	7f 93       	push	r23
  __asm__ __volatile__("PUSH R24                  \n\t"); 
     960:	8f 93       	push	r24
  __asm__ __volatile__("PUSH R25                  \n\t");     
     962:	9f 93       	push	r25
  __asm__ __volatile__("PUSH R26                  \n\t"); 
     964:	af 93       	push	r26
  __asm__ __volatile__("PUSH R27                  \n\t"); 
     966:	bf 93       	push	r27
 //__asm__ __volatile__("PUSH R28                  \n\t"); 
 //__asm__ __volatile__("PUSH R29                  \n\t");     
  __asm__ __volatile__("PUSH R30                  \n\t");  
     968:	ef 93       	push	r30
  __asm__ __volatile__("PUSH R31                  \n\t");  
     96a:	ff 93       	push	r31

  __asm__ __volatile__("PUSH R28                  \n\t");  //R28与R29用于建立在堆栈上的指针 
     96c:	cf 93       	push	r28
  __asm__ __volatile__("PUSH R29                  \n\t");  //入栈完成 
     96e:	df 93       	push	r29

00000970 <Interrupt_OSSched>:
   //===========================================  
     __asm__ __volatile__("Interrupt_OSSched:              \n\t");  
 TCB[OSTaskRunningPrio].OSTaskStackTop=SP;           //将正在运行的任务的堆栈底保存 
     970:	20 91 ab 07 	lds	r18, 0x07AB
     974:	e2 2f       	mov	r30, r18
     976:	ff 27       	eor	r31, r31
     978:	ee 0f       	add	r30, r30
     97a:	ff 1f       	adc	r31, r31
     97c:	ee 0f       	add	r30, r30
     97e:	ff 1f       	adc	r31, r31
     980:	e9 51       	subi	r30, 0x19	; 25
     982:	fa 4f       	sbci	r31, 0xFA	; 250
     984:	8d b7       	in	r24, 0x3d	; 61
     986:	9e b7       	in	r25, 0x3e	; 62
     988:	80 83       	st	Z, r24
     98a:	91 83       	std	Z+1, r25	; 0x01
//=============================================
    unsigned char OSNextTaskPrio,j=0;   
     98c:	30 e0       	ldi	r19, 0x00	; 0
	OSNextTaskPrio=OSTaskRunningPrio;
	OSRdyTbl &= ~(0x01<<idle_id);//挂起os_idle task 
     98e:	80 91 a1 07 	lds	r24, 0x07A1
     992:	8e 7f       	andi	r24, 0xFE	; 254
     994:	80 93 a1 07 	sts	0x07A1, r24
	//******
next_task_id:  if(++OSNextTaskPrio>=OS_TASKS) //轮流运行各个任务,没有优先级 
     998:	2f 5f       	subi	r18, 0xFF	; 255
     99a:	22 30       	cpi	r18, 0x02	; 2
     99c:	08 f0       	brcs	.+2      	; 0x9a0
                   OSNextTaskPrio=0; 
     99e:	20 e0       	ldi	r18, 0x00	; 0
				  if(++j>OS_TASKS)  OSRdyTbl |= (0x01<<idle_id); //如果所有的任务都是挂起的,那么就进入idle
     9a0:	3f 5f       	subi	r19, 0xFF	; 255
     9a2:	33 30       	cpi	r19, 0x03	; 3
     9a4:	28 f0       	brcs	.+10     	; 0x9b0
     9a6:	80 91 a1 07 	lds	r24, 0x07A1
     9aa:	81 60       	ori	r24, 0x01	; 1
     9ac:	80 93 a1 07 	sts	0x07A1, r24
	  if(! (OSRdyTbl & (0x01<<OSNextTaskPrio)))  goto next_task_id;
     9b0:	80 91 a1 07 	lds	r24, 0x07A1
     9b4:	99 27       	eor	r25, r25
     9b6:	02 2e       	mov	r0, r18
     9b8:	02 c0       	rjmp	.+4      	; 0x9be
     9ba:	95 95       	asr	r25
     9bc:	87 95       	ror	r24
     9be:	0a 94       	dec	r0
     9c0:	e2 f7       	brpl	.-8      	; 0x9ba
     9c2:	80 ff       	sbrs	r24, 0
     9c4:	e9 cf       	rjmp	.-46     	; 0x998
//*****
 OSTaskRunningPrio=OSNextTaskPrio;
     9c6:	20 93 ab 07 	sts	0x07AB, r18
 //***********************
  cli();  //保护堆栈转换 
     9ca:	f8 94       	cli
  SP=TCB[OSTaskRunningPrio].OSTaskStackTop; 
     9cc:	80 91 ab 07 	lds	r24, 0x07AB
     9d0:	e8 2f       	mov	r30, r24
     9d2:	ff 27       	eor	r31, r31
     9d4:	ee 0f       	add	r30, r30
     9d6:	ff 1f       	adc	r31, r31
     9d8:	ee 0f       	add	r30, r30
     9da:	ff 1f       	adc	r31, r31
     9dc:	e9 51       	subi	r30, 0x19	; 25
     9de:	fa 4f       	sbci	r31, 0xFA	; 250
     9e0:	80 81       	ld	r24, Z
     9e2:	91 81       	ldd	r25, Z+1	; 0x01
     9e4:	9e bf       	out	0x3e, r25	; 62
     9e6:	8d bf       	out	0x3d, r24	; 61
  sei(); 
     9e8:	78 94       	sei
   //===========================================  
    //根据中断时的出栈次序     
  __asm__ __volatile__("POP  R29                  \n\t");     
     9ea:	df 91       	pop	r29
  __asm__ __volatile__("POP  R28                  \n\t");
     9ec:	cf 91       	pop	r28
//===============================         
  __asm__ __volatile__("POP  R31                  \n\t");     
     9ee:	ff 91       	pop	r31
  __asm__ __volatile__("POP  R30                  \n\t");     
     9f0:	ef 91       	pop	r30
  __asm__ __volatile__("POP  R27                  \n\t");     
     9f2:	bf 91       	pop	r27
  __asm__ __volatile__("POP  R26                  \n\t");     
     9f4:	af 91       	pop	r26
  __asm__ __volatile__("POP  R25                  \n\t");     
     9f6:	9f 91       	pop	r25
  __asm__ __volatile__("POP  R24                  \n\t");     
     9f8:	8f 91       	pop	r24
  __asm__ __volatile__("POP  R23                  \n\t");     
     9fa:	7f 91       	pop	r23
  __asm__ __volatile__("POP  R22                  \n\t");     
     9fc:	6f 91       	pop	r22
  __asm__ __volatile__("POP  R21                  \n\t");     
     9fe:	5f 91       	pop	r21
  __asm__ __volatile__("POP  R20                  \n\t");     
     a00:	4f 91       	pop	r20
  __asm__ __volatile__("POP  R19                  \n\t"); 
     a02:	3f 91       	pop	r19
  __asm__ __volatile__("POP  R18                  \n\t");
     a04:	2f 91       	pop	r18
  __asm__ __volatile__("POP  R17                  \n\t");   
     a06:	1f 91       	pop	r17
  __asm__ __volatile__("POP  R16                  \n\t"); 
     a08:	0f 91       	pop	r16
  __asm__ __volatile__("POP R15                  \n\t"); 
     a0a:	ff 90       	pop	r15
  __asm__ __volatile__("POP R14                  \n\t"); 
     a0c:	ef 90       	pop	r14
  __asm__ __volatile__("POP R13                  \n\t"); 
     a0e:	df 90       	pop	r13
  __asm__ __volatile__("POP R12                  \n\t"); 
     a10:	cf 90       	pop	r12
  __asm__ __volatile__("POP R11                  \n\t"); 
     a12:	bf 90       	pop	r11
  __asm__ __volatile__("POP R10                  \n\t"); 
     a14:	af 90       	pop	r10
  __asm__ __volatile__("POP R9                   \n\t"); 
     a16:	9f 90       	pop	r9
  __asm__ __volatile__("POP R8                   \n\t"); 
     a18:	8f 90       	pop	r8
  __asm__ __volatile__("POP R7                   \n\t"); 
     a1a:	7f 90       	pop	r7
  __asm__ __volatile__("POP R6                   \n\t");     
     a1c:	6f 90       	pop	r6
  __asm__ __volatile__("POP R5                   \n\t"); 
     a1e:	5f 90       	pop	r5
  __asm__ __volatile__("POP R4                   \n\t"); 
     a20:	4f 90       	pop	r4
  __asm__ __volatile__("POP R3                   \n\t"); 
     a22:	3f 90       	pop	r3
  __asm__ __volatile__("POP R2                   \n\t");      
     a24:	2f 90       	pop	r2
  __asm__ __volatile__("POP  __tmp_reg__          \n\t");      //SERG 出栈并恢复 
     a26:	0f 90       	pop	r0
  __asm__ __volatile__("OUT  __SREG__,__tmp_reg__ \n\t");      // 
     a28:	0f be       	out	0x3f, r0	; 63
  __asm__ __volatile__("POP  __tmp_reg__          \n\t");      //R0 出栈 
     a2a:	0f 90       	pop	r0
  __asm__ __volatile__("POP  __zero_reg__         \n\t");      //R1 出栈 
     a2c:	1f 90       	pop	r1
  __asm__ __volatile__("RETI                      \n\t");     //返回并开中断 
     a2e:	18 95       	reti
     a30:	08 95       	ret

00000a32 <OSStartTask>:
    
  //中断时出栈完成 
} 

//开始任务调度
void OSStartTask(uint8 id)         
{ 
OSTaskRunningPrio=id; 
     a32:	80 93 ab 07 	sts	0x07AB, r24
  SP=TCB[id].OSTaskStackTop;
     a36:	e8 2f       	mov	r30, r24
     a38:	ff 27       	eor	r31, r31
     a3a:	ee 0f       	add	r30, r30
     a3c:	ff 1f       	adc	r31, r31
     a3e:	ee 0f       	add	r30, r30
     a40:	ff 1f       	adc	r31, r31
     a42:	e9 51       	subi	r30, 0x19	; 25
     a44:	fa 4f       	sbci	r31, 0xFA	; 250
     a46:	80 81       	ld	r24, Z
     a48:	91 81       	ldd	r25, Z+1	; 0x01
     a4a:	9e bf       	out	0x3e, r25	; 62
     a4c:	8d bf       	out	0x3d, r24	; 61
__asm__ __volatile__("RJMP Interrupt_OSSched      \n\t");  //重新调度 
     a4e:	90 cf       	rjmp	.-224    	; 0x970
     a50:	08 95       	ret

00000a52 <IntSwitch>:
//调用子函数时

⌨️ 快捷键说明

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