[an error occurred while processing this directive]
|
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 проходила без замечаний, а работала программа как-то не так... Оказалось: в одном из модулей был вызов ф-ции
E-mail:
info@telesys.ru
ldexp( ). Явного указания #include
объявлено:
float func(float);
unsigned long unsigned_long_var;
float float_var;
используется:
float_var = func((float)unsigned_long_var);
32 битовая переменная unsigned_long_var не преобразовывалась к типу флоат, а преобразовывался указатель на нее (обе 32 битовые, так чего голову ломать то?)
Объявление #include
Удивительно, что если объявлена переменная, но не используется, то компилятор обязательно сгенерирует замечание - на это его хватает.
Ответы