【发布时间】:2009-03-24 15:48:50
【问题描述】:
我有两个中断服务例程 (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 预处理器宏的解决方案。
【问题讨论】:
标签: c refactoring embedded