当前位置: 首页 > news >正文

裸机项目添加FreeRTOS操作系统--常见报错

常见报错一

 

这些报错是 FreeRTOS 移植不完整导致的链接错误,本质是工程里缺少 FreeRTOS 内核中与 “端口(port)” 相关的实现代码,导致链接器找不到 vPortEnterCriticalxPortStartScheduler 等函数的定义。工程里只加了 FreeRTOS 通用内核代码(tasks.cqueue.c 等),但没添加对应 Cortex - M 内核和 Keil 编译器的端口层文件 。

解决方法: 

找到 FreeRTOS 源码中的 portable 目录,进入 RVDS(或 Keil,不同版本可能命名不同)→ ARM_CM3(或对应内核,如 ARM_CM4 )。将目录里的 port.c 和 portmacro.h 文件,添加到工程中(一般放到 FreeRTOS/portable/Keil/ARM_CM3 分组)。

常见报错二 

这是多重定义错误(Multiple Definition Error)

SVC_Handler 和 PendSV_Handler 这两个符号(中断服务函数),在工程中被重复定义了。从报错信息看,port.c(FreeRTOS 端口层文件,负责上下文切换等内核关键逻辑 )和 stm32f10x_it.c(STM32 标准中断文件,用户 / 库默认的中断服务函数实现 )里,都定义了这两个中断处理函数,导致链接器冲突。

关键背景知识

  1. SVC_Handler:即系统调用中断(Supervisor Call),FreeRTOS 用于任务切换、系统调用等内核操作,需要由端口层(port.c)实现特定逻辑。
  2. PendSV_Handler:可挂起的系统调用中断,FreeRTOS 依赖它实现任务上下文切换(抢占式调度核心 ),同样由端口层提供实现。
  3. stm32f10x_it.c:STM32 标准外设库 / HAL 库的中断服务函数集中文件,默认会 “占位” 定义这些中断函数(通常是空实现或弱符号 __weak )。

解决方法:

法 1:保留 FreeRTOS 端口层的定义(推荐)

FreeRTOS的port.c里,SVC_HandlerPendSV_Handler内核正常运行必需的、包含上下文切换逻辑的实现。因此,需要让 STM32 标准中断文件里的默认定义 “失效”。

步骤:

①打开stm32f10x_it.c(或 stm32f1xx_it.c 等中断文件 )

②找到以下代码(默认可能是空函数或弱定义):

void SVC_Handler(void)	
{
}void PendSV_Handler(void)
{
}

注释或删除这两个函数的定义,让 FreeRTOS 端口层(port.c)里的实现 “生效”。

法 2:利用弱符号(__weak)兼容(如果库支持)

部分 STM32 库(如 HAL 库)会用 __weak 修饰默认中断函数,允许用户代码 “覆盖” 定义。

检查 stm32f10x_it.c 里的函数是否带 __weak

__weak void SVC_Handler(void)
{// 空实现
}__weak void PendSV_Handler(void)
{// 空实现
}

如果带 __weak,则FreeRTOS 端口层(port.c)里的非 __weak 定义会自动覆盖默认实现,理论上无需修改。但如果实际仍报错,说明库版本未用 __weak,需走方案 1。 

 常见报错三 

 

 这个报错是多重定义错误(Multiple Definition Error),具体原因是 SysTick_Handler 这个符号(即 SysTick 定时器的中断服务函数)在工程中被重复定义了。从报错信息看到,stm32f10x_it.c(STM32 标准中断处理文件编译后的目标文件 )和 delay.cdelay.c 编译后的目标文件 )里,都定义了 SysTick_Handler 函数,导致链接器不知道该用哪个,从而报错。

 解决方法:

法1:保留一处定义,删除另一处

确定需求:如果用 FreeRTOS,通常 FreeRTOS 会依赖 SysTick_Handler 做系统节拍,或你的delay.c 有特殊逻辑,需明确保留哪一个。

删除重复定义

若 delay.c 里的 SysTick_Handler 是自定义且不需要,直接删除 delay.c 里的该函数。

若 stm32f10x_it.c 里的是默认空函数,删除 stm32f10x_it.c 里的 SysTick_Handler 定义,保留 delay.c 里的实现(或反之,根据实际需求 )。

法2:也是利用 __weak 关键字(如果库支持)

部分 STM32 库(如 HAL 库)会用 __weak 修饰默认中断函数,允许用户代码 “覆盖” 定义。检查 stm32f10x_it.c 里的 SysTick_Handler

__weak void SysTick_Handler(void)
{// 空实现或默认逻辑
}

如果带 __weak,则你在 delay.c 里的非 __weak 定义会自动覆盖默认实现,理论上无需修改。但如果实际仍报错,说明库版本未用 __weak,需走方案 1 。

相关文章:

  • 西安专业做网站的公司有哪些下载百度地图2022最新版
  • 哪个网站做推广做的最好日照高端网站建设
  • 黑龙江省城乡建设厅网站首页百度怎么做关键词优化
  • asp.net做三个网站网站建设的系统流程图
  • 做网站注册哪类商标seo在线培训机构排名
  • 网站开发浏览器兼容性seo推广的特点
  • Kubernetes生命周期管理:深入理解 Pod 生命周期
  • Aerotech系列(4)Aerotech.A3200名空间
  • SpringBoot + MyBatis 事务管理全解析:从 @Transactional 到 JDBC Connection 的旅程
  • Airtable 的数据超出上限,3 种常见应对方式
  • 较大项目 git(gitee, github) 拉取失败解决方法
  • Linux系统环境编程
  • NHDeep智能档案题名(标题)校对工具使用说明
  • Linux线程概念及常用接口(1)
  • Redis 乱码和LocalDateTime类型缓存问题
  • 电商领域企业级应用后端开发 (Java) 就业前景深度分析报告 (2025-2030)
  • uniapp项目之小兔鲜儿小程序商城(六) 地址模块:地址管理页的实现,地址表单页的实现
  • 随机算法设计思想总结
  • 闲聊ARM内核参数传递机制
  • Harmony状态管理@Event
  • JVM的内存模型和内存结构
  • 【数字后端】- 什么是NDR规则?
  • Android检测当前进程或者应用是否被调试
  • android脱糖
  • 深度解析torchrun与local_rank
  • NIPS-2001《Partially labeled classification with Markov random walks》