在一个.c文件中定义了多个中断函数,出现 保存 redefinition of 'ISR',如何解决?
时间: 2024-10-25 13:07:16 浏览: 85
出现 "redefinition of 'ISR'" 错误通常是因为在一个`.c`文件中,您尝试多次声明同名的中断服务 Routine (ISR) 函数,这在 C 编程中是不允许的,因为每个函数必须有唯一的标识符。
要解决这个问题,您可以按照以下步骤操作:
1. **确保每个 ISR 定义只出现一次**:检查您的代码,确保每个中断处理程序(ISR)函数仅在一个地方被定义,而不是在`.c`文件的不同部分都被重新定义。
```c
// 只需在一处定义 ISR
void ISR_NAME(void) interrupt INTERRUPT_NUMBER {
// ISR 实现
}
```
2. **包含头文件**:如果这些 ISR 函数是在不同的源文件里分别定义的,确保每个`.c`文件包含了包含它们的头文件,并使用 `extern` 关键字声明而不是直接定义。
```c
// ISR.h
extern void ISR_NAME(void);
// ISR.c
#include "ISR.h"
void ISR_NAME(void) interrupt INTERRUPT_NUMBER {
// ISR 实现
}
// 其他.c 文件
#include "ISR.h" // 如果需要的话
```
3. **避免宏滥用**:如果你使用宏定义 ISR,确保宏在所有引用它的文件中都是一致的。如果有自定义宏导致名称冲突,考虑使用预处理器条件编译(如 `#ifdef` 或 `#ifndef`) 来限制宏的可见性。
4. **检查编译选项**:确保编译器的 `-D` 或 `-I` 选项没有无意间引入了重复的 ISR 定义。
通过上述调整,你应该能够解决 "redefinition of 'ISR'" 的错误。
阅读全文