0

我正在使用 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 结构中的“状态”。

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

4

2 回答 2

1

据我所知,鉴于架构并没有那么不同,您需要执行原子操作来更改 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 :)

于 2013-04-22T18:55:35.640 回答
0

在某些情况下,IRQ 中的变量更新是“原子的”,如果变量可以在一条指令中更新,如递增、递减、只读、只写。因此,您不需要在 IRQ 处理程序上禁用和启用裸 c 代码的中断。一些 OS 编码器为这些情况提供了功能,以确保使用单条指令更新变量。操作系统功能示例:http ://www.qnx.com/developers/docs/6.3.2/neutrino/lib_ref/a/atomic_add.html

对于其他一些情况,读/修改/写操作在大多数 cpu 上不是原子的(尽管它们在某些 CISC cpus 上是/是原子的),并且在访问多个变量时不能保证原子性。对于这些情况,在变量更新之前使用 enter_critical_section() 和在变量更新之后使用 exit_critical_section() 函数。对于bare-c(非操作系统)情况,这些函数简化为interruptEnable() 和interruptDisable() 函数。

于 2013-04-22T19:15:23.713 回答