Appearance
移植到stm32
根据作者给出的示例里面的代码之间的关系, 复制以下的文件夹
- common 通用的头文件
- mqttclient
- network
- platform 不同的平台
- FreeRTOS
- mqtt 格式相关的函数
出现的问题
- 找不到头文件
- 添加对应路径
- 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里面的, 需要添加头文件
在文件nettpye_tcp.c里面使用了这两个头文件, 在后面的文件里面引用了stdio.h文件, 里面有size_t, 但是前面的nettpye_tcp.h文件里面包含的文件
在文件platform_net_socket.h文件里面使用到了
**解决方法: **对调头文件顺序
- platform_net_socket文件里面的函数实现不正确
改为空函数
- 少括号
c
#define configTICK_RATE_HZ 1000 //((TickType_t)1000)
可以在这里面添加
之后会有更多的错误, 暂时不添加
- 不使用安全相关
在mqtt_defconfig.h
文件里面添加一个宏定义
c
#define MQTT_NETWORK_TYPE_NO_TLS
- 报错匿名结构体
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;
)
};
**另外的修改方式: **
c
#define PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___
使用另一种方式进行展开
PLOOC_CFG_REMOVE_MEMORY_LAYOUT_BOUNDARY___USE_WITH_CAUTION___是plooc库的一个配置开关,用于控制是否启用内存布局边界优化。默认情况下,该开关是关闭的。
当该开关开启时,plooc库会将多个成员变量放在一起,从而减少成员变量之间的空隙,使结构体的内存布局更加紧凑,从而可以优化内存占用和访问速度。但是,这种优化可能会带来一些潜在的问题,比如可能会影响代码的可移植性和可靠性,因此需要谨慎使用。
具体而言,开启这个开关后,plooc库可能会违反C语言标准对于结构体内存布局的规定,也可能会导致一些未定义行为。因此,建议只有在确保不会出现问题的情况下才使用该开关。
- 使用无符号数返回一个有符号的整形
把函数的uint32_t改为int