c - 是否可以在运行时在 M0+ 上设置 ISR 处理程序

标签 c arm embedded isr

我的 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/

相关文章:

c - 如何在 Ubuntu 中使用 Code::Blocks 解决 C 中的 Segmentation fault(core dumped) 错误?

c - C 中的浮点值除法

arm - 如何确保缓冲区存储在arm 9上的缓存中

c - 使用 FreeRTOS 二进制信号量的硬件中断

c - GCC 中 -O0 和 -O1 的区别

c - 我的代码在长文本时崩溃?从文件中逐个字符地读取到 C 中的动态字符数组

c++ - 为什么 C 和 C++ 编译器将显式初始化和默认初始化的全局变量放在不同的段中?

arm - 为什么无符号类型在 arm cpu 中更有效?

c - 处理 ARM 芯片的保留寄存器位

使用 std::future 的 C++ 程序拒绝在 Windows XP Embedded 上运行