Здраствуйте.
Пытаюсь сделать ремап векторов прерываний на ОЗУ.
Последовательность такая.
Создаю секцию в ld-файле:
Код
MEMORY
{
TEXT (rx) : ORIGIN = 0x00000000, LENGTH = 32K
RAMVectorTable (rwx) : ORIGIN = 0x10000000, LENGTH = 256
RAM (xrw) : ORIGIN = 0x10000100, LENGTH = 0x1F00
}
.IntVecTable :
{
*(.IntVecTable)
} > RAMVectorTable
структура таблицы векторов(vector_table.h):
Код
#define LPC11XX_VECTOR_QTY 47
typedef void (*ISRPtr) (void);
struct TLPC11xxVectorTable {
ISRPtr StackPtr;// уже не нужен
ISRPtr ResetISR;// уже не нужен
ISRPtr Reserved0[9];
ISRPtr SvcISR;
ISRPtr Reserved1[2];
ISRPtr PendSvcISR;
ISRPtr SysTickISR;
/* Device interrupt vectors */
ISRPtr WakeUpISR[13];
ISRPtr Reserved2;
ISRPtr Ssp1ISR;
ISRPtr I2cISR;
ISRPtr Timer16_0_ISR;
ISRPtr Timer16_1_ISR;
ISRPtr Timer32_0_ISR;
ISRPtr Timer32_1_ISR;
ISRPtr Ssp0ISR;
ISRPtr UART_ISR;
ISRPtr Reserved3[2];
ISRPtr ADC_ISR;
ISRPtr Wdt_ISR;
ISRPtr Bod_ISR;
ISRPtr Reserved4;
ISRPtr EINT3_ISR;
ISRPtr EINT2_ISR;
ISRPtr EINT1_ISR;
ISRPtr EINT0_ISR;
void SetDefault(ISRPtr default_handler);
};
main.cpp:
CODE
#include "vector_table.h"
__attribute__ ((__section__(".IntVecTable")))
struct TLPC11xxVectorTable IntVecTable;
extern "C" void SVC_Handler(void);
extern "C" void PendSVC_ISR(void);
extern "C" void Default_Handler(void);
void InitVectorTable()
{
IntVecTable.SvcISR=&SVC_Handler;
IntVecTable.PendSvcISR=&PendSVC_ISR;
IntVecTable.SysTickISR=&OS::SystemTimer_ISR;
IntVecTable.Timer16_0_ISR=&Timer16_0_IRQ_Handler;
IntVecTable.UART_ISR=&UART_IRQ_Handler;
LPC_SYSCON->SYSMEMREMAP=1;
}
void TLPC11xxVectorTable::SetDefault(ISRPtr default_handler) {
ISRPtr *isr_ptr=&ResetISR;
for (uint8_t i=0; i<LPC11XX_VECTOR_QTY; i++)
*isr_ptr++=default_handler;
for (uint8_t i=0; i<9; i++)
Reserved0[i]=0;
Reserved4=
Reserved3[0]=Reserved3[1]=
Reserved2=
Reserved1[0]=Reserved1[1]=0;
}
int main()
{
IntVecTable.SetDefault(&Default_Handler);
InitVectorTable();
//....... код
Вроде работает. Но может это только пока, а потом перестанет?
Может есть какие-то способы получше?
Кто как делает подобные действия?
Спасибо.