Skip to content

移植到stm32

根据作者给出的示例里面的代码之间的关系, 复制以下的文件夹

  • common 通用的头文件
  • mqttclient
  • network
    • platform 不同的平台
    • FreeRTOS
  • mqtt 格式相关的函数

image-20231125223404662

出现的问题

  • 找不到头文件
  1. 添加对应路径
  2. platform下面的文件有的头文件不存在, 直接删除
c
#if 0
#include "lwip/opt.h"
#include "lwip/sys.h"
#include "lwip/api.h"
#include <lwip/sockets.h>
#include "lwip/netdb.h"
#endif

之后在使用的时候不使用lwip的方式

LWIP (Lightweight IP)是一个轻量级的开源TCP/IP协议栈,专为小型系统和嵌入式系统设计,可以运行于各种操作系统和硬件平台上。LWIP提供了TCP、UDP、IP、ICMP、DNS、DHCP、SNTP、PPP等协议的实现,可以方便地用于网络通信应用,如互联网应用、物联网应用等。LWIP还支持多种操作系统和编译器,比如FreeRTOS、Linux、Windows、Keil、IAR等。

  • 没有对应的类型定义

在平台的头文件里面添加一个

c
#define size_t unsigned int	//这一个添加以后会报一个重复包含的错误
#define socklen_t unsigned int /* 100ask add */

这个是FreeRTOS里面的, 需要添加头文件

image-20231126201125223

在文件nettpye_tcp.c里面使用了这两个头文件, 在后面的文件里面引用了stdio.h文件, 里面有size_t, 但是前面的nettpye_tcp.h文件里面包含的文件

image-20231126201323289

在文件platform_net_socket.h文件里面使用到了

**解决方法: **对调头文件顺序

  • platform_net_socket文件里面的函数实现不正确

改为空函数

  • 少括号
c
#define configTICK_RATE_HZ                       1000 //((TickType_t)1000)

image-20231126194846824

可以在这里面添加image-20231126195225514

之后会有更多的错误, 暂时不添加

  • 不使用安全相关

mqtt_defconfig.h文件里面添加一个宏定义

c
#define MQTT_NETWORK_TYPE_NO_TLS
  • 报错匿名结构体

image-20231126202215811

keil使用的编译器arm_cc不支持gcc的语法

c
def_class(mqtt_connack_data_t,
    private_member(
    uint8_t rc;
    uint8_t session_present;
    )
)
#elif   defined(__PLOOC_CLASS_IMPLEMENT__) || defined(__PLOOC_CLASS_IMPLEMENT)
//实际上使用的是这一个,跳转会跳转错误
#   define private_member(...)              PLOOC_VISIBLE(__VA_ARGS__)
#   define protected_member(...)            PLOOC_VISIBLE(__VA_ARGS__)
#   define public_member(...)               PLOOC_VISIBLE(__VA_ARGS__)

#   if defined(PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___)
#       define PLOOC_VISIBLE(...)           __VA_ARGS__
#   else
#       define PLOOC_VISIBLE(...)                                               \
        struct  {                                                           \
            __VA_ARGS__                                                         \
        }PLOOC_ALIGN(PLOOC_ALIGNOF_STRUCT(__VA_ARGS__));
    //这里是实际上使用到的位置
#   endif    
    

#define def_class(__name, ...)          __def_class(__name, __VA_ARGS__)
#define __def_class(__name, ...)                                                \
    typedef struct __name __name;                                               \
    struct __name {                                                             \
        __VA_ARGS__                                                             \
    };

展开以后

c
typedef struct mqtt_connack_data_t mqtt_connack_data_t;                               
struct __name {               
    ,private_member(
    uint8_t rc;
    uint8_t session_present;
    )                    
};

image-20231126202931235

**另外的修改方式: **

c
#define PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___

使用另一种方式进行展开

PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___是plooc库的一个配置开关,用于控制是否启用内存布局边界优化。默认情况下,该开关是关闭的。

当该开关开启时,plooc库会将多个成员变量放在一起,从而减少成员变量之间的空隙,使结构体的内存布局更加紧凑,从而可以优化内存占用和访问速度。但是,这种优化可能会带来一些潜在的问题,比如可能会影响代码的可移植性和可靠性,因此需要谨慎使用。

具体而言,开启这个开关后,plooc库可能会违反C语言标准对于结构体内存布局的规定,也可能会导致一些未定义行为。因此,建议只有在确保不会出现问题的情况下才使用该开关。

  • 使用无符号数返回一个有符号的整形

image-20231126205950058

把函数的uint32_t改为int

image-20231127172536430