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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> ГЛЮКИ КОМПИЛЯТОРОВ, предлагаю описывать здесь
Fortune
сообщение Feb 6 2007, 11:28
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 1-02-07
Из: Украина
Пользователь №: 24 940



Открыть эту тему меня подтолкнул тот факт, что используя однажды в IARe функцию SIN, я так и не смог добиться нормальной ее работы. Хотя не утверждаю что мой код не содержал ошибок, но все же может кто-то сталкивался с подобными проблемами?

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

Предлагаю также сюда кидать описание глюков (багов, граблей) при работе с компиляторами...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 6 2007, 12:12
Сообщение #2


Гуру
******

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



Предыдущие попытки "обвинить" компилятор и уличить его в граблях, заканчивались провалом. (По крайней мере в области языка). Так что не думаю, что данная ветка будет содержать большое колличество постов. Хотя кто знает ...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 6 2007, 12:53
Сообщение #3


Шаман
******

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



Цитата(SasaVitebsk @ Feb 6 2007, 11:12) *
Предыдущие попытки "обвинить" компилятор и уличить его в граблях, заканчивались провалом. (По крайней мере в области языка). Так что не думаю, что данная ветка будет содержать большое колличество постов. Хотя кто знает ...

Подавляющее количество подобных глюков - от недопонимания. Зато как хорошо звучит: "ГЛЮКИ КОМПИЛЯТОРОВ"
Тем не менее, позволю себе указать на один реальный (я уже писал о нём).
Тулчейн от IAR не важно какой версии.
Глюк содержится в файле \avr\src\lib\eeprom.s90 (предкомпилирован во все библиотеки с еепром больше 256 байт) и заключается в неверной записи в еепром чисел типа long long.
Для исправления глюка надо включить в проект исправленный файл.
Исправить надо содержимое функции __eeput64_16:
заменить в ней ?eeput16 на ?eeput16_64 и ?eeput16_inc на ?eeput16_64_inc.
Как это ни странно, но разработчики от версии к версии вносят изменения только в комментарии.
Go to the top of the page
 
+Quote Post
satellite-plus
сообщение Feb 6 2007, 13:18
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 8-01-07
Из: Одесса
Пользователь №: 24 196



?eeget16_64_inc:
ADIW R25:R24,1
?eeget16_64:
RCALL ?eewait
OUT EEARL,R24
//***********************************************
OUT EEARH,R25
SBI EECR,EERE
RET

Является ли глюком загрузка адреса без запрета прерывания? Если в прерывании захочется обратится к EEPROM можно сбить EEARL.


--------------------
Опыт - это та чудесная штука, которая позволяет вам узнать ошибку, когда вы ее повторите.
Go to the top of the page
 
+Quote Post
Fortune
сообщение Feb 6 2007, 13:23
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 1-02-07
Из: Украина
Пользователь №: 24 940



Цитата(SasaVitebsk @ Feb 6 2007, 13:12) *
Предыдущие попытки "обвинить" компилятор и уличить его в граблях, заканчивались провалом. (По крайней мере в области языка). Так что не думаю, что данная ветка будет содержать большое колличество постов. Хотя кто знает ...


Почему, программы ведь пишутся людьми(компилятор-тоже не ислключение), а люди ошибаются...
Go to the top of the page
 
+Quote Post
_Bill
сообщение Feb 6 2007, 13:28
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Fortune @ Feb 6 2007, 13:23) *
Цитата(SasaVitebsk @ Feb 6 2007, 13:12) *

Предыдущие попытки "обвинить" компилятор и уличить его в граблях, заканчивались провалом. (По крайней мере в области языка). Так что не думаю, что данная ветка будет содержать большое колличество постов. Хотя кто знает ...


Почему, программы ведь пишутся людьми(компилятор-тоже не ислключение), а люди ошибаются...

Вот и давайте разбираться с этими "ГЛЮКАМИ". Я думаю, лучше всего в одной ветке. Хотя бы здесь.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Feb 6 2007, 13:41
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Согласен с теми, кто предлагает вынести на широкое бсуждение Т.Н. ГЛЮКОВ компиллятора. И не важно, следствием чего они являются, ошибками разработчиков компиллятора, или недопониманием чего - либо нами самими. Вот к примеру:
http://electronix.ru/forum/index.php?showtopic=26578
я создал этот пост, и сам разобрался в чем дело. Только вот не до конца понял, чей это "косяк".
Так, что, вперед... И с песней...
Меньше будет недопонимания, меньше будет "ГЛЮКОВ".
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 6 2007, 13:44
Сообщение #8


Шаман
******

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



Цитата(satellite-plus @ Feb 6 2007, 12:18) *
Является ли глюком загрузка адреса без запрета прерывания? Если в прерывании захочется обратится к EEPROM можно сбить EEARL.

Нет, не является.
Но если существует возможность обращения к еепром (или к любому другому подобному ресурсу) из прерываний (или в других процессах в случае применения RTOS), то обрамление критичного ресурса процедурами сохранения/запрета/восстановления прерываний ложится на пользователя.
Но когда это бывает нужно, то это несложно сделать. Я уже выкладывал исправленный файл в этой ветке.
Go to the top of the page
 
+Quote Post
Fortune
сообщение Feb 6 2007, 14:04
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 1-02-07
Из: Украина
Пользователь №: 24 940



Цитата(_Bill @ Feb 6 2007, 14:28) *
Вот и давайте разбираться с этими "ГЛЮКАМИ". Я думаю, лучше всего в одной ветке. Хотя бы здесь.


Ну давайте. Вот код(нашел все-таки, я тогда не разобрался до конца в чем дело):

void sine()
{
unsigned int x;
unsigned char y;
float a;

for (x=0; x<320; x++)
{
a=(float)x/50;
y=(40*sin(a))+100;
point(x,y,0x0a);
delay(250);
}

}

Это для ЖКИ 320x240.
Go to the top of the page
 
+Quote Post
GDI
сообщение Feb 6 2007, 14:30
Сообщение #10


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Может потому что функция имеет следующее объявление
double sin(double);
А вы ей float скормить пытаетесь...


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
xinod2000
сообщение Feb 6 2007, 14:50
Сообщение #11





Группа: Участник
Сообщений: 6
Регистрация: 31-10-06
Пользователь №: 21 826



Цитата(Fortune @ Feb 6 2007, 15:04) *
Цитата(_Bill @ Feb 6 2007, 14:28) *

Вот и давайте разбираться с этими "ГЛЮКАМИ". Я думаю, лучше всего в одной ветке. Хотя бы здесь.


Ну давайте. Вот код(нашел все-таки, я тогда не разобрался до конца в чем дело):

void sine()
{
unsigned int x;
unsigned char y;
float a;

for (x=0; x<320; x++)
{
a=(float)x/50;
y=(40*sin(a))+100;
point(x,y,0x0a);
delay(250);
}

}

Это для ЖКИ 320x240.


А как выглядит сей баг\глюк, в чем проявляется?
Насколько я вижу, то более коректным является

y=(char)((40*sin(a))+100);

а так особого криминала не вижу.
ну и аргументы функции sin()

Сообщение отредактировал xinod2000 - Feb 6 2007, 14:52
Go to the top of the page
 
+Quote Post
_Bill
сообщение Feb 6 2007, 15:23
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(xinod2000 @ Feb 6 2007, 14:50) *
Цитата(Fortune @ Feb 6 2007, 15:04) *

Цитата(_Bill @ Feb 6 2007, 14:28) *

Вот и давайте разбираться с этими "ГЛЮКАМИ". Я думаю, лучше всего в одной ветке. Хотя бы здесь.


Ну давайте. Вот код(нашел все-таки, я тогда не разобрался до конца в чем дело):

void sine()
{
unsigned int x;
unsigned char y;
float a;

for (x=0; x<320; x++)
{
a=(float)x/50;
y=(40*sin(a))+100;
point(x,y,0x0a);
delay(250);
}

}

Это для ЖКИ 320x240.


А как выглядит сей баг\глюк, в чем проявляется?
Насколько я вижу, то более коректным является

y=(char)((40*sin(a))+100);

а так особого криминала не вижу.
ну и аргументы функции sin()

Вроде, и так все коррктно. Не нужно только забывать включать соотвествующие заголовочные файлы с прототипами функций.
Go to the top of the page
 
+Quote Post
ahulap
сообщение Feb 6 2007, 16:19
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



мне кажется, что дело здесь в преобразовании типов - результат sin(a) преобразовывается в char, т.е. всегда 0.
может, попробовать что-то вроде y=(40.0*sin(a))+100 или y=(unsigned char)((float)(40.0*sin(a))+100) ...
Go to the top of the page
 
+Quote Post
_Bill
сообщение Feb 6 2007, 16:28
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(ahulap @ Feb 6 2007, 16:19) *
мне кажется, что дело здесь в преобразовании типов - результат sin(a) преобразовывается в char, т.е. всегда 0.
может, попробовать что-то вроде y=(40.0*sin(a))+100 или y=(unsigned char)((float)(40.0*sin(a))+100) ...

Да правильно там все. То, что Вы предлагаете, совершенно излишне. Хотя это и не делает выражение некорректным, но делает менее читабельным. И вообще, "глюк"-то в чем?
Go to the top of the page
 
+Quote Post
Fortune
сообщение Feb 7 2007, 11:50
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 1-02-07
Из: Украина
Пользователь №: 24 940



Цитата(_Bill @ Feb 6 2007, 17:28) *
... И вообще, "глюк"-то в чем?


Ну началось все с того, что я подключил atmega128 к монитору bg320240 через sed1375 и сделал интерфейс связи с писюком через usart.
так вот, если обсчитываю по приведенной выше программе значение функции
в компьютере - получаю на экране чистый синус,
если пытаюсь обсчитать в контроллере, то выводится мусор, точнее та же синусоида,но грязная, и если выводить ее повторно, через некоторое время синус обрисовывается треугольником, случайные точки тоже имеются.Жаль не могу прислать скриншот, потому что девайс пока у меня не работает - надо монитор доставать.
Ну а разобраться тогда с проблемой у меня не хватило терпения, поэтому и жалуюсь
на компилятор, ибо за собой греха "успеть не нашел".
Go to the top of the page
 
+Quote Post

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

 


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


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