• 七、基于FreeRTOS&STM32移植MQTT


    1、移植环境

    (1)Keil MDK: V5.38.0.0

    (2)STM32CubeMX: V6.8.1

    (3)MCU: STM32F407ZGT6

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

    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、总结

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

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

  • 相关阅读:
    如何压缩图片200k以下?
    python之Matplotlib
    高防CDN之所以强大的原因
    前端表单滑块验证码开发
    OpenCV---视频操作
    Java学习笔记4.5.1 日期时间 - Date类
    day58 单调栈.p1
    性能优化:JIT即时编译与AOT提前编译
    [ Shell ] 两个 case 实现 GetOptions 效果
    VBA技术资料MF72:利用函数判断文件及工作表存在
  • 原文地址:https://blog.csdn.net/weixin_42727214/article/details/136333927