52197
Особенности написания LDF файла - резервирование области для NOP
Есть ли особенности при написании и использовании своего LDF файла?
При создании своего файл сценария для компоновщика (LDF файла) необходимо в первую очередь ориентироваться на стандартный base.ldf, который расположен по пути: CM-LYNX.2.xx.yy\toolchain\LDF.
В стандартном LDF файле в конец секции с кодом программы добавляется 10 инструкций "NOP", чтобы при выполнении программы в конвейер случайно не были загружены данные из неинициализированной области:
{
Таким образом ручное увеличение счетчика местоположения на 10 слов никогда не приведёт к его выходу за пределы физического сегмента памяти.
В стандартном LDF файле в конец секции с кодом программы добавляется 10 инструкций "NOP", чтобы при выполнении программы в конвейер случайно не были загружены данные из неинициализированной области:
program##bank_num
{
FILL(0xb3c00000) /* Fill any gaps with NOPs. */
...
. = . + 10; /* 10 NOPs */
}
Для добавления 10 инструкций "NOP" вручную изменяется значение счетчика местоположения ("."). При ручном изменении счётчика местоположения компоновщик не отслеживает его выход за границы сегмента памяти, предупреждения также не формируются. Поэтому, чтобы счетчик местоположения не выходил за пределы сегмента памяти, в конце каждого сегмента, который может включать в себя секции с кодом программы, резервируется 16 слов:
MEMORY{
FILL(0xb3c00000) /* Fill any gaps with NOPs. */
...
. = . + 10; /* 10 NOPs */
}
Для добавления 10 инструкций "NOP" вручную изменяется значение счетчика местоположения ("."). При ручном изменении счётчика местоположения компоновщик не отслеживает его выход за границы сегмента памяти, предупреждения также не формируются. Поэтому, чтобы счетчик местоположения не выходил за пределы сегмента памяти, в конце каждого сегмента, который может включать в себя секции с кодом программы, резервируется 16 слов:
{
M_STARTUP { TYPE(RAM) START(0x00000000) END(0x000000FF - 16) WIDTH(32) }
M0 { TYPE(RAM) START(0x00000100) END(0x00000000 + (INT_MEM_BANK_SIZE - 1) - 16)
WIDTH(32) } //16 words reserved for adding NOPs after code
...
}
M0 { TYPE(RAM) START(0x00000100) END(0x00000000 + (INT_MEM_BANK_SIZE - 1) - 16)
WIDTH(32) } //16 words reserved for adding NOPs after code
...
}
Таким образом ручное увеличение счетчика местоположения на 10 слов никогда не приведёт к его выходу за пределы физического сегмента памяти.