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

📄 test.lss

📁 avr和small操作系统的一个测试程序
💻 LSS
📖 第 1 页 / 共 5 页
字号:
     49c:	e0 93 7d 00 	sts	0x007D, r30
     4a0:	08 95       	ret

000004a2 <SososTimer0>:
}
#endif

#if SOSOS_TASK_ENALBE == 1
void SososTimer0(void)//延时和超时处理
//本函数在定时器0的中断函数中调用,调用时中断时开着的
//用于出来处理时间片轮换和所有的延时操作
{
     4a2:	0f 93       	push	r16
     4a4:	cf 93       	push	r28
     4a6:	df 93       	push	r29
     4a8:	cd b7       	in	r28, 0x3d	; 61
     4aa:	de b7       	in	r29, 0x3e	; 62
     4ac:	26 97       	sbiw	r28, 0x06	; 6
     4ae:	0f b6       	in	r0, 0x3f	; 63
     4b0:	f8 94       	cli
     4b2:	de bf       	out	0x3e, r29	; 62
     4b4:	0f be       	out	0x3f, r0	; 63
     4b6:	cd bf       	out	0x3d, r28	; 61
 unsigned char i,j,tmpi,tmpj;
 SOSOS_TCB *point;
//超时处理
 point=TCB;
 tmpi=1;
 DISABLE_INTERRUPT();
     4b8:	f8 94       	cli
     4ba:	29 2d       	mov	r18, r9
 for(i=0;i<SOSOS_PRI_MAX;i++){
   if((SOSOS_WAIT_TASK&tmpi)==0){
     point=point+SOSOS_MAX_TASK_PER_PRI;//指向下一优先级
     tmpi=tmpi<<1;
     continue;
     }
   tmpj=1;
   SOSOS_WAIT_TASK=SOSOS_WAIT_TASK&(~tmpi);
   for(j=0;j<SOSOS_MAX_TASK_PER_PRI;j++){
     if((point->TASK_STATE>=TASK_STATE_DELAY)&&(point->TASK_STATE<TASK_STATE_SEM_TIMEOUT)){
       if(point->TASK_TIMEOUT>0){
         point->TASK_TIMEOUT--;
         if(point->TASK_TIMEOUT==0){
           SOSOS_TASK_READY[i]=SOSOS_TASK_READY[i]|tmpj;
           if(point->TASK_STATE>TASK_STATE_DELAY)
             point->TASK_STATE=point->TASK_STATE+TASK_STATE_TIMEOUT_OFFSET;
           else
             point->TASK_STATE=TASK_STATE_OK;
#if SOSOS_MUTEX_ENABLE == 1
           if(SOSOS_RUNNING_INHERIT_PRI>i){
     4bc:	06 2d       	mov	r16, r6
     4be:	31 e0       	ldi	r19, 0x01	; 1
     4c0:	40 e8       	ldi	r20, 0x80	; 128
     4c2:	50 e0       	ldi	r21, 0x00	; 0
     4c4:	60 e0       	ldi	r22, 0x00	; 0
     4c6:	70 e0       	ldi	r23, 0x00	; 0
     4c8:	8a e7       	ldi	r24, 0x7A	; 122
     4ca:	90 e0       	ldi	r25, 0x00	; 0
     4cc:	9e 83       	std	Y+6, r25	; 0x06
     4ce:	8d 83       	std	Y+5, r24	; 0x05
     4d0:	82 2f       	mov	r24, r18
     4d2:	83 23       	and	r24, r19
     4d4:	b9 f1       	breq	.+110    	; 0x544 <SososTimer0+0xa2>
     4d6:	83 2f       	mov	r24, r19
     4d8:	80 95       	com	r24
     4da:	28 23       	and	r18, r24
     4dc:	da 01       	movw	r26, r20
     4de:	1a 82       	std	Y+2, r1	; 0x02
     4e0:	91 e0       	ldi	r25, 0x01	; 1
     4e2:	99 83       	std	Y+1, r25	; 0x01
     4e4:	ed 81       	ldd	r30, Y+5	; 0x05
     4e6:	fe 81       	ldd	r31, Y+6	; 0x06
     4e8:	fc 83       	std	Y+4, r31	; 0x04
     4ea:	eb 83       	std	Y+3, r30	; 0x03
     4ec:	fd 01       	movw	r30, r26
     4ee:	96 81       	ldd	r25, Z+6	; 0x06
     4f0:	89 2f       	mov	r24, r25
     4f2:	80 51       	subi	r24, 0x10	; 16
     4f4:	81 37       	cpi	r24, 0x71	; 113
     4f6:	e0 f4       	brcc	.+56     	; 0x530 <SososTimer0+0x8e>
     4f8:	81 85       	ldd	r24, Z+9	; 0x09
     4fa:	88 23       	and	r24, r24
     4fc:	c9 f0       	breq	.+50     	; 0x530 <SososTimer0+0x8e>
     4fe:	81 50       	subi	r24, 0x01	; 1
     500:	81 87       	std	Z+9, r24	; 0x09
     502:	88 23       	and	r24, r24
     504:	a1 f4       	brne	.+40     	; 0x52e <SososTimer0+0x8c>
     506:	eb 81       	ldd	r30, Y+3	; 0x03
     508:	fc 81       	ldd	r31, Y+4	; 0x04
     50a:	80 81       	ld	r24, Z
     50c:	f9 81       	ldd	r31, Y+1	; 0x01
     50e:	8f 2b       	or	r24, r31
     510:	eb 81       	ldd	r30, Y+3	; 0x03
     512:	fc 81       	ldd	r31, Y+4	; 0x04
     514:	80 83       	st	Z, r24
     516:	91 31       	cpi	r25, 0x11	; 17
     518:	20 f0       	brcs	.+8      	; 0x522 <SososTimer0+0x80>
     51a:	90 59       	subi	r25, 0x90	; 144
     51c:	fd 01       	movw	r30, r26
     51e:	96 83       	std	Z+6, r25	; 0x06
     520:	02 c0       	rjmp	.+4      	; 0x526 <SososTimer0+0x84>
     522:	fd 01       	movw	r30, r26
     524:	16 82       	std	Z+6, r1	; 0x06
     526:	60 17       	cp	r22, r16
     528:	18 f4       	brcc	.+6      	; 0x530 <SososTimer0+0x8e>
#else
           if(SOSOS_RUNNING_TASK_PRI>i){
#endif
             set_bit(SOSOS_STATE,STATE_SCHED_REQ);
     52a:	11 60       	ori	r17, 0x01	; 1
     52c:	01 c0       	rjmp	.+2      	; 0x530 <SososTimer0+0x8e>
             }
           }
         else
           SOSOS_WAIT_TASK=SOSOS_WAIT_TASK|tmpi;
     52e:	23 2b       	or	r18, r19
         }
       }
     tmpj=tmpj<<1;
     point++;
     530:	1a 96       	adiw	r26, 0x0a	; 10
     532:	fa 81       	ldd	r31, Y+2	; 0x02
     534:	ff 5f       	subi	r31, 0xFF	; 255
     536:	fa 83       	std	Y+2, r31	; 0x02
     538:	f2 30       	cpi	r31, 0x02	; 2
     53a:	21 f0       	breq	.+8      	; 0x544 <SososTimer0+0xa2>
     53c:	89 81       	ldd	r24, Y+1	; 0x01
     53e:	88 0f       	add	r24, r24
     540:	89 83       	std	Y+1, r24	; 0x01
     542:	d4 cf       	rjmp	.-88     	; 0x4ec <SososTimer0+0x4a>
     544:	4c 5e       	subi	r20, 0xEC	; 236
     546:	5f 4f       	sbci	r21, 0xFF	; 255
     }
   tmpi=tmpi<<1;
     548:	33 0f       	add	r19, r19
     54a:	6f 5f       	subi	r22, 0xFF	; 255
     54c:	7f 4f       	sbci	r23, 0xFF	; 255
     54e:	ed 81       	ldd	r30, Y+5	; 0x05
     550:	fe 81       	ldd	r31, Y+6	; 0x06
     552:	31 96       	adiw	r30, 0x01	; 1
     554:	fe 83       	std	Y+6, r31	; 0x06
     556:	ed 83       	std	Y+5, r30	; 0x05
     558:	63 30       	cpi	r22, 0x03	; 3
     55a:	71 05       	cpc	r23, r1
     55c:	09 f0       	breq	.+2      	; 0x560 <SososTimer0+0xbe>
     55e:	b8 cf       	rjmp	.-144    	; 0x4d0 <SososTimer0+0x2e>
     560:	92 2e       	mov	r9, r18
   }
//时间片轮换处理
 if((++SOSOS_TIMESLICE)>=SYS_TIMESLICE){
     562:	88 2d       	mov	r24, r8
     564:	8f 5f       	subi	r24, 0xFF	; 255
     566:	88 2e       	mov	r8, r24
     568:	51 f0       	breq	.+20     	; 0x57e <SososTimer0+0xdc>
   SOSOS_TIMESLICE=0;
     56a:	88 24       	eor	r8, r8
#if SOSOS_MUTEX_ENABLE == 1
   if((SOSOS_RUNNING_INHERIT_PRI==SOSOS_RUNNING_TASK_PRI)&&(SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]!=SOSOS_RUNNING_TASK_ID_INDEX))
     56c:	0a 15       	cp	r16, r10
     56e:	39 f4       	brne	.+14     	; 0x57e <SososTimer0+0xdc>
     570:	e0 2f       	mov	r30, r16
     572:	ff 27       	eor	r31, r31
     574:	e6 58       	subi	r30, 0x86	; 134
     576:	ff 4f       	sbci	r31, 0xFF	; 255
     578:	80 81       	ld	r24, Z
     57a:	8c 11       	cpse	r24, r12
#else
   if(SOSOS_TASK_READY[SOSOS_RUNNING_TASK_PRI]!=SOSOS_RUNNING_TASK_ID_INDEX)
#endif
     set_bit(SOSOS_STATE,STATE_SCHED_REQ);
     57c:	11 60       	ori	r17, 0x01	; 1
     57e:	26 96       	adiw	r28, 0x06	; 6
     580:	0f b6       	in	r0, 0x3f	; 63
     582:	f8 94       	cli
     584:	de bf       	out	0x3e, r29	; 62
     586:	0f be       	out	0x3f, r0	; 63
     588:	cd bf       	out	0x3d, r28	; 61
     58a:	df 91       	pop	r29
     58c:	cf 91       	pop	r28
     58e:	0f 91       	pop	r16
     590:	08 95       	ret

00000592 <SososSched>:
   }
}
#endif

#if SOSOS_TASK_ENALBE == 1
void SososSched (void) __attribute__ ((naked));//任务调度
void SososSched(void)//任务调度
//本函数是任务调度的核心函数,提供优先级继承的调度支持,进入时中断应该是关闭的
{
  __asm__ __volatile__("POP __tmp_reg__ \n\t");
     592:	0f 90       	pop	r0
  __asm__ __volatile__("POP __tmp_reg__ \n\t");
     594:	0f 90       	pop	r0

 set_bit(SOSOS_STATE,STATE_SCHED_RUN);
     596:	81 2f       	mov	r24, r17
     598:	82 60       	ori	r24, 0x02	; 2
     59a:	18 2f       	mov	r17, r24
 ENABLE_INTERRUPT();
     59c:	78 94       	sei
#if SOSOS_WDT_ENABLE == 1
//看门狗
 SOSOS_WDT_RST();//复位看门狗
#else
 __asm__ __volatile__("NOP \n\t");
     59e:	00 00       	nop
#endif
 DISABLE_INTERRUPT();
     5a0:	f8 94       	cli

 SOSOS_STATE=SOSOS_STATE&(~((1<<STATE_SCHED_RUN)|(1<<STATE_SCHED_REQ)));
     5a2:	1c 7f       	andi	r17, 0xFC	; 252
     5a4:	3a 2d       	mov	r19, r10
     5a6:	2c 2d       	mov	r18, r12

 unsigned char i,j,SOSOS_TMP;

//任务调度
 for(i=0;i<SOSOS_PRI_MAX;i++){
   if(SOSOS_TASK_READY[i]==0)
     continue;
   if(SOSOS_RUNNING_TASK_PRI==i){
     SOSOS_TMP=SOSOS_TASK_READY[i]&(~SOSOS_RUNNING_TASK_ID_INDEX);
     if(SOSOS_TMP==0)
       goto SososSchedEnd;

     if(SOSOS_TMP>SOSOS_RUNNING_TASK_ID_INDEX){
       SOSOS_TMP=SOSOS_RUNNING_TASK_ID+1;
     5a8:	6b 2d       	mov	r22, r11
     5aa:	6f 5f       	subi	r22, 0xFF	; 255
     5ac:	40 e0       	ldi	r20, 0x00	; 0
     5ae:	50 e0       	ldi	r21, 0x00	; 0
     5b0:	aa e7       	ldi	r26, 0x7A	; 122
     5b2:	b0 e0       	ldi	r27, 0x00	; 0
     5b4:	8c 91       	ld	r24, X
     5b6:	88 23       	and	r24, r24
     5b8:	d1 f0       	breq	.+52     	; 0x5ee <SososSched+0x5c>
     5ba:	34 17       	cp	r19, r20
     5bc:	11 f0       	breq	.+4      	; 0x5c2 <SososSched+0x30>
     5be:	34 2f       	mov	r19, r20
     5c0:	07 c0       	rjmp	.+14     	; 0x5d0 <SososSched+0x3e>
     5c2:	9c 91       	ld	r25, X
     5c4:	82 2f       	mov	r24, r18
     5c6:	80 95       	com	r24
     5c8:	98 23       	and	r25, r24
     5ca:	e1 f0       	breq	.+56     	; 0x604 <SososSched+0x72>
     5cc:	29 17       	cp	r18, r25
     5ce:	18 f0       	brcs	.+6      	; 0x5d6 <SososSched+0x44>
     5d0:	80 e0       	ldi	r24, 0x00	; 0
     5d2:	21 e0       	ldi	r18, 0x01	; 1
     5d4:	02 c0       	rjmp	.+4      	; 0x5da <SososSched+0x48>
       SOSOS_RUNNING_TASK_ID_INDEX=SOSOS_RUNNING_TASK_ID_INDEX<<1;
     5d6:	22 0f       	add	r18, r18
     5d8:	86 2f       	mov	r24, r22
     5da:	98 2f       	mov	r25, r24
     5dc:	fd 01       	movw	r30, r26
     5de:	05 c0       	rjmp	.+10     	; 0x5ea <SososSched+0x58>
       }
     else{
       SOSOS_TMP=0;
       SOSOS_RUNNING_TASK_ID_INDEX=1;
       }
     }
   else{
     SOSOS_RUNNING_TASK_PRI=i;
     SOSOS_TMP=0;
     SOSOS_RUNNING_TASK_ID_INDEX=1;
     }

   for(j=SOSOS_TMP;j<SOSOS_MAX_TASK_PER_PRI;j++){
     if((SOSOS_TASK_READY[i]&SOSOS_RUNNING_TASK_ID_INDEX)!=0){
     5e0:	80 81       	ld	r24, Z
     5e2:	82 23       	and	r24, r18
     5e4:	59 f4       	brne	.+22     	; 0x5fc <SososSched+0x6a>
       SOSOS_RUNNING_TASK_ID=j;
       goto SososSchedEnd;
       }
     else
       SOSOS_RUNNING_TASK_ID_INDEX=SOSOS_RUNNING_TASK_ID_INDEX<<1;
     5e6:	22 0f       	add	r18, r18
     5e8:	9f 5f       	subi	r25, 0xFF	; 255
     5ea:	92 30       	cpi	r25, 0x02	; 2
     5ec:	c8 f3       	brcs	.-14     	; 0x5e0 <SososSched+0x4e>
     5ee:	4f 5f       	subi	r20, 0xFF	; 255
     5f0:	5f 4f       	sbci	r21, 0xFF	; 255
     5f2:	11 96       	adiw	r26, 0x01	; 1
     5f4:	43 30       	cpi	r20, 0x03	; 3
     5f6:	51 05       	cpc	r21, r1
     5f8:	e9 f6       	brne	.-70     	; 0x5b4 <SososSched+0x22>
     5fa:	04 c0       	rjmp	.+8      	; 0x604 <SososSched+0x72>
     5fc:	a3 2e       	mov	r10, r19
     5fe:	c2 2e       	mov	r12, r18
     600:	b9 2e       	mov	r11, r25
     602:	02 c0       	rjmp	.+4      	; 0x608 <SososSched+0x76>
     604:	a3 2e       	mov	r10, r19
     606:	c2 2e       	mov	r12, r18
     }
   }

SososSchedEnd:
#if SOSOS_MUTEX_ENABLE == 1
 SOSOS_RUNNING_INHERIT_PRI=SOSOS_RUNNING_TASK_PRI;
     608:	6a 2c       	mov	r6, r10
 if(SOSOS_MUTEX_POINT!=0){//互斥型信号量队列有成员
     60a:	a0 91 c1 00 	lds	r26, 0x00C1
     60e:	b0 91 c2 00 	lds	r27, 0x00C2
     612:	10 97       	sbiw	r26, 0x00	; 0
     614:	49 f1       	breq	.+82     	; 0x668 <SososSched+0xd6>
     616:	c1 e0       	ldi	r28, 0x01	; 1
     618:	d0 e0       	ldi	r29, 0x00	; 0
   SOSOS_MUTEX * mutex;

   mutex=SOSOS_MUTEX_POINT;
   while(mutex!=0){
     if((mutex->INHERIT_PRI)>SOSOS_RUNNING_TASK_PRI){
     61a:	fd 01       	movw	r30, r26
     61c:	62 81       	ldd	r22, Z+2	; 0x02
     61e:	a6 16       	cp	r10, r22
     620:	18 f1       	brcs	.+70     	; 0x668 <SososSched+0xd6>
       break;
       }
     else{
       if(test_1(SOSOS_TASK_READY[mutex->OWN_TASK_PRI],mutex->OWN_TASK_ID)){
     622:	53 81       	ldd	r21, Z+3	; 0x03
     624:	e5 2f       	mov	r30, r21
     626:	ff 27       	eor	r31, r31
     628:	e6 58       	subi	r30, 0x86	; 134
     62a:	ff 4f       	sbci	r31, 0xFF	; 255
     62c:	80 81       	ld	r24, Z
     62e:	99 27       	eor	r25, r25
     630:	fd 01       	movw	r30, r26
     632:	44 81       	ldd	r20, Z+4	; 0x04
     634:	24 2f       	mov	r18, r20
     636:	33 27       	eor	r19, r19
     638:	02 2e       	mov	r0, r18
     63a:	02 c0       	rjmp	.+4      	; 0x640 <SososSched+0xae>
     63c:	95 95       	asr	r25
     63e:	87 95       	ror	r24
     640:	0a 94       	dec	r0
     642:	e2 f7       	brpl	.-8      	; 0x63c <SososSched+0xaa>
     644:	80 ff       	sbrs	r24, 0
     646:	0a c0       	rjmp	.+20     	; 0x65c <SososSched+0xca>

⌨️ 快捷键说明

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