User Tag List

Страница 113 из 113 ПерваяПервая ... 109110111112113
Показано с 1,121 по 1,128 из 1128

Тема: ЭТЮДЫ

  1. #1121

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Для однократного вызова процедуры можно глушить ретурном.
    Это все не рабочее, просто проверяй предположением что допустим прерывание пришло после первой комманды. Эти локи с комбинациями с di такое себе.

    Цитата Сообщение от Reobne Посмотреть сообщение
    Может изначально в ячейке ложить единицу
    а вот это я точно использую, уменьшает начальную проверку. и b грузить не надо

    - - - Добавлено - - -

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

    Этот пользователь поблагодарил krt17 за это полезное сообщение:

    Reobne(08.09.2025)

  2. #1122

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    Это все не рабочее, просто проверяй предположением что допустим прерывание пришло после первой комманды. Эти локи с комбинациями с di такое себе.
    Пардон не понял, что процедуру планируется применять ещё и в обслуживании прерывания.

  3. #1123

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  4. #1124

    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,691
    Спасибо Благодарностей отдано 
    302
    Спасибо Благодарностей получено 
    223
    Поблагодарили
    159 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А если в начале процедуры модифицировать первый байт как ret, и в конце - возвращать в nop?
    Тогда всегда сможет работать только одна.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  5. #1125

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    А если в начале процедуры модифицировать первый байт как ret, и в конце - возвращать в nop?
    Тогда всегда сможет работать только одна.
    в общем случае лок отдельной процедуры это пол задачи, чаще нужно лочить данные. В этом случае все становится сложнее, выделение области для переменных на стеке или вообще без переменных в памяти. грубо говоря есть процедура удаления элемента списка и добавления, если удалять в основном цикле а добавлять в прерывании (дизайн не очень согласен, но списки разные бывают, допустим список с нажатыми клавишами) возможны нарушения данных. как то так. Возможно пересмотрю подход, я просто вернулся к https://vtrd.in/release.php?r=f60879...2e1f79f01055fc и мне понадобились некоторые базовые вещи, по классике не охота, а по другому пока не умею.

  6. #1126

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,821
    Спасибо Благодарностей отдано 
    273
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Может неправильно понял задачу, но если правильно - то делал разделённым счётом.
    Var1 - где-то там в основном цикле инкреминтируется
    Var2 - в контрольной процедуре (которую нужно ограничивать) держит в себе последнее значение Var1 которое "видело" и сравниваю с разностью (ну допустим уже больше N вызовов) - разрешает дальнейший код, если пока не прошло достаточно тиков - отменяется.
    (костыльно, но на связке S300-Weintek не придумалось ничего лучше, зато работает замечательно, 10 лет в разных вариациях)

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

  8. #1127

    Регистрация
    19.06.2008
    Адрес
    Киров
    Сообщений
    374
    Спасибо Благодарностей отдано 
    27
    Спасибо Благодарностей получено 
    200
    Поблагодарили
    99 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Покритикуйте такую идею для реализации критической секции. На emuverse.ru упоминается недокументированная команда LD DDD, rot [IX+d], которая производит битовый сдвиг байта в памяти и запись результата в регистр. Т.е. имеем две операции в рамках одной атомарной. Идея такова. Нулевой байт обозначает свободную секцию. Используем LD A, SLI [IX+d] (или SCF: LD A, RL [IX+d]). Поток, которые первый выполняет эту атомарную операцию занесет в секцию значение 1, последующие потоки будут заносить 3, 7, 15 и т.д., но никогда не 1. Т.е. наличие единицы в регистре A обозначает, что мы захватили секцию. Освобождение секции выполняется простым занесением нуля в секцию.

    Код:
    ;; если флаг Z при выходе функции включен, то зашли в секцию
    TryEnterCriticalSection:
      LD A, SLI [IX]
      DEC A
      RET
    
    EnterCriticalSection:
      LD A, SLI [IX]
      DEC A
      JR NZ, $ - 5
      RET
    
    LeaveCriticalSection:
      LD [IX], 0
      RET
    Update.

    Что-то я слишком все усложнил. Можно и на документированных командах это сделать. 0x80 - значение свободной секции.

    Код:
    ;; если флаг С при выходе функции включен, то зашли в секцию
    TryEnterCriticalSection:
      SLA (IX)
      RET
    
    EnterCriticalSection:
      SLA (IX)
      JR NC, $ - 4
      RET
    
    LeaveCriticalSection:
      LD [IX], 0x80
      RET
    Последний раз редактировалось Dec; 08.09.2025 в 22:29.

  9. #1128

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dec Посмотреть сообщение
    Что-то я слишком все усложнил. Можно и на документированных командах это сделать. 0x80 - значение свободной секции.
    ролами тоже нормально, я думал как вариант, просто не нашел преимуществ перед inc/dec. а так все верно, рабочая идея

    - - - Добавлено - - -

    Цитата Сообщение от Destr Посмотреть сообщение
    Может неправильно понял задачу, но если правильно - то делал разделённым счётом.
    Var1 - где-то там в основном цикле инкреминтируется
    Var2 - в контрольной процедуре (которую нужно ограничивать) держит в себе последнее значение Var1 которое "видело" и сравниваю с разностью (ну допустим уже больше N вызовов) - разрешает дальнейший код, если пока не прошло достаточно тиков - отменяется.
    (костыльно, но на связке S300-Weintek не придумалось ничего лучше, зато работает замечательно, 10 лет в разных вариациях)
    ну для каких вариантов приемлемо конечно, но тут как бы все в лоб, у меня потребность: есть набор процедур работы со списками и есть несколько списков, вот список с которым работаем надо блочить

    - - - Добавлено - - -

    Вообщем посмотрел на все еще раз и решил оставить 0>inc>sub>dec это позволяет помимо прочего по флагу z определять блок в вызывающей процедуре, все остальное требует отдельного кода для этого. rrc (rp) rlc (rp) получается даже лучше всего и флаг С однозначно говорит что отработало или нет (только при выходе без снятия лока не забыть сделать scf) и меньше занимает чем проверка 0>inc

Страница 113 из 113 ПерваяПервая ... 109110111112113

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

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

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

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 00:43
  2. Ответов: 0
    Последнее: 18.08.2006, 22:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 05:21

Метки этой темы

Ваши права

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