|
Интересная функция задержки, Вопрос по ассемблеру |
|
|
|
Aug 25 2006, 12:26
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 9-05-05
Пользователь №: 4 855

|
Есть вот такая интересная функция задержки времени. Сначала задается: ldi AL, 125 Потом вызывается сама функция: dly: mov _Stm1, AL tst _Stm1 brne PC-1 ret При кварце в 10 МГц задержка выходит примерно в 500 мс. Вопрос - как это работает, а именно, что постепенно обнуляет регистр _Stm1?
|
|
|
|
|
 |
Ответов
|
Aug 28 2006, 18:58
|

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

|
Цитата(vet @ Aug 28 2006, 23:57)  prottoss к чему ирония? разумеется, измерение отрезка времени таймером точнее, чем с помощью цикла, неизвестно на сколько времени продлённого разнообразными возникающими по ходу работы прерываниями. Так и я о том же, а уважаемый defunct пытается доказать обратное Цитата(singlskv @ Aug 29 2006, 02:39)  Интересно, а если у нас вся работа происходит в прерываниях, то что мы будем делать, в то время пока не произошло интересуещее нас событие (ИМХО, ковырять в носу в каком-нибудь пустом цикле  ). Кто то ковыряет в носу, а кто то спокойно спит)))
Сообщение отредактировал prottoss - Aug 28 2006, 19:00
--------------------
|
|
|
|
|
Aug 28 2006, 19:14
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Aug 28 2006, 22:58)  Кто то ковыряет в носу, а кто то спокойно спит))) Угу, а если после наступления события нам необходимо очень оперативно отреагировать ? Типа, реалтайм какой-нибудь, а событие такое что выход из sleep не прикрутить ? Дальше "спокойно спим". Уважаемый prottoss, если Вы умеете делать выводы о коде на основании 5-6 команд на ассемблере, то вероятно вы выбрали не ту профессию, возможно Вас ждет большой успех в области ясновидения. P.S. без обид пожалуйста
|
|
|
|
|
Aug 28 2006, 19:56
|

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

|
Цитата(singlskv @ Aug 29 2006, 03:14)  Угу, а если после наступления события нам необходимо очень оперативно отреагировать ? Типа, реалтайм какой-нибудь, а событие такое что выход из sleep не прикрутить ? Дальше "спокойно спим". Уважаемый prottoss, если Вы умеете делать выводы о коде на основании 5-6 команд на ассемблере, то вероятно вы выбрали не ту профессию, возможно Вас ждет большой успех в области ясновидения. P.S. без обид пожалуйста  Что Вы, какие обиды) Я просто стараюсь не обращать внимание на глупые реплики подобные вашим... Я всего лишь сказал, что не вижу смысла делать задержку на прерывании, если выхода из функции все равно нет! Раз уж все накинулись на меня скопом) давайте найдем истину). Вот обсуждаемый код: Код Сначала задается: ldi AL, 125 Потом вызывается сама функция: dly: mov _Stm1, AL tst _Stm1 brne PC-1 ret Потоки, работающие по прерываниям и так отработают свое.. О какой точности идет речь? Между tst _Stm1 и brne PC-1 может возникнуть прерывание, которое сведет всю вашу точность на нет. И, наконец, можете описать, или придумать, хотя бы одну ситуацию, где нельзя прикрутить sleep хотя бы в режиме idle?
Сообщение отредактировал prottoss - Aug 28 2006, 19:58
--------------------
|
|
|
|
|
Aug 28 2006, 20:49
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Aug 28 2006, 23:56)  Потоки, работающие по прерываниям и так отработают свое.. О какой точности идет речь? Между tst _Stm1 и brne PC-1 может возникнуть прерывание, которое сведет всю вашу точность на нет. Потоки отработали свое, и например сохранили метку времени в регистре ICR, будем ждать когда ее кто-нибудь испортит, или обработаем как можно быстрее ? prottoss все, кто спорит здесь с Вами, имеют в виду всего лишь то, что такой код вполне имеет право на существование, а Вы утверждаете, "никогда".
|
|
|
|
|
Aug 28 2006, 21:12
|

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

|
Цитата(singlskv @ Aug 29 2006, 04:49)  Потоки отработали свое, и например сохранили метку времени в регистре ICR, будем ждать когда ее кто-нибудь испортит, или обработаем как можно быстрее ? prottoss все, кто спорит здесь с Вами, имеют в виду всего лишь то, что такой код вполне имеет право на существование, а Вы утверждаете, "никогда". Это где же я говорил "никогда"? Любой код, пусть даже самый абсурдный имеет право на существование...
--------------------
|
|
|
|
|
Aug 28 2006, 21:39
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Aug 29 2006, 01:12)  Цитата(singlskv @ Aug 29 2006, 04:49)  Потоки отработали свое, и например сохранили метку времени в регистре ICR, будем ждать когда ее кто-нибудь испортит, или обработаем как можно быстрее ? prottoss все, кто спорит здесь с Вами, имеют в виду всего лишь то, что такой код вполне имеет право на существование, а Вы утверждаете, "никогда". Это где же я говорил "никогда"? Любой код, пусть даже самый абсурдный имеет право на существование... Пример: 1. Timer1 считает время (по прерываниям) 2. INT0 и Timer0 ловят код(старт и стоп) по RF каналу. (то есть должны работать все время) 3. Основной цикл выводит текущий результат на LCD (причем без всяких там HD4XXX). 4. Когда код от RF "поймали" наполовину, перестаем выводить на LCD и ждем(в цикле похожем на цикл автора топика ) когда получим код полностью. 5. фиксируем время. Это, с некоторыми упрощениями логика работы некоторого девайса. Все это работает при 1Мгц тактовой (ну типа устройство было "батарейным" - надо было экономить).
|
|
|
|
|
Aug 28 2006, 22:03
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Aug 29 2006, 01:47)  Цитата(singlskv @ Aug 29 2006, 05:39)  Пример: 1. Timer1 считает время (по прерываниям) 2. INT0 и Timer0 ловят код(старт и стоп) по RF каналу. (то есть должны работать все время) 3. Основной цикл выводит текущий результат на LCD (причем без всяких там HD4XXX). 4. Когда код от RF "поймали" наполовину, перестаем выводить на LCD и ждем(в цикле похожем на цикл автора топика ) когда получим код полностью. 5. фиксируем время.
Это, с некоторыми упрощениями логика работы некоторого девайса. Все это работает при 1Мгц тактовой (ну типа устройство было "батарейным" - надо было экономить). А при чем здесь задержки через задний проход? Можно чуть-чуть по подробнее что Вы имеете ввиду ? Цитата перестаем выводить на LCD и ждем(в цикле похожем на цикл автора топика ) когда получим код полностью. автор топика всего лишь предположил что это был таймер... Цитата А при чем здесь задержки через задний проход? Или может быть просто хотите пообщаться с модераторами ?
|
|
|
|
|
Aug 28 2006, 22:29
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Aug 29 2006, 02:16)  Цитата(singlskv @ Aug 29 2006, 06:03)  Можно чуть-чуть по подробнее что Вы имеете ввиду ?
Я и имею ввиду задержки на прерываниях, если так можно выразится об этих задержках Цитата(singlskv @ Aug 29 2006, 06:03)  Или может быть просто хотите пообщаться с модераторами ?  OFFTOP: Что вы нервничаете так? Сначала оскорбляете обидными словами, что мол работу меняй) Теперь модераторами пугаете) Окорблять не собирался (смайликов поставил). Просто создалось впечатление, что Вы высказались не очень ТОЧНО(это ключевое слово), а теперь боитесь упасть "лицом в грязь", ну и от сюда все проблеммы. А может быть просто нужно "уточнить", что Вы имели ввиду ? ИМХО, это куда как более достойное поведение (Все мы иногда ощибаемся, или говорим так, что другим нас не понять).
|
|
|
|
|
Aug 28 2006, 22:44
|

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

|
Цитата(singlskv @ Aug 29 2006, 06:29)  Окорблять не собирался (смайликов поставил). Ага, обижать человека с улыбкой, по Вашему это нормально?Ладно, проехали... Цитата(singlskv @ Aug 29 2006, 06:29)  Просто создалось впечатление, что Вы высказались не очень ТОЧНО(это ключевое слово),а теперь боитесь упасть "лицом в грязь", ну и от сюда все проблеммы.А может быть просто нужно "уточнить", что Вы имели ввиду ? ИМХО, это куда как более достойное поведение (Все мы иногда ощибаемся, или говорим так, что другим нас не понять). За все, мною сказанное выше в топике я отвечаю, и я не боюсь упасть в грязь лицом) Вы тут чего то наговорили непонятного, по моему даже Вам самому) Я всего лишь сказал, что Цитата Я бы сказал, что функция не интересная, а наоборот - тупая. Зачем использовать прерывание, если все равно выхода из функции не будет пока переменная _Stm1 не обнулится? и от своего мнения не отказываюсь. Так же выше в топике я привел свой вариант выполнения задержек, чем он хуже? Вы еще ни одного реального довода мне не привели, зато впечатлениями обо мне делитесь. Может быть Вам пора работу сменить, психологом например заделаться, а? Огорчает, что замусорили топик перепалкою, это и меня касается(
Сообщение отредактировал prottoss - Aug 28 2006, 22:47
--------------------
|
|
|
|
|
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 31 2006, 13:17
|

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

|
Цитата(prottoss @ Aug 30 2006, 21:12)  Цитата(SasaVitebsk @ Aug 31 2006, 01:42)  Си прогу я привёл просто так. Обсуждаемая явно ассемблерная. Ваша на Си использует регистры. Просто Вы не знаете.  Использует стэк. Длинее по коду. Так в чём выигрыш? Не хотел больше отвечать на обидные слова в мой адрес, и, тем более, оскорбления и насмешки (касается defunct и иже с ним), но Вы туда же лезете) Я знаю, что программа использует регистры. Когда Вы привели пример на Си, я же не напоминал Вам о том, что она использует регистры, то есть я не посчитал Вас идиотом, так? Поскольку вы написали, что это касается и меня, то вынужден ответить на этот пост. Ваши "проблемы" исходят от вас же, почитайте ветку с начала "со стороны". Или попросите почитать друга, но не говорите ему вашего ник-нейма и потом спросите его, кто на его взгляд в этой ветке вел себя хамовато. Если вы чуствуете что в ваш адрес было сказано что-то уж очень обидное, тогда может быть в пора почитать это? Цитата Для тех, кто на бронепоезде, повторю еще раз, что не вижу смысла пользовать прерывание для ожидания прохождения отрезка времени и при этом висеть в цикле... Зачем повторять ваше мнение многократно, к тому же отдельно тем кто на бронепоезде или в танке и т.п. Совсем тупых, чтобы возникала необходимость в многократном разжевывании вашего мнения, полагаю здесь нет. С вашим мнением уже ознакомились, еще на первой странице этой ветки. Цитата В чем выйгрыш? Да ни в чем, просто я привел то же самое, что и Вы но без прерываний. Выигрыш в том, что с прерыванием можно легко организовать HAL (Hardware Abstraction Layer) и т.о. заданные интервалы задержек не будут зависеть от частоты кварца и от латентности других прерываний. пример: задаем в hal константу - чатоту чипа. задаем в hal формулу расчета делителя для таймера для получения периода в 1ms. пишем в hal обработчик "системного таймера" и отводим две переменных: одну под счетчик (системное время) и одну под таймер (декремент до нуля). далее в программах пользуемся этими переменными и всегда знаем что счетчик считает миллисекунды, а таймер отнимает миллисекунды. И не заморачиваем себе голову тем сколько циклов надо отмерять для получения задержки в N ms. При переносе проекта под другой процессор, просто немного подправляем hal - меняем частоту, меняем формулу, меняем синтаксис обработчика прерывания, а все остальное оставляем как было. И все задержки используемые в любых других модулях остаются правильными. Не забываем о том, что такая задержка будет много точнее холостых циклов за счет независимости от других прерываний и их латентности. Иллюстрация: требуется организовать задержку в 100 ms при частоте чипа 1 Mhz и при наличии в программе 5-ти обработчиков прерываний (_IRQ0_handler, _IRQ1_handler, ... _IRQ4_Handler) с длительностью обработки: _IRQ0 - 50 циклов (цикл для AVR = 1 такт) _IRQ1 - 100 циклов _IRQ2 - 150 циклов _IRQ3 - 200 циклов _IRQ4 - 250 циклов. Допускается, что за 1 ms каждое из прерываний может произойти не более одного раза. Вопрос каким способом мы можем наиболее точно организовать задержку в 100ms? 1. Рассмотрим способ предлагаемый prottoss. (без использования прерываний):- рассчитываем количество циклов Nc требуемое для организации задержки в 100ms на 1Mhz Nc = 1Mhz * 0.1c = 1*10^5 формируем и запускаем функцию задержки на 1*10^5 циклов. А теперь оценим точность. С учетом того, что в системе имеется 5 обработчиков прерываний, и каждое из них может произойти раз в 1ms, то в наихудшем случае за 100 ms, каждое и прерываний произойдет 100 раз. Суммируем количество циклов требуемое на обработку всех этих прерываний Nirqc (ведь в момент обработки прерываний, функция отсчитывающая задержку приостанавливается). Nirqc = (50 + 100 + 150 + 200 + 250) * 100 = 7.5*10^4 т.о. 75 тыс циклов не будут нами учтены функцией задержки, врезультате чего вместо 1*10^5 циклов наша функция задержки пропустит 1*10^5 + 7.5*10^4 = 1.75*10^5 циклов, а это в 1.75 раза больше чем требовалось. И вместо задержки в 100ms у нас получится задержка в 175ms. Суммарная точность получится:Acc = +-(7.5*10^4) *100%/ (1*10^5) = +-75% 2. Рассмотрим способ обсуждаемый в сабж.- пишем еще один обработчик прерывания либо модифицируем существующий. который будет вызываться раз в 1 ms и декрементировать до нуля определенную переменную. Код такого обработчика: Код if (__Timer > 0) __Timer -= 1; - формируем функцию задержки как: Код __Timer = 100; while (__Timer) __no_operation; Оценим точность: за одну ms проц выполняет 1mhz * 10^(-3)с = 1000 циклов. Суммарная нагрузка обработчиков прерываний в 1 ms составляет (50 + 100 + 150 + 200 + 250) = 750 циклов, т.о. наше прерывание с периодом вызова 1ms в худшем случае вызовется с отставанием на 750 циклов, если будет иметь наинизший приоритет. Отставание в 750 циклов и будет единственной погрешностью нашей функции задержки с использованием прерываний, поскольку наше прерывание выполняется через каждую 1ms. Итого наша функция задержки с использованием прерывания обеспечит точность: Acc = +-(0.75ms)*100%/100ms = +-0.75%Ну так где выше точность? prottoss, Вы поняли разницу или вы на бронепоезде? Цитата Если не понимаешь о чем говорит человек, то стоит сначала осмыслить его слова, и уж потом умничать. Вот именно. Хороший совет вы дали. Следуйте ему.
|
|
|
|
Сообщений в этой теме
Reboot_s Интересная функция задержки Aug 25 2006, 12:26 vet Очевидно, прерывание; предположительно, по таймеру... Aug 25 2006, 12:37 Reboot_s Цитата(vet @ Aug 25 2006, 16:37) Очевидно... Aug 25 2006, 13:13 prottoss Я бы сказал, что функция не интересная, а наоборот... Aug 25 2006, 13:09 SasaVitebsk Цитата(prottoss @ Aug 25 2006, 16:09) Я б... Aug 26 2006, 19:49  prottoss Цитата(SasaVitebsk @ Aug 27 2006, 03:49) ... Aug 26 2006, 21:25   SasaVitebsk Цитата(prottoss @ Aug 27 2006, 00:25) Цит... Aug 27 2006, 22:41    CDT Цитата(prottoss @ Aug 25 2006, 16:09) Я б... Aug 28 2006, 05:17   defunct Цитата(prottoss @ Aug 27 2006, 00:25) Цит... Aug 28 2006, 12:01    prottoss Цитата(defunct @ Aug 28 2006, 20:01) ну я... Aug 28 2006, 15:45 singlskv Цитата(prottoss @ Aug 25 2006, 17:09) Я б... Aug 28 2006, 18:39    SasaVitebsk Цитата(prottoss @ Aug 28 2006, 22:56) Пот... Aug 28 2006, 20:07     prottoss Цитата(SasaVitebsk @ Aug 29 2006, 04:07) ... Aug 28 2006, 21:21     SasaVitebsk Цитата(singlskv @ Aug 28 2006, 23:49) Пот... Aug 28 2006, 21:09            singlskv Цитата(prottoss @ Aug 29 2006, 02:44) Цит... Aug 28 2006, 23:10  defunct Цитата(prottoss @ Aug 28 2006, 21:58) Цит... Aug 29 2006, 13:29   prottoss Цитата(defunct @ Aug 29 2006, 21:29) типи... Aug 29 2006, 14:01    defunct Цитата(prottoss @ Aug 29 2006, 17:01) Над... Aug 29 2006, 14:48     prottoss Цитата(defunct @ Aug 29 2006, 22:48) Вы э... Aug 29 2006, 15:43      defunct Цитата(prottoss @ Aug 29 2006, 18:43) Цит... Aug 29 2006, 18:25       prottoss Цитата(defunct @ Aug 30 2006, 02:25) PS: ... Aug 29 2006, 18:39        defunct Цитата(prottoss @ Aug 29 2006, 21:39) Цит... Aug 29 2006, 20:50 prottoss Я предложу, но объясните мне, непонятливому, зачем... Aug 28 2006, 20:42 SasaVitebsk Цитата(prottoss @ Aug 28 2006, 23:42) Я п... Aug 28 2006, 21:18 vet prottoss
Ваш вариант хуже в смысле точности, и нам... Aug 29 2006, 05:51 prottoss Цитата(vet @ Aug 29 2006, 13:51) prottoss... Aug 29 2006, 06:09 vet Опять не понимаете. Таймер тикает независимо от пр... Aug 29 2006, 07:09 GetSmart prottoss
Если вы такой умный насколько и нагловаты... Aug 29 2006, 16:16 prottoss Цитата(GetSmart @ Aug 30 2006, 00:16) pro... Aug 29 2006, 16:47 GetSmart Ну то есть задание вы провалили. Приходите через г... Aug 29 2006, 16:58 SasaVitebsk Специально использую класический смайл так как он ... Aug 30 2006, 20:20 prottoss 2 SasaVitebsk: объяснения об улыбках, ухмылках, и ... Aug 31 2006, 14:57 defunct LMD Aug 31 2006, 23:10 SpiritDance А дык чего вы хотите от Пиннокио? Ж))) Sep 1 2006, 05:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|