реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> WDTimer, Запустил, а как остановить?
qulik
сообщение Jun 18 2009, 22:15
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Доброго вечера!
Заметил такую особенность: при "небольшом" загрязнении между контактами TX и RX (видимо электрический контакт появился), функция gets() безнадежно зависла. Подумал, что хорошо бы запустить перед началом gets() сторожевой таймер, который сбросит контроллер в случае зависания, мало ли чего. WDT запустил путем записи в его регистр сначала комбинации битов, разрешающих изменение режима WDT, а потом записал нужное значение. Через положеные 8 секунд произошол сброс контроллера. Попробовал остановить WDT путем записи в его регистр 0x00. Но эффекта не последовало, произошел сброс... Что делать?!?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 18 2009, 22:28
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(qulik @ Jun 19 2009, 02:15) *
WDT запустил путем записи в его регистр сначала комбинации битов, разрешающих изменение режима WDT, а потом записал нужное значение. Через положеные 8 секунд произошол сброс контроллера. Попробовал остановить WDT путем записи в его регистр 0x00. Но эффекта не последовало, произошел сброс... Что делать?!?


А вы пытались останавить его тоже комбинацией или простой записью?
Может быть так попробовать:

WDTCSR |= (1<<WDCE);
WDTCSR = 0;

или так:

WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;

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

cli();
wdt_reset();
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;
sei();

Ну тут уж кажется всё предусмотрено с запасом...

Сообщение отредактировал Xenia - Jun 18 2009, 22:41
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jun 19 2009, 00:41
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(qulik @ Jun 19 2009, 02:15) *
Доброго вечера!
Подумал, что хорошо бы запустить перед началом gets() сторожевой таймер, который сбросит контроллер в случае зависания, мало ли чего.

Вы бы лучше подумали - а нужна ли такая "полезная" функция. Которая видимо тупо ждет прихода чего бы то ни было в UDR. Используйте нормальный драйвер работающий по прерываниям.
Go to the top of the page
 
+Quote Post
qulik
сообщение Jun 19 2009, 21:13
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Цитата(Xenia @ Jun 19 2009, 02:28) *
А вы пытались останавить его тоже комбинацией или простой записью?
Может быть так попробовать:

WDTCSR |= (1<<WDCE);
WDTCSR = 0;

или так:

WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;


Так пробовал, непомогло.

А вот следующий вариант выглядит убедительно! Что-то я припоменаю про MCUSR при сбросе бита WDE... smile.gif Пойду попробую!


Цитата(Qwertty @ Jun 19 2009, 04:41) *
Вы бы лучше подумали - а нужна ли такая "полезная" функция. Которая видимо тупо ждет прихода чего бы то ни было в UDR. Используйте нормальный драйвер работающий по прерываниям.


Ну дак у меня gets() и находится в блоке обработки прерывания, вызываемого при приеме очередного символа по USART!

INTERRUPT (SIG_USART_RCV)
{
gets();
}...

Или вы имеете ввиду посимвольно считывать строку???
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 19 2009, 21:20
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Xenia @ Jun 19 2009, 02:28) *
А вы пытались останавить его тоже комбинацией или простой записью?
Может быть так попробовать:

WDTCSR |= (1<<WDCE);
WDTCSR = 0;

или так:

WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;

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

cli();
wdt_reset();
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;
sei();

Ну тут уж кажется всё предусмотрено с запасом...

Даже не знаю где здесь указывать на "неправильности"... поэтому текст не сокращаю,
ВСЕ показанные варианты не применимы.... тк принципиально зависят от уровня оптимизации компилятора...
Ну нельзя пользовать |= в ситуации наличии 4 тактов для операции и все тут... ну повторим это в 125раз...
Go to the top of the page
 
+Quote Post
qulik
сообщение Jun 19 2009, 21:58
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Цитата(singlskv @ Jun 20 2009, 01:20) *
Ну нельзя пользовать |= в ситуации наличии 4 тактов для операции и все тут... ну повторим это в 125раз...


Ой! А как же тогда быть? Использовать простое приравнивание REGISTOR=0x05?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 19 2009, 22:00
Сообщение #7


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(singlskv @ Jun 20 2009, 01:20) *
ВСЕ показанные варианты не применимы.... тк принципиально зависят от уровня оптимизации компилятора...
Ну нельзя пользовать |= в ситуации наличии 4 тактов для операции и все тут... ну повторим это в 125раз...


Вот, пожалуйста, результат компиляции на IAR EWAVR:

Код
WDTCR |= (1<<WDCE) | (1<<WDE);
00000000   B501               IN      R16, 0x21
00000002   6108               ORI     R16, 0x18
00000004   BD01               OUT     0x21, R16

WDTCR = 0;
00000006   E000               LDI     R16, 0
00000008   BD01               OUT     0x21, R16


- между записями в регистр WDTCR только одна лишняя команда. Итого всего 2 такта между операциями записи.
А про оптимизацию вы не совсем правы, когда речь идет о записи в регистры, то компилятор (IAR) никогда не опускает присваивание, даже если оно повторное. И это при любом типе оптимизации - как по размеру, так и по скорости.
Однако не забывайте название темы - сказано, что WatchDog запустить удалось. А, значит, компиляция велась в условиях, когда требование 4-х тактов соблюдалось. Поэтому это условие я не стала особо оговаривать.

Сообщение отредактировал Xenia - Jun 19 2009, 22:17
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 19 2009, 22:13
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Xenia @ Jun 20 2009, 02:00) *
- между записями в регистр WDTCR только одна лишняя команда. Итого всего 2 такта между операциями записи.
Один раз повезло другой нет...
так и рождаются легенды...



Цитата(qulik @ Jun 20 2009, 01:58) *
Ой! А как же тогда быть? Использовать простое приравнивание REGISTOR=0x05?
Лучше всего заготовьте ВСЕ константы заранее а потом их присваивайте регистрам...



Цитата(Xenia @ Jun 20 2009, 02:00) *
А про оптимизацию вы не совсем правы, когда речь идет о записи в регистры, то компилятор (IAR) никогда не опускает присваивание, даже если оно повторное. И это при любом типе оптимизации - как по размеру, та и по скорости.
я как раз и не забываю, и volatile у Вашего регистра как раз и заставляет делать много(иногда >4) операций
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 19 2009, 22:14
Сообщение #9


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(singlskv @ Jun 20 2009, 02:09) *
Один раз повезло другой нет...
так и рождаются легенды...


Длиннее просто невозможно скомпилировать, т.к. операции с константами всегда производятся еще при компиляии, а не в runtime.
Приведенная в моем прошлом посте компиляция одинакова как при отсутствии оптимизации, так и при оптимизации по скорости или размеру. Поскольку из-за примитивности примера ее невозможно оттранслировать ни длиннее, ни короче.

Цитата(singlskv @ Jun 20 2009, 02:09) *
Лучше всего заготовьте ВСЕ константы заранее а потом их присваивайте регистрам...


Константы невозможно "приготовить заранее". Если вы намереваетесь поместить их в память, то вытаскивание оттуда обойдется дороже - тогда действительно в 4 такта можно не уложиться. А если положить в регистр, то примерно так оно и получится.

P.S. Мой предыдущий пост, адресованный вам, был мною отредактирован. Ознакомьтесь с ним пожалуйста еще разик.

Сообщение отредактировал Xenia - Jun 19 2009, 22:22
Go to the top of the page
 
+Quote Post
qulik
сообщение Jun 19 2009, 22:18
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



А что меняет выбор варианта оптимизации? В AVR Studio есть варианты: О0 - Оs. Поисковик ничего не выдал.

Спасибо! Замечание с константами я учту на будущее.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 19 2009, 22:21
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Xenia @ Jun 20 2009, 02:14) *
Константы невозможно "приготовить заранее". Если вы намереваетесь поместить их в память, то вытаскивание оттуда обойдется дороже - тогда действительно в 4 такта можно не уложиться. А если положить в регистр, то так оно и получится.
Я Вам и предлагаю положить их(константы) во временные регистры...
Цитата
P.S. Мой предыдущий пост, адресованный вам, был мною отредактирован. Ознакомьтесь с ним пожалуйста еще разик.
Вы очень настойчивая девушка... , хотя наверное это и не плохо... но очень торопитесь...
не спешите в своих суждениях... smile.gif
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 19 2009, 22:28
Сообщение #12


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(singlskv @ Jun 20 2009, 02:21) *
Вы очень настойчивая девушка... , хотя наверное это и не плохо... но очень торопитесь...
не спешите в своих суждениях...


Докажите обратное! Приведите результат компиляции этих двух сишных строк, чтобы компилятор допустил больше одной промежуточной инструкции между записями в регистр WDTCR. Условия оптимизации можете выбирать любые.

Сообщение отредактировал Xenia - Jun 19 2009, 22:28
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 19 2009, 22:35
Сообщение #13


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(qulik @ Jun 20 2009, 02:18) *
А что меняет выбор варианта оптимизации? В AVR Studio есть варианты: О0 - Оs. Поисковик ничего не выдал.
Все меняет, если хотите работу на С для таких вариантов(4такта на все) то только -Os или -O2 рулит..
Цитата
Спасибо! Замечание с константами я учту на будущее.
Ну и подготовленные заранее константы рулят всегда...



Цитата(Xenia @ Jun 20 2009, 02:28) *
Докажите обратное! Приведите результат компиляции этих двух сишных строк, чтобы компилятор допустил больше одной промежуточной инструкции между записями в регистр WDTCR. Условия оптимизации можете выбирать любые.
Ксения, я Вам позволю самой воспользоваться поиском, особенно по теме записи в EEPROM, и там Вы найдете
ВСЕ ответы, в том числе и мои...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 19 2009, 22:36
Сообщение #14


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(qulik @ Jun 20 2009, 02:18) *
Спасибо! Замечание с константами я учту на будущее.


В данном случае варианты компиляции выражения
WDTCR |= (1<<WDCE) | (1<<WDE);
несущественны, поскольку запись в регистр WDTCR всегда будет ПОСЛЕДНЕЙ инструкцией. А, стало быть, протяжка перед следующей строкой
WDTCR = 0;
зависит исключительно от сложности обнуления регистра. Дольше двух тактов это не затянется при любых способах оптимизации или отсутствия оной.

Сообщение отредактировал Xenia - Jun 19 2009, 22:40
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 19 2009, 22:48
Сообщение #15


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Xenia @ Jun 20 2009, 02:36) *
Дольше двух тактов это не затянется при любых способах оптимизации или отсутствия оной.
Давайте Вы уже избавитесь от илюзий и попробуете это сделать совсем без оптимизации..
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 13:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016