[an error occurred while processing this directive] [an error occurred while processing this directive]
Какой процессор-то, сколько ОЗУ, ПЗУ?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено некто 22 апреля 2002 г. 21:55
В ответ на: Где ставить ? отправлено proxy 22 апреля 2002 г. 16:05

Для таких задач как раз и кужен простейший 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