Board.KolibriOS.org
http://board.kolibrios.org/

Таймер
http://board.kolibrios.org/viewtopic.php?f=1&t=1307
Page 1 of 4

Author:  wolf.ram [ Fri Jul 24, 2009 11:37 pm ]
Post subject:  Таймер

Подправил в ядре работу с таймером. А точнее - сделал счетчик миллисекунд, прошедших с начала запуска, более независимым от частоты таймера. Частоту таймера можно настраивать при компиляции ядра, в файле const.inc.
Публикую сдесь, ибо как SVN-ами пользоваться не учен, а diff-ы выкладывать - так многие в винде сидят. Лучше так код выложу сюда, что менять, что удалять.

Итак, в const.inc добавляем следующие строки:
Code:
;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:
; 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:
; 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:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; IRQ0 HANDLER (TIMER INTERRUPT) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


align 32
irq0:
        pushad
        Mov     ds, ax, app_data
        mov     es, ax
        inc     [timer_ticks]

На это:
Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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 Гц виснет все)).
Кто разбирается в ядре: там ничего сильно не скосится при смене частоты?

Author:  Serge [ Sat Jul 25, 2009 6:57 am ]
Post subject:  Re: Таймер

Cкосится.

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

Author:  s1n [ Sat Jul 25, 2009 8:26 am ]
Post subject:  Re: Таймер

>а diff-ы выкладывать - так многие в винде сидят.
с каких времен diff'ы стали проблемой для венды??? или я не правильный вендузятник.. =((

Author:  imsushka [ Sat Jul 25, 2009 10:00 am ]
Post subject:  Re: Таймер

Serge wrote:
Cкосится.

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


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

Author:  Serge [ Sat Jul 25, 2009 10:22 am ]
Post subject:  Re: Таймер

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

Author:  imsushka [ Sat Jul 25, 2009 10:28 am ]
Post subject:  Re: Таймер

Serge wrote:
Quote:
прерывания по таймеру должны отрабатываться в текущем контексте
Так и происходит с аппаратным таймером, а программных таймеров в Колибри нет.
Quote:
Планировщик переключает задачи на каждом тике.
Точнее обработчик аппратного таймера на каждом тике переключает контекст
Code:
        call    find_next_task
        jz      .return  ; if there is only one running process
        call    do_change_task
  .return:
        popad
        iretd


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

Author:  wolf.ram [ Sat Jul 25, 2009 12:42 pm ]
Post subject:  Re: Таймер

Serge wrote:
Cкосится.

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

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

Author:  bw [ Sat Jul 25, 2009 1:05 pm ]
Post subject:  Re: Таймер

> када будет нормальный шедулер?
Тогда, когда ты его сделаешь :-).

..bw

Author:  imsushka [ Sat Jul 25, 2009 3:27 pm ]
Post subject:  Re: Таймер

ее я себе (в своей ОСи) не могу сделать а тут еще каким то птичкам делать :)

Author:  Ghost [ Mon Jul 27, 2009 8:04 am ]
Post subject:  Re: Таймер

wolf.ram wrote:
Хех, ну так-то смысл изменения частоты таймера был в том, чтоб сделать переключение задач чаще, а значит сделать работу системы более "мягкой". Только при этом сбивалось время, вот я и поправил этот недостаток.

От того что задачи будут переключатся чаще, мы лишь получим много впустую потраченного паразитного времени, "мягкости" не будет.

Author:  Galkov [ Wed Jul 29, 2009 3:32 pm ]
Post subject:  Re: Таймер

imsushka wrote:
када будет нормальный шедулер?

Хотелось бы услышать развернутое определение для "нормальный шедулер" :)

Author:  imsushka [ Thu Jul 30, 2009 11:16 am ]
Post subject:  Re: Таймер

Galkov wrote:
imsushka wrote:
када будет нормальный шедулер?

Хотелось бы услышать развернутое определение для "нормальный шедулер" :)

нормальный эт который не тупо переключает задчу каждый тик, а по какомунибуть алгоритму. в линуксе 4 разных алгоритма есть (или было)

Author:  Gluk [ Thu Jul 30, 2009 11:45 am ]
Post subject:  Re: Таймер

дыки переключение подряд это тоже алгоритм.

Author:  Ghost [ Thu Jul 30, 2009 12:12 pm ]
Post subject:  Re: Таймер

Quote:
...не тупо переключает задчу каждый тик, а по какомунибуть алгоритму...

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

Author:  Mario [ Sat Apr 07, 2012 4:32 am ]
Post subject:  Re: Таймер

Может в теме было зерно истины? На форуме встречал упоминание Serge о том что 100 Гц всем не хватает. Так может поднять частоту аппартного таймера до нужной, а в планировщике и в остальных местах сделать счетчики дополнительные. Или все упрется в нестабильность?

Page 1 of 4 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/