Перейти к содержанию
    

C6457 неправильный вывод на консоль и неверные результаты вычисления

Здравствуйте Всем!

У меня в некоторых случаях не работает нормально вычисление операции:

cp=log((double)temp);

Например при значении temp=33154 получается cp=1.83817018879156e+229, бред какой-то, и получается так, что значения типа указанного (далекие от истинного результата и здравого смысла) появляются при конкретных нескольких значениях temp, и это стабильно повторяется. С чем это связано?

Еще момент: при выводе на консоль (операция printf("cp=%f\n", cp);) не работает нормально отображение значений %f, %g и глючно выводится %i.Подскажите пожалуйста в чем дело? Где у меня ошибки конфигурации? Работаю с микропроцессором TMS320C6457.

Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно элементарная классическая нехватка стека.

 

 

Стек я пробовал увеличивать, возможно еще маловато было, еще попробую. А может ли быть такое, что Техасовские хедеры (math.h и stdio.h) кривоватые? не сталкивались с таким?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стек я пробовал увеличивать, возможно еще маловато было, еще попробую. А может ли быть такое, что Техасовские хедеры (math.h и stdio.h) кривоватые? не сталкивались с таким?

для с672х проблем не было с math.h. Правда не знаю, есть ли отличия в math.h для разных серий 6000 поколения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стек я пробовал увеличивать, возможно еще маловато было, еще попробую. А может ли быть такое, что Техасовские хедеры (math.h и stdio.h) кривоватые? не сталкивались с таким?

 

Кривости нет. Еще, возможно, не хватает heap, если Вы используете обмен данными через эмулятор, в том числе вывод в консоль. Причем никакой диагностики по этому поводу не выдается, просто глючит и все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кривости нет. Еще, возможно, не хватает 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-файле менять значения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

значения типа указанного (далекие от истинного результата) появляются при конкретных нескольких значениях 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.

 

Изменено пользователем AndrewN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы говорили где-то в опциях линкера меняются значения стека и heap'а, подскажите где. Могу ли я так, прямо в cmd-файле менять значения?

 

Это и есть те самые опции линкера. Но их передает еще и среда из свойств проекта, и кто имеет приоритет - я честно говоря не в курсе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения, что долго не появлялся, но проблема стала остро.

В примерах чтения из 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 файле менял значения, какие-то изменения есть, но как сделать правильный ввод вывод - пока не победил.

Изменено пользователем transf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

pDdr2Data какой тип имеет? "long long"? Вряд ли. Тогда скорее всего не %llX, а %X или %lX

 

Uint32 *pDdr2Data = (Uint32 *)EMIFB_CE0_BASE_ADDR ;

 

то есть, скорее всего long long (32 бита int'овое значение). При %x и %lx я тоже выводил, и тоже какая-то лажа получалась. Я немного позже кину, какие результаты при этом получаются

 

и вопрос по опциям линкера:

 

-heap 0x10000

-stack 0x30000

 

эти значения задуманы просто в байтах?

Изменено пользователем transf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

последующие запуски дают те же результаты. Можно ли сделать вывод без такой кривизны и с одинаковой повторяемостью? Подскажите как это сделать пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то с памятью у вас, или с кэшем. Вроде heap и stack достаточны, а вот в какой области памяти все лежит и как расположено - проверьте. Может быть еще с моделью памяти, с endianess, но тут обычно или линкер ругается, или загрузка кода.

Изменено пользователем SAURIS GmbH

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стек я пробовал увеличивать, возможно еще маловато было, еще попробую. А может ли быть такое, что Техасовские хедеры (math.h и stdio.h) кривоватые? не сталкивались с таким?

 

наверное не хедеры а сами библиотеки.

с кривым техасовским кодтом встречался,

но мне кажется что такоие функции как printf

давно отлажены и отработаны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...