Kiryanov 0 19 марта, 2012 Опубликовано 19 марта, 2012 · Жалоба Здравствуйте Всем! У меня в некоторых случаях не работает нормально вычисление операции: cp=log((double)temp); Например при значении temp=33154 получается cp=1.83817018879156e+229, бред какой-то, и получается так, что значения типа указанного (далекие от истинного результата и здравого смысла) появляются при конкретных нескольких значениях temp, и это стабильно повторяется. С чем это связано? Еще момент: при выводе на консоль (операция printf("cp=%f\n", cp);) не работает нормально отображение значений %f, %g и глючно выводится %i.Подскажите пожалуйста в чем дело? Где у меня ошибки конфигурации? Работаю с микропроцессором TMS320C6457. Заранее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 19 марта, 2012 Опубликовано 19 марта, 2012 · Жалоба Вероятно элементарная классическая нехватка стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kiryanov 0 20 марта, 2012 Опубликовано 20 марта, 2012 · Жалоба Вероятно элементарная классическая нехватка стека. Стек я пробовал увеличивать, возможно еще маловато было, еще попробую. А может ли быть такое, что Техасовские хедеры (math.h и stdio.h) кривоватые? не сталкивались с таким? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aod 0 21 марта, 2012 Опубликовано 21 марта, 2012 · Жалоба Стек я пробовал увеличивать, возможно еще маловато было, еще попробую. А может ли быть такое, что Техасовские хедеры (math.h и stdio.h) кривоватые? не сталкивались с таким? для с672х проблем не было с math.h. Правда не знаю, есть ли отличия в math.h для разных серий 6000 поколения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 21 марта, 2012 Опубликовано 21 марта, 2012 · Жалоба Стек я пробовал увеличивать, возможно еще маловато было, еще попробую. А может ли быть такое, что Техасовские хедеры (math.h и stdio.h) кривоватые? не сталкивались с таким? Кривости нет. Еще, возможно, не хватает heap, если Вы используете обмен данными через эмулятор, в том числе вывод в консоль. Причем никакой диагностики по этому поводу не выдается, просто глючит и все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kiryanov 0 24 марта, 2012 Опубликовано 24 марта, 2012 · Жалоба Кривости нет. Еще, возможно, не хватает heap, если Вы используете обмен данными через эмулятор, в том числе вывод в консоль. Причем никакой диагностики по этому поводу не выдается, просто глючит и все. Подскажите, а почему при вычислении арктангенса с помощью функции atan, а конкренно операции: pi=4.*atan(1.); выдается неверное значение (2.81)? При этом функции asin и acos дают правильные значения. Еще такой вопрос: в файле c64xplus.cmd есть такие данные -c -heap 0x1000 -stack 0x3000 в других проектах примеров я еще видел: -c -heap 0x2000 -stack 0x2000 как понять эту запись? для кучи и стека распределение имеющегося кэша? были попытки увеличить -heap 0x10000 -stack 0x30000 существенных результатов не принесло. Увеличивал еще до -heap 0x100000 -stack 0x300000 уже начинало глючить. Вы говорили где-то в опциях линкера меняются значения стека и heap'а, подскажите где. Могу ли я так, прямо в cmd-файле менять значения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 24 марта, 2012 Опубликовано 24 марта, 2012 (изменено) · Жалоба значения типа указанного (далекие от истинного результата) появляются при конкретных нескольких значениях temp, и это стабильно повторяется Приведите ещё несколько значений. Все выявленные, если их немного (до 10-20). Уточните версию code gen tools. - в командной строке выполните "cl6x.exe -version" Стек и кучу нельзя увеличивать до бесконечности - есть же предел озу которое доступно физически на используемом оборудовании. Наконец, могут быть ошибки и в вашей программе. Например, однажды у Кернигана и Ритчи спросили, а можно ли делить на произведение ненулевых переменных float? Да! - ответили Керниган и Ритчи... Еще момент: при выводе на консоль (операция printf("cp=%f\n", cp)(IMG:style_emoticons/default/wink.gif) не работает нормально отображение значений %f, %g Это просто: "cp" наверняка типа double - используйте %lf, %lg. Изменено 24 марта, 2012 пользователем AndrewN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 26 марта, 2012 Опубликовано 26 марта, 2012 · Жалоба Вы говорили где-то в опциях линкера меняются значения стека и heap'а, подскажите где. Могу ли я так, прямо в cmd-файле менять значения? Это и есть те самые опции линкера. Но их передает еще и среда из свойств проекта, и кто имеет приоритет - я честно говоря не в курсе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kiryanov 0 28 мая, 2012 Опубликовано 28 мая, 2012 (изменено) · Жалоба Прошу прощения, что долго не появлялся, но проблема стала остро. В примерах чтения из DDR2 есть такие слова для записи в память и чтения из нее: 0xdeadbeef при записи в файл (там в разные регистры записывается одно и то же значение) пишется такое: 0x 2B 40DEADBEEF 0x 7 B406DDEADBEEF 0x 72B406DDEADBEEF 0x дB406DDEADBEEF 0x 2B406DDEADBEEF 0x 7 B406DDEADBEEF 0x 72B 40DEADBEEF 0x дB406DDEADBEEF 0x 2B406DDEADBEEF 0x 7 B406DDEADBEEF используемые команды для этого: fprintf(ft,"0x "); fprintf(ft,"%llX", pDdr2Data[index]); fprintf(ft, "\n"); при записи вида: fprintf(ft,"0x%llx\n", pDdr2Data[index]); пишется так: 0x7 b406ddeadbeef 0x 2b406ddeadbeef 0x„b406ddeadbeef 0x72b 40deadbeef 0x7 b406ddeadbeef 0x2b406ddeadbeef 0x„b406ddeadbeef 0x72b406ddeadbeef 0x7 b406ddeadbeef 0x 2b 40deadbeef 0x7 406d56780000 0x72b 4056780001 0x2 406d56780002 0x2 406d56780003 0x72 406d56780004 0x72b406d56780005 0x2b406d56780006 0x2 406d56780007 0x72b406d56780008 0x72b406d56780009 Write to and Read from DDR2 SDRAM is Successful Это просто: "cp" наверняка типа double - используйте %lf, %lg. применяя это замечание выводится такое s= s=0.62 s=1.72 s= s= s=6.11 s= s=1s=)s=1s=1s=19.2 s=62.1 s=8s=;s=>s=3s=Bs=38.2 s=DDDR2 кусок кода: int i; float s=0.; for(i=0;i<20;i++){ s+=log(i+1.); printf("s=%lf\n",s); } Не понятно. Подскажите плиз, мне надо из файла читать данные с помощью fscanf - я не понимаю как это будет работать при таком кривом выводе. Кстати чтение будет из файла изображения yuv или rgb, что само по себе отдельный вопрос, так как я формата этих файлов не знаю Да, кстати в cmd файле менял значения, какие-то изменения есть, но как сделать правильный ввод вывод - пока не победил. Изменено 28 мая, 2012 пользователем transf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба pDdr2Data какой тип имеет? "long long"? Вряд ли. Тогда скорее всего не %llX, а %X или %lX Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kiryanov 0 29 мая, 2012 Опубликовано 29 мая, 2012 (изменено) · Жалоба pDdr2Data какой тип имеет? "long long"? Вряд ли. Тогда скорее всего не %llX, а %X или %lX Uint32 *pDdr2Data = (Uint32 *)EMIFB_CE0_BASE_ADDR ; то есть, скорее всего long long (32 бита int'овое значение). При %x и %lx я тоже выводил, и тоже какая-то лажа получалась. Я немного позже кину, какие результаты при этом получаются и вопрос по опциям линкера: -heap 0x10000 -stack 0x30000 эти значения задуманы просто в байтах? Изменено 29 мая, 2012 пользователем transf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба long long - 64 битное, а не 32. да, значения в байтах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kiryanov 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба long long - 64 битное, а не 32. понятно, попробовал %lx, результат такой: 0x20de eef 0x20de eef 0x20de eef 0x20de eef 0x20de eef 0x20de eef 0x20de eef 0x20de eef 0x20de eef 0x20de eef как до конца исправить, чтоб все символы пропечатывались? да, значения в байтах. я прошу прощения, сначала подумал в битах, но то что в байтах - теперь понятно. после второго запуска результаты уже такие: 0x20de eef 0x20de eef 0x20de eef 0x20de eef 0x20de eef 0x 0 0x20de eef 0x20de eef 0x 0 0x20de eef последующие запуски дают те же результаты. Можно ли сделать вывод без такой кривизны и с одинаковой повторяемостью? Подскажите как это сделать пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 30 мая, 2012 Опубликовано 30 мая, 2012 (изменено) · Жалоба Что-то с памятью у вас, или с кэшем. Вроде heap и stack достаточны, а вот в какой области памяти все лежит и как расположено - проверьте. Может быть еще с моделью памяти, с endianess, но тут обычно или линкер ругается, или загрузка кода. Изменено 30 мая, 2012 пользователем SAURIS GmbH Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 30 мая, 2012 Опубликовано 30 мая, 2012 · Жалоба Стек я пробовал увеличивать, возможно еще маловато было, еще попробую. А может ли быть такое, что Техасовские хедеры (math.h и stdio.h) кривоватые? не сталкивались с таким? наверное не хедеры а сами библиотеки. с кривым техасовским кодтом встречался, но мне кажется что такоие функции как printf давно отлажены и отработаны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться