ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1468806 Топик полностью
klen (09.10.2024 21:51, просмотров: 115) ответил VladislavS. на Меньше букв не есть симпатичнее. Сущность надо правильно описывать. Таблица векторов это ни раз не массив char. В конце концов, в неё когда-нибудь и вектр установить надо будет вручную.
так лучше? букв я не жалел - че их жалеть?. даром богомерзките аглицкие.. 
enum class irq_num_t : int8_t
{
thread = 0,
nmi = 2,
hard_fault,
sys_tick= 12,
software_interrupt=14,
// источники внешних запросов на прерывания
wwdg=16,
pvd,
flash,
rcc,
gpiox7_0,
awu,
dma1_channel1,
dma1_channel2,
dma1_channel3,
dma1_channel4,
dma1_channel5,
dma1_channel6,
dma1_channel7,
adc1,
i2c1_ev,
i2c1_er,
usart1,
spi1,
tim1_brk,
tim1_up,
tim1_trg_com,
tim1_cc,
tim2,
};


/*[0]*/ static constexpr auto __attribute__(( used, section(".vector[0]"),naked)) reset_entry_point(void) { __asm volatile ("j _ZN8ch32v00xL12handle_resetEv"); }
static constexpr void __attribute__(( used, section(".vector[1]"))) (*vector_table[])() =
{
/*[1]*/ 0,
/*[2]*/ nmi_exception_handler,
/*[3]*/ hard_fault_exception_handler,
/*[4]*/ 0,
/*[5]*/ 0,
/*[6]*/ 0,
/*[7]*/ 0,
/*[8]*/ 0,
/*[9]*/ 0,
/*[10]*/0,
/*[11]*/0,
/*[12]*/sys_tick_irq_handler,
/*[13]*/0,
/*[14]*/software_irq_handler,
/*[15]*/0,
/*[16]*/wwdg_irq_handler,
/*[17]*/pvd_irq_handler,
/*[18]*/flash_irq_handler,
/*[19]*/rcc_irq_handler,
/*[20]*/gpiox7_0_irq_handler,
/*[21]*/awu_irq_handler,
/*[22]*/dma1_channel1_irq_handler,
/*[23]*/dma1_channel2_irq_handler,
/*[24]*/dma1_channel3_irq_handler,
/*[25]*/dma1_channel4_irq_handler,
/*[26]*/dma1_channel5_irq_handler,
/*[27]*/dma1_channel6_irq_handler,
/*[28]*/dma1_channel7_irq_handler,
/*[29]*/adc1_irq_handler,
/*[30]*/i2c1_ev_irq_handler,
/*[31]*/i2c1_er_irq_handler,
/*[32]*/usart1_irq_handler,
/*[33]*/spi1_irq_handler,
/*[34]*/tim1_brk_irq_handler,
/*[35]*/tim1_up_irq_handler,
/*[36]*/tim1_trg_com_irq_handler,
/*[37]*/tim1_cc_irq_handler,
/*[38]*/tim2_irq_handler,
} ;


static constexpr auto __attribute__((naked,used)) handle_reset()
{
#ifdef __CRT_IMPL_GDB_DEALY__
// задержка после сброса, для обеспечения захвата отдажчиком GDB
nop_while(__CRT_IMPL_GDB_DEALY__);
#endif

// установка глобального указателя
gp( gnu_linker_global_pointer()) ;
// установка указателя стека
sp( gnu_linker_main_stack_end() ) ;
// установка вложенных прерываний и аппаратного стека
intsysc_t::write( intsysc_t::hardware_stack_t::enable, intsysc_t::interrupt_nesting_t::enable, intsysc_t::eabi_t::enable);
// глобальное разрешение прерываний
mstatus_t::write( mstatus_t::global_interrupt_enable_t::enable, mstatus_t::interrupt_enable_state_befor_entering_t::enable) ;
// установка таблицы векторов
mtvec ( reinterpret_cast<void*> (reinterpret_cast<uint32_t>(reset_entry_point) | 0x3) ) ;

если я в скрипте линкера всуну секцию *(.vector*) в раздел озу или куда можно пописать (ударение в слове свободное по желанию) то запись обрабочика например

dma1_channel4 будет так

void dma1_channel4_irq_handler()
{
 ....
}

(vector_table-1)[irq_num_t::dma1_channel4] = dma1_channel4_irq_handler ;