我的SAMD21 ARM M0 +有一个“默认”resetVectors.c文件。它有一些看起来像:
__attribute__ ((section(".vectors")))
const DeviceVectors exception_table = {
...
};
在其中定义了不同处理程序存根的位置。出于测试目的,我想使用一个未使用的外设IRQ。
默认情况下,未使用的设置为NULL地址。我已向自己证明我可以修改该文件,并在编译时更改我未使用的IRQ(21)以触发处理程序。但是,是否可以在编译时间之外完成此操作?
我观察到该表似乎是基于偏移0.所以我尝试了这个:
DeviceVectors *table = 0x0000000;
table->pvReserved21 = PV21Handler;
但这只是挂板。有没有动态的方法在运行时分配处理程序?
答案 0 :(得分:5)
在Cortex-M中,可以在运行时设置向量表的地址。因此,为了设置特定向量,您需要将向量表定位到RAM中。
在这种情况下,最简单的方法是将exception_table
指向的向量表复制到RAM,修改需要在RAM副本中更改的特定向量,然后将向量表切换到RAM副本。 / p>
但请注意, Vector Table Offset Register 在Cortex-M0 +上是可选的,可能无法在所有设备上实现。然而,它在SAMD21上实现(见datasheet summary的7.1.1。
答案 1 :(得分:-1)
您可以将矢量表放在RAM中,或者如果您不想在那里将其复制到闪存中更改ISR矢量的新位置。然后你可以改变向量表本身的地址。