Цитата(Cosmojam @ Aug 17 2013, 21:47)

Вот пробуя это не получилось разместить 2 копии таблицы по 0 и 0x4000 адресам.
Скрипт линкера:
CODE
ENTRY(Reset_Handler)
_Minimum_Stack_Size = 0x100;
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
}
/* higher address of the user mode stack */
PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) );
SECTIONS
{
.text :
{
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);
. = 0x0B8;// первый байт после таблицы векторов
KEEP(*(.bootloader_code));
. = 0x1000;
KEEP(*(.isr_vector2))
__ctors_start__ = .;
KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */
__ctors_end__ = .;
__dtors_start__ = .;
__dtors_end__ = .;
*(.text) /* remaining code */
*(.text.*)
*(.rodata) /* read-only data (constants) */
*(.rodata.*)
*(.eh_frame_hdr)
*(.eh_frame)
//----- и так далее
startup.c:
CODE
__attribute__ ((section(".isr_vector")))
void (* const g_pfnVectors[])(void) =
{
/* Core interrupt vectors */
(intfunc)((unsigned long)&_estack),
Reset_Handler,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSVC_ISR,
SysTick_Handler,
/* Device interrupt vectors */
// остальные вектора
};
// та же таблица, но по другому адресу
__attribute__ ((section(".isr_vector2")))
void (* const g_pfnVectorsCopy[])(void) =
{
/* Core interrupt vectors */
(intfunc)((unsigned long)&_estack),
Reset_Handler,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSVC_ISR,
SysTick_Handler,
/* Device interrupt vectors */
// остальные вектора
};
В случае если загрузчик есть, то он должен перед запуском приложения задать VTOR. Если его нет, то и так будет работать.