当前位置:  开发笔记 > 编程语言 > 正文

如何避免类似ISR之间的代码重复?

如何解决《如何避免类似ISR之间的代码重复?》经验,为你挑选了1个好方法。

我有两个中断服务程序(ISR),基本上完全相同,但每个处理来自不同设备的中断(虽然是相同类型的设备).因此,逻辑是相同的,但它们访问不同的CPU寄存器和存储器位置.

作为一个简单的示例,请考虑以下代码:

extern volatile unsigned int dev1_rx_buffer;
extern volatile unsigned int dev2_rx_buffer;

volatile unsigned char data;

void __attribute__((__interrupt__)) _dev1_interrupt(void)
{
    /* Clear interrupt flag */
    dev1.IF = 0;

    if (dev1.IS_FULL) {
         /* Read data from device */
         data = dev1_rx_buffer;
    } else {
         /* do something else using registers of device 1 */
    }
    /* More stuff using registers of device 1 */
}

void __attribute__((__interrupt__)) _dev2_interrupt(void)
{
    /* Clear interrupt flag */
    dev2.IF = 0;

    if (dev2.IS_FULL) {
         /* Read data from device */
         data = dev2_rx_buffer;
    } else {
         /* do something else using registers of device 2 */
    }
    /* More stuff using registers of device 2 */
}

如何避免代码重复与适用于ISR的限制(即我不能将参数传递给ISR,因为它们的开销应该避免函数调用).

我曾想过编写一个模板,使用更高级别的脚本语言从中生成两个ISR,但我更喜欢只使用C或C预处理器宏的解决方案.



1> Dan..:

在这种情况下,我通常让ISR(向量入口点)的前端设置指向设备特定块的指针,然后使用指向该块的指针调用公共代码.

大致(不担心ISR语法等)

void __attribute__((__interrupt__)) Isr1(void)
{
   CommonISR(&dev1info);
}

void __attribute__((__interrupt__)) Isr2(void)
{
   CommonISR(&dev2info);
}

void CommonISR(Foo *devptr)
{
    devptr->count = 0;
    devptr->reset();
    etc...
}

dev1info和dev2info在启动时配置/初始化; 他们可能有指向HW寄存器等的指针......

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有