· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› multitasking

Посл.отвђт Сообщенiе


Дата: Окт 20, 2003 01:19:05

Помогите, плиз, разобраться с организацией мультитаскинга на самом низком уровне, т.к. у меня самого уже чайник кипит :-(
Пишу я микро ОСь. Вроде бы с основными элументами почти разобрался, по крайней мере код более или менее рабочий, но вот никак не могу вникнуть в организацию вышеупомянутого.
Значит грузится ОСь с флоппа, но может и как .СОМ запускаться из под чистого доса. Переход в защищенный режим проходит нормально, инициализируется ГДТ и ИДТ, потом и прерывания включаются, все ОК, если происходит ГП, он перехватывается, высвечивается номер, пришлось даже мини дебаггер приписать, выводит регистры, запускается главная задача (бесконечный цикл) и есть еще одна маленькая задачка, которая тоже запускается, но вот тут и возникает проблема. Иногда.
1. Использую переключение на другую задачу прямым жампом по схеме:
main_task: ...
mov ax,task1_sel
mov jmptasksel,ax
jmp jmptask
...
jmp main_task
;
task1: ...
mov ax,main_sel
mov jmptasksel,ax
jmp jmptask
...
jmp task1
;
jmptask dd 0
jmptasksel dw 0
;
По этой схеме все работает отлично, параллельно обрабатываются прерывания от таимера и клавы. В общем все как надо, вроде бы.
2. Использую переключение на другую задачу во время обработки прерывания от таимера по следующей схеме:
main_task: ...
jmp main_task
;
task1: ...
jmp task1
;
int_timer: pushad
...
mov ax,XXX_sel
mov jmptasksel
popad
sti
jmp jmptask
iret
;
jmptask dd 0
jmptasksel dw 0
;
Этот механизм я взял из отсюда: "Защищенный режим процессоров Intel 80286/80386/80486" © Александр Фролов, Григорий Фролов. Код программы прилагается, сам проверял у него все работает как надо, а вот у меня не получается ...
При втором варианте переключении задач, само переключение как таковое происходит, но система вскоре виснет и я уверен в причине - затирание кода и данных стеком ...
Но вопрос как и почему это происходит и почему это происходит тока у меня, а в примере нет. По-моему внимание стоит обратить на последователькость:
jmp jmptask
iret
т.к. я ее не совсем понимаю.
Это происходит в нутри обработчика прерывания, перед этим в стек заносятся флаги и точка возврата, потом происходит переключение на другую задачу, но стек не очищается ...
Поэтому после нескольких переключениях затираются код и данны, все зависит от расположения стека и его рамера, но не это важно. Вопрос в том почему этого не происходит у Фролова? и что мне надо сделать что бы работало и у меня.

В нете я не смог найти толкового описания с примерами, лучшем чем у Фролова. Все этот момент описывают очень поверхностно.
Форум - моя последняя надежда. :-)

56805951__TinyOS.rar


Дата: Окт 20, 2003 02:16:51

Переход должен быть дальний:
jmp pword ptr [jmptask]


Дата: Окт 20, 2003 02:27:11

Black_mirror
дело не в этом, а может я ошибаюсь ...
ведь фактически (по дебаггеру видно) задачи переключаются
вот как на самом деле:
jmp fword ptr jmptask
iret
а там я упростил, дело не в синтаксисе, а в работе проца


Дата: Окт 20, 2003 03:03:17

Что засылается в jmptasksel в обработчике таймера? Если там у тебя константа, то так как обработчик прерывания общий, после первого переключения, второе переключение происходит на ту же задачу. Еще вроде ОС должна очищать в TSS занятости задачи.
И еще имей ввиду, что для каждой задачи стек должен быть свой. В принципе TSS для многозадачности не нужен. Он нужен только для обработки всяких сбоев. Можно в обработчике прерывания от таймера сохранить все регистры в стеке и выполнть переключение на другой стек. После чего востанавливаем регисты, но уже для другой задачи. Разумеется если все задачи в одном адресном пространстве.


Дата: Окт 21, 2003 07:44:22

Все, разобрался!!!!!! Уууррррраааааааааа!!!
Получилось. Проблема х-з в чем была, но я нашел пару ошибок и все сразу заработало, а то ведь думал, хана мне с этой многозадачьностью :-). Пол недели на это убил.

Black_mirror
Очищать ТСС занятости не надо, это СРУ сам делает в зависимости от типа перехода (JMP, CALL, ...).

По ходу дела, тема закрыта.
Всем спасибо за внимание. :-)