|
ГЛЮКИ КОМПИЛЯТОРОВ, предлагаю описывать здесь |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 41)
|
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. так вот, если обсчитываю по приведенной выше программе значение функции в компьютере - получаю на экране чистый синус, если пытаюсь обсчитать в контроллере, то выводится мусор, точнее та же синусоида,но грязная, и если выводить ее повторно, через некоторое время синус обрисовывается треугольником, случайные точки тоже имеются.Жаль не могу прислать скриншот, потому что девайс пока у меня не работает - надо монитор доставать. Ну а разобраться тогда с проблемой у меня не хватило терпения, поэтому и жалуюсь на компилятор, ибо за собой греха "успеть не нашел".
|
|
|
|
|
Feb 7 2007, 13:33
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Fortune @ Feb 7 2007, 11:50)  Цитата(_Bill @ Feb 6 2007, 17:28)  ... И вообще, "глюк"-то в чем?
Ну началось все с того, что я подключил atmega128 к монитору bg320240 через sed1375 и сделал интерфейс связи с писюком через usart. так вот, если обсчитываю по приведенной выше программе значение функции в компьютере - получаю на экране чистый синус, если пытаюсь обсчитать в контроллере, то выводится мусор, точнее та же синусоида,но грязная, и если выводить ее повторно, через некоторое время синус обрисовывается треугольником, случайные точки тоже имеются.Жаль не могу прислать скриншот, потому что девайс пока у меня не работает - надо монитор доставать. Ну а разобраться тогда с проблемой у меня не хватило терпения, поэтому и жалуюсь на компилятор, ибо за собой греха "успеть не нашел". А как со временем? Вы же пытаетесь формировать сигнал в реальном времени, а вычисления с плавающей точкой времени требуют.
|
|
|
|
|
Feb 7 2007, 16:01
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Fortune @ Feb 7 2007, 15:19)  Цитата(_Bill @ Feb 7 2007, 14:33)  А как со временем? Вы же пытаетесь формировать сигнал в реальном времени, а вычисления с плавающей точкой времени требуют.
Что значит "времени требуют"? Немного не понимаю. Я вызвал функцию, она посчитала. Функция ведь не в фоне выполняется. Сколько времени занимает вычисление sin для одной точки - 100 мкс, 1 мс, 5 мс?
|
|
|
|
|
Feb 7 2007, 16:06
|
Участник

Группа: Свой
Сообщений: 70
Регистрация: 4-04-06
Из: г. Омск
Пользователь №: 15 777

|
Почему никто не обратил внимание на вот это Цитата(GDI @ Feb 6 2007, 17:30)  Может потому что функция имеет следующее объявление double sin(double); А вы ей float скормить пытаетесь... тогда полная запись выглядела бы так y=(unsigned char)((40.0*sin((double)a))+100.0), а еще лучше переменную объявить сразу как double a; Хотя, честно говоря совсем не уверен, что это все это поможет. Но есть еще функция Цитата point(x,y,0x0a); где ее объявление? Может все дело в ней?
|
|
|
|
|
Feb 7 2007, 17:26
|
Участник

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

|
запись y=(40*sin(a))+100 верна, я проверил на нескольких числах - точно как в виндовом калькуляторе. IAR 4.11A, "Use 64-bit doubles" не установлена. может опять переполнение стека?
|
|
|
|
|
Feb 7 2007, 18:18
|

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

|
Цитата(_Bill @ Feb 7 2007, 17:01)  Сколько времени занимает вычисление sin для одной точки - 100 мкс, 1 мс, 5 мс? На этот вопрос ответить не могу, нет возможности запустить девайс, но разве это так важно? меня по-моему не должно беспокоить время выполнения. Цитата(ahulap @ Feb 7 2007, 18:26)  запись y=(40*sin(a))+100 верна, я проверил на нескольких числах - точно как в виндовом калькуляторе. IAR 4.11A, "Use 64-bit doubles" не установлена. может опять переполнение стека? Проверил в проекте, Data stack 0x80 bytes, return address stack 0x80 - это немало, вроде Ну я вообще к тому, может кто-то использовал IAR и функцию SIN в реальных разработках, считает или нет?
|
|
|
|
|
Feb 8 2007, 17:23
|

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

|
Цитата(Fortune @ Feb 8 2007, 15:10)  Цитата(GDI @ Feb 8 2007, 16:59)  ... предлагаю считать данный случай не глюком компилятора, а глюком программиста, не в обиду будет сказано...
Не факт, если дойдут руки, я еще раз проверю чей глюк... Просмотрел обсуждение и не нашел упоминания - какой именно компилятор использовался. Он имеет симулятор? Вы можете написать простую программу, заполняющую массив из 36(100, 360) чисел типа float значением sin(i * 2 * M_PI / (sizeof(array)/sizeof(array[0])) и таким образом выяснить виновата функция sin или дальнейшая формула? Если функция не виновата, можно медитировать формулу. если виновата функция - будем "разбирать" ее.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 8 2007, 18:28
|
Участник

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

|
Цитата(Fortune @ Feb 7 2007, 10:50)  если пытаюсь обсчитать в контроллере, то выводится мусор, точнее та же синусоида,но грязная, и если выводить ее повторно, через некоторое время синус обрисовывается треугольником, случайные точки тоже имеются. Не может эта функция давать разные результаты. А 128 байт стека (если не ошибаюсь) может и не хватить, особенно если есть локальные массивы или обработка внутри прерываний...
|
|
|
|
|
Feb 8 2007, 21:02
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Fortune @ Feb 6 2007, 11:28)  ... Предлагаю также сюда кидать описание глюков (багов, граблей) при работе с компиляторами... не знаю глюк или нет.. но и в симуляторе от атмела, и в самих кристаллах - неправильно трактуются ведущие нули, при инициализации регистров (азм). Не проходила (дай бог памяти) инициализация регистров с ведущими нулями в 10сс. с уважением (круглый) ЗЫ НЕ проходила - это значит что в регистр заносился бред, а не значение которое грузилось. Да, и ышо... Прогон с выводом на ЖК подтвердил - это результат компиляции... ЗЫ ЗЫ Ну про баги у кейла под 51 серию - я не буду тут распространяться.
|
|
|
|
|
Feb 8 2007, 21:35
|
Участник

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

|
Цитата(kolobok0 @ Feb 8 2007, 20:02)  не знаю глюк или нет.. но и в симуляторе от атмела, и в самих кристаллах - неправильно трактуются ведущие нули, при инициализации регистров (азм). Не проходила (дай бог памяти) инициализация регистров с ведущими нулями в 10сс. Ведущим нулем обозначается восьмиричная сс. Или не все так просто?
|
|
|
|
|
Feb 9 2007, 06:06
|
Участник

Группа: Свой
Сообщений: 70
Регистрация: 4-04-06
Из: г. Омск
Пользователь №: 15 777

|
Цитата Вряд ли. Потому что прямые линии рисуются этой функцией нормально Какая прямая? Y у нее изменяется?(по крайней мере в пределах диапазона Y для функции с SIN). Если это не так, то это ничего не значит. Вы бы привели все-таки саму функцию здесь. Цитата Ну про баги у кейла под 51 серию - я не буду тут распространяться. Хотя бы один приведите. Можете даже отдельную ветку создать.
|
|
|
|
|
Feb 9 2007, 11:05
|

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

|
Цитата(DimG @ Feb 9 2007, 07:06)  Цитата Вряд ли. Потому что прямые линии рисуются этой функцией нормально Какая прямая? Y у нее изменяется?(по крайней мере в пределах диапазона Y для функции с SIN). Если это не так, то это ничего не значит. Вы бы привели все-таки саму функцию здесь. Цитата Ну про баги у кейла под 51 серию - я не буду тут распространяться. Хотя бы один приведите. Можете даже отдельную ветку создать. Y меняется естественно, я рисовал линии с наклоном в 0, pi/2, pi/3, pi/4,pi/6. Потом создал массив, заполнил массив значениями синусоидальной функции(посчитал в компьютере) и через USART передал в контроллер. С массива синусоида вывелась контроллером нормально. Так что у меня нет повода сомневаться в том, что функция вывода точки работала как надо. Ну текст то мне привести не сложно, но что вам это даст? Это всего лишь особенности работы с контроллером SED.Мне придется обьяснять как работает этот контроллер,и мы уйдем от темы. Я попробую на днях ввести данные, посчитанные функцией sine на флеш карту(SD-карту через SPI уже подключил), тогда посмотрим, что к чему.Если синус окажется истинным, значит мне придется признать, что глюк был по моей вине Цитата(Сергей Борщ @ Feb 8 2007, 18:23)  Просмотрел обсуждение и не нашел упоминания - какой именно компилятор использовался. Он имеет симулятор? Вы можете написать простую программу, заполняющую массив из 36(100, 360) чисел типа float значением sin(i * 2 * M_PI / (sizeof(array)/sizeof(array[0])) и таким образом выяснить виновата функция sin или дальнейшая формула? Если функция не виновата, можно медитировать формулу. если виновата функция - будем "разбирать" ее. IAR. Попробуем.
|
|
|
|
|
Feb 9 2007, 11:23
|
Участник

Группа: Свой
Сообщений: 70
Регистрация: 4-04-06
Из: г. Омск
Пользователь №: 15 777

|
Fortune Вообще-то я просто хотел увидеть, как объявлены в функции point(x,y,0x0a); первый и второй параметры. Совпадают ли они с объявлениями x и y.
И действительно, если у вас включена оптимизация, то попробуйте выключить ее. Вообще, я бы предложил отложить дальнейшее обсуждение до момента, когда устройство будет собрано, а после этого продоложить поиски истины.
|
|
|
|
|
Feb 9 2007, 11:32
|
Участник

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

|
Функция sine() не имеет параметров, так что должна каждый раз давать один и тот же результат. И если синус считался неправильно, то он бы считался одинаково неправильно каждый раз. А автор пишет, что результаты на экране отличатся. ИМХО дело все же в чем-то другом. Или я не прав?
|
|
|
|
|
Feb 9 2007, 12:00
|

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

|
Цитата(DimG @ Feb 9 2007, 12:23)  Вообще, я бы предложил отложить дальнейшее обсуждение до момента, когда устройство будет собрано, а после этого продоложить поиски истины. Не возражаю.
|
|
|
|
|
Feb 9 2007, 14:07
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Fortune @ Feb 9 2007, 12:48)  Изменил программу: А контроллер какой?
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Feb 9 2007, 15:59
|

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

|
Цитата(_Bill @ Feb 9 2007, 15:07)  А контроллер какой? Atmega128
|
|
|
|
|
Feb 9 2007, 16:07
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Fortune @ Feb 9 2007, 15:59)  Цитата(_Bill @ Feb 9 2007, 15:07)  А контроллер какой?
Atmega128 Модель памяти, значения стека, версия компилятора?
|
|
|
|
|
Feb 9 2007, 16:36
|

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

|
Цитата(_Bill @ Feb 9 2007, 17:07)  Цитата(Fortune @ Feb 9 2007, 15:59)  Цитата(_Bill @ Feb 9 2007, 15:07)  А контроллер какой?
Atmega128 Модель памяти, значения стека, версия компилятора? Small, 0x80, 0x80 , IAR 4 - крякнутый
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|