Смотрел,хорошая оська,незнаю как насчет фунциональности,так как глубоко не копал,
но написано стильно и понравились кое какие нестандартные приемы,в частности реализация косвенного перехода на подпрограмму (задачу) с маневрами со стеком и т.д.
Оказывается не только я такой "экстремал-извращенец",
хотя конечно вот это необязательно было делать
Код
____INIT_THREAD_CONTEXT:
std Y+CONST_THREAD_CONTEXT_SIZE+3,r24;save SPL
std Y+CONST_THREAD_CONTEXT_SIZE+2,r25;save SPH
std Y+CONST_THREAD_CONTEXT_SIZE+1,REG_OS_TEMP;save SREG
std Z+CONST_THREAD_AMOUNT,Yh
st Z+,Yl
adiw Y,CONST_THREAD_MEM_SIZE
RET
;------------------------------------------------
std Y+CONST_THREAD_CONTEXT_SIZE+3,r24;save SPL
std Y+CONST_THREAD_CONTEXT_SIZE+2,r25;save SPH
std Y+CONST_THREAD_CONTEXT_SIZE+1,REG_OS_TEMP;save SREG
std Z+CONST_THREAD_AMOUNT,Yh
st Z+,Yl
adiw Y,CONST_THREAD_MEM_SIZE
RET
;------------------------------------------------
Для этого есть такая рееедко применяемая ,но всетаки существующая команда косвенного перехода на подпрограмму по Z icall .

Скажу чесно,оси никогда не цеплял,так как считаю что асм потеряет свои преимущества перед другими языками при ее применении.
Но своебразную многозадачность реализовывал.Сами знаете ,частенько на асме проги небольшие выходят .Вот и захотельсь мне зделать многофункциональный девайс ,тоесть впихнуть несколько программ (которые были уже написаны) в один контроллер.
Я не навязываю свой способ ,но я думаю будет интересен.Раскажу вкратце.
1 Заместь векторов в таблице указываем вызов планировщика
Например заместь
rjmp PROG
rjmp INT0
rjmp INT1
.....
Пишем
rcall PLAN_START
rcall PLAN
rcall PLAN
.....
Я думаю догадались для чего заместь rjmp стоит rcall



2 К этому адрессу плюсуем адрес начала векторов прерываний одной из программ который выбрал планировщик ,подвигаем стек,и переходим на вектор,ну а дальше как обычно.
3 Естественно в PLAN_START обнуляем память до RAMEND-1 ,последняя ячейка у нас для выбора программы,ну и т.д.
Вот такие извращения.

Что нам это дает?
Можно просто тупо соединять несколько программ,с сохранением абсолютно ВСЕХ прерываний для каждой программы без каких либо переделок,все что нужно если хотим программно перепрыгивать из одной программы в другую - дописать в нужном месте номер проги в последнюю ячейку и call PLAN_START


