То есть надо вместо di вызывать irq_store=di()?
А вместо ei - irq_restore(irq_store)?
---------- Post added at 16:48 ---------- Previous post was at 16:44 ----------
Но если "прерывания всегда запрещены" - то зачем вообще их разрешать?
То есть надо вместо di вызывать irq_store=di()?
А вместо ei - irq_restore(irq_store)?
---------- Post added at 16:48 ---------- Previous post was at 16:44 ----------
Но если "прерывания всегда запрещены" - то зачем вообще их разрешать?
глядя на функции map_kernel() других архитектур - я вообще там чтото не вижу поигрывания прерываниями.
На других архитектурах есть возможность узнать, какая банка включена в данный момент (нужно для map_store). У нас нет, и поэтому вывод в порт и сохранение в current_map надо делать в рамках одной "критической секции". Ну и пошло-поехало.
Но, повторюсь, сейчас, когда DI нет, но всё переделано на стек, те глюки, что были, не вернулись. Поэтому и кажется, что то, что тогда di/ei что-то починили - это было всего лишь совпадением.
Я делаю так: у меня все переключаемые банки в самом теле страничек последовательно пронумерованы перед стартом ядра значением, соответствующим коду порта переключения страниц: в служебной области выше UZIXBASE кроме служебных процедур и структур типа GotoUnix, GotoExit, UDATA_STASH, еще есть байтовая ячейка с номером страницы. Когда мне надо прочитать состояние порта переключения страниц (аппаратно он только на запись), я читаю ту ячейку (позже старта никогда туда более не записывая). Соответственно, нет необходимости в лишнем DI/EI и работает на несколько тактов быстрее.![]()
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Дурацкая ошибка - https://github.com/atsidaev/FUZIX/co...3c658c0a5665bd, починил. Все программы с SfS-овского образа стартуют, никаких багов в работе не замечено. Медленно только всё.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)