Важная информация

User Tag List

Страница 1 из 6 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 51

Тема: context switcher in new OS?

  1. #1
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию context switcher in new OS?

    Каким предполагается быть сабж? Типа вот такого?

    Код:
    context_switch:
     di
     push af-hl,af'-hl',ix,iy
    
     ;store sp
    
     ;select task
    
     ;load new sp
    
     pop af-hl,af'-hl',ix,iy
     ei
     ret
    А если таска решит 'отдаться' оси, ось пойдёт этим кодом другой таске время отдавать, а тут как раз прерывание придёт... Хорошо на амиге (или ещё где), где контроллер прерываний с рогами =), а на спеке? Прерывание пропускаться будет... сам с таким недавно столкнулся.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Activist Аватар для PheeL
    Регистрация
    19.01.2005
    Адрес
    Москва
    Сообщений
    333
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А если таск начал уже исполняться он сам ставит бит управления TASK_ON, чтобы прерывание его повторно не запускало (если я правильно понял о чем речь) и перескакивало дальше.
    На 8051 это вот так выглядит:
    JB TASK_ON, OFF
    CALL TASK
    OFF:
    Sinclair ZX Spectrum 128k (Toastrack) + ZX Spectrum +3 + DivMMC EnJOY
    Commodore 64c + 1541 Ultimate II
    Commodore Amiga 1200 + 8Mb Fast + CF 8Gb + GOTEK

  4. #3
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от PheeL
    А если таск начал уже исполняться он сам ставит бит управления TASK_ON, чтобы прерывание его повторно не запускало (если я правильно понял о чем речь) и перескакивало дальше.
    На 8051 это вот так выглядит:
    JB TASK_ON, OFF
    CALL TASK
    OFF:
    точнее, LCALL )

    на 8051 и семафоры выглядят просто замечательно:

    jbc lock, locked
    ;use...
    setb lock
    locked:

    а насчет добровольного пропуска- при входе в процедуру запрещаем прерывания, ставим процессу флаг "заблокирован на текущий квант",сохраняем самостоятельно контекст и переходим на вызов процедуры диспетчера внутри обработчика прерываний (тот который в первом посте нарисован). в ветке "эксперимент" я выкидывал свои сорцы, где у меня получалось подобное сделать. причем там аж две функции пропуска кванта %)

  5. #4
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    а насчет добровольного пропуска- при входе в процедуру запрещаем прерывания, ставим процессу флаг "заблокирован на текущий квант",сохраняем самостоятельно контекст и переходим на вызов процедуры диспетчера внутри обработчика прерываний (тот который в первом посте нарисован). в ветке "эксперимент" я выкидывал свои сорцы, где у меня получалось подобное сделать. причем там аж две функции пропуска кванта %)
    Дык ну и вот, в момент этого добровольного пропуска тебе приходит инт и ты его запросто пропускаешь. Вот о чём речь, а не о том, как это сделать.

  6. #5
    Activist Аватар для Alex/AT
    Регистрация
    14.03.2005
    Адрес
    Russia, Saint-Petersburg
    Сообщений
    213
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я модифицировал RTK так, чтобы он мог делать preemption. Делается замечательно, причем учитывает нахождение в ядре или в таске. Причем размер критических секций (где может теряться прерывание) всего около 40 тактов, их 4. Сегодня выложу версию 0.9.
    Последний раз редактировалось Alex/AT; 02.04.2005 в 14:45.

  7. #6
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от lvd
    Дык ну и вот, в момент этого добровольного пропуска тебе приходит инт и ты его запросто пропускаешь. Вот о чём речь, а не о том, как это сделать.
    когда приходит инт, возможны две ситуации
    -процесс вытеснится
    -процесс останется тот же самый

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

    int_routine:
    push af
    ld a,(int_flag)
    or int_comeon
    ld (int_flag),a
    and pended_interrupt
    jr nz,skip_int
    push bc
    ....
    pop bc
    skip_int:
    pop af
    ei
    ret

    ;somewhere in system
    yield
    ld a,(int_flag) ;beneath DI
    or pended_interrupt
    ld (int_flag),a
    ...

  8. #7
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    когда приходит инт, возможны две ситуации
    -процесс вытеснится
    -процесс останется тот же самый

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

    Меня волнует именно пропуск прерываний, а никак не то, что там с процессами будет. На прерываниях муза висит, и неприятно, когда она заикается.

    так что тут мы ничего не теряем.
    исключение составляет очередь процессов реального времени, обязанных выполняться по очереди каждое прерывание. для них нужно вводить специальный флаг, который будет выставляться каждое прерывание обработчиком и сниматься диспетчером по окончанию обработки той очереди. но тут есть узкое место- в предложенной ситуации пропуск прерывания означает вероятный пропуск диспетчеризации очереди процессов реального времени. как вариант, можно использовать отложенные прерывания. например:

    int_routine:
    push af
    ld a,(int_flag)
    or int_comeon
    ld (int_flag),a
    and pended_interrupt
    jr nz,skip_int
    push bc
    ....
    pop bc
    skip_int:
    pop af
    ei
    ret

    ;somewhere in system
    yield
    ld a,(int_flag) ;beneath DI
    or pended_interrupt
    ld (int_flag),a
    ...
    Вот, нагромождение на нагромождении. То память в очке 16кб, потом такое вот безобразие без контроллера прерываний. Кстати, простейший контроллер прерываний получается из половинки ТМ2, устанавливается по фронту вбланка, сбрасывается по /IORQ|/M1 =)
    Последний раз редактировалось lvd; 03.04.2005 в 00:50.

  9. #8
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от lvd
    Зачем идти в обработчик прерывания, если мы только передиспетчеризацию вызвали? Тогда не скипаться инты будут, а наоборот, ложные вызываться =)
    не вызвали. а перешли внутрь обработчика прерываний потому что там стоит вызов передиспетчеризации. а так как переход идет на вполне определенную точку, то можно вполне решить, откуда пришли- из обработчика или извне

    Цитата Сообщение от lvd
    Меня волнует именно пропуск прерываний, а никак не то, что там с процессами будет. На прерываниях муза висит, и неприятно, когда она заикается.
    в предложенной схеме такого быть не должно. максимум что может быть- сдвиг "музы" по времени от начала инта. имхо не критично

    Цитата Сообщение от lvd
    Вот, нагромождение на нагромождении. То память в очке 16кб, потом такое вот безобразие без контроллера прерываний. Кстати, простейший контроллер прерываний получается из половинки ТМ2, устанавливается по фронту вбланка, сбрасывается по /IORQ|/M1 =)
    ты считаешь что это нагромождение?! ты настоящих не видел %)
    неужели ты никогда не использовал обработчик прерывания примерно следующего вида:
    int:
    push af
    ld a,(is_music)
    and a
    jr z,nomusic
    push ...
    call 49157/49158
    pop...
    nomusic:
    pop af
    ei
    ret

    а насчет железной доработки- это уже крайний случай. потому как лезть с паяльником ради софта- никому не надо

  10. #9
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin
    в предложенной схеме такого быть не должно. максимум что может быть- сдвиг "музы" по времени от начала инта. имхо не критично
    1 - если инт придёт в момент, когда ты в аккум загрузил inf_flag, будет попа.
    2 - Вызов музы от балды со средней частотой 50гц тоже не катит =)


    ты считаешь что это нагромождение?! ты настоящих не видел %)
    неужели ты никогда не использовал обработчик прерывания примерно следующего вида:
    int:
    push af
    ld a,(is_music)
    and a
    jr z,nomusic
    push ...
    call 49157/49158
    pop...
    nomusic:
    pop af
    ei
    ret
    Юзал и юзаю, но при этом муза всегда играет в фикс. момент времени относительно начала инта и не скипается.
    А проблему я решил следующим образом: вместо call _release делаю halt:call _release. Инт, естественно, жрёт далеко не все такты.

    а насчет железной доработки- это уже крайний случай. потому как лезть с паяльником ради софта- никому не надо
    Тем не менее проблема пропуска прерываний имеет место быть.

  11. #10
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от lvd
    1 - если инт придёт в момент, когда ты в аккум загрузил inf_flag, будет попа.
    2 - Вызов музы от балды со средней частотой 50гц тоже не катит =)
    1- согласен, именно этот момент и стоит обвязать di/ei или придумать какойнить атомарный способ установки
    2- ты че представляешь обработчик прерываний для ОСи со специальной функцией типа "а тут мы будем играть музыку"?
    все вещи, которые требуют жесткой периодичности, висят на процессах реального времени. они по очереди выполняются каждое прерывание. отличие от стандартного вызова в контексте прерывания- использование не системного стека, решение проблемы реентерабельности вызова прерывания. поэтому твои опасения необоснованы %)



    Цитата Сообщение от lvd
    Юзал и юзаю, но при этом муза всегда играет в фикс. момент времени относительно начала инта и не скипается.
    А проблему я решил следующим образом: вместо call _release делаю halt:call _release. Инт, естественно, жрёт далеко не все такты.
    halt в операционной системе- варварская пустая трата драгоценных тактов %)

    Цитата Сообщение от lvd
    Тем не менее проблема пропуска прерываний имеет место быть.
    промоделируй ситуацию на предложенных мной исходах и убедись что это не так

Страница 1 из 6 12345 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •