|
|
  |
ГЛЮКИ КОМПИЛЯТОРОВ, предлагаю описывать здесь |
|
|
|
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сс. Ведущим нулем обозначается восьмиричная сс. Или не все так просто?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|