224 lines
9.0 KiB
Markdown
224 lines
9.0 KiB
Markdown
# 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++)
|