void schedule(void) { 15c: 1f 93 push r17 15e: cf 93 push r28 160: df 93 push r29 t_delay--; 162: 80 91 d2 01 lds r24, 0x01D2 166: 90 91 d3 01 lds r25, 0x01D3 16a: 01 97 sbiw r24, 0x01 ; 1 16c: 90 93 d3 01 sts 0x01D3, r25 170: 80 93 d2 01 sts 0x01D2, r24 if (t_first == T_LAST) // no timer to serve break; uint8_t first = t_first; t_first = t_ctrl_lst[first].next; // point to next t_delay = t_ctrl_lst[t_first].delta; // next delay delta t_ctrl_lst[first].next = T_FREE; // mark as free 174: 1e e1 ldi r17, 0x1E ; 30 176: 41 c0 rjmp .+130 ; 0x1fa void schedule(void) { t_delay--; while (t_delay == 0) // serve if delay = 0 { if (t_first == T_LAST) // no timer to serve 178: e0 91 d4 01 lds r30, 0x01D4 17c: ef 31 cpi r30, 0x1F ; 31 17e: 09 f4 brne .+2 ; 0x182 180: 43 c0 rjmp .+134 ; 0x208 break; uint8_t first = t_first; t_first = t_ctrl_lst[first].next; // point to next 182: ce 2f mov r28, r30 184: d0 e0 ldi r29, 0x00 ; 0 186: de 01 movw r26, r28 188: 43 e0 ldi r20, 0x03 ; 3 18a: aa 0f add r26, r26 18c: bb 1f adc r27, r27 18e: 4a 95 dec r20 190: e1 f7 brne .-8 ; 0x18a 192: ac 1b sub r26, r28 194: bd 0b sbc r27, r29 196: a0 50 subi r26, 0x00 ; 0 198: bf 4f sbci r27, 0xFF ; 255 19a: 8c 91 ld r24, X 19c: 80 93 d4 01 sts 0x01D4, r24 t_delay = t_ctrl_lst[t_first].delta; // next delay delta 1a0: 90 e0 ldi r25, 0x00 ; 0 1a2: fc 01 movw r30, r24 1a4: 33 e0 ldi r19, 0x03 ; 3 1a6: ee 0f add r30, r30 1a8: ff 1f adc r31, r31 1aa: 3a 95 dec r19 1ac: e1 f7 brne .-8 ; 0x1a6 1ae: e8 1b sub r30, r24 1b0: f9 0b sbc r31, r25 1b2: e0 50 subi r30, 0x00 ; 0 1b4: ff 4f sbci r31, 0xFF ; 255 1b6: 81 81 ldd r24, Z+1 ; 0x01 1b8: 92 81 ldd r25, Z+2 ; 0x02 1ba: 90 93 d3 01 sts 0x01D3, r25 1be: 80 93 d2 01 sts 0x01D2, r24 t_ctrl_lst[first].next = T_FREE; // mark as free 1c2: 1c 93 st X, r17 if (t_ctrl_lst[first].period) 1c4: 13 96 adiw r26, 0x03 ; 3 1c6: 4d 91 ld r20, X+ 1c8: 5c 91 ld r21, X 1ca: 14 97 sbiw r26, 0x04 ; 4 1cc: 41 15 cp r20, r1 1ce: 51 05 cpc r21, r1 1d0: 31 f0 breq .+12 ; 0x1de schedule_add(t_ctrl_lst[first].func, t_ctrl_lst[first].period, t_ctrl_lst[first].period); // add again 1d2: 15 96 adiw r26, 0x05 ; 5 1d4: 8d 91 ld r24, X+ 1d6: 9c 91 ld r25, X 1d8: 16 97 sbiw r26, 0x06 ; 6 1da: ba 01 movw r22, r20 1dc: 3f df rcall .-386 ; 0x5c t_ctrl_lst[first].func(); // execute function 1de: fe 01 movw r30, r28 1e0: 23 e0 ldi r18, 0x03 ; 3 1e2: ee 0f add r30, r30 1e4: ff 1f adc r31, r31 1e6: 2a 95 dec r18 1e8: e1 f7 brne .-8 ; 0x1e2 1ea: ec 1b sub r30, r28 1ec: fd 0b sbc r31, r29 1ee: e0 50 subi r30, 0x00 ; 0 1f0: ff 4f sbci r31, 0xFF ; 255 1f2: 05 80 ldd r0, Z+5 ; 0x05 1f4: f6 81 ldd r31, Z+6 ; 0x06 1f6: e0 2d mov r30, r0 1f8: 09 95 icall } void schedule(void) { t_delay--; while (t_delay == 0) // serve if delay = 0 1fa: 80 91 d2 01 lds r24, 0x01D2 1fe: 90 91 d3 01 lds r25, 0x01D3 202: 89 2b or r24, r25 204: 09 f4 brne .+2 ; 0x208 206: b8 cf rjmp .-144 ; 0x178 t_ctrl_lst[first].next = T_FREE; // mark as free if (t_ctrl_lst[first].period) schedule_add(t_ctrl_lst[first].func, t_ctrl_lst[first].period, t_ctrl_lst[first].period); // add again t_ctrl_lst[first].func(); // execute function } } 208: df 91 pop r29 20a: cf 91 pop r28 20c: 1f 91 pop r17 20e: 08 95 ret 00000210 : static t_ctrl_struct t_ctrl_lst[MAX_SCHEDULE]; static t_res t_delay; // count down until next service static uint8_t t_first; // point to first entry void schedule_fast(void) { 210: 0f 93 push r16 212: 1f 93 push r17 214: cf 93 push r28 216: df 93 push r29 t_delay--; 218: 80 91 d2 01 lds r24, 0x01D2 21c: 90 91 d3 01 lds r25, 0x01D3 220: 01 97 sbiw r24, 0x01 ; 1 222: 90 93 d3 01 sts 0x01D3, r25 226: 80 93 d2 01 sts 0x01D2, r24 while (t_delay == 0) // serve if delay = 0 { if (t_first == T_LAST) // no timer to serve break; t_ctrl_struct* p = &t_ctrl_lst[t_first]; // for faster access 22a: 07 e0 ldi r16, 0x07 ; 7 t_first = p->next; // point to next t_delay = t_ctrl_lst[t_first].delta; // next delay delta p->next = T_FREE; // mark as free 22c: 1e e1 ldi r17, 0x1E ; 30 22e: 2a c0 rjmp .+84 ; 0x284 void schedule_fast(void) { t_delay--; while (t_delay == 0) // serve if delay = 0 { if (t_first == T_LAST) // no timer to serve 230: 80 91 d4 01 lds r24, 0x01D4 234: 8f 31 cpi r24, 0x1F ; 31 236: 61 f1 breq .+88 ; 0x290 break; t_ctrl_struct* p = &t_ctrl_lst[t_first]; // for faster access 238: 80 9f mul r24, r16 23a: e0 01 movw r28, r0 23c: 11 24 eor r1, r1 23e: c0 50 subi r28, 0x00 ; 0 240: df 4f sbci r29, 0xFF ; 255 t_first = p->next; // point to next 242: 88 81 ld r24, Y 244: 80 93 d4 01 sts 0x01D4, r24 t_delay = t_ctrl_lst[t_first].delta; // next delay delta 248: 90 e0 ldi r25, 0x00 ; 0 24a: fc 01 movw r30, r24 24c: 53 e0 ldi r21, 0x03 ; 3 24e: ee 0f add r30, r30 250: ff 1f adc r31, r31 252: 5a 95 dec r21 254: e1 f7 brne .-8 ; 0x24e 256: e8 1b sub r30, r24 258: f9 0b sbc r31, r25 25a: e0 50 subi r30, 0x00 ; 0 25c: ff 4f sbci r31, 0xFF ; 255 25e: 81 81 ldd r24, Z+1 ; 0x01 260: 92 81 ldd r25, Z+2 ; 0x02 262: 90 93 d3 01 sts 0x01D3, r25 266: 80 93 d2 01 sts 0x01D2, r24 p->next = T_FREE; // mark as free 26a: 18 83 st Y, r17 if (p->period) 26c: 4b 81 ldd r20, Y+3 ; 0x03 26e: 5c 81 ldd r21, Y+4 ; 0x04 270: 41 15 cp r20, r1 272: 51 05 cpc r21, r1 274: 21 f0 breq .+8 ; 0x27e schedule_add(p->func, p->period, p->period); // add again 276: 8d 81 ldd r24, Y+5 ; 0x05 278: 9e 81 ldd r25, Y+6 ; 0x06 27a: ba 01 movw r22, r20 27c: ef de rcall .-546 ; 0x5c p->func(); // execute function 27e: ed 81 ldd r30, Y+5 ; 0x05 280: fe 81 ldd r31, Y+6 ; 0x06 282: 09 95 icall static uint8_t t_first; // point to first entry void schedule_fast(void) { t_delay--; while (t_delay == 0) // serve if delay = 0 284: 80 91 d2 01 lds r24, 0x01D2 288: 90 91 d3 01 lds r25, 0x01D3 28c: 89 2b or r24, r25 28e: 81 f2 breq .-96 ; 0x230 p->next = T_FREE; // mark as free if (p->period) schedule_add(p->func, p->period, p->period); // add again p->func(); // execute function } } 290: df 91 pop r29 292: cf 91 pop r28 294: 1f 91 pop r17 296: 0f 91 pop r16 298: 08 95 ret