我的 SAMD21 ARM M0+ 有一个“默认”resetVectors.c 文件。它看起来像这样:
__attribute__ ((section(".vectors")))
const DeviceVectors exception_table = {
...
};
在其中定义不同处理程序 stub 的位置。出于测试目的,我想使用一个未使用的外设 IRQ。
默认情况下,未使用的地址设置为 NULL 地址。我已经向自己证明我可以修改该文件并在编译时更改我未使用的 IRQ (21) 以触发处理程序。但是,是否可以在编译时间之外执行此操作?
我观察到该表似乎基于偏移量 0。所以我尝试了这个:
DeviceVectors *table = 0x0000000;
table->pvReserved21 = PV21Handler;
但这只是悬而未决。有没有一种在运行时动态分配处理程序的方法?
最佳答案
在 Cortex-M 中,可以在运行时设置 vector 表的地址。因此,为了设置特定的 vector ,您需要将 vector 表定位到 RAM 中。
这种情况下最简单的方法就是将exception_table
指向的 vector 表复制到RAM中,在RAM副本中修改你需要改变的具体 vector ,然后将 vector 表切换到RAM中复制。
但是请注意, Vector Table Offset Register 在 Cortex-M0+ 上是可选的,可能不会在所有设备上实现。然而,它是在 SAMD21 上实现的(参见 datasheet summary 的 7.1.1。
关于c - 是否可以在运行时在 M0+ 上设置 ISR 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47721785/