是否可以在运行时在 M0+ 上设置 ISR 处理程序
Is it possible to set ISR Handler at runtime on M0+
我的 SAMD21 ARM M0+ 有一个 "default" resetVectors.c 文件。它看起来像:
__attribute__ ((section(".vectors")))
const DeviceVectors exception_table = {
...
};
其中定义了不同处理程序存根的位置。出于测试目的,我想使用未使用的外设 IRQ 之一。
默认情况下,未使用的地址设置为空地址。我已经向自己证明我可以修改该文件并在编译时更改我未使用的 IRQ (21) 以触发处理程序。但是,是否可以在编译时间之外执行此操作?
我观察到 table 似乎基于偏移量 0。所以我尝试了这个:
DeviceVectors *table = 0x0000000;
table->pvReserved21 = PV21Handler;
但这只是挂起董事会。有没有在运行时动态分配处理程序的方法?
在 Cortex-M 中,可以在运行时设置向量的地址 table。因此,为了设置特定的向量,您需要将向量 table 定位到 RAM 中。
这种情况最简单的方法就是将exception_table
指向的向量table拷贝到RAM中,在RAM拷贝中修改你需要改变的具体向量,然后切换向量table复制到RAM中。
但是请注意 Vector Table Offset Register is optional on Cortex-M0+ and may not be implemented on all devices. It is however implemented on SAMD21 (see 7.1.1 of the datasheet summary.
您可以将向量 table 放入 RAM 中,或者如果您不想要它,您可以将它复制到闪存中的新位置,更改 ISR 向量。然后你可以改变向量table本身的地址。
我的 SAMD21 ARM M0+ 有一个 "default" resetVectors.c 文件。它看起来像:
__attribute__ ((section(".vectors")))
const DeviceVectors exception_table = {
...
};
其中定义了不同处理程序存根的位置。出于测试目的,我想使用未使用的外设 IRQ 之一。
默认情况下,未使用的地址设置为空地址。我已经向自己证明我可以修改该文件并在编译时更改我未使用的 IRQ (21) 以触发处理程序。但是,是否可以在编译时间之外执行此操作?
我观察到 table 似乎基于偏移量 0。所以我尝试了这个:
DeviceVectors *table = 0x0000000;
table->pvReserved21 = PV21Handler;
但这只是挂起董事会。有没有在运行时动态分配处理程序的方法?
在 Cortex-M 中,可以在运行时设置向量的地址 table。因此,为了设置特定的向量,您需要将向量 table 定位到 RAM 中。
这种情况最简单的方法就是将exception_table
指向的向量table拷贝到RAM中,在RAM拷贝中修改你需要改变的具体向量,然后切换向量table复制到RAM中。
但是请注意 Vector Table Offset Register is optional on Cortex-M0+ and may not be implemented on all devices. It is however implemented on SAMD21 (see 7.1.1 of the datasheet summary.
您可以将向量 table 放入 RAM 中,或者如果您不想要它,您可以将它复制到闪存中的新位置,更改 ISR 向量。然后你可以改变向量table本身的地址。