RTOS または Linux OS を使用しないベアメタル環境で、C またはインライン アセンブリを使用して ARM9 割り込みベクトル テーブルをセットアップする方法の例を教えてください。
具体的には、インライン アセンブリまたは C を使用して、C でコーディングされた IRQ 割り込みハンドラー ISR に分岐を設定するにはどうすればよいですか?
/// timer1 64-bit mode interrupt handler connected to TINT2 interrupt=#34
/// \todo I think I need to ACK it once I get working
interrupt void interruptHandlerTimer1(void) {
printf("\n [* ISR *] \n");
// ACK TINT2 interrupt #34
AINTC ->IRQ1 = 1 << (34 - 32);
}
void main(void) {
TIMER1 ->TCR = 0x00000000;
// TGCR: TIMMODE=0 64-bit GP, TIM34RS=TIM12RS=1
TIM0ER1 ->TGCR = 0x00000003;
TIMER1 ->TIM34 = 0x00000000;
TIMER1 ->TIM12 = 0x00000000;
TIMER1 ->PRD34 = 0x00000000;
TIMER1 ->PRD12 = 0x0000ffff;
// TCR: inc until period match, then reset
TIMER1 ->TCR = (2 << 6);
// This is wrong.
// I think I need to insert opcode or assembly to branch to interruptHandlerTimer1 ?
// AINTC ->EABASE located @ 0x00000000
uint32_t** ptrEabase = (uint32_t**) (AINTC ->EABASE);
ptrEabase[34] = (uint32_t*) (interruptHandlerTimer1);
// Set INT34 TINT2 to IRQ priority 2
AINTC ->INTPRI4 = 0x00000200;
// Enable INT34
AINTC ->EINT1 = (1 << (34 - 32));
// Enable IRQ in CPSR
// "TMS32DM644x ARM Subsystem", 3.3 Processor Status registers
asm(" ;Enable IRQ in CPSR");
asm(" mrs r0, cpsr");
asm(" bic r0, r0, #0x80");
asm(" msr cpsr_c, r0");
// I expected to see " [* ISR *] " print
// when TIMER1->TIM12 reaches 0x0000ffff
while (1) {
printf("%08x %08x\r\n", TIMER1 ->TIM34, TIMER1 ->TIM12);
}
}
ヒントや方向性を事前に感謝します。
ARM9 のベアメタル開発の例を見つけるのは非常に困難です。
エド
- TI TMS320DM6466
- コード コンポーザー スタジオ v5.5