|
ГЛЮКИ КОМПИЛЯТОРОВ, предлагаю описывать здесь |
|
|
|
Feb 6 2007, 12:53
|

Шаман
     
Группа: Модераторы
Сообщений: 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. Как это ни странно, но разработчики от версии к версии вносят изменения только в комментарии.
|
|
|
|
|
Feb 6 2007, 13:18
|
Участник

Группа: Участник
Сообщений: 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.
--------------------
Опыт - это та чудесная штука, которая позволяет вам узнать ошибку, когда вы ее повторите.
|
|
|
|
|
Feb 6 2007, 13:28
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Fortune @ Feb 6 2007, 13:23)  Цитата(SasaVitebsk @ Feb 6 2007, 13:12)  Предыдущие попытки "обвинить" компилятор и уличить его в граблях, заканчивались провалом. (По крайней мере в области языка). Так что не думаю, что данная ветка будет содержать большое колличество постов. Хотя кто знает ...
Почему, программы ведь пишутся людьми(компилятор-тоже не ислключение), а люди ошибаются... Вот и давайте разбираться с этими "ГЛЮКАМИ". Я думаю, лучше всего в одной ветке. Хотя бы здесь.
|
|
|
|
|
Feb 6 2007, 13:41
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

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

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

|
Цитата(satellite-plus @ Feb 6 2007, 12:18)  Является ли глюком загрузка адреса без запрета прерывания? Если в прерывании захочется обратится к EEPROM можно сбить EEARL. Нет, не является. Но если существует возможность обращения к еепром (или к любому другому подобному ресурсу) из прерываний (или в других процессах в случае применения RTOS), то обрамление критичного ресурса процедурами сохранения/запрета/восстановления прерываний ложится на пользователя. Но когда это бывает нужно, то это несложно сделать. Я уже выкладывал исправленный файл в этой ветке.
|
|
|
|
|
Feb 6 2007, 14:04
|

Частый гость
 
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Feb 6 2007, 14:50
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 6 2007, 15:23
|
Местный
  
Группа: Участник
Сообщений: 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() Вроде, и так все коррктно. Не нужно только забывать включать соотвествующие заголовочные файлы с прототипами функций.
|
|
|
|
|
Feb 6 2007, 16:19
|
Участник

Группа: Участник
Сообщений: 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) ...
|
|
|
|
|
Feb 6 2007, 16:28
|
Местный
  
Группа: Участник
Сообщений: 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) ... Да правильно там все. То, что Вы предлагаете, совершенно излишне. Хотя это и не делает выражение некорректным, но делает менее читабельным. И вообще, "глюк"-то в чем?
|
|
|
|
|
Feb 7 2007, 11:50
|

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

|
Цитата(_Bill @ Feb 6 2007, 17:28)  ... И вообще, "глюк"-то в чем? Ну началось все с того, что я подключил atmega128 к монитору bg320240 через sed1375 и сделал интерфейс связи с писюком через usart. так вот, если обсчитываю по приведенной выше программе значение функции в компьютере - получаю на экране чистый синус, если пытаюсь обсчитать в контроллере, то выводится мусор, точнее та же синусоида,но грязная, и если выводить ее повторно, через некоторое время синус обрисовывается треугольником, случайные точки тоже имеются.Жаль не могу прислать скриншот, потому что девайс пока у меня не работает - надо монитор доставать. Ну а разобраться тогда с проблемой у меня не хватило терпения, поэтому и жалуюсь на компилятор, ибо за собой греха "успеть не нашел".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|