|
IAR EWAVR v5.30.6 и WDT, таймаут WDT до main (длинная инициализация) |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Dec 14 2009, 16:06
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(ivainc1789 @ Dec 14 2009, 18:42)  Насколько я понял, для решения задачи нужно создать проект библиотеки на основе стандартной CLIB, внести туда изменения (в __low_level_init()) и скомпилировать эту "свою" библиотеку. Далее эту свою библиотеку подключить к проекту. Странно, но редактор в проекте библиотеки ругается на // комменты, /* а такие */ воспринимает нормально. Это баг? И что же теперь, по каждому чиху перекомпилировать стандартные либы? Других способов видимо нет? Поняли неправильно. В Вашем файле с функцией main определяете функцию __low_level_init() в которой отключаете сторожевой таймер на время инициализации. Далее настраиваете свое приложение и включаете сторожевой таймер. Конкретно с IAR для AVR не работал, но идеология у IAR общая. Для MSP430 делаю именно так. Если функция не определена, то ничего не делается. Если определена, то вызывается до main. Обратите внимание на возвращаемое значение 1 или 0, в зависимости от которого идет инициализация сегментов памяти. Лучше всего почитать документацию на компилятор для деталей.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Dec 14 2009, 16:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(ivainc1789 @ Dec 14 2009, 17:42)  Насколько я понял, для решения задачи нужно создать проект библиотеки на основе стандартной CLIB, внести туда изменения (в __low_level_init()) и скомпилировать эту "свою" библиотеку. Где вы нашли такое в документации?? Просто добавьте в свой проект функцию Код int __low_level_init() { // тут все, что вы хотите выполнить сразу же после инициализации указателя стека
return 1; } Если проект на С++, то функцию надо объявить с extern "C" Цитата(ivainc1789 @ Dec 14 2009, 17:42)  Странно, но редактор в проекте библиотеки ругается на // комменты, /* а такие */ воспринимает нормально. Это баг? Редактор ругается или все же компилятор? Посмотрите в настройках проекта раздел C/C++ compiler -> Language. Там надо выбрать Allow IAR extensions. Дело в том, что коментарии '//' - это из С++, в стандартном С89 таких комментариев нет. Цитата(ivainc1789 @ Dec 14 2009, 17:42)  И что же теперь, по каждому чиху перекомпилировать стандартные либы? Достаточно просто вдумчиво читать документацию.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 3 2010, 21:58
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
Цитата(VladislavS @ Jan 3 2010, 10:09)  Скорее всего вы на С++ наделали Нет, писано на С. Проблема вылезла именно с увеличением объема кода. Времени не хватало, пришлось писать быстро, возможно в ущерб качеству, но др выхода не было. По-моему, там пришлось даже компилятору инициализировать несколько переменных в EEPROM. А это время... Вот WDT и успел сработать. По памяти в ATmega324P по сбросу WDT устанавливается на 16ms (мин значение). ИМХО, вполне реально преодолеть... WDTON я просто поставил для проверки, когда проблема обнаружилась, и начал уменьшать код. В определенный момент при меньшем объеме все заработало... А так, конечно, этот фуз у меня не запрограммирован, а WDT включаю программно, когда нужно...
|
|
|
|
|
Jan 4 2010, 08:35
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Xenia @ Jan 4 2010, 05:41)  Дурью, господа, маетесь. стараясь запустить проц, который не может пройти setup без ошибок. Давайте не будем столь категорично оценивать друг друга. Ведь зачем-то этот фуз вставили в процессор? Значит есть такие задачи, где WDT должен быть включен при исполнении стартапа.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 4 2010, 09:50
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Xenia @ Jan 4 2010, 11:12)  Очень возможно, что такие задачи существуют. Но в данной теме обсуждается проблема раннего срабатывания watch dog'а. Подобным методом можно отсечь любые аргументы. В исходном посте не было описано "такая" задача у автора или нет. Раз он включил собаку - значит мы должны предположить, что сделал он это сознательно и что задача именно "такая". Бороться надо не со следствием, а с причиной. Если на стартап нужно больше времени - значит надо правильно настроить собаку перед выполнением стартапа (и, возможно, снова перенастроить после стартапа), а не отключать ее. И именно такое решение и просил автор. Ваш метод решения напоминает установку гвоздя вместо "автомата" на лестнице, который постоянно выбивало из-за стиралки, бойлера и "теплых" полов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 4 2010, 10:21
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Сергей Борщ @ Jan 4 2010, 11:35)  Значит есть такие задачи, где WDT должен быть включен при исполнении стартапа. Возможно. Назовешь, хоть одну? Типа отлаживались без WD медленно и печально а потом fuse включили (главное не забыть) и отдали в серию? Но тут startup ни причем.... У меня до сих пор фантазии как-то не хватило и включаю WD ручками, если включаю. Если вдруг должен будет включен во время startup, то там не только проинициализирую, но и включу. Позицию разработчиков некоторых контроллеров, которые по reset всегда WD включают и дают потом возможность один раз отключить или перенастроить я еще понимаю, но зачем разновариантность вводить-то?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|