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

 
 
 
Reply to this topicStart new topic
> Глюк на глюке..., перешел на IAR :)
king2
сообщение Oct 16 2006, 15:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 255
Регистрация: 17-08-06
Из: Москва
Пользователь №: 19 646



До этого писал проект на ICCAVR7 (imagecraft). Закончился триальный срок, решил попробовать IAR, вроде все и везде его хвалят.

После изменения в проекте разных штучек типа объявления прерываний скомпилял проект и понеслась душа в рай.

То оно работает, то оно виснет. Виснет в разных местах (разное количество символов выводя на ЖК). Увеличил значение стека, вроде прошло через первый инит и зажгло светодиодик. Ура.

Дальше больше. Почему-то не работает sprintf, ни с CLIB, ни с DLIB. Увеличил CSTACK до 0x50, RSTACK до 0x40 - не помогло. Иногда на дисплейчике все же появляется то пол-строчки, то еще глюк какой, и постоянно виснет через несколько секунд или минут работы.

С ICCAVR подобного глюкалова не было, код не менялся никак..

В коде используется TIMER1 (OVF, CAPT, COMPB) и timer2_ovf, контроллер mega16.

Может я чего забыл-не учел-не узнал?

Спасибо заранее!

Сообщение отредактировал king2 - Oct 16 2006, 15:07
Go to the top of the page
 
+Quote Post
Alex11
сообщение Oct 16 2006, 15:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Для начала полностью выключить оптимизацию - там один большой глюк, без нее, как правило, работает. Дальше можно, после того, как все заработает, увеличивать уровень оптимизации, пока не сломается. Эта зараза, мало того, что не видит сама, что переменная используется в прерываниях, так еще и игнорирует слово volatile, после чего может выкинуть половину программы в оптимизаторе.
Go to the top of the page
 
+Quote Post
king2
сообщение Oct 16 2006, 15:30
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 255
Регистрация: 17-08-06
Из: Москва
Пользователь №: 19 646



Цитата(Alex11 @ Oct 16 2006, 19:27) *
Для начала полностью выключить оптимизацию - там один большой глюк, без нее, как правило, работает. Дальше можно, после того, как все заработает, увеличивать уровень оптимизации, пока не сломается. Эта зараза, мало того, что не видит сама, что переменная используется в прерываниях, так еще и игнорирует слово volatile, после чего может выкинуть половину программы в оптимизаторе.

Оптимизация выключена. Проблема (или по крайней мере не вся проблема) не в компиляторе, потому что иногда он все-таки выводит первую часть строчки...
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 16 2006, 15:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Функция sprintf требует для работы весьма много стека (иногда до 1,5кБайт).
Go to the top of the page
 
+Quote Post
king2
сообщение Oct 16 2006, 16:31
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 255
Регистрация: 17-08-06
Из: Москва
Пользователь №: 19 646



Цитата(rezident @ Oct 16 2006, 19:51) *
Функция sprintf требует для работы весьма много стека (иногда до 1,5кБайт).

Хм, а что, она так плохо реализована?
Почему в ICCAVR все нормально, а тут до полутора килобайт? Где я стока в меге16 возьму? smile.gif

Неужели чтобы запихнуть один байт в 16 символов нужно столько стека???
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 16 2006, 16:49
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(king2 @ Oct 16 2006, 22:31) *
Неужели чтобы запихнуть один байт в 16 символов нужно столько стека???

А зачем вам в таком случае sprintf? Пишите напрямую. Побайтно. Я, например, недавно при нехватке RAM в МК писал свой putchar и выводил символы на индикацию посимвольно (побайтно), а не строкой.
P.S. В IAR есть несколько моделей sprintf, в зависимости от выбора требования к стеку разные.
Go to the top of the page
 
+Quote Post
king2
сообщение Oct 16 2006, 17:33
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 255
Регистрация: 17-08-06
Из: Москва
Пользователь №: 19 646



Цитата(rezident @ Oct 16 2006, 20:49) *
Цитата(king2 @ Oct 16 2006, 22:31) *

Неужели чтобы запихнуть один байт в 16 символов нужно столько стека???

А зачем вам в таком случае sprintf? Пишите напрямую. Побайтно. Я, например, недавно при нехватке RAM в МК писал свой putchar и выводил символы на индикацию посимвольно (побайтно), а не строкой.
P.S. В IAR есть несколько моделей sprintf, в зависимости от выбора требования к стеку разные.

Да вот чтобы как раз самому не писать.
Вне зависимости от используемой модели все равно глючит.
Охх, буду пробовать разбираться..
Go to the top of the page
 
+Quote Post
arttab
сообщение Oct 17 2006, 01:39
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Цитата
Для начала полностью выключить оптимизацию - там один большой глюк, без нее, как правило, работает.


Может тогда вообще отказаться от IAR? Глюки бывают в алгоритме, в неиспользовании или неправильном использовании объявлений, ошибки в библиотеках или в нестыковки их между собой и очень редко в самом каде.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 17 2006, 04:45
Сообщение #9


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(Alex11 @ Oct 16 2006, 18:27) *
Для начала полностью выключить оптимизацию - там один большой глюк, без нее, как правило, работает.


Не согласен. Отличный оптимизатор.

Цитата
Дальше можно, после того, как все заработает, увеличивать уровень оптимизации, пока не сломается.


Весь свой софт пишу сразу с установками макс. оптимизации (обычно по скорости). Проблем не было, если все грамотно писать.

Цитата
Эта зараза, мало того, что не видит сама, что переменная используется в прерываниях, так еще и игнорирует слово volatile, после чего может выкинуть половину программы в оптимизаторе.


Приведите пожалуйста пример. По моему опыту, volatile надежно решает проблемы (иногда даже слишком, в смысле лишнего кода)...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 17 2006, 05:14
Сообщение #10


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Rst7 @ Oct 17 2006, 11:45) *
Цитата(Alex11 @ Oct 16 2006, 18:27) *

Для начала полностью выключить оптимизацию - там один большой глюк, без нее, как правило, работает.


Не согласен. Отличный оптимизатор.

Цитата
Дальше можно, после того, как все заработает, увеличивать уровень оптимизации, пока не сломается.


Весь свой софт пишу сразу с установками макс. оптимизации (обычно по скорости). Проблем не было, если все грамотно писать.

Цитата
Эта зараза, мало того, что не видит сама, что переменная используется в прерываниях, так еще и игнорирует слово volatile, после чего может выкинуть половину программы в оптимизаторе.


Приведите пожалуйста пример. По моему опыту, volatile надежно решает проблемы (иногда даже слишком, в смысле лишнего кода)...

Присоединяюсь! cheers.gif Всегда использовал и использую максимальный уровень оптимизации на IAR'е, никогда проблем не встречал. На деле больше проблем, как раз, при средних и низких уровнях оптимизации.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
king2
сообщение Oct 17 2006, 10:23
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 255
Регистрация: 17-08-06
Из: Москва
Пользователь №: 19 646



Цитата(arttab @ Oct 17 2006, 05:39) *
Цитата
Для начала полностью выключить оптимизацию - там один большой глюк, без нее, как правило, работает.


Может тогда вообще отказаться от IAR? Глюки бывают в алгоритме, в неиспользовании или неправильном использовании объявлений, ошибки в библиотеках или в нестыковки их между собой и очень редко в самом каде.

Да похоже, что все к тому и идет.
По поводу ошибок в объявлениях и прочем - тот же самый код, один в один, кроме формата объявления прерываний, записи nop, sei и cli и имени инклудов - чудесно и надежно работает при компилежке его при помощи ICCAVR. Так что оно может конечно ошибка и в коде, но не настолько же...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 17 2006, 10:34
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(king2 @ Oct 17 2006, 13:23) *
Да похоже, что все к тому и идет.

Если Вы так уверены, то не стоит колебаться. ("Никогда не повторяйте удачный эксперимент" закон Мерфи)
Цитата(king2 @ Oct 17 2006, 13:23) *
По поводу ошибок в объявлениях и прочем - тот же самый код, один в один, кроме формата объявления прерываний, записи nop, sei и cli и имени инклудов - чудесно и надежно работает при компилежке его при помощи ICCAVR.

Не аргумент.
Вы могли и не заметить того, что используете недостатки компилятора, сами того не подозревая.
Цитата(king2 @ Oct 17 2006, 13:23) *
Так что оно может конечно ошибка и в коде, но не настолько же...

Уж поверьте на слово, бывает и не только "настолько же", а и похлеще.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 17 2006, 19:49
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Простите, но не верю что дело в компиляторе. Может не совсем в компиляторе?

У меня прога 6К несколько прерываний. В том числе вложенных. Структуры и файлы. Применял разные виды оптимизации. Прямых глюков не заметил. Интересное поведение на JTAG - действительно было. Но с IARом явно не связано. Как только впрямую заливаешь - всё класс. Ну ладно я, но пользователей данного компилятора по миру - море. И если бы такие хомуты, - буча была бы.

А может проблема в каких-нибудь переменных. Ну например в прерывании. Тот компилятор в лоб сохранял всё, а этот только используемые. Короче ищите како-то хомут.

Да ещё с EEPROM работаете? А в прерывании?
Go to the top of the page
 
+Quote Post
Георгий
сообщение Oct 18 2006, 07:57
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Да, действительно, нужно глянуть в доках как компиляторы передают переменные в функции, может набор регистров разный, и используется тот, который вы вручную используете или еще что нибудь подобное.


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post

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

 


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


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