У меня есть набор сценариев сценария компоновщика для таблицы векторов прерываний. Секции будут расположены в ОЗУ и будут загружены в ОЗУ по моему коду. Поскольку каждый вектор должен находиться в абсолютном местоположении, для каждого вектора имеется отдельный раздел (и отдельная область памяти).Установить минимальный размер сценария компоновщика ссылок
Некоторые векторы не могут использоваться приложением, в то время как другие будут. Чтобы убедиться, что код копирования все еще работает, мне нужно убедиться, что, если вектор отсутствует, заполняется эквивалентное пространство в ПЗУ (два байта). Я попытался сделать это, продвигая указатель местоположения, но, конечно, это влияет только на VMA, и поэтому мне совсем не помогает.
Как я могу обеспечить, чтобы раздел всегда занимал необходимое пространство в ПЗУ? например, как я могу переместить LMA, если в разделе нет данных?
Любые советы и подсказки были бы весьма признательны.
Я сокращенном мой текущий сценарий компоновщика ниже:
OUTPUT_ARCH(msp430)
ENTRY(_start)
MEMORY {
ROM (rx) : ORIGIN = 0x9C02, LENGTH = 0x61FE
VECT1 : ORIGIN = 0x5B80, LENGTH = 0x0002
VECT2 : ORIGIN = 0x5B82, LENGTH = 0x0002
...
VECT63 : ORIGIN = 0x5BFC, LENGTH = 0x0002
}
SECTIONS
{
__interrupt_vector_1 :
{
__vectable_load__ = LOADADDR(__interrupt_vector_1);
__vectable_start__ = .;
__interrupt_vector_1__ = .;
KEEP (*(__interrupt_vector_1))
. = __interrupt_vector_1__ + 2;
} > VECT1 AT> ROM
__interrupt_vector_2 :
{
__interrupt_vector_2__ = .;
KEEP (*(__interrupt_vector_2))
. = __interrupt_vector_2__ + 2;
} > VECT2 AT> ROM
...
{
__interrupt_vector_63__ = .;
KEEP (*(__interrupt_vector_63))
KEEP (*(__interrupt_vector_sysnmi))
. = __interrupt_vector_63__ + 2;
__vectable_end__ = .;
} > VECT63 AT> ROM
}
Я предполагаю, что другой способ задать этот вопрос: как я могу заставить компоновщик отказаться от раздела, не добавляя ничего лишнего к нему (если вектор определен, он не должен быть больше)? –
Это проблема XY. Вместо того, чтобы иметь отдельный раздел для каждого вектора, вы должны использовать одну ** таблицу ** в своем коде в своей отдельной секции. Затем поместите этот раздел по соответствующему адресу. Возможно, вам стоит взглянуть на типичный код запуска не только для MSP430, но и других MCU, таких как ARM Cortex-M. – Olaf
Я бы пошел с тем, что предлагает @Olaf. Обычно это делается с таблицей, определенной либо в файле сборки, либо в файле C, который помещается в раздел вектора прерываний. Вы можете забить этот квадратный штифт в круглое отверстие, если вы используете достаточную силу, но проще использовать круглую привязку. – rjp