Я не понимаю как это сделать, но говорят что надо разместить копию таблицы векторов приложения по 0 адресу. Т.е. на случай приложения без загрузчика (прошито через ISP, например) мы стартуем с 0 адреса, оттуда попадаем по нужному адресу с приложением (0x4000), там таблица векторов перемещается на начальный адрес приложения (0x4000) и т.к. таблицы одинаковые и на 0 и на 0x4000, то всё должно работать.
Пока пытаюсь запустить такой вариант и не получается. Делаю в скрипте линкера
Код
MEMORY
{
FLASH (rx) : ORIGIN = 0x4000 LENGTH = 0x7C000
SRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x10000
PIRAM(rw) : ORIGIN = 0x20000000, LENGTH = 0x8000
SDRAM (rw) : ORIGIN = 0xA0080000, LENGTH = 0x10000
VECTORS_AT_ZERO (rx) : ORIGIN = 0x0 LENGTH = 0x1FF
}
.text :
{
KEEP(*(.isr_vector))
} > VECTORS_AT_ZERO
.text :
{
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
} > FLASH
{
FLASH (rx) : ORIGIN = 0x4000 LENGTH = 0x7C000
SRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x10000
PIRAM(rw) : ORIGIN = 0x20000000, LENGTH = 0x8000
SDRAM (rw) : ORIGIN = 0xA0080000, LENGTH = 0x10000
VECTORS_AT_ZERO (rx) : ORIGIN = 0x0 LENGTH = 0x1FF
}
.text :
{
KEEP(*(.isr_vector))
} > VECTORS_AT_ZERO
.text :
{
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
} > FLASH
В стартап файле
Код
extern void (* const g_pfnVectors[])(void);
__attribute__ ((section(".isr_vector")))
void (* const g_pfnVectors[])(void) =
{
// Core Level - CM3
(void *)&_vStackTop, // The initial stack pointer
ResetISR, // The reset handler
__attribute__ ((section(".isr_vector")))
void (* const g_pfnVectors[])(void) =
{
// Core Level - CM3
(void *)&_vStackTop, // The initial stack pointer
ResetISR, // The reset handler
Но работает только 1 раз сразу же после прошивки через ISP, потом после сброса уже не работает до следующей прошивки.
Подскажите как можно решить эту задачу? Если размещением копии таблицы векторов по 0 адресу, то как это сделать?