This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
你好,我学习了SPNA218即相关的文档,但我现在希望主动触发软中断。
我尝试通过向SSIR1寄存器的SSKEY1写入75h来触发软中断(在spnu563a的188页定义),然后程序跳转到了dataEntry而不是_svc。
我的问题是如果我想在某些时刻主动触发软中断是否就是像SSIR1寄存器写入正确的key即可呢?另外为什么会触发到dataEnrty呢?
非常感谢您提供的资料。
您好,
Hercules的系统模块支持使用 SSIR1、SSIR2、SSIR3、SSIR4寄存器生成四个软件中断(IRQ 或 FIQ)。 此外,ARM 内核有一个内置软件中断,此中断将生成一个 CPU 中止(SWI/SVC)。
所有四个 SSI 中断被组合成一个到 VIM 的single request line。 您可以同时激活全部4个 SSI。 SSIVEC 寄存器将显示最高挂起 SSI 中断。 与其他外设中的向量寄存器类似,在 SSI ISR 中读取向量寄存器时,相应的标志将被清除。
SSI 将生成 IRQ 或 FIQ 中断,而不是 SVC。
请参阅以下工程师的示例。 在对 SSIR 进行编程(写入0x75密钥)后,系统硬件会向 CPU 产生 IRQ 中断。 CPU 停止执行 main()中的代码并跳转到由您在 VIMRAM 中输入的名称(在以下示例中为 ssiInterrupt())标识的中断服务例程。 在中断例程结束时,CPU 返回到其关闭的位置,并继续执行原始代码。
不会生成数据中止。
#pragma CODE_STATE(ssiInterrupt, 32)
#pragma INTERRUPT(ssiInterrupt, IRQ)
void ssiInterrupt(void)
{
uint32 vec = systemREG1->SSIVEC;
if ((vec & 0xFF) == 0x1){
asm(" nop");
printf("SSI Interrupt 1 \n\r");
}
}
/* USER CODE END */
int main(void)
{
_enable_IRQ();
systemREG1->SSIR1 = 0x7500 | (0xff & 0x2);
}