# RTU_ALL_AI 模块功能规范(基于 RTU 原工程分析) > 生成时间: 2026-07-07 > 原则: 每条功能点均来自 RTU 原工程对应模块的完整分析,不遗漏不编造 --- ## 1. myBase.h ### 功能点 | 序号 | 功能 | 说明 | |------|------|------| | B01 | 颜色宏 | COLOR_RESET/RED/GREEN/YELLOW/BLUE/MAGENTA/CYAN/WHITE | | B02 | 文件名缩写宏 | `__SHORT_FILE__` 去除路径前缀 | | B03 | 基础日志宏 | `MY_LOG(color,level,fmt,...)` / `MY_LOG_I` / `MY_LOG_E` | | B04 | LOCAL 宏 | `#define LOCAL static` | | B05 | 字符串类型 | `S_STR[64]` / `L_STR[128]` | | B06 | uint16 大小端转换 | `MY_GET/SET_SHORT_BIGEND/LITTLEEND` | | B07 | int32 大小端转换 | `MY_GET/SET_INT_BIGEND/LITTLEEND` | | B08 | uint64 大小端转换 | `MY_GET/SET_LONG_BIGEND/LITTLEEND` | | B09 | 类型级存/取宏 | `MY_GET/SET_DATA_WITH_TYPE` | | B10 | 数据类型常量 | DATA_TYPE_B/S8/U8/.../STR (22种) | --- ## 2. liblist 侵入式链表 ### 功能点(Linux 内核标准 list.h 精简版) | 序号 | 功能 | API | |------|------|------| | L01 | 链表初始化 | `LIST_HEAD` / `INIT_LIST_HEAD` | | L02 | 头插 | `list_add` | | L03 | 尾插 | `list_add_tail` | | L04 | 删除 | `list_del` / `list_del_init` | | L05 | 移动 | `list_move` / `list_move_tail` | | L06 | 替换 | `list_replace` / `list_replace_init` | | L07 | 判空 | `list_empty` / `list_is_linked` | | L08 | 节点→宿主转换 | `list_entry` | | L09 | 取首/尾元素 | `list_first_entry` / `list_last_entry` / `list_first_entry_or_null` | | L10 | 遍历(安全) | `list_for_each` / `list_for_each_entry` / `*_safe` | | L11 | 拼接 | `list_splice_init` | ### 关键约束 - 纯头文件,无运行时依赖 - 所有 API 必须兼容 C 和 C++(变量名不用 `new`/`class`;`typeof`→`__typeof__`) --- ## 3. liblog 异步日志系统 ### 功能点(636 行,完整复刻 RTU 原实现) | 序号 | 功能 | 说明 | |------|------|------| | G01 | 异步日志线程 | `log_worker_thread` 独立线程处理日志写入 | | G02 | 懒初始化 | `pthread_once` 实现首次调用自动初始化 | | G03 | 消息池预分配 | `calloc(LOG_QUEUE_SIZE)` 预分配消息池,避免频繁 malloc/free | | G04 | 消息池取还 | `get_message_from_pool` / `return_message_to_pool` | | G05 | 队列满阻塞 | `pthread_cond_wait` 等待 not_full,不丢弃日志 | | G06 | 批量消费 | 一次最多取 `LOG_BATCH_SIZE`=100 条,批量写入 | | G07 | 控制台输出 | 带颜色 ANSI 码输出 | | G08 | 文件输出 | 带时间戳写入日志文件 | | G09 | 文件自动创建 | `init_log_directory` 自动创建 logs/ 目录 | | G10 | 文件按大小轮转 | 超过 10MB 自动轮转,保留 5 个历史文件 | | G11 | 文件 setlinebuf | 行缓冲模式 | | G12 | 时间戳格式化 | 精确到毫秒 `YYYY-MM-DD HH:MM:SS.mmm` | | G13 | 文件信息格式化 | `文件名/函数名:行号` 格式 | | G14 | LOG_I/LOG_E 宏 | 便捷宏 | | G15 | 开关控制 | `log_set_file_enabled` / `log_set_console_enabled` | | G16 | flush | 等待队列清空 | | G17 | cleanup | 停止线程、关闭文件、释放消息池 | ### 程序运行流程 ``` 首次 log_prt() 调用 → pthread_once → log_global_init → init_message_pool (预分配 LOG_QUEUE_SIZE 个消息结构) → logger.running = 1 → pthread_create(&log_worker_thread) 每次 log_prt() → get_message_from_pool() → 填充 level/timestamp/file_info/content → enqueue_log() → 队列满则 pthread_cond_wait(¬_full) 阻塞等待 → 尾插队列 → pthread_cond_signal(¬_empty) log_worker_thread 主循环 → 批量取消息 (最多 LOG_BATCH_SIZE) → write_log_batch_array() → 控制台: printf 带颜色 → 文件: fopen/fprintf, 超过 10MB 触发 rotate_log_files → return_message_to_pool() 归还每个消息 ``` --- ## 4. libfunc 基础工具函数 ### 功能点(1783 行,完整复刻 RTU 原实现) #### 4.1 校验计算 (6 个函数) | 序号 | 函数 | 说明 | |------|------|------| | F01 | `func_cal_sum_byte` | 8位校验和 | | F02 | `func_cal_sum_word` | 16位校验和 | | F03 | `func_cal_crc16` | CRC16(Modbus 多项式) | | F04 | `func_cal_crc32` | CRC32(标准多项式) | | F05 | `func_cal_file_crc16` | 文件 CRC16 (4K 缓冲区) | | F06 | `func_cal_file_crc32` | 文件 CRC32 (4K 缓冲区) | #### 4.2 字符串转换 (10 个函数) | 序号 | 函数 | 说明 | |------|------|------| | F07 | `func_get_hex_from_ASCLL` | 单字符hex→数值 | | F08 | `func_get_dec_from_ASCLL` | 单字符dec→数值 | | F09 | `func_string_hex_to_dec` | hex字符串→int | | F10 | `func_string_dec_to_dec` | dec字符串→int | | F11 | `func_string_hex_to_buf` | hex字符串→字节缓冲 | | F12 | `func_dec_to_string` | int→dec字符串(支持宽度填充) | | F13 | `func_hex_to_string` | int→hex字符串(支持宽度填充) | | F14 | `func_float_to_string` | float→字符串(支持宽度) | | F15 | `func_buf_to_string` | 字节缓冲→hex字符串 | | F16 | `func_string_to_argv` | 字符串→argc/argv分割 | #### 4.3 时间处理 (6 个函数) | 序号 | 函数 | 说明 | |------|------|------| | F17 | `func_sys_time_to_string` | 系统时间结构体→字符串 | | F18 | `func_string_to_sys_time` | 字符串→系统时间结构体 | | F19 | `func_get_time` | 获取系统时间(支持 sys/cal 两种) | | F20 | `func_set_time` | 设置系统时间 | | F21 | `func_time_sys_to_cal` | 系统时间→日历时间 | | F22 | `func_time_cal_to_sys` | 日历时间→系统时间 | #### 4.4 文件目录操作 (11 个函数) | 序号 | 函数 | 说明 | |------|------|------| | F23 | `func_dir_exist` | 目录是否存在 | | F24 | `func_make_dirs` | 创建目录(递归) | | F25 | `func_del_dirs` | 删除目录(递归) | | F26 | `func_del_dirs_by_cmd` | 删除目录(系统命令) | | F27 | `func_file_exist` | 文件是否存在 | | F28 | `func_get_file_size` | 获取文件大小 | | F29 | `func_read_file_to_buf` | 读文件到预分配buf | | F30 | `func_read_file_alloc_buf` | 读文件到动态分配buf | | F31 | `func_write_buf_to_file` | 写buf到文件 | | F32 | `func_read_file_tip_info` | 读结构体格式文件信息(含CRC校验) | | F33 | `func_make_dir`(内部) | 内部单级目录创建 | #### 4.5 进程管理 (9 个函数) | 序号 | 函数 | 说明 | |------|------|------| | F34 | `func_get_process_self_name` | 获取本进程名 | | F35 | `func_get_process_name_by_pid` | PID→进程名 | | F36 | `func_get_process_pid` | 获取本进程PID | | F37 | `func_get_process_pid_by_name` | 进程名→PID | | F38 | `func_process_exist_by_name` | 按名判断进程存在 | | F39 | `func_process_exist_by_pid` | 按PID判断进程存在 | | F40 | `func_get_process_path_by_pid` | PID→进程路径 | | F41 | `func_get_process_self_path` | 本进程路径 | | F42 | `func_get_process_self_dir` | 本进程目录 | #### 4.6 环境变量路径 (12 个函数) | 序号 | 函数 | 说明 | |------|------|------| | F43 | `func_get_env_value`(内部) | 读环境变量 | | F44 | `func_get_env_path`(内部) | 读环境变量路径 | | F45 | `func_get_work_path` | WORK_PATH | | F46 | `func_get_sys_cfg_path` | SYS_CFG_PATH | | F47 | `func_get_app_root_path` | APP_ROOT_PATH | | F48 | `func_get_his_root_path` | HIS_ROOT_PATH | | F49 | `func_get_log_root_path` | LOG_ROOT_PATH | | F50 | `func_get_dbc_root_path` | DBC_ROOT_PATH | | F51 | `func_get_shell_path` | SHELL_PATH | | F52 | `func_get_update_path` | UPDATE_PATH | | F53 | `func_get_app_path` | 应用路径(拼接后) | | F54 | `func_get_app_cfg_path` | 应用配置路径 | | F55 | `func_get_app_his_path` | 应用历史路径 | | F56 | `func_get_app_log_path` | 应用日志路径 | #### 4.7 IPC 消息队列 (9 个函数) | 序号 | 函数 | 说明 | |------|------|------| | F57 | `func_create_ipc_msg_queue_by_name` | 按名称创建 | | F58 | `func_create_ipc_msg_queue_by_pid` | 按PID创建 | | F59 | `func_get_ipc_msg_queue_by_name` | 按名称获取 | | F60 | `func_get_ipc_msg_queue_by_pid` | 按PID获取 | | F61 | `func_ipc_msg_send_buf` | 发送原始buf | | F62 | `func_ipc_msg_recv_buf` | 接收原始buf | | F63 | `func_ipc_msg_send_struct` | 发送结构体 | | F64 | `func_ipc_msg_recv_struct` | 接收结构体 | | F65 | `func_delete_ipc_msg_queue` | 删除队列 | | — | `func_process_exist_by_name` | (见4.5) | --- ## 5. 构建系统 ### 层次结构 (与 RTU 完全一致) ``` release/ makefile ← 顶层入口 (SUBDIRS=./src) linux.mk ← 公共编译选项 (CC/CXX/AR, x86/arm切换) build.sh ← 一键编译脚本 src/ makefile ← 第二层 (SUBDIRS=public protocol system) public/ makefile ← 第三层 (SUBDIRS=liblist libfunc liblog ...) liblist/makefile libfunc/makefile ... protocol/ makefile system/ makefile ``` ### linux.mk 关键变量 - `CC`/`CXX`/`LD`/`AR` — 工具链 - `CROSS=arm` 切换 ARM 交叉编译 - `ROOT_DIR`/`SRC_ROOT_DIR`/`REL_INC`/`LIB_REL`/`EXE_REL` — 路径 - `C_FLAGS`/`CXX_FLAGS` — 编译选项(.c 用 gcc,.cpp 用 g++)