Projekte
workwind
Multitasking 1
scheduler.S
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
Multitasking 1
cdll.c
cdll.h
main.c
scheduler.S
thread.c
thread.h
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7416 private projects
378 public projects
16172649 lines compiled
58122 builds
NIBO
@
multitasking_1/scheduler.S [read only]
#include <avr/io.h> /* Context: register | sp[] ---------+------ PC lo | 38 PC hi | 37 ---------+------ r0 | 36 SREG | 35 RAMPZ | 34 MCUCR | 33 ---------+------ r31 | 32 r30 | 31 r29 | 30 r28 | 29 r27 | 28 r26 | 27 r25 | 26 r24 | 25 r23 | 24 r22 | 23 r21 | 22 r20 | 21 r19 | 20 r18 | 19 r17 | 18 r16 | 17 r15 | 16 r14 | 15 r13 | 14 r12 | 13 r11 | 12 r10 | 11 r9 | 10 r8 | 9 r7 | 8 r6 | 7 r5 | 6 r4 | 5 r3 | 4 r2 | 3 r1 | 2 ---------+------ status | 1 ---------+------ */ #define SCHEDULER_IS_IDLE 0 #define SCHEDULER_HAS_NEXT 1 #define SCHEDULER_FROM_IRQ 2 #define SCHEDULER_TIMER 3 .section .text .global scheduler_yield .global scheduler_irq .global scheduler_timer .global scheduler_idle .extern scheduler_status /* uint8_t thread_selectNext(uint8_t status); */ /* uint8_t thread_handleTimer(uint8_t status); */ .extern thread_selectNext .extern thread_handleTimer scheduler_idle: sleep; rjmp scheduler_idle; // timer interrupt function (called directly or by jmp) // stack must only contain the return address scheduler_timer: push r0 in r0, _SFR_IO_ADDR(SREG) push r0 set // T-Flag setzen da wir vom Timer Interrupt aufgerufen wurden! jmp scheduler_skip_sreg // called from thread_xxx() funktion (called by jsr) // stack must only contain the return address scheduler_irq: scheduler_yield: push r0 in r0, _SFR_IO_ADDR(SREG) push r0 clt // T-Flag loeschen, da wir _nicht_ vom Timer Interrupt aufgerufen wurden... scheduler_skip_sreg: in r0, _SFR_IO_ADDR(RAMPZ) push r0 in r0, _SFR_IO_ADDR(MCUCR) push r0 push r31 push r30 push r29 push r28 push r27 push r26 push r25 push r24 push r23 push r22 push r21 push r20 push r19 push r18 push r17 push r16 push r15 push r14 push r13 push r12 push r11 push r10 push r9 push r8 push r7 push r6 push r5 push r4 push r3 push r2 push r1 store_stackpointer: lds r30, running_thread+0 lds r31, running_thread+1 in r16, _SFR_IO_ADDR(SPL) in r17, _SFR_IO_ADDR(SPH) std Z+10, r16 std Z+11, r17 call_handleTimer: brtc call_selectNext call thread_handleTimer call_selectNext: call thread_selectNext /* now we should switch the running_thread... */ switch_task: lds r30, next_thread+0 lds r31, next_thread+1 sts running_thread+0, r30 sts running_thread+1, r31 restore_stackpointer: /* r30 and r31 are already loaded */ ldd r16, Z+10 ldd r17, Z+11 out _SFR_IO_ADDR(SPL), r16 out _SFR_IO_ADDR(SPH), r17 restore_context: pop r1 pop r2 pop r3 pop r4 pop r5 pop r6 pop r7 pop r8 pop r9 pop r10 pop r11 pop r12 pop r13 pop r14 pop r15 pop r16 pop r17 pop r18 pop r19 pop r20 pop r21 pop r22 pop r23 pop r24 pop r25 pop r26 pop r27 pop r28 pop r29 pop r30 pop r31 pop r0 out _SFR_IO_ADDR(MCUCR), r0 pop r0 out _SFR_IO_ADDR(RAMPZ), r0 pop r0 out _SFR_IO_ADDR(SREG), r0 pop r0 reti
Compiler results:
Werbung
Online
brandi20b03191419
carollamson4653652
dustinbaldridge38
jeffryaiello27385282
kinay25036512297240
KylieSat
nilawhitelaw039161899
noelgerste704576016
orlandomckenzie895
reneedillon5507
rongair39316288
shannanbury30913456
willygoldie91317