52197
[i] Особенности написания 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 слов никогда не приведёт к его выходу за пределы физического сегмента памяти.