|
|
  |
Интересная функция задержки, Вопрос по ассемблеру |
|
|
|
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 25 2006, 13:13
|
Участник

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

|
Цитата(vet @ Aug 25 2006, 16:37)  Очевидно, прерывание; предположительно, по таймеру. Так оно и есть. Просто я разбираю чужой исходник и не люблю, когда не до конца все понимаю. Решил, может это что-то чисто аппаратное, о чем я еще не знаю. Спасибо. Тема закрыта.
|
|
|
|
|
Aug 26 2006, 19:49
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(prottoss @ Aug 25 2006, 16:09)  Я бы сказал, что функция не интересная, а наоборот - тупая. Зачем использовать прерывание, если все равно выхода из функции не будет пока переменная _Stm1 не обнулится? Не следует делать скоропалительных выводов. Я иногда примерно так делал для формирования точных но больших временных интервалов. Скорее всего данное прерывание используется совсем не для этого. А это, так сказать, лишь мелкий довесок, - одна команда. Как правило когда используются в программе различные временные метки, то я их все формирую в одном прерывании по таймеру. Чем меньше в программе прерываний (учитывая отсутствие ранжирования), тем проще работать.
|
|
|
|
|
Aug 26 2006, 21:25
|

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

|
Цитата(SasaVitebsk @ Aug 27 2006, 03:49)  Цитата(prottoss @ Aug 25 2006, 16:09)  Я бы сказал, что функция не интересная, а наоборот - тупая. Зачем использовать прерывание, если все равно выхода из функции не будет пока переменная _Stm1 не обнулится? Не следует делать скоропалительных выводов. Я иногда примерно так делал для формирования точных но больших временных интервалов. Скорее всего данное прерывание используется совсем не для этого. А это, так сказать, лишь мелкий довесок, - одна команда. Как правило когда используются в программе различные временные метки, то я их все формирую в одном прерывании по таймеру. Чем меньше в программе прерываний (учитывая отсутствие ранжирования), тем проще работать. Я не хочу здесь начинать спорить о стилях программирования, я просто высказал мнение по поводу приведенного выше кода, и мнение мое однозначно. Цитата(SasaVitebsk @ Aug 27 2006, 03:49)  Чем меньше в программе прерываний (учитывая отсутствие ранжирования), тем проще работать. ))))))))))))))))))))))))))Нонсенс...
--------------------
|
|
|
|
|
Aug 27 2006, 22:41
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(prottoss @ Aug 27 2006, 00:25)  Цитата(SasaVitebsk @ Aug 27 2006, 03:49)  Цитата(prottoss @ Aug 25 2006, 16:09)  Я бы сказал, что функция не интересная, а наоборот - тупая. Зачем использовать прерывание, если все равно выхода из функции не будет пока переменная _Stm1 не обнулится? Не следует делать скоропалительных выводов. Я иногда примерно так делал для формирования точных но больших временных интервалов. Скорее всего данное прерывание используется совсем не для этого. А это, так сказать, лишь мелкий довесок, - одна команда. Как правило когда используются в программе различные временные метки, то я их все формирую в одном прерывании по таймеру. Чем меньше в программе прерываний (учитывая отсутствие ранжирования), тем проще работать. Я не хочу здесь начинать спорить о стилях программирования, я просто высказал мнение по поводу приведенного выше кода, и мнение мое однозначно. Цитата(SasaVitebsk @ Aug 27 2006, 03:49)  Чем меньше в программе прерываний (учитывая отсутствие ранжирования), тем проще работать. ))))))))))))))))))))))))))Нонсенс... В данном случае я имел ввиду "дублирующих или бесполезных прерываний". Зачем плодить 10 прерываний от таймера для формирования различных задержек? Представьте себе что Вы обрабатываете канал информации. И недопустимы слишком большие задержки на обработку этого канала. У меня не более 250мкс. Вам надо кроме этого канала обработать прерывание от последовательного порта и сформировать следующие задержки: 1cек, 0.1сек, 20мс, 0.25сек, 8мс. При этом по некоторым из задержек приходится одновременно отсчитывать несколько интервалов. Вы как по каждому интервалу свой таймер заводите? Извините, но я избегаю ответов типа "однозначно" или "нонсенс". Это сродни "этого не может быть потому что этого я не могу себе представить". Я вовсе не защищаю автора той программы. Я её не видел. Но программирование мне нравится за то, что любую задачу можно решить десятком способов! И я отнюдь не уверен что Ваш, - самый правильный.
Сообщение отредактировал SasaVitebsk - Aug 27 2006, 22:43
|
|
|
|
|
Aug 28 2006, 05:17
|
Местный
  
Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044

|
Цитата(prottoss @ Aug 25 2006, 16:09)  Я бы сказал, что функция не интересная, а наоборот - тупая. Цитата(SasaVitebsk @ Aug 28 2006, 01:41)  Не следует делать скоропалительных выводов. Я иногда примерно так делал для формирования точных но больших временных интервалов. Известно, что о вкусах не спорят, но зачем постоянно торчать в этом месте, если можно заходить время от времени (для максимальной точности - с интервалом прерываний или чаще) и делать Код tst AL вместо Код mov _Stm1, AL tst _Stm1 А пока идет выдержка поделать еще что-нибудь полезное.
--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
|
|
|
|
|
Aug 28 2006, 12:01
|

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

|
Цитата(prottoss @ Aug 27 2006, 00:25)  Цитата(SasaVitebsk @ Aug 27 2006, 03:49)  Чем меньше в программе прерываний (учитывая отсутствие ранжирования), тем проще работать. ))))))))))))))))))))))))))Нонсенс... Отнюдь не нонсенс. Если делается что-то очень реалтаймовое, например звуковой канал или эмуляция синхронного интерфейса, то обилие прерываний может привести к глюкам. Цитата Я не хочу здесь начинать спорить о стилях программирования, я просто высказал мнение по поводу приведенного выше кода, и мнение мое однозначно. ну я тогда тоже выскажу свое мнение: вполне грамотная организация задержки. которая к тому же будет работать намного точнее чем __delay_cycles в совокупности с кучей прерываний.
|
|
|
|
|
Aug 28 2006, 18:39
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Aug 25 2006, 17:09)  Я бы сказал, что функция не интересная, а наоборот - тупая. Зачем использовать прерывание, если все равно выхода из функции не будет пока переменная _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
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|