- 博客(102)
- 收藏
- 关注
原创 Linux 消息队列接收与处理线程实现
下面是一个完整的 C 语言实现,创建一个线程来接收消息队列中的数据,缓存到队列中,然后逐个处理。4. 可以根据需要修改消息处理函数 process_message() 的实现。◦ 使用条件变量 (pthread_cond_t) 实现生产者-消费者模型。◦ 使用互斥锁 (pthread_mutex_t) 保护共享数据。◦ 接收线程: 从消息队列接收消息并放入处理队列。◦ 当有新消息到达时,接收线程通知条件变量。◦ 处理线程: 从处理队列取出消息并处理。◦ 当队列为空时,处理线程等待条件变量。
2025-07-14 23:05:25
150
原创 linux打包固件shell脚本
确保校验文件不包含自己,且不会重复打包已生成的。:解压后直接是文件,适合 SDK/软件发布。:避免动态获取脚本名可能导致的意外问题。确保解压后直接是文件,没有父目录层级。,避免动态获取脚本名可能带来的问题。(包含所有文件的 SHA256)如果需要排除更多文件(如。、临时文件等),可在。
2025-07-14 22:20:01
352
原创 linux获取NTP方式
此实现已在ARMv7嵌入式平台测试通过,实测同步精度在局域网环境下可达±50ms,广域网环境下±200ms(受网络延迟影响)。8种详细错误代码(从socket创建到时间设置)默认使用pool.ntp.org公共服务器。若目标平台无DNS支持,可直接使用IP地址。使用NTP v3协议(兼容大多数服务器)使用settimeofday设置系统时间。正确处理1900-1970时间差。超时检测机制(默认5秒可配置)// 使用自定义服务器和超时。支持自定义NTP服务器。// 使用默认参数同步。
2025-07-11 14:37:43
269
原创 linux下OTA升级方案
├── current -> /app/versions/v1.0.0 # 符号链接指向当前版本。方案(如Android OTA),由Bootloader决定启动分区,彻底避免软故障。RestartSec=5s # 等待5秒后重启。│ ├── v1.0.0 # 旧版本(当前运行)│ └── v1.1.0 # 新版本(待升级)└── update.sh # 升级脚本。# 切换回上一个可用版本(如v1.0.0)
2025-07-11 14:28:05
871
原创 linux下进程之间socket通信c程序例程
我们将实现一个简单的客户端 - 服务器模型,服务器监听连接,客户端连接到服务器并发送 JSON 消息,服务器接收消息并打印出来,然后服务器也可以向客户端发送 JSON 消息。• 服务器端:创建一个 Unix 域套接字,绑定到指定路径,监听连接,接受客户端连接,接收客户端发送的 JSON 消息,解析并打印该消息,然后向客户端发送一条 JSON 响应消息。• 客户端:创建一个 Unix 域套接字,连接到服务器,创建一个 JSON 消息并发送给服务器,接收服务器的响应消息,解析并打印该消息。
2025-07-06 22:50:20
251
原创 基于esp32,控制IO1高低电平 和读取IO0按键的c程序
1. GPIO0在ESP32开发板上通常连接有自动下载电路,用作按键输入可能会有问题。◦ BUTTON_IO (GPIO0): 用于连接按键(注意: GPIO0在ESP32上通常有特殊用途,如启动模式选择)5. 如果需要更复杂的按键处理(如双击、多击等),可以考虑使用状态机或专门的按键库。2. 按键需要连接在GPIO0和地之间,内部已启用上拉电阻。◦ OUTPUT_IO (GPIO1): 用于输出高低电平。◦ 区分短按(500ms以内)和长按(2000ms以上)◦ 实际应用中可以根据按键状态来控制输出。
2025-05-29 23:53:57
309
原创 linux删除当前目录的子目录中的所有 .c 文件
该命令只会列出符合条件的文件,而不会进行删除操作。命令可以实现删除操作。如果你想更直观地控制删除过程,也可以使用。命令是一个强大的文件搜索工具,结合。
2025-05-29 14:58:04
232
原创 C语言printf使用错误导致程序崩溃
ld:专用于类型。ESP32 开发:注意long是 32 位,打印uint32_t时优先用PRIu32。避免错误:严格匹配格式化字符串与变量类型。
2025-05-09 15:13:51
566
原创 在 ESP-IDF 中使用 .a 静态库调用
在 components/my_lib/CMakeLists.txt 中添加。通过以上步骤,你可以将静态库无缝集成到 ESP-IDF 项目中。├── lib/ # 静态库文件。# 添加组件目录(自动搜索 components/ 下的子目录):库与当前项目的目标架构(如 xtensa-esp32)不匹配。// 调用库中的函数。:确保库是为 ESP32 编译的,使用相同的工具链重新编译库。#include "mylib.h" // 你的库头文件。:库可能依赖其他未链接的组件。
2025-05-07 15:52:28
686
原创 在 ESP32 开发中,配置默认的串口打印
ESP32 有 3 个 UART(UART0/UART1/UART2),但 UART1 的 TX 引脚(GPIO9)可能与 Flash 冲突,需谨慎选择。如果需要更改日志输出的 UART 端口(例如改用 UART1 或禁用日志),可以通过。确认 GPIO 引脚未被占用(如 UART1 默认用于 Flash,需避免冲突)。在 ESP32 开发中,默认的串口打印(日志输出)通常通过。通过以上方法,可以灵活配置 ESP32 的日志输出串口。(默认 UART0,GPIO1/GPIO3)(自定义 TX/RX 引脚)
2025-05-06 15:25:24
1350
原创 在 Ubuntu 下使用 ESP-IDF 通过串口烧录 ESP32
通过以上步骤,你可以在 Ubuntu 下顺利完成 ESP-IDF 项目的串口烧录。遇到问题时,优先检查串口权限、硬件连接和芯片型号配置。idf.py set-target esp32 # 或 esp32s2/esp32c3/esp8266。通过 USB 线将 ESP32/ESP8266 开发板连接到 Ubuntu 主机。# 或永久加入 dialout 组(见步骤1.3)或检查硬件连接(USB 线/开发板是否正常)。:可选,修改波特率(默认 460800)。确认设备识别到的串口号(通常为。
2025-05-06 15:15:37
1088
原创 基于esp32实现键值对存储读写c程序例程
我们首先打开 NVS 命名空间,然后使用 nvs_set_i32 写入参数,最后调用 nvs_commit 提交更改。4. 主函数:在 app_main 函数中,我们调用 write_config_parameter 写入一个参数,然后调用 read_config_parameter 读取该参数,并打印结果。1. 初始化 NVS:在 app_main 函数中,我们首先调用 nvs_flash_init() 来初始化 NVS。// NVS 分区被截断,需要擦除并重试。// 定义一个函数用于写入配置参数。
2025-04-27 23:33:46
474
原创 ESP32上C语言实现JSON对象的创建和解析
在ESP32上使用C语言实现JSON对象的创建和解析,同样可以借助cJSON库。ESP-IDF(Espressif IoT Development Framework)本身已经集成了cJSON库,你可以直接使用。以下是详细的步骤和示例代码。
2025-04-24 15:46:35
333
原创 基于 ESP32 - S3 同步 NTP(网络时间协议)并获取系统时间的 C 语言程序例程
以下是一个基于 ESP32 - S3 同步 NTP(网络时间协议)并获取系统时间的 C 语言程序例程。这个例程使用了 ESP-IDF(Espressif IoT Development Framework)来实现,你需要在 ESP-IDF 环境下编译和运行该程序。
2025-04-23 16:38:36
459
原创 基于ESP32 - S3的MD5校验算法的C语言例程
下面是一个基于ESP32 - S3的MD5校验算法的C语言例程。在ESP32 - S3上实现MD5校验,你可以使用ESP-IDF(Espressif IoT Development Framework)提供的功能。
2025-04-23 15:34:58
378
原创 基于esp32-s3,写一个实现json键值对数据创建和读写解析c例程
以下是一个基于 ESP32 - S3 使用 ESP - IDF 框架实现 JSON 键值对数据创建、读写和解析的 C 语言例程。
2025-04-23 15:13:39
301
原创 git将本地修改的 README.md 文件更新到远程仓库案例
如果出现冲突,你需要手动解决冲突,然后再次提交修改。命令将本地的提交推送到远程仓库。命令将暂存区的修改提交到本地仓库,并添加有意义的提交信息,描述这次修改的内容。在推送本地修改之前,建议先拉取远程仓库的最新更新,以避免可能的冲突。如果你还修改了其他文件,并且想将所有修改都添加到暂存区,可以使用通配符。选项用于指定提交信息,你可以根据实际修改情况编写合适的信息。执行该命令后,你可能会看到类似如下输出,提示。命令查看工作目录和暂存区的状态,确认。文件的修改就会更新到远程仓库。通常情况下,如果你使用的是。
2025-04-23 10:39:49
428
原创 strlen参数不匹配编译报错处理
这个编译错误是由于strlen函数期望的参数类型是,而你传递给它的是类型,也就是类型,两种指针所指向的数据类型的有符号性不同,从而引发了错误。要解决这个问题,你需要将uint8_t *类型的指针强制转换为类型,这样就能符合strlen函数的参数要求了。
2025-04-22 16:22:46
143
原创 基于 ESP32 - S3 实现互斥锁的 C 语言例程
下面是一个基于 ESP32 - S3 实现互斥锁的 C 语言例程,该例程利用 FreeRTOS(ESP32 - S3 所使用的实时操作系统)提供的互斥锁机制,创建两个任务,这两个任务会尝试访问一个共享资源,通过互斥锁来保证同一时间只有一个任务可以访问该资源,避免数据竞争。
2025-04-22 15:34:48
297
原创 以下是一个基于 ESP32 - S3 实现消息队列收发测试的 C 例程
以下是一个基于 ESP32 - S3 实现消息队列收发测试的 C 例程,该例程使用了 ESP - IDF(Espressif IoT Development Framework)。消息队列是 FreeRTOS 提供的一种机制,用于在不同任务之间传递数据。
2025-04-22 15:21:46
271
原创 通过 Samba 服务实现 Ubuntu 和 Windows 之间互传文件
点击“完成”,如果之前设置了 Samba 用户和密码,会弹出验证窗口,输入相应的用户名和密码即可访问共享目录。通过以上步骤,你就可以在 Ubuntu 和 Windows 之间实现文件的互传。是 Ubuntu 系统的 IP 地址,可以在 Ubuntu 终端中使用。在“驱动器”下拉菜单中选择一个未使用的驱动器号,在“文件夹”中输入。可以使用以下命令创建一个新的共享目录,例如创建名为。替换为 Windows 上的共享文件夹名称,在 Windows 系统中,打开“此电脑”。替换为 Windows 的用户名和密码。
2025-04-19 10:27:19
523
原创 esp32的NVS非易失性存储代码
在 ESP32 中,(通常nvs指非易失性存储,Non - Volatile Storage)主要实现了与非易失性存储相关的功能。ESP32 的 NVS 是一个轻量级的键值对存储系统,它允许开发者将少量的数据持久化存储在闪存中,即使设备断电或重启,数据也不会丢失。以下详细介绍。
2025-04-17 19:28:57
343
原创 CMake 的多层级文件编译实现
通过上述步骤,你可以实现 CMake 的多层级文件编译。核心要点是合理规划项目结构,编写各级文件,使用包含子目录,使用生成库,使用生成可执行文件,并使用链接库。
2025-04-17 14:50:07
572
原创 C 语言实现 HTTP 和 HTTPS 通信的例程
HTTPS 是基于 HTTP 的安全传输协议,需要使用 SSL/TLS 进行加密。在 C 语言中可以使用 OpenSSL 库来实现 HTTPS 通信。编程来实现简单的 HTTP 请求。以上代码仅是简单示例,实际应用中可能需要更多的错误处理和安全性检查。HTTP 是一种明文传输协议,在 C 语言中可以使用。
2025-04-17 09:41:58
669
原创 在 Ubuntu 系统下进行 GitLab 操作(上传代码和下载代码)的详细流程:
复制输出的内容,登录 GitLab 网站,进入个人设置 -> SSH 密钥,将公钥粘贴到相应的输入框中并保存。在使用 Git 之前,需要配置用户名和邮箱,这会在提交代码时记录你的身份信息。登录 GitLab 网站,点击右上角的“+”号,选择“New project”,按照提示创建一个新的仓库。通过以上步骤,你就可以在 Ubuntu 系统下完成 GitLab 的代码上传和下载操作。然后,将公钥添加到 GitLab 账户中。默认情况下,密钥会生成在。如果你需要从 GitLab 下载代码,可以使用。
2025-04-16 17:20:12
543
原创 基于ESP32-S3 蓝牙SDK封装设计
c复制#endif/*** @brief 蓝牙工作模式枚举*/BT_MODE_NONE = 0, // 无模式BT_MODE_BLE, // 仅BLE模式BT_MODE_CLASSIC, // 仅经典蓝牙模式BT_MODE_DUAL // 双模模式(BLE+经典蓝牙)/*** @brief 蓝牙角色枚举*/BT_ROLE_PERIPHERAL = 0, // BLE外设模式。
2025-04-14 19:37:39
863
原创 线程池管理及FreeRTOS示例
线程池管理是一种多线程处理技术,它预先创建并维护一组线程(在FreeRTOS中称为任务),当有任务需要执行时,从池中取出空闲线程来执行,执行完成后线程返回池中等待下一次任务,而不是销毁线程。
2025-04-10 11:08:24
339
2
原创 软件运行架构设计
-------------------------细化某个模块(如规则引擎的并发策略)----------------------------------------------是否需要进一步探讨如何将此架构映射到具体代码实现(如C++线程池/Java虚拟线程)?以下针对智能家居SDK中。
2025-04-10 10:44:30
797
原创 结构体指针和结构体作为函数参数主要区别
特性结构体作为参数结构体指针作为参数传递方式按值传递(传递副本)按引用传递(传递地址)性能复制开销大,性能较低仅传递地址,性能高是否修改原始数据不会修改原始结构体会修改原始结构体适用场景结构体较小,且不需要修改数据结构体较大,或需要修改数据在实际开发中,结构体指针作为参数更为常见,因为它更高效且更灵活,尤其是在需要修改结构体内容或处理大型结构体时。
2025-04-09 09:57:08
353
原创 物联网中的物模型是什么意思,在嵌入式软件开发中如何体现?
物模型是物联网设备与平台交互的核心,通过定义属性、事件和服务,统一描述设备的能力和行为。在嵌入式开发中,物模型通过解析、实现和通信,将抽象描述映射到具体的硬件操作,简化了开发流程,提高了系统的灵活性和可扩展性。物模型(Thing Model)是物联网中对物理设备或虚拟设备的抽象描述,定义了设备的属性、事件和服务。它是设备与云平台或其他设备之间交互的基础,用于统一描述设备的能力和行为。在嵌入式软件中实现物模型定义的属性、事件和服务。根据设备的功能,使用JSON或其他格式定义物模型。
2025-03-28 14:17:48
1011
原创 cmake教程
它使用 CMakeLists.txt 文件来配置项目的构建过程,并生成适用于不同编译器和操作系统的构建文件(如 Makefile、Visual Studio 项目文件等)。以下是一个简单的 CMake 教程,帮助你快速上手。如果你的项目需要使用库,可以在 CMakeLists.txt 中添加库的依赖。首先,你需要在你的系统上安装 CMake。这将在 build 目录下生成适用于你的系统的构建文件(如 Makefile)。在 Windows 上,你可以下载并安装 CMake 的安装程序。
2025-03-20 23:58:33
490
原创 如何修改word文档的目录字体为指定字体大小
返回文档后,Word会提示是否更新目录,选择。在“修改样式”窗口中,设置字体为。在弹出的“目录”对话框中,点击。选中目录内容(点击目录区域)。打开包含目录的Word文档。(二级目录)等,然后点击。在“样式”窗口中,选择。在顶部菜单栏中,点击。
2025-03-20 11:33:57
5647
原创 在 ARM 嵌入式 Linux 下使用 C/C++ 实现 MQTT
在 ARM 嵌入式 Linux 下使用 C/C++ 实现 MQTT 通信是一个常见的需求,尤其是在资源受限的环境中。以下是一个详细的教程,使用库来实现 MQTT 客户端。
2025-03-17 11:41:23
976
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人