分类 嵌入式开发 下的文章

I2C 通信协议

I2C(Inter-Integrated Circuit,又常写作 IIC、$I^2C$)是一种广泛应用于数字电路中的串行通信协议。这种通信协议由 Philips 公司(现在的 NXP 公司)在 20 世纪 80 年代开发,旨在解决多个芯片间的通信问题。I2C 通信协议具有简单、高可靠性和灵活性的特点,因此被广泛应用于各种不同领域的电子设备中。 I2C 协议使用两根线进行数据传输,分别是 SDA(Serial Data Line)和 SCL(Serial Clock Line)。数据在 SDA 线上传输,而时钟同步则由 SCL 线提供。这两根线在通信过程中通过电平变化来传输数据,并且都有上拉电阻。 在 I2C 通信中,有两个主要的参与者角色:主设备(Master)和从设备(Slave)。主设备是 I2C 总线的控制者,负责发起通信和发送指令;从设备则根据主设备的指令执行相应的操作并返回数据。 I2C 通信协议的基本操作包括起始条件和停止条件。起始条件是主设备发起通信的标志,它的产生是通过在 SCL 线保持高电平的同时将 SDA 线从高电平拉低。停止条件是通信结束的标志,在 SCL 线保持高电平的同时将 SDA 线从低电平拉高。 在起始条件之后,主设备会发送一些控制字节来选择特定的从设备进行通信。这些控制字节通常包括从设备的地址和读/写控制位。一旦从设备被选择,数据传输可以开始。数据的传输采用字节为单位,每个字节的传输分为数据传输和应答两个部分。 此外,I2C 协议还规定了数据有效性、地址及数据方向、应答信号和非应答信号等方面的细节,以确保通信的准确和可靠。 读写标志位:1 为读,0 为写。 注意: SDA 使用 GPIO 的 OD 模式时,在读前不需要将 GPIO 切换为输入模式,可以直接读取,但需要在读前将其输出电平置为高,这时由于时开漏状态,是由外部上拉电阻将总线拉高的,这时从设备才可以将总线拉低。如果主设备输出低电平则总线一直被主设备强拉低而使从设备不能正常输出高电平,从而使读通信不能正常进行。 主机在收完从机的 ACK 后要把 SCL 拉低,否则从机一直保持输出电平(SCL 高电平是从设备电平不能变化),比如 ACK 时一直输出低电平,NACK 时一直输出高电平,主机的 Sr 开始信号不能够使从机重新开始。 SDA 线上的数据在时钟“高”期间必须是稳定的,只有当 SCL 线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。 数据有效性 I2C 使用 SDA 信号线来传输数据,使用 SCL 信号线进行数据同步。SDA 数据线在 SCL 的每个时钟周期传输一位数据。传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL 为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。 重启动信号 在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放总线,就需要利用重启动 Sr 信号时序。重启动信号 Sr 既作为前一次数据传输的结束,又作为后一次数据传输的开始。利用重启动信号的优点是,在前后两次通信之间主控器不需要释放总线,这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线。 Sr 的型号与 S 是完全一样的,后面要重新发送器件地址,与S后的逻辑完全一致。 I2C 有 7 位和 10 位两种地址模式 I2C 规范保留了两组和 8 个地址,1111XXX 和 0000XXX。这些地址用于特殊用途。 从机地址+R/W 描述 0000 0000 呼叫地址 0000 0001 起始字节 0000 001X CBUS地址 0000 010X 保留供不同的总线格式 0000 011X 保留将来用 0000 1XXX HS模式主机码 1111 0XXX 10位从机地址 1111 1XXX 保留将来用 I2C 总线的 10bit 寻址和 7bit 寻址是兼容的,这样就可以在同一个总线上同时使用 7bit 地址和 10bit 地址模式的设备,在进行 10bit 地址传输时,第一字节是一个特殊的保留地址来指示当前传输的是 10bit 地址...

RT-Thread 邮箱与消息队列

邮箱 RT-Thread 操作系统的邮箱用于线程间通信,特点是开销比较低,效率较高。邮箱中的每一封邮件只能容纳固定的 4 字节内容(针对 32 位处理系统,指针的大小即为 4 个字节,所以一封邮件恰好能够容纳一个指针)。典型的邮箱也称作交换消息。 邮件发送不具有加急(插队)的功能。 静态邮箱初始化 初始化前资源要静态地创建。 rt_err_t rt_mb_init(rt_mailbox_t mb, const char *name, void *msgpool, rt_size_t size, rt_uint8_t flag) 静态邮箱脱管 把静态初始化的邮箱对象从内核对象管理器中脱离。 rt_err_t rt_mb_detach(rt_mailbox_t mb) 创建邮箱 动态地创建邮箱并初始化。 rt_mailbox_t rt_mb_create(const char *name, rt_size_t size, rt_uint8_t flag) 删除邮箱 脱管邮箱并释放动态资源,与 rt_mb_create 配合使用。 rt_err_t rt_mb_delete(rt_mailbox_t mb) 发送邮件 rt_err_t rt_mb_send (rt_mailbox_t mb, rt_uint32_t value) 函数调用了rt_mb_send_wait,timeout = 0 以等待方式发送邮件 邮箱满时等待。 rt_err_t rt_mb_send_wait(rt_mailbox_t mb, rt_uint32_t value, rt_int32_t timeout) 接收邮件 支持空等待。 rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout) 邮箱控制 不常用。 rt_err_t rt_mb_control(rt_mailbox_t mb, rt_uint8_t cmd, void *arg) 2.1.0 版 支持的命令 RT_IPC_CMD_RESET(复位邮箱) timeout 支持以下宏: #define RT_WAITING_FOREVER -1 /**< Block forever until get resource. */ #define RT_WAITING_NO 0 /**< Non-block. */ 消息队列 消息队列能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息队列是一种异步的通信方式。 很遗憾的是消息队列不支持发送阻塞模式(像邮箱那样的发送等待)。 消息队列初始化 静态创建。 rt_err_t rt_mq_init(rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_size, rt_size_t pool_size, rt_uint8_t flag) 消息队列脱管 rt_err_t rt_mq_detach(rt_mq_t mq) 动态创建消息队列 rt_mq_t rt_mq_create(const char *name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag) 删除消息队列 rt_err_t rt_mq_delete(rt_mq_t mq) 发送消息到队列 线程或者中断服务程序都可以给消息队列发送消息。当发送消息时,消息队列对象先从空闲消息链表上取下一个空闲消息块,把线程或者中断服务程序发送的消息内容复制到消息块上,然后把该消息块挂到消息队列的尾部。当且仅当空闲消息链表上有可用的空闲消息块时,发送者才能成功发送消息;当空闲消息链表上无可用消息块,说明消息队列已满,此时,发送消息的的线程或者中断程序会收到一个错误码(-RT_EFULL)。 rt_err_t rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size) 发送紧急消息到队列 发送紧急消息的过程与发送消息几乎一样,唯一的不同是,当发送紧急消息时,从空闲消息链表上取下来的消息块不是挂到消息队列的队尾,而是挂到队首,这样,接收者就能够优先接收到紧急消息,从而及时进行消息处理。 rt_err_t rt_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size) 接收消息 当消息队列中有消息时,接收者才能接收消息,否则接收者会根据超时时间设置,或挂起在消息队列的等待线程队列上,或直接返回。 rt_err_t rt_mq_recv(rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout) 消息队列控制 rt_err_t rt_mq_control(rt_mq_t mq, rt_uint8_t cmd, void *arg) 支持的命令有:RT_IPC_CMD_RESET(复位) 区别 邮箱只能传4字节的值,消息队列可以传递更长的值; 邮箱有发送等待功能,消息队列没有; 消息队列有紧急消息功能,邮箱没有紧急邮件的功能...

u-boot 通过 tftp 下载 uImage

使用 tftp 下载镜像文件 setenv serverip 172.16.9.52 saveenv # 保存 tftp 0x80800000 uImage # 从服务器下载 uImage 放在 RAM 的 0x80800000 地址(不写地址默认是 0x80200000) bootm 0x80800000 # 从该地址加载内核镜像启动 Linux 系统(掉电后镜像会丢失) 怎样掉电不丢失呢,直接写 flash,替换原有镜像。 查看 nand flash 分区: mtdparts device nand0 <omap2-nand.0>, # parts = 8 #: name size offset mask_flags 0: SPL 0x00020000 0x00000000 0 1: SPL.backup1 0x00020000 0x00020000 0 2: SPL.backup2 0x00020000 0x00040000 0 3: SPL.backup3 0x00020000 0x00060000 0 4: u-boot 0x001e0000 0x00080000 0 5: u-boot-env 0x00020000 0x00260000 0 6: kernel 0x00500000 0x00280000 0 7: rootfs 0x07880000 0x00780000 0 active partition: nand0,0 - (SPL) 0x00020000 @ 0x00000000 defaults: mtdids : nand0=omap2-nand.0 mtdparts: mtdparts=omap2-nand.0:128k(SPL),128k(SPL.backup1),128k(SPL.backup2),128k(SPL.backup3),1920k(u-boot),128k(u-boot-env),5m(kernel),-(rootfs) 擦除原镜像: nand erase 0x00280000 0x00500000 将内存中的镜像文件写入 nand flash: nand write 0x80800000 0x00280000 ${filesize} U-Boot 中的环境命令可以使用 $(filesize) 来确定刚下载(传输)得到的文件大小,printenv filesize 可查看其...

STM8S 使用笔记

1、GPIO 关于 SWIM 用作普通 GPIO 脚 即使 CFG_GCR 的 SWD 脚不置为 1,事实上 PD1 脚也可正常执行输入输出功能,只不过在同时使用 SWIM 调试时,即使设置 DDR 为输出,ODR 总保持为 1。关开 SWIM 连线,复位 MCU 后输出功能可正常执行。SWD 位看似没有什么作用,不过还是按手册所说的方式来做吧。另外也不必担心 SWIM 功能因为该配置而被禁用。 关于开漏输出脚 手册上打 T 标记的是真正的开漏脚,不具备推挽输出的功能,也没有内部上拉功能。使用时需要特别注意。 2、读 TIMx_CNTR 要分别读 TIMx_CNTRH 和 TIMx_CNTRL(分别读 TIMx_CNTRL 和 TIMx_CNTRH 也没错),因为发现直接读 16 位的 TIMx_CNTR 可能出现错误: 明明 TIMx_CNTR 的值是 829,偏偏赋值给一个变量后变量的值是 789。但也不总是有问题,运行几次就好了,复位后现象依旧,但分别读 TIMx_CNTRH 和 TIMx_CNTRL 并赋值给变量就正常,连续读两次 TIMx_CNTR 也是正常的。 3、关于 COSMIC 编译器 编译器有三个自用的变量 c_x、c_y、c_lreg,当与中断函数关联时: (1)当中断函数直接使用(编译器自动产生汇编代码)他们时,会被自动保存和恢复; (2)当终端函数调用使用了 c_x、c_y 的函数时,c_x、c_y 会被自动保存和恢复,但是 c_lreg 不会被这样自动保存和恢复; 这就要特别注意:如果中断中调用了使用 longs 或者 floats 的函数时就要在中断函数的定义中加修饰词 @svlreg! 不太好判断是否使用了 c_lreg(需要反汇编才能看),例如 c_lgadc(长整数加无符号单字节)就没有用到这三个变量,所以在不影响性能的是否加上无妨,除非你的应用很在意那几个 pushw、popw。 4、一个配置字初始化引起的问题 同样的软件延时程序在不同的板子上一个验时是 4ms,一个是 3ms,如果用硬件定时器来实现验时则一致。 读出配置字为 000000F0F000FFFE00,而正常情况下应该读出的是全 0。置 1 的那些位是保留位,具体作用不清除,将其都清零以后延时都是 3ms 了。 可能保留的配置字影响了指令执行等待时间等参数。通过这个问题来看,如果烧写程序时(尤其是 debug 程序时)不烧写正常的配置字进去,可能会造成程序的异常执行。 5、stm8 cosmic 用 sp 索引变量,如果用 push cc 保存寄存器至栈会造成由于编译器不能识别嵌入式汇编而造成的后续代码的变量使用的错误,所以要用 push cc 然后 pop a 的方式获取 cc 的值并返回,不能保存在栈里: uint8 EnterCritical(void) {     #asm     push cc     sim     pop a     #endasm } 6、关于 STVD 开发环境 如果出现编辑界面或仿真界面布局变乱,可以删除 .wed 文件(存储开发界面信息)或 .wdb 文件(存储仿真界面信息),以初始化界面。 7、关于 memcpy cosmic 的 memcpy 是从后往前拷贝,这样当 src 与 dst 重叠时,比如 memcpy(buf, buf + 5, 10) 结果就不是我们预想的,可以使用 memmove 来代替,它会检查是否重叠。当 dst 大于等于 src 时,从前往后拷贝(常规顺序)。 8、stm8 终端向量表 由操作码 0x82(INT)与三字节的地址组成,执行过程是将三字节地址赋给 PC,程序将跳转到该地址处执...

AM335X 内核编译

内核编译: sudo apt-get install u-boot-tools #uImage 生成时依赖的 mkimage 工具 make mrproper make am335x_evm_defconfig make menuconfig make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage 模块编译: make modules make modules_install INSTALL_MOD_PATH=./module...

以动态模块 ko 的形式使用 nfs 客户端

ARM 设备的的内核中没有编进去 NFS,所以打算采用 ko 的方式加载进内核。 编译内核源程序,产生 Makefile。 make menuconfig 配置内核: [*] Network File Systems ---> <M> NFS client support [*] NFS client support for NFS version 3 把 NFS client support 选做模块(M)。 make modules 生成 nfs.ko、sunrpc.ko、lockd.ko 拷贝到 /lib/modules/$(uname -r) 执行 depmod 执行 modprobe nfs [ 207.024183] RPC: Registered named UNIX socket transport module. [ 207.030461] RPC: Registered udp transport module. [ 207.035397] RPC: Registered tcp transport module. [ 207.040317] RPC: Registered tcp NFSv4.1 backchannel transport module...

ARM DS-5(ARM Development Studio 5)

ARM DS-5 是 ARM 公司 2009 年推出的一款可扩展多功能,可调试裸板、Linux、Android 系统,支持所有 ARM 内核的软件开发工具。 自 2007 年 ARM 公司停止对 ADS 的维护更新后,ARM 在基于 eclipse 集成环境的基础上,相继推出了 RVDS(RealView Development Suite)和 DS-5 两款重量级开发软件。其中 DS-5 以同时集成 ARM Compiler 和 GCC 可轻松调试 Linux 系统而占优势。 ARM DS-5 开发工具链帮助工程师为 ARM 应用处理器(如 Cortex™-A 系列,Cortex-R 实时处理器和其他 ARM 嵌入式处理器)开发强大且高度优化的嵌入式软件 。 DS-5 工具链包括一流的 ARM C / C ++ 编译器,强大的 Linux / Android™/ RTOS 调试器,ARM Streamline™ 系统性能分析器和实时系统仿真模型, 所有这些都方便地封装在基于 Eclipse 的用户友好的集成开发环境(IDE)中。 DS-5 有三个不同的版本,它们是通过同一安装包进行许可证管理。 DS-5 Ultimate Edition 支持最新的 ARM 处理器和技术,如 ARMv8。 DS-5 专业版支持所有 ARM 处理器,包括 ARMv7,提供卓越的调试和跟踪功能以及 ARM 编译器。 DS-5 社区版是免费的,可以使用 DS-5 调试器和 Streamline 的有限功能集。功能包括裸机和 Linux 应用程序调试。 应用程序处理器支持: ARMv5: ARM926EJ-S ARMv6: ARM1136JF-S ARM1176JZ-S ARMv7: Cortex-A5 Cortex-A8 Cortex-A9 Cortex-A15 价格(20171108 Digi-Key): Ultimate 相比 Professional 多 ARMv8 processors、Compiler Safety Package Ultimate DS5UE-KD-40001 floating 1year 56,113.46HKD Ultimate DS5UE-KD-30001 node-locked 1year 44,635.76HKD Professional DS5PE-KD-40001 floating 1year 35,070.92HKD Professional DS5PE-KD-30001 node-locked 1year 28,056.77HKD Professional DS5PE-KD-40000 floating 永久 70,141.84HKD Professional DS5PE-KD-30000 node-locked 永久 56,113.46HKD 仿真器: DS-5 官方推荐的仿真器 DSTREAM,售价大约在 2 万 3 千人民币(201711)。 DS-5 vs MDK KEIL MDK-ARM 是用于满足开发者基于ARM7/9, ARM Cortex-M 处理器的开发需求,包括它自带的 RTX 实时操作系统和中间库,都是属于 MCU 应用领域的。 DS-5 是用于创建 Linux/Andriod 的复杂嵌入式系统应用和系统平台驱动接口,DS-5 支持设备添加,包括多核调试和支持,主要针对复杂的多核调试,片上系统开发而推出...

MQTT 学习笔记

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输) 是 IBM 开发的一个即时通信协议。它是一种使用发布/订阅(publish/subscribe)模型的轻量级二进制通信协议,这使得它很适合 M2M(machine to machine)的消息传递,比如低功耗传感器或移动通信设备。 参与角色 由于是基于 publish/subscribe 模型的,所以必定存在消息的发布者和消息的订阅者两个角色,此外还应具有消息代理者(message broker),也就是服务器这一角色。 动作 发布者需要将消息推送至服务器,订阅者要有订阅的动作,然后服务器需要将消息推送给订阅者。 话题 消息以话题为归集(分类),话题将发布者与订阅者的兴趣点牵连了起来。话题就是一个 UTF-8 的字符串,可以使用斜杠(/)表示多个层级关系。话题不需要创建,直接使用就可以。 QoS QoS(Quality of Service,服务质量) 共有 3 级: 0: The broker/client will deliver the message once, with no confirmation. 1: The broker/client will deliver the message at least once, with confirmation required. 2: The broker/client will deliver the message exactly once by using a four step handshake. 通配符 + 与 # 以下带通配符的字符串可以匹配主题 a/b/c/d +/b/c/d a/+/c/d a/+/+/d +/+/+/+ # a/# a/b/# a/b/c/# +/b/c/# 只允许使用通配符订阅话题,不允许使用通配符发布消息。 消息类型 MQTT 拥有 14 种不同的消息类型: CONNECT:客户端连接到 MQTT 代理 CONNACK:连接确认 PUBLISH:新发布消息 PUBACK:新发布消息确认,是 QoS 1 给 PUBLISH 消息的回复 PUBREC:QoS 2 消息流的第一部分,表示消息发布已记录 PUBREL:QoS 2 消息流的第二部分,表示消息发布已释放 PUBCOMP:QoS 2 消息流的第三部分,表示消息发布完成 SUBSCRIBE:客户端订阅某个主题 SUBACK:对于 SUBSCRIBE 消息的确认 UNSUBSCRIBE:客户端终止订阅的消息 UNSUBACK:对于 UNSUBSCRIBE 消息的确认 PINGREQ:心跳 PINGRESP:确认心跳 DISCONNECT:客户端终止连接前优雅地通知 MQTT 代理 相关软件 当前流行的开源代理服务器(MQTT Broker)的实现有:mosquitto, HiveMQ, Apache ActiveMQ, RabbitMQ, mosca 等,MQTT 客户端也有不同操作系统和编程语言下的实现,流行的客户端库(MQTT ClientLibraries)有:Eclipse Paho(支持 C,C++, Java, JavaScript, Python, Go, C#), M2MQTT(C#), Fusesource MQTTClient(Java), MQTT.js(javascript), libmosquitto(c/c++)等等,通过以上库而开发出的 MQTT 客户端应用程序有:mosquitto_pub/mosquitto_sub(可运行于 Linux, Windows, MacOSX 操作系统),HiveMQWebsocket Client(Web browser),MyMQTT(Android),MQTTLens(Google Chrome)等等。 Mosquitto Eclipse Mosquitto™ 是一款实现了 MQTT 3.1 和 3.1.1 版本的开源消息代理软件(C 语言)。 官方网站:https://mosquitto.org/ 测试: wget http://mosquitto.org/files/source/mosquitto-1.4.13.tar.gz tar -zxvf mosquitto-1.4.13.tar.gz cd mosquitto-1.4.13 make(编译过程需要以下三个库:libssl-dev、libc-ares-dev、uuid-dev) sudo make install 编译生成的文件主要是: /usr/local/sbin/mosquitto 代理服务器主程序 /usr/local/bin/mosquitto_pub 用于发布消息的命令行客户端测试程序 /usr/local/bin/mosquitto_sub 用于订阅消息的命令行客户端测试程序 编译时可能出现的错误及解决办法: (1)./mosquitto_internal.h:27:27: fatal error: openssl/ssl.h: 没有那个文件或目录 sudo apt-get install libssl-dev libssl-dev 是将 OpenSSL 用于开发时使用的库文件、头文件等(Debian、Ubuntu) (2)./mosquitto_internal.h:40:20: fatal error: ares.h: 没有那个文件或目录 安装 libc-ares-dev sudo apt-get install libc-ares-dev libc-ares-dev 是 c-ares 的开发库,用于异步域名解析。 (3)read_handle_server.c:31:25: fatal error: uuid/uuid.h: 没有那个文件或目录 sudo apt-get install uuid-dev 它是用于生成 UUID(xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx (8-4-4-4-12))的库 测试: 终端 1: mosquitto -v 1499668521: mosquitto version 1.4.13 (build date 2017-07-10 11:52:05+0800) starting 1499668521: Using default config. 1499668521: Opening ipv4 listen socket on port 1883. 1499668521: Opening ipv6 listen socket on port 1883. 1499668525: New connection from ::1 on port 1883. 1499668525: New client connected from ::1 as mosqsub|1739-debian (c1, k60). 1499668525: Sending CONNACK to mosqsub|1739-debian (0, 0) 1499668525: Received SUBSCRIBE from mosqsub|1739-debian 1499668525: sensors/devicename/temperature (QoS 0) 1499668525: mosqsub|1739-debian 0 sensors/devicename/temperature 1499668525: Sending SUBACK to mosqsub|1739-debian 1499668529: New connection from ::1 on port 1883. 1499668529: New client connected from ::1 as mosqpub|1740-debian (c1, k60). 1499668529: Sending CONNACK to mosqpub|1740-debian (0, 0) 1499668529: Received PUBLISH from mosqpub|1740-debian (d0, q0, r0, m0, 'sensors/devicename/temperature', ... (5 bytes)) 1499668529: Sending PUBLISH to mosqsub|1739-debian (d0, q0, r0, m0, 'sensors/devicename/temperature', ... (5 bytes)) 1499668529: Received DISCONNECT from mosqpub|1740-debian 1499668529: Client mosqpub|1740-debian disconnected. 终端 2: mosquitto_sub -d -t sensors/devicename/temperature Client mosqsub|1739-debian sending CONNECT Client mosqsub|1739-debian received CONNACK Client mosqsub|1739-debian sending SUBSCRIBE (Mid: 1, Topic: sensors/devicename/temperature, QoS: 0) Client mosqsub|1739-debian received SUBACK Subscribed (mid: 1): 0 Client mosqsub|1739-debian received PUBLISH (d0, q0, r0, m0, 'sensors/devicename/temperature', ... (5 bytes)) 31deg 终端 3: mosquitto_pub -d -t sensors/devicename/temperature -m 31deg Client mosqpub|1740-debian sending CONNECT Client mosqpub|1740-debian received CONNACK Client mosqpub|1740-debian sending PUBLISH (d0, q0, r0, m1, 'sensors/devicename/temperature', ... (5 bytes)) Client mosqpub|1740-debian sending DISCONNECT 运行时可能遇到的问题及解决办法: (1)mosquitto_sub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory 解决办法: sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1 Eclipse Paho The Eclipse Paho project provides open-source client implementations of MQTT and MQTT-SN messaging protocols aimed at new, existing, and emerging applications for the Internet of Things (IoT). 项目包含了多种语言的 MQTT 客户端库。 EMQ EMQ 杭州小莉科技 EMQ 2.0 完整支持 MQTT V3.1/V3.1.1 版本协议规范,并扩展支持 WebSocket、Stomp、CoAP、MQTT-SN 或私有 TCP 协议。EMQ 2.0 消息服务器支持单节点 100 万连接与多节点分布式集群。 VerneMQ VerneMQ is a high-performance, distributed MQTT broker. It scales horizontally and vertically on commodity hardware to support a high number of concurrent publishers and consumers while maintaining low latency and fault tolerance. VerneMQ is the reliable message hub for your IoT platform or smart products.VerneMQ is based on Erlang OTP, the best technology currently available to build highly scalable messaging systems. This enables VerneMQ to scale horizontally and vertically by fully utilizing multicore architectures....

结构体内存对齐规则

规则 1:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为 0 计算)。 规则 2:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。 struct route_entry { uint16_t addr; uint32_t teAddr; uint8_t relayNum; uint16_t relay[NWK_RELAY_MAXNUM]; uint8_t age; }; struct route_table { uint8_t count; struct route_entry entry[2]; uint16_t crc; }; sizeof(struct route_entry) == 24 sizeof(struct route_table) == 56...

ARM 交叉编译工具链

交叉编译 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在 PC 平台(X86 CPU)上编译出能运行在以 ARM 为内核的 CPU 平台上的程序,编译得到的程序在 X86 CPU 平台上是不能运行的,必须放到 ARM CPU 平台上才能运行,虽然两个平台用的都是 Linux 系统。 交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由 binutils、gcc 和 glibc 三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。建立交叉编译工具链是一个相当复杂的过程,如果不想自己经历复杂繁琐的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载,但就以 学习为目的来说读者有必要学习自己制作一个交叉编译工具链(目前来看,对于初学者没有太大必要自己交叉编译一个工具链)。 分类和说明 从授权上,分为免费授权版和付费授权版。 免费版目前有三大主流工具商提供,第一是 GNU(提供源码,自行编译制作),第二是 Codesourcery,第三是 Linora。 arm-none-linux-gnueabi-gcc:是 Codesourcery 公司(目前已经被 Mentor 收购)基于 GCC 推出的的 ARM 交叉编译工具。可用于交叉编译 ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem 和 App 应用程序。 arm-linux-gnueabihf-gcc:是由 Linaro 公司基于 GCC 推出的的 ARM 交叉编译工具。可用于交叉编译 ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem 和 App 应用程序。 aarch64-linux-gnu-gcc:是由 Linaro 公司基于 GCC 推出的的 ARM 交叉编译工具。可用于交叉编译 ARMv8 64 位目标中的裸机程序、u-boot、Linux kernel、filesystem 和 App 应用程序。 arm-none-elf-gcc:是 Codesourcery 公司(目前已经被 Mentor 收购)基于 GCC 推出的的 ARM 交叉编译工具。可用于交叉编译ARM MCU(32位)芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。 arm-none-eabi-gcc:是 GNU 推出的的ARM交叉编译工具。可用于交叉编译 ARM MCU(32位)芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。 收费版有 ARM 原厂提供的 armcc、IAR 提供的编译器等等,因为这些价格都比较昂贵,不适合学习用户使用,所以不做讲...