2016-09-07 10 views
2

У меня есть набор сценариев сценария компоновщика для таблицы векторов прерываний. Секции будут расположены в ОЗУ и будут загружены в ОЗУ по моему коду. Поскольку каждый вектор должен находиться в абсолютном местоположении, для каждого вектора имеется отдельный раздел (и отдельная область памяти).Установить минимальный размер сценария компоновщика ссылок

Некоторые векторы не могут использоваться приложением, в то время как другие будут. Чтобы убедиться, что код копирования все еще работает, мне нужно убедиться, что, если вектор отсутствует, заполняется эквивалентное пространство в ПЗУ (два байта). Я попытался сделать это, продвигая указатель местоположения, но, конечно, это влияет только на 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 
} 
+0

Я предполагаю, что другой способ задать этот вопрос: как я могу заставить компоновщик отказаться от раздела, не добавляя ничего лишнего к нему (если вектор определен, он не должен быть больше)? –

+1

Это проблема XY. Вместо того, чтобы иметь отдельный раздел для каждого вектора, вы должны использовать одну ** таблицу ** в своем коде в своей отдельной секции. Затем поместите этот раздел по соответствующему адресу. Возможно, вам стоит взглянуть на типичный код запуска не только для MSP430, но и других MCU, таких как ARM Cortex-M. – Olaf

+0

Я бы пошел с тем, что предлагает @Olaf. Обычно это делается с таблицей, определенной либо в файле сборки, либо в файле C, который помещается в раздел вектора прерываний. Вы можете забить этот квадратный штифт в круглое отверстие, если вы используете достаточную силу, но проще использовать круглую привязку. – rjp

ответ

0

Я создал работу вокруг. Оглядываясь назад, это очевидно, но в случае, если это поможет кому-то еще, я опишу его здесь.

Мое продвижение указателя местоположения не помогает, потому что если во входном разделе нет данных, компоновщик удаляет выходной раздел. Это означает, что никакие данные не будут добавлены в ПЗУ. Мне нужно, чтобы добавление добавлено в ПЗУ, потому что мне нужно, чтобы векторная таблица всегда была того же размера. Я работал вокруг этого с помощью продвижения указателя местоположения, но положить все векторы прерываний в одной секцию:

OUTPUT_ARCH(msp430) 
ENTRY(_start) 

MEMORY { 
    ROM (rx)   : ORIGIN = 0x9C02, LENGTH = 0x61FE 
    VECTABLE   : ORIGIN = 0x5B80, LENGTH = 0x007E 
} 

SECTIONS 
{ 
    .vector_table : 
    { 
    __vectable_load__ = LOADADDR(.vector_table); 
    __vectable_start__ = .; 
    __interrupt_vector_1__ = .; 
    KEEP (*(__interrupt_vector_1)) 
    . = __interrupt_vector_1__ + 2; 
    __interrupt_vector_2__ = .; 
    KEEP (*(__interrupt_vector_2)) 
    . = __interrupt_vector_2__ + 2; 
    ... 
    __interrupt_vector_63__ = .; 
    KEEP (*(__interrupt_vector_63)) 
    KEEP (*(__interrupt_vector_sysnmi)) 
    . = __interrupt_vector_63__ + 2; 
    __vectable_end__ = .; 
    } > VECTABLE AT> ROM 
} 

Теперь необходимо заполнение будет добавляться как к ОЗУ и ПЗУ при условии, что вектор таблица не полностью пуста , Если это не меня беспокоит, оно просто не копируется, главное, что векторы не попадают в неправильные места.