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

RT-Thread studio的驱动5.1.0报错修改

文章目录

  • 前言
  • 开始修复


前言

我发现,好像很多芯片使用最新的驱动包5.1.0都会有报错和警告(5以上好像都有些问题),于是参考多方资料,终于修改成功。


开始修复

在这里插入图片描述
接着点击重新构建项目会有如下报错
在这里插入图片描述
我们定位到第一个报错
在这里插入图片描述
先不管错误信息,这个好像有点不准,看官方手册,将变量RT_WEAK 改成了小写,而这里没有更改,那我们改成小写再编译一下。

5.0.0
RT_WEAK 改为 rt_weak
ALIGN 改为 rt_align
新增 driver.c 文件
scheduler.c 分为 scheduler_mp.c(SMP 相关) 和 scheduler_up.c(单核)

这里我们要用重新构建,也就是锤头图标那一个,。
在RT-Thread Studio中,构建(Build)和重新构建(Rebuild)是两个不同的操作,它们的主要区别在于执行的操作范围和目的。
1. 构建(Build):
构建操作会编译整个工程,但不会重新编译那些没有发生变化的文件。这意味着,如果某些源文件或头文件没有被修改,构建过程会跳过这些文件的编译,从而节省时间和资源。构建操作通常用于在开发过程中,当你修改了部分代码并希望快速看到结果时。
2. 重新构建(Rebuild):
重新构建操作会强制编译整个工程,无论文件是否发生变化。这意味着,它会重新编译所有的源文件和头文件,确保生成的可执行文件是最新的。重新构建操作通常用于以下情况:

  • 初次编译整个工程
  • 需要确保所有文件都是最新版本时
  • 需要清除旧的编译结果,避免潜在的编译错误
    排查警告需要用重新构建,否则不会显示警告,结果如下
    在这里插入图片描述
    可以看到错误信息没有了,只剩警告了,看警告信息,警告几乎都是函数未声明,经过我对很多函数的溯源,发现文件rtsched.h(RT_derive5.1.0\rt-thread\include\rtsched.h)里有一段预处理指令没有编译
    在这里插入图片描述
    而这里面包括了很多前面警告没有声明函数的声明,那我们通过定义__RT_KERNEL_SOURCE__或者__RT_IPC_SOURCE__宏就能编译这一段代码,于是我在rtsched.h加入了一句预定义#define __RT_KERNEL_SOURCE__,如下。
    在这里插入图片描述
    编译后发现警告大幅度减少
    在这里插入图片描述
    接着继续定位,发现这里的报错是类型不兼容
    在这里插入图片描述
    我们找到结构体rt_pin_ops的声明,然后也看一下第一个警告函数的声明
    在这里插入图片描述
static void stm32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)

发现函数stm32_pin_mode第三个新参类型与rt_pin_ops定义的函数新参类型确实不同,那我们就保持一致就行。rt_base_t 与rt_uint8_t保留哪一个都行,在这里我是保留rt_pin_ops结构体的声明,改变了_stm32_pin_ops里的函数声明。应为我发现函数声明的形参需求的内存都很大,而实际都用不了,rt_pin_ops结构体的声明更加贴切。结果如下

static void stm32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
static void stm32_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value)
static rt_err_t stm32_pin_attach_irq(struct rt_device *device, rt_base_t pin,rt_uint8_t mode, void (*hdr)(void *args), void *args)
static rt_err_t stm32_pin_irq_enable(struct rt_device *device, rt_base_t pin,rt_uint8_t enabled)

继续编译,警告更少了,而且还是同样问题,
在这里插入图片描述
经过查看发现,下面的返回类型不一样。经过查找发现,rt_size_t 与rt_ssize_t 类型就是有无符号的区别,这里我保留了rt_size_t ,因为这个定义使用面更广

static rt_size_t stm32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction)
rt_ssize_t (*dma_transmit)(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction);
rt_size_t  = long unsigned int
rt_ssize_t  = signed long

索引的时候会发现有两个文件serial.h与serial_v2.h都有rt_uart_ops的声明,这两个文件工程会根据使用的串口版本是v1还是v2声明其中一个,默认v1,也就是声明serial.h,那这里我们两个都该就行。
继续编译
在这里插入图片描述
#pragma GCC diagnostic ignored “-Wimplicit-fallthrough” 这行代码的用途是让 GCC 编译器忽略 switch 语句里隐式贯穿(fallthrough)所产生的警告。隐式贯穿指的是在 switch 语句中,某个 case 分支结束时没有 break 语句,从而导致程序流程直接进入下一个 case 分支。
注释掉这一句//#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"整个工程0错误0警告了
在这里插入图片描述

http://www.xdnf.cn/news/3884.html

相关文章:

  • c++学习
  • 算法笔记。质数筛算法
  • 一种实波束前视扫描雷达目标二维定位方法——论文阅读
  • 短信登录功能实现(黑马点评)
  • 高中数学联赛模拟试题精选学数学系列第6套几何题
  • QT —— QWidget(1)
  • 白皮解读:数据流通关键技术白皮书【附全文阅读】
  • MNN 支持 DeepSeekVL
  • shell入门
  • 通过Docker部署Prometheus + Grafana搭建监控平台【超详细版】
  • 驱动总裁v2.19(含离线版)驱动工具软件下载及安装教程
  • 实用在线工具箱OmniTools
  • Python硬核革命:从微控制器到FPGA的深度开发指南
  • 多模态大语言模型arxiv论文略读(五十七)
  • Java响应式编程
  • DeepSeek实战--蒸馏
  • Java快速上手之实验六
  • Scrapy框架之【settings.py文件】详解
  • 开源项目实战学习之YOLO11:ultralytics-cfg-models-rtdetr(十一)
  • 强化学习:山地车问题
  • 【信息系统项目管理师】【论文】项目背景-通用部分(可背诵)
  • P1434 [SHOI2002] 滑雪
  • NVMe控制器之完成信息解析模块
  • Rotary Positional Embedding
  • FastAPI系列14:API限流与暴力破解防护
  • 学习黑客资产威胁分析贴
  • Linux:时间同步服务器
  • 深入理解C++中的指针与引用:区别、应用与最佳实践
  • 《Spring Boot实战指南:从零开始构建现代Java应用》
  • 从实列中学习linux shell11 :在 shell 中 对于json的解析 jq 和awk 如何选择,尤其在数据清洗,数据重新组织中的应用