七、基于FreeRTOSSTM32移植MQTT

1、移植环境

(1)Keil MDK: V5.38.0.0

(2)STM32CubeMX: V6.8.1

(3)MCU: STM32F407ZGT6

(4)已移植好FreeRTOS和调试好串口的项目。

  • FreeRTOS移植参考博客:示例1:FreeRTOS移植详解_基于HAL库工程_hal库移植rtos-CSDN博客
  • mqttclient源码:https://github.com/jiejieTop/mqttclient

2、移植程序4步骤

  • 合并源码
  • 解决编译错误
  • 解决链接错误
  • 调试

3、合并源码_添加MQTTClient源码

(1)在基础工程中创建MQTTClient文件夹,用于存放MQTTClient代码。如下图所示:

(2)将mqttcline源码所有文件拷贝到刚创建的MQTTClient中。如下图所示:

  • 可以参照示例程序,逐步拷贝用到的代码
  • 也可以全部拷贝,再逐步删除没用到的代码

(3)MQTTClient\platform文件下只保留FreeRTOS文件夹,其余均删除。如下图所示:

(4)删除下图所示文件

(5)删除后,如下图所示:

(4)删除下列文件夹,删除后如下图所示:

  • MQTTClient\cmake
  • MQTTClient\docs          // 文档
  • MQTTClient\example   // 示例程序
  • MQTTClient\png           // 图片

(5)common目录下删除如下文件和文件夹

4、MQTTClient代码添加进Keil工程

(1)KeilMDK打开工程,新建如下分组,如下图所示:
(config不用新建分组,该文件夹下只有头文件)

  • common
  • mqtt
  • mqttclient
  • network
  • platform

(3)将 “MQTTClient\common”目录下的.c文件添加到 common 分组。(包括子文件夹下的.c文件)

(4)将 “MQTTClient\mqtt”目录下的.c文件添加到 mqtt 分组。

(5)将 “MQTTClient\mqttclient”目录下的.c文件添加到 mqttclient 分组。

(6)将 “MQTTClient\network”目录下的.c文件添加到 network分组。

  • 子文件夹 mbedtls 下的文件暂不添加,tls是安全传输相关的程序

(7)将 “MQTTClient\platform”目录下的.c文件添加到 platform 分组。(包括子文件夹下的.c文件)

5、添加头文件路径

  • E:\Gitee\mqtt-freertos-csdn\MQTT_FreeRTOS_Start\MQTTClient\common
  • E:\Gitee\mqtt-freertos-csdn\MQTT_FreeRTOS_Start\MQTTClient\common\log
  • E:\Gitee\mqtt-freertos-csdn\MQTT_FreeRTOS_Start\MQTTClient\config
  • E:\Gitee\mqtt-freertos-csdn\MQTT_FreeRTOS_Start\MQTTClient\mqtt
  • E:\Gitee\mqtt-freertos-csdn\MQTT_FreeRTOS_Start\MQTTClient\mqttclient
  • E:\Gitee\mqtt-freertos-csdn\MQTT_FreeRTOS_Start\MQTTClient\network
  • E:\Gitee\mqtt-freertos-csdn\MQTT_FreeRTOS_Start\MQTTClient\platform\FreeRTOS

6、编译错误解决

6.1、找不到头文件pthread.h

(1)报错内容:

  • ..\MQTTClient\common\log\salof_defconfig.h(105): error:  #5: cannot open source input file "pthread.h": No such file or directory
  • 这样的条件编译通常用于跨平台编程,以便在不同的操作系统或硬件上定制特定的代码。

(2)阅读源码发现,错误原因是配置默认的操作系统是Linux,修改为FreeRTOS,如下图所示:

6.2、找不到头文件nettype_tls.h

(1)报错内容

  • ..\MQTTClient\network\nettype_tls.h(28): error:  #5: cannot open source input file "mbedtls/config.h": No such file or directory

(2)tls 的文件是安全传输相关的,修改为不包含这个头文件。

  • 这些文件的包含和宏 MQTT_NETWORK_TYPE_NO_TLS 相关
  • #define MQTT_NETWORK_TYPE_NO_TLS 1  // 定义该宏取消包含这些代码

6.3、找不到头文件lwip/opt.h

(1)报错内容

  • ..\MQTTClient\platform\FreeRTOS\platform_net_socket.h(14): error:  #5: cannot open source input file "lwip/opt.h": No such file or directory
  • 在编译nettype.c文件时,包含了头文件 lwip/opt.h ,却找不到

(2)这里是使用ESP模块AT指令联网,用不到lwip。

  • 移植的工程中也找不到头文件 lwip/opt.h
  • 这里先注释掉

6.4、函数返回值类型不匹配

(1)报错内容

  • ..\MQTTClient\common\log\arch\freertos\arch.c(39): error:  #120: return value type does not match the function type
  • xSemaphoreCreateMutex(); 该函数在FreeRTOS中,它用于创建一个互斥锁。

(2) 解决方法1:修改函数返回值使其匹配

  • 检查代码后发现是FreeRTOS没有配置启用互斥量功能
  • 添加如何宏定义
    #define configUSE_MUTEXES	        1

(3)解决方法2:注释该部分代码

  • 检查代码后发现该部分代码是属于调式打印log信息的;
  • 可通过修改宏定义注释该部分代码。

6.5、重定义变量类型未定义

(1)报错内容

  • ..\MQTTClient\platform\FreeRTOS\platform_net_socket.h(33): error:  #20: identifier "socklen_t" is undefined

(2)解决

  • socklen_t变量类型再其他文件中也没有定义,这里自己添加
  • socklen_t 是表示长度的,这里就先定义为 unsigned int 类型
  • 该函数是平台相关的函数,后续也需要自己写,自己用AT指令实现

6.6、语法错误

(1)报错内容

  • ..\MQTTClient\platform\FreeRTOS\platform_timer.c(15): error:  #18: expected a ")"
  • 编译器期望再15行得到一个 ")"

(2)问题分析

  • 检查 configTICK_RATE_HZ
    #define configTICK_RATE_HZ			( ( TickType_t ) 1000 )
  • 检查 TickType_t 

    • 该重定义类型未定义

  • 先不使用该类型

    #define configTICK_RATE_HZ			1000  //( ( TickType_t ) 1000 )  // zjd add

6.7、平台相关函数报错

(1)报错内容

  • ..\MQTTClient\platform\FreeRTOS\platform_net_socket.c(58): error:  #70: incomplete type is not allowed

(2)先注释掉该部分内容,函数名保留。

7、总结

        移植代码的错误一般分为编译错误和链接错误。

        直至移植的代码无错误后开始写代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/504687.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIS之深度学习01:检测电脑是否包含英伟达GPU

GPU(Graphics processing unit),中文全称图形处理器,我们听说的更多的CPU全称是central processing unit,中央处理器。研究深度学习和神经网络大都离不开GPU,在GPU的加持下,我们可以更快的获得模…

Linux搭建SFTP服务器

案例:搭建SFTP服务器 SFTP(SSH文件传输协议) SFTP(SSH文件传输协议)是一种安全的文件传输协议,用于在计算机之间传输文件。它基于SSH(安全外壳协议)的子系统,提供了加密的…

java 基础(核心知识搭配代码)

前言 java的学习分为了上部分以及下部分进行学习,上部分就是对于java的基础知识,面向对象上,面向对象下,异常操作,javaApi;下部主要是集合,泛型,反射,IO流,J…

加密隧道技术

在现在的互联网上传输数据,首要考虑的就是安全。这关乎到你的隐私,个人信息,财产安全等等重大问题。如果你的程序本身传输的信息没有加密,也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的,…

ubuntu20下使用 torchviz可视化计算图

安装 torchviz: pip install torchviz示例代码:下面是一个简单的示例代码,展示如何使用 torchviz 可视化计算图: python import torch from torchviz import make_dot# 创建一个简单的模型 model torch.nn.Sequential(torch.nn…

《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?

根据求生之路2服务器的实际案例分析选择合适的内存和CPU核心数以避免丢包和延迟高的问题,首先需要考虑游戏的类型和对服务器配置的具体要求。《求生之路2》作为一款多人在线射击游戏,其服务器和网络优化对于玩家体验至关重要。 首先,考虑到游…

二维码门楼牌管理系统技术服务的分类与应用

文章目录 前言一、二维码门楼牌管理系统的分类二、二维码门楼牌管理系统的应用优势三、结论 前言 随着城市管理的精细化和智能化,二维码门楼牌管理系统成为了现代城市管理的重要工具。该系统将传统的门牌、楼牌、户牌与二维码技术相结合,实现了信息的快…

麒麟银河操作系统V10部署ffmpeg(也能用于Linux系统)

麒麟银河操作系统V10部署ffmpeg(也能用于Linux系统) 部署ffmpeg用来处理视频的各种操作 想使用ffmpeg,要先安装nasm,yasm,x264之后,否则会报错 nkvers 查看麒麟操作系统版本 cat /proc/version #查看linux版本信息 uname -a …

提升工作能力的方法

1.接受工作,只问标准 2.请示工作,必带方案; 3.汇报工作,突出成果; 4.分享工作,细说流程; 5.复盘工作,总结SOP 如果能这么做,那将是一个非常通透的高手,所以高…

Java学习-简单算法与正则表达式

1.排序算法 a.冒泡排序: 每轮找出当前最大值,冒到前面,循环长度减一次,每轮从1个比较到长度减i个 b.选择排序: 每一轮选择每一个位置的数组元素和后面的元素比较,从第i1个比较到最后一个 选择排序的优化&am…

芯科科技为全球首批原生支持Matter-over-Thread的智能锁提供强大助力,推动Matter加速成为主流技术

智能锁领域的先锋企业U-tec和Nuki选择芯科科技解决方案,成为Matter-over-Thread应用的领先者 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今…

Linux 常用的文本处理工具

目录 cat 连接 more/less 分页 tail 实时 cat 连接 将一个或多个文件的内容连接并显示在终端上,创建新文件或将内容追加到已有文件。 不会分屏显示文件内容,适用于较小的文件。 cat 文件1.txt 文件2.txt # 连接并显示文件1.txt和文件2.txt的内容 …