Page 1 of 4

Таймер

Posted: Fri Jul 24, 2009 11:37 pm
by wolf.ram
Подправил в ядре работу с таймером. А точнее - сделал счетчик миллисекунд, прошедших с начала запуска, более независимым от частоты таймера. Частоту таймера можно настраивать при компиляции ядра, в файле const.inc.
Публикую сдесь, ибо как SVN-ами пользоваться не учен, а diff-ы выкладывать - так многие в винде сидят. Лучше так код выложу сюда, что менять, что удалять.

Итак, в const.inc добавляем следующие строки:

Code: Select all

;Don't set hight values on slow machines\emulators!
TIMER_FREQ		equ		250	; From 20 to ...
TIMER_SCALE		equ		10000 ; or 1000, etc...
В файле kernel.asm заменяем(строка 564) это:

Code: Select all

; TIMER SET TO 1/100 S

        mov   al,0x34              ; set to 100Hz
        out   0x43,al
        mov   al,0x9b              ; lsb    1193180 / 1193
        out   0x40,al
        mov   al,0x2e              ; msb
        out   0x40,al
На это:

Code: Select all

; TIMER SET TO 1/TIMER_FREQ S

        mov   al,0x34
        out   0x43,al
        mov   al, (((1193180 / TIMER_FREQ) and 0x00ff))
        out   0x40,al
        mov   al, (((1193180 / TIMER_FREQ) shr 8) and 0x00ff)
        out   0x40,al
А в файле core/sched.inc заменяем это:

Code: Select all

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; IRQ0 HANDLER (TIMER INTERRUPT) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


align 32
irq0:
        pushad
        Mov     ds, ax, app_data
        mov     es, ax
        inc     [timer_ticks]
На это:

Code: Select all

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; IRQ0 HANDLER (TIMER INTERRUPT) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

timer_frequency		dd	TIMER_FREQ ; Need for ``div''
timer_scale         dd  TIMER_SCALE
timer_accumulator	dd	0

align 32
irq0:
        pushad
        Mov     ds, ax, app_data
        mov     es, ax
        
        mov     eax, 100 * TIMER_SCALE
        xor     edx, edx
        div     [timer_frequency]
        
        add     eax, edx
        add     eax, [timer_accumulator]
        cmp     eax, TIMER_SCALE
        jb      .notick
        
        xor     edx, edx
        div     [timer_scale]
        add     [timer_ticks], eax
        xchg    eax, edx        

    .notick:
        mov     [timer_accumulator], eax
Дальше все то же.

Вроде часы идут ровно, программы тоже работают(таймер сапера) при любой частоте(тестил от 20 то 1000 Гц(На VBox, на qemu при частоте, большей 350 Гц виснет все)).
Кто разбирается в ядре: там ничего сильно не скосится при смене частоты?

Re: Таймер

Posted: Sat Jul 25, 2009 6:57 am
by Serge
Cкосится.

Планировщик переключает задачи на каждом тике.
Почему ? Надо спросить у Вилле.

Re: Таймер

Posted: Sat Jul 25, 2009 8:26 am
by s1n
>а diff-ы выкладывать - так многие в винде сидят.
с каких времен diff'ы стали проблемой для венды??? или я не правильный вендузятник.. =((

Re: Таймер

Posted: Sat Jul 25, 2009 10:00 am
by imsushka
Serge wrote:Cкосится.

Планировщик переключает задачи на каждом тике.
Почему ? Надо спросить у Вилле.
смысл переключать задачу на каждом тике?????
ни где так не делается
прерывания по таймеру должны отрабатываться в текущем коетексте

Re: Таймер

Posted: Sat Jul 25, 2009 10:22 am
by Serge
прерывания по таймеру должны отрабатываться в текущем контексте
Так и происходит с аппаратным таймером, а программных таймеров в Колибри нет.
Планировщик переключает задачи на каждом тике.
Точнее обработчик аппратного таймера на каждом тике переключает контекст

Code: Select all

        call    find_next_task
        jz      .return  ; if there is only one running process
        call    do_change_task
  .return:
        popad
        iretd

Re: Таймер

Posted: Sat Jul 25, 2009 10:28 am
by imsushka
Serge wrote:
прерывания по таймеру должны отрабатываться в текущем контексте
Так и происходит с аппаратным таймером, а программных таймеров в Колибри нет.
Планировщик переключает задачи на каждом тике.
Точнее обработчик аппратного таймера на каждом тике переключает контекст

Code: Select all

        call    find_next_task
        jz      .return  ; if there is only one running process
        call    do_change_task
  .return:
        popad
        iretd
ну получается что планировщика как токового нет
идет тупое переключение задач
када будет нормальный шедулер?

Re: Таймер

Posted: Sat Jul 25, 2009 12:42 pm
by wolf.ram
Serge wrote:Cкосится.

Планировщик переключает задачи на каждом тике.
Почему ? Надо спросить у Вилле.
Хех, ну так-то смысл изменения частоты таймера был в том, чтоб сделать переключение задач чаще, а значит сделать работу системы более "мягкой". Только при этом сбивалось время, вот я и поправил этот недостаток.

Re: Таймер

Posted: Sat Jul 25, 2009 1:05 pm
by bw
> када будет нормальный шедулер?
Тогда, когда ты его сделаешь :-).

..bw

Re: Таймер

Posted: Sat Jul 25, 2009 3:27 pm
by imsushka
ее я себе (в своей ОСи) не могу сделать а тут еще каким то птичкам делать :)

Re: Таймер

Posted: Mon Jul 27, 2009 8:04 am
by Ghost
wolf.ram wrote:Хех, ну так-то смысл изменения частоты таймера был в том, чтоб сделать переключение задач чаще, а значит сделать работу системы более "мягкой". Только при этом сбивалось время, вот я и поправил этот недостаток.
От того что задачи будут переключатся чаще, мы лишь получим много впустую потраченного паразитного времени, "мягкости" не будет.

Re: Таймер

Posted: Wed Jul 29, 2009 3:32 pm
by Galkov
imsushka wrote:када будет нормальный шедулер?
Хотелось бы услышать развернутое определение для "нормальный шедулер" :)

Re: Таймер

Posted: Thu Jul 30, 2009 11:16 am
by imsushka
Galkov wrote:
imsushka wrote:када будет нормальный шедулер?
Хотелось бы услышать развернутое определение для "нормальный шедулер" :)
нормальный эт который не тупо переключает задчу каждый тик, а по какомунибуть алгоритму. в линуксе 4 разных алгоритма есть (или было)

Re: Таймер

Posted: Thu Jul 30, 2009 11:45 am
by Gluk
дыки переключение подряд это тоже алгоритм.

Re: Таймер

Posted: Thu Jul 30, 2009 12:12 pm
by Ghost
...не тупо переключает задчу каждый тик, а по какомунибуть алгоритму...
Видится мне здесь идея ради идеи.
Алгоритмов менеджера задачь много (а с вариациями оооочень много), и каждый хорошо работает для своей задачи, для других задачь он плох. Под линукс может официальных 4 а сколько тестовых, сделаных из академического интереса, их сотни, но собирая дома вам вообще пофиг как там задачи переключаются.
Так как понимание автора не прослеживается это пустая тема.

Re: Таймер

Posted: Sat Apr 07, 2012 4:32 am
by Mario
Может в теме было зерно истины? На форуме встречал упоминание Serge о том что 100 Гц всем не хватает. Так может поднять частоту аппартного таймера до нужной, а в планировщике и в остальных местах сделать счетчики дополнительные. Или все упрется в нестабильность?