|
|
  |
Интересная функция задержки, Вопрос по ассемблеру |
|
|
|
Aug 29 2006, 06:09
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(vet @ Aug 29 2006, 13:51)  prottoss Ваш вариант хуже в смысле точности, и намного. Повторюсь, таймер считает число тактов без привязки к программе, а программный цикл - число машинных циклов, без учета прерываний. Считаем: если каждые 100 мкс возникает прерывание длиной 20 мкс (152 такта @8МГц + 8 тактов вход/выход), то 1-сек задержка циклами ошибется на 0.2 с. В то время, как та же задержка таймером - максимум на время выполнения какого-либо текущего прерывания. Хм...Странный ход мыслей, и в цикле, где идет подсчет тактов (что привел я), и в цикле, где ожидается изменение переменной (оригинальный обсуждаемый сдесь код) могут возникать сколь угодное количество прерываний, отчего же оригинальный код точнее, чем тот, что привел я? Получается так: задержка не точная, prottoss, это нормально, но вот Вы привели код, он еще менее точен, и это не нормально. Давайте уж так, либо прецизионные задержки, либо никакие. А если в каком то прерывании ветвления, что тогда? Плавающая точная задержка...Мдя Цитата(vet @ Aug 29 2006, 13:51)  Добавим к этому то, что, пока таймер тикает, программа может заниматься разнообразными полезными делами или вообще спать. Впрочем, это уже обсуждалось. Я и спорить то начал с того, что подпрограмма использует прерывание для вычисления таймингов, но фактически она ничего, акромя ожидания изменения переменной НИЧЕГО НЕ ДЕЛАЕТ! Смысл в использовании прерывания?
Сообщение отредактировал prottoss - Aug 29 2006, 06:15
--------------------
|
|
|
|
|
Aug 29 2006, 13:29
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(prottoss @ Aug 28 2006, 21:58)  Цитата(vet @ Aug 28 2006, 23:57)  prottoss к чему ирония? разумеется, измерение отрезка времени таймером точнее, чем с помощью цикла, неизвестно на сколько времени продлённого разнообразными возникающими по ходу работы прерываниями. Так и я о том же, а уважаемый defunct пытается доказать обратное Цитату в студию. protossМожет быть прежде чем слепо спорить, что-то домысливать и т.п. лучше просто подумать над тем что было сказано?.. А код такой задержи на мой взгляд имеет корни скорее всего из realmode x86 платформы. Системный таймер в realmode x86 располагается по фиксированному адресу и инкрементируется 18.2 раз в секунду обработчиком прерывания IRQ0, т.о. самый простой способ организации относительно точной задержки, независимой от частоты процессора для realmode x86 - это просто постоянно вычитывать значение системного таймера и сравнивать с требуемым значением: типичная организация задержки в DOS программах: Код push ds xor ax, ax mov ds, ax mov eax, [413h]; <- могу ошибиться с адресом add eax, 182; +10 секунд _do_wait: cmp eax, [413h] ja _do_wait pop ds
|
|
|
|
|
Aug 29 2006, 14:01
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(defunct @ Aug 29 2006, 21:29)  типичная организация задержки в DOS программах: Код push ds xor ax, ax mov ds, ax mov eax, [413h]; <- могу ошибиться с адресом add eax, 182; +10 секунд _do_wait: cmp eax, [413h] ja _do_wait pop ds Надоело спорить о бессмысленном, но Вы хоть добавляйте, что типично для Вас. Хотите поговорить о DOS? Пожалуйста. Вы слышали чего нибудь о функции BIOS INT15? Это типично для DOS... Но долго...Представляю лучшие ДОСовские игры, с задержками, организованными по Вашему коду))) PS: счетчик располагается по адресу 0000:046Ch
--------------------
|
|
|
|
|
Aug 29 2006, 14:48
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(prottoss @ Aug 29 2006, 17:01)  Надоело спорить о бессмысленном, но Вы хоть добавляйте, что типично для Вас. Боже упаси, кто с вами спорит-то?  Вы эта.. хоть читайте сообщения.. или "чукча только писатель" © ?  Цитата Хотите поговорить о DOS? Пожалуйста. Вы слышали чего нибудь о функции BIOS INT15? Это типично для DOS... Но долго... Сервисные функции DOS начинаются с INT 20H, поэтому INT 15 это "типично для Вас" © protoss, а не для DOS.  Цитата Представляю лучшие ДОСовские игры, с задержками, организованными по Вашему коду))) Всякий овощ полезен. ©
|
|
|
|
|
Aug 29 2006, 15:43
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(defunct @ Aug 29 2006, 22:48)  Вы эта.. хоть читайте сообщения.. или "чукча только писатель" © ?  Ну вот))) Опять разнервничались))) Цитата(defunct @ Aug 29 2006, 22:48)  Цитата Хотите поговорить о DOS? Пожалуйста. Вы слышали чего нибудь о функции BIOS INT15? Это типично для DOS... Но долго... Сервисные функции DOS начинаются с INT 20H, поэтому INT 15 это "типично для Вас" © protoss, а не для DOS. Я про BIOS он про DOS))) Мдя, кто писатель...а кто... Цитата(defunct @ Aug 29 2006, 22:48)  Цитата Представляю лучшие ДОСовские игры, с задержками, организованными по Вашему коду))) Всякий овощ полезен. © Ну кто ж себя любимого осудит
--------------------
|
|
|
|
|
Aug 29 2006, 16:47
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(GetSmart @ Aug 30 2006, 00:16)  prottoss Если вы такой умный насколько и нагловатый (!?!), то приведите простой и в то же время максимально точный (в силу ограничений системы) пример функции задержки для большинства процессоров (идеален для армов), не использующий прерываний. А то кроме вашей критики ничего дельного на этой ветке я не нашёл. Как сказал один великий "... нельзя объять необъятное ...". Универсальных методов нет...Я высказал лишь свое мнение по поводу кода, который я не считаю оригинальным, и не считаю нормальным. Но это все уже ближе к стилю программирования. И это мое ИМХО, от которого я не отказываюсь. Каждый имеет право на свое мнение, ведь так? Зачем пытаться нападать на меня?))) Вроде люди здесь, в основном, проффесионалы, умные.... начинают гадости говорить, если с ними не соглашаются...А методов на самом деле много, все зависит же от конкретной задачи и от средств, которые на эту задачу выделенны) Вы ведь сами это понимаете.
--------------------
|
|
|
|
|
Aug 29 2006, 18:25
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(prottoss @ Aug 29 2006, 18:43)  Цитата(defunct @ Aug 29 2006, 22:48)  Вы эта.. хоть читайте сообщения.. или "чукча только писатель" © ?  Ну вот))) Опять разнервничались))) Цитата(defunct @ Aug 29 2006, 22:48)  Цитата Хотите поговорить о DOS? Пожалуйста. Вы слышали чего нибудь о функции BIOS INT15? Это типично для DOS... Но долго... Сервисные функции DOS начинаются с INT 20H, поэтому INT 15 это "типично для Вас" © protoss, а не для DOS. Я про BIOS он про DOS))) Мдя, кто писатель...а кто... Уважаемый, мне конечно все равно, однако я в отличие от вас, когда постил свой пост, потрудился добавить туда вашу цитату, в которой вы сказали: Цитата Это типично для DOS... Поэтому не вижу смысла вам отпираться от того, что вы сами и сказали. PS: не уподобляйтесь A.Bolshev'у - "мастеру перевоплощений", он тоже очень любит использовать домыслы и подмену понятий в своих изречениях.
|
|
|
|
|
Aug 29 2006, 20:50
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(prottoss @ Aug 29 2006, 21:39)  Цитата(defunct @ Aug 30 2006, 02:25)  PS: не уподобляйтесь A.Bolshev'у - "мастеру перевоплощений", он тоже очень любит использовать домыслы и подмену понятий в своих изречениях. Я ни кому не уподобляюсь) По моему это вы тут играетесь словами а не я: Хотя Вы прекрасно понимаете, о чем я говорю, начинаете играть словами и выражениями, и уходите от сути вопроса, акцентируете внимание совсем на другом...Спор давно уже перетек в неприязнь, по моему, так что прекращайте молоть... Ну это по вашему. А по-моему вы перегнули палку в этой ветке. Спора как такового здесь не было. Было высказано 2 мнения и была перебранка с использованием подмены понятий с вашей стороны. Высказанные мнения: 1. Такой способ задержки - ламерский. 2. Такой способ задержки - не ламерский. Большинство склоняется ко второму мнению. Вот и все.
|
|
|
|
|
Aug 30 2006, 17:42
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(prottoss @ Aug 29 2006, 01:44)  Цитата(singlskv @ Aug 29 2006, 06:29)  Окорблять не собирался (смайликов поставил). Ага, обижать человека с улыбкой, по Вашему это нормально?Ладно, проехали... Цитата(singlskv @ Aug 29 2006, 06:29)  Просто создалось впечатление, что Вы высказались не очень ТОЧНО(это ключевое слово),а теперь боитесь упасть "лицом в грязь", ну и от сюда все проблеммы.А может быть просто нужно "уточнить", что Вы имели ввиду ? ИМХО, это куда как более достойное поведение (Все мы иногда ощибаемся, или говорим так, что другим нас не понять). За все, мною сказанное выше в топике я отвечаю, и я не боюсь упасть в грязь лицом) Вы тут чего то наговорили непонятного, по моему даже Вам самому) Я всего лишь сказал, что Цитата Я бы сказал, что функция не интересная, а наоборот - тупая. Зачем использовать прерывание, если все равно выхода из функции не будет пока переменная _Stm1 не обнулится? и от своего мнения не отказываюсь. Так же выше в топике я привел свой вариант выполнения задержек, чем он хуже? Вы еще ни одного реального довода мне не привели, зато впечатлениями обо мне делитесь. Может быть Вам пора работу сменить, психологом например заделаться, а? Огорчает, что замусорили топик перепалкою, это и меня касается( Си прогу я привёл просто так. Обсуждаемая явно ассемблерная. Ваша на Си использует регистры. Просто Вы не знаете.  Использует стэк. Длинее по коду. Так в чём выигрыш? Но в целом мне кажется тему надо прибить, так как главное - доказано. А главное: 1) Нельзя по нескольким строчкам судить о "тупости" автора. 2) Если не понимаешь причины какого-нибудь решения, то стоит сначала его осмыслить, и уж потом делать выводы.
|
|
|
|
|
Aug 30 2006, 18:12
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(SasaVitebsk @ Aug 31 2006, 01:42)  Си прогу я привёл просто так. Обсуждаемая явно ассемблерная. Ваша на Си использует регистры. Просто Вы не знаете.  Использует стэк. Длинее по коду. Так в чём выигрыш? Не хотел больше отвечать на обидные слова в мой адрес, и, тем более, оскорбления и насмешки (касается defunct и иже с ним), но Вы туда же лезете) Я знаю, что программа использует регистры. Когда Вы привели пример на Си, я же не напоминал Вам о том, что она использует регистры, то есть я не посчитал Вас идиотом, так? Для тех, кто на бронепоезде, повторю еще раз, что не вижу смысла пользовать прерывание для ожидания прохождения отрезка времени и при этом висеть в цикле... В чем выйгрыш? Да ни в чем, просто я привел то же самое, что и Вы но без прерываний. Цитата(SasaVitebsk @ Aug 31 2006, 01:42)  Но в целом мне кажется тему надо прибить... Давно пора Цитата(SasaVitebsk @ Aug 31 2006, 01:42)  А главное: 1) Нельзя по нескольким строчкам судить о "тупости" автора. Я не сказал, что тупой автор, протрите глаза! Я сказал что "... функция не интересная, а наоборот - тупая ...", про автора и слова не было сказанно. Если я говорю о тупом решении, это не значит что я говорю о тупости автора Цитата(SasaVitebsk @ Aug 31 2006, 01:42)  2) Если не понимаешь причины какого-нибудь решения, то стоит сначала его осмыслить, и уж потом делать выводы. Если не понимаешь о чем говорит человек, то стоит сначала осмыслить его слова, и уж потом умничать.
--------------------
|
|
|
|
|
Aug 30 2006, 20:20
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Специально использую класический смайл так как он переводится как улыбка. И ведь так и в жизни... Вот люблю улыбаться...  Но время от времени нарываюсь на неприятности ... ну типа: "чё лыбишься..." или там "Ваша насмешка не уместна". По моему "улыбка" или "насмешка", - это просто отражение Вашего взгляда на жизнь и окружающих. Я - улыбался. Последняя попытка оправдаться.  Видишь ли, я использую такой вариант, и пока не планирую от него отказываться. Ваши доводы пока меня не убедили. Такой вариант и аналогичные ему. Ну например ... В прерывании ..... cnt_ms500++; cnt_ms300++; cnt_ms200++; ..... В голове ..... #define wt_tim1 = 4 // 4ms // Точность определяется периодом цикла головы ..... if(cnt_ms500 > 500/wt_tim1) { cnt_ms500 = 0; // Данный блок исполняется с периодом 500 мс } if(cnt_ms300 > 300/wt_tim1) { cnt_ms300 = 0; // Данный блок исполняется с периодом 300 мс } if(cnt_ms200 > 200/wt_tim1) { cnt_ms200 = 0; // Данный блок исполняется с периодом 200 мс } .... Конечно это можно сделать и семафорами (и даже лучше если переменные > 1 байта), но сути это не меняет. Подход тот же. По поводу прерываний. С одной стороны Вы пишете "нонсенс" по поводу моего высказывания "о необходимости минимизировать число прерываний", с другой - ругаете за его применение. Дело в том что таймерные прерывания - самые низкоприоритетные (обычно). А посему я делаю первой командой "sei". Но ещё раз повторяю такое используется ПОПУТНО. Прерывание не задействовано. В этом не минус а плюс такой реализации. Используется прерывание без которого НЕ ОБОЙТИСЬ. И добавляется туда всего ОДНА КОМАНДА. Например регенерация экрана, опрос датчиков, програмный ШИМ, регулярный обмен с внешними устройствами, опрос АЦП по таймеру и т.д. Если я Вас не убедил, то давайте считать что я просто заблуждаюсь и мне поможет только время.  (улыбка)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|