📄 test.lss
字号:
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 + -