[an error occurred while processing this directive]
Думал, что 3.0 и 3.5 ведут себя менее нагло, чем 2.0. А для софтеров из ADI очень подходят слова Фоменко: кривыми должны быть извилины, а не руки...
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Oleg_0515 24 февраля 2004 г. 17:54
В ответ на: VisualDSP 3.5 vs 3.0, очередные глюки (только для 219x) (+) отправлено mir 23 февраля 2004 г. 16:01

1. Если линкер не выдал ошибки, то это еще не значит, что ссылки настроены правильно.

Ошиблись мы осенью - оставили выводы MODE_A-MODE_D в воздухе. Платы запустили в повторное производство, а имеющиеся попытались юзить через EZ-ICE. Поскольку в таком режиме процессор стартует с PMOVLAY=4, DMOVLAY=4, PC=2000, то в таблице векторов для в-ра RESET добавили вставку: PMOVLAY=0; DMOVLAY=0; nop; JUMP START_PROG;,
добавили дополнительную секцию:
.section/code BGA_FIX_program;
BGA_FIX: jump 0x0000;

а в LDF-файле:
MEMORY {...
mem_pmpage4a { TYPE(PM RAM) START(0x42000) END(0x4200f) WIDTH(24) }
mem_pmpage4b { TYPE(PM RAM) START(0x42010) END(0x43fff) WIDTH(24) }
...
}

PROCESSOR p0
{
LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST)
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
SECTIONS
{
...
sec_pmpage
{
...
PAGE_INPUT {
ALGORITHM(ALL_FIT)
PAGE_OUTPUT(DIR\pm_page4a.ovl)
INPUT_SECTIONS($OBJECTS(BGA_FIX_program))
} > mem_pmpage4a
PAGE_INPUT {
ALGORITHM(ALL_FIT)
PAGE_OUTPUT(DIR\pm_page4b.ovl)
INPUT_SECTIONS($OBJECTS(program_DECOD))
} > mem_pmpage4b
}
}
Компиляция - шедевр! Ни одного замечания... и нихрена не работает!
Смотрим окно дизассемблера - все как хочется:
2000 BGA_FIX: jump 0x0000;
...
2010 DECODER_INI: ... /* тело подпрограммы */
...
Начинаем пошаговку - все изумительно! аж до того места, когда из основной программы (резидентная страница) не вызывается:
PMOVLAY=4; CALL DECODER_INI;
!!! Вызов делается по адресу 2000 (!) а не 2010.
Смотрим мап-файл - чудеса: оба символа (BGA_FIX и DECODER_INI) имеют одинаковое значение 2000.
Т.е. помещаются куски программы в памяти правильно, а настраиваются ссылки с ошибкой.
Нужно добавить, что файл pm_page4a.ovl имеет длину чуть меньше, чем
файл pm_page4b.ovl (с большущей программой).

Эти грабли мы обошли и торжественно пообещали заменить VisualDSP++2.0 на более новый как только появится минутка времени.

2. Если компилятор не выдал замечания, то это еще не значит, что он нашел все функции и правильно подставил их прототипы.
Всегда указывайте все стандартные библиотеки.

В модели на C (компилировалось на разных машинах борландом разных версий) все работало отлично. Компиляция того же самого на VisualDSP++2.0 проходила без замечаний, а работала программа как-то не так... Оказалось: в одном из модулей был вызов ф-ции
ldexp( ). Явного указания #include в модуле не было. Компилятор VisualDSP находил эту функцию среди стандартных и никаких замечаний не делал, но и функцию не вставлял (видимо прототип в этом случае пустой использовался)... А кроме того и явное переопределение типов отрабатывал неправильно (по крайней мере в окне Expression), например:
объявлено:
float func(float);
unsigned long unsigned_long_var;
float float_var;
используется:
float_var = func((float)unsigned_long_var);
32 битовая переменная unsigned_long_var не преобразовывалась к типу флоат, а преобразовывался указатель на нее (обе 32 битовые, так чего голову ломать то?)
Объявление #include решило проблему.
Удивительно, что если объявлена переменная, но не используется, то компилятор обязательно сгенерирует замечание - на это его хватает.



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru