C 如何在M0+;

C 如何在M0+;,c,unit-testing,arm,embedded,isr,C,Unit Testing,Arm,Embedded,Isr,我正在为运行在Arm M0+上的嵌入式项目编写一些单元测试。我的一些API取决于它们是否从ISR上下文调用。所以我想通过编程驱动一个中断。在伪代码中,我希望我的测试看起来像: // set (global) flag indicating what ISR should do // trigger the ISR // control transfers to ISR which branches off of (global) flag and computes result, store i

我正在为运行在Arm M0+上的嵌入式项目编写一些单元测试。我的一些API取决于它们是否从ISR上下文调用。所以我想通过编程驱动一个中断。在伪代码中,我希望我的测试看起来像:

// set (global) flag indicating what ISR should do
// trigger the ISR
// control transfers to ISR which branches off of (global) flag and computes result, store in some global
// control now returns to here, where I can assert the nature of the global result
我需要说明的部分是如何触发ISR。我在M3文档中看到了一些关于软件中断触发器的参考资料,但我没有发现类似于M0+的内容


一个“解决方案”可能是抓取一个未使用的计时器,使用它的ISR,然后将它的比较设置为0,然后启动它以驱动中断。或者可能是一个类似的方案,我配置了一个未使用的pin?有没有更直接的方法来实现这一点?

根据@user58697和@andymango的提示,我提出了以下方案

-我确定对于我的板(SAMD21),IRQ 21没有外围设备

-2复制resetVectors.c文件中的其他别名伪处理程序时,我添加了:

void PV21Handler             ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
-3将DeviceVectors结构修改为将.pvReserved21设置为:

__attribute__ ((section(".vectors")))
const DeviceVectors exception_table = {
    ...
    ...
    .pvReserved21           = (void*) PV21Handler,
    ...
    ...
};
-4实现了一个实际执行某些操作的void PV21Handler(void){}函数

-5使用以下方法启用中断:

NVIC_EnableIRQ(21);
// this comes from the core_cm0plus.h file
-6最后通过以下方式触发中断:

while (NVIC_GetPendingIRQ(21)) {  }
NVIC_SetPendingIRQ(21);
while (NVIC_GetPendingIRQ(21)) {  }

清除状态的轮询是必要的,因为在设置中断和它实际发生之间似乎有一点延迟,所以为了获得真正的边缘,我必须先将其断言为低。

只需将一些输出连接到输入,然后通过该输入触发中断。。。但您肯定有一个触发异常的
svc
指令。ISPR是可写的。只需设置中断挂起。那么我将使用什么中断?我使用的是一个小型嵌入式操作系统,它似乎在使用SVC和PendSV。在向量表中使用一个“保留”插槽是否合法?它们现在被映射到DummyHandler,我能不能只映射其中一个到函数,然后将相关的IRQn写入ISPR?您可以尝试将中断用于未使用的外围设备。定义自己的处理程序并将中断设置为挂起。然后,自然应该顺其自然。你可能应该开始一个新的问题,而不是把你关于向量表的查询附加到这个问题上。我喜欢在没有明确原因的否决票的情况下这样做