【问题标题】:Passing structure into ISR将结构传递到 ISR
【发布时间】:2013-04-22 18:09:55
【问题描述】:

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

对于中断,我使用的是结构:

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

我试图弄清楚如何将对象传递到 ISR。我知道我可以简单地将对象设为全局变量,但这不是重点。我已经看到它在 C 中使用另一种架构完成。由于我使用的是C,所以当我说一个对象时,我指的是一个typedef struct,例如:

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

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

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

【问题讨论】:

标签: c pic microchip isr


【解决方案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 :)

【讨论】:

    【解决方案2】:

    在某些情况下,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() 函数。

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2019-09-19
      • 1970-01-01
      • 2013-12-05
      • 2021-09-13
      • 2011-07-05
      相关资源
      最近更新 更多