[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Для таких задач как раз и кужен простейший task switcher.
----------------------------------------------------
прерывание по таймеру с НИЗШИМ приоритетом:
Сохранить все регистры в стеке.
if(current_task == 0)
Запретить прерывания.
Сохранить указатель стека в ячейке_0.
Прочитать указатель стека из ячейки_1.
Разрешить прерывания.
current_task = 1;else if (current_task == 1)
Запретить прерывания.
Сохранить указатель стека в ячейке_1.
Прочитать указатель стека из ячейки_2.
Разрешить прерывания.
current_task = 2;else if (current_task == 2)
...
else if (current_task == n)
Запретить прерывания.
Сохранить указатель стека в ячейке_n.
Прочитать указатель стека из ячейки_0.
Разрешить прерывания.
current_task = 0;Сохранить все регистры в стеке.
Пишется все это на ассемблере на ура.
Самое сложное - инициализация stack frame для всех задач, кроме первой.
В результате - получаешь n-задачную систему.
Функции, используемые в разных задачах, должны быть reentrant.
E-mail: info@telesys.ru