c - 将结构传递给 ISR

标签 c pic microchip isr

我正在使用 Hi-Tech-PICC v9.65PL1 进行 C 语言编程,对 PIC16F876 进行编程。

对于中断,我使用以下结构:

void interrupt isr() {
    if (T0IF) {
               //Do STUFF
     T0IF = 0;
    }
}

我正在尝试弄清楚如何将对象传递到 ISR 中。我知道我可以简单地将对象设置为全局变量,但这不是重点。我见过用另一种架构用 C 语言完成的。由于我使用的是 C,所以当我说对象时,我指的是 typedef 结构,例如:

typedef struct {
    volatile char state;
    rtc_t rtc;
    shiftReg_t shiftReg;
} clock_t;

我的目标是让ISR改变clock_t结构中的“状态”。

有人可以解释一下这样做涉及什么吗?

最佳答案

据我所知,鉴于架构没有那么不同,您需要执行原子操作来更改clock_t结构中的状态。

也就是说,void Interrupt isr() 可以接受参数吗?如果是,那么您可以使用本地clock_t结构,否则最好的选择是使用全局变量。

如果 isr 确实接受该参数,您可以执行以下操作:

int main()
{
    clock_t noteState;
    ....
    isr(&noteState);
    ....
}

isr 定义为::

void interrupt isr(clock_t *tmp)
{
    interruptDisable(); // I am guessing that T0IF is a global value, yes?
    /* Perform operation */
    tmp->state = newState /*(whatever you choose to set)*/
    interruptEnable();
}

您可以在将来重用 noteState :)

关于c - 将结构传递给 ISR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16153819/

相关文章:

c - 终端模拟器中的随机字符

c - 内存映射显示分配给神秘变量 _powers_ 和 _npowers_ 的空间

c - sprintf 正在输出一些奇怪的数据

java - 是什么导致 Java 库在被 JRuby 调用时表现不同?

c - qsort 和 bsearch 指针数组

c - 为什么我的 ifdigit 出现故障

c - 不应使用 MISRA C 2012 规则 20.5 #undef

c - 动态分配数组与使用全局作用域自动声明数组(C 语言)

c - C 中带有数据段内存的通用静态 vector 数据类型

c - 为 PIC24 重新定义寄存器掩码以提高可读性是不好的做法吗?