MDK编译错误 Symbol SysTick_Handler multiply defined (by hal_cm3.o and xxx.o) 的解决

本文解决在使用RTX内核的程序中添加SysTick_Handler实现后,出现MDK编译错误的问题。通过分析错误原因,提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用“系统节拍”定时器的程序出现MDK编译错误 Symbol SysTick_Handler multiply defined (by hal_cm3.o and xxx.o) 的解决

 

出现此错误是因为你在使用RTX内核的程序中添加了SysTick_Handler的实现,RL-RTX操作系统能跑起来的一大前提就是初始化好了Systick,也就是说系统已经实现了SysTick_Handler函数,这个函数就位于Keil安装目录下的“\ARM\RL\RTX\SRC\CM\hal_cm3.c"文件中。

 

片段如下:

 

SysTick_Handler
        BL      __cpp(rt_systick)
        B       Sys_Switch


也就是说想增加系统节拍定时器中断处理也要在这里实现。

在STM32项目中遇到 `Error L6200E: Symbol SysTick_Handler multiply defined` 通常是由于SysTick中断处理函数在多个源文件中被定义引起的。这类问题常见于使用FreeRTOS或裸机编程时与系统滴答定时器(SysTick)相关的模块冲突。 ### 原因分析 - **SysTick_Handler** 是用于处理系统滴答中断的默认中断服务函数名。 - 在标准的STM32固件库中,该函数通常在 `stm32f10x_it.c` 文件中实现。 - 当引入其他模块(如FreeRTOS、自定义的 `sys_tick.c` 或其他第三方库)时,也可能定义了同名的 `SysTick_Handler`,导致链接器报错。 ### 解决方法 #### 方法一:注释掉重复定义的 `SysTick_Handler` 找到包含 `SysTick_Handler` 实现的源文件(例如 `stm32f10x_it.c` 或 `sys_tick.c`),保留一个定义,将另一个文件中的函数实现注释掉或删除: ```c // void SysTick_Handler(void) // { // HAL_IncTick(); // } ``` #### 方法二:使用弱符号(Weak Symbol) 在某些编译器(如Keil MDK或GCC)中,可以将其中一个定义标记为“弱符号”,这样链接器会优先使用非弱符号的定义。 在 `sys_tick.c` 或相关文件中修改如下: ```c void __attribute__((weak)) SysTick_Handler(void) { // 默认空实现或HAL调用 } ``` #### 方法三:配置FreeRTOS避免重复定义 如果使用的是FreeRTOS,并且你希望由FreeRTOS接管SysTick中断,则可以在 `FreeRTOSConfig.h` 中进行如下配置: ```c #define xPortSysTickHandler SysTick_Handler ``` 同时确保在 `stm32f10x_it.c` 中不再定义 `SysTick_Handler` 函数。 #### 方法四:检查启动文件中的中断向量表 确认启动文件(如 `startup_stm32f10x_xx.s`)中是否正确地将 `SysTick_Handler` 指向了实际使用的实现函数。如果有多个符号映射到同一个中断向量,也会引发冲突。 --- ### 总结 解决此类错误的核心在于确保整个工程中只有一个有效的 `SysTick_Handler` 定义[^3]。可以通过删除/注释多余实现、使用弱符号机制或调整FreeRTOS配置来实现目的。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值