# libfunc — 基础工具函数 API 参考 ## 模块概述 libfunc 提供嵌入式开发中最常用的 65 个基础工具函数,分为 7 大类: 1. 校验计算 2. 字符串转换 3. 时间处理 4. 文件目录操作 5. 进程管理 6. 环境变量路径 7. IPC 消息队列 ## 一、校验计算 (6 函数) | 函数 | 说明 | |------|------| | `func_cal_sum_byte(d, n)` | 8 位累加校验和 | | `func_cal_sum_word(d, n)` | 16 位累加校验和 | | `func_cal_crc16(d, n)` | CRC16 (Modbus 多项式 0xA001) | | `func_cal_crc32(d, n)` | CRC32 (标准多项式) | | `func_cal_file_crc16(path)` | 文件 CRC16(4K 缓冲区流式计算) | | `func_cal_file_crc32(path)` | 文件 CRC32 | **示例**: ```c uint8_t d[] = { 0x01, 0x02, 0x03 }; uint16_t crc = func_cal_crc16(d, 3); printf("CRC16 = 0x%04X\n", crc); // 0x6161 ``` ## 二、字符串转换 (10 函数) | 函数 | 参数 | 说明 | |------|------|------| | `func_hex_ch(c)` | char c | 十六进制字符 → 数值 | | `func_dec_ch(c)` | char c | 十进制字符 → 数值 | | `func_hex2dec(s)` | char *s | "FF" → 255 | | `func_dec2dec(s)` | char *s | "255" → 255(支持负号) | | `func_hex2buf(s, dst, len)` | 3 参数 | 十六进制字符串 → 字节缓冲 | | `func_dec2str(buf, sz, val, w)` | 4 参数 | int → 十进制字符串 | | `func_hex2str(buf, sz, val, w)` | 4 参数 | int → 十六进制字符串 | | `func_float2str(buf, sz, f, w)` | 4 参数 | float → 字符串 | | `func_buf2str(buf, sz, src, n)` | 4 参数 | 字节数组 → 十六进制字符串 | | `func_str2argv(s, argc, argv, max)` | 4 参数 | 按空格分割为 argc/argv | **示例**: ```c char buf[64]; func_dec2str(buf, sizeof(buf), 255, 4); printf("%s\n", buf); // "0255" func_hex2str(buf, sizeof(buf), 255, 0); printf("%s\n", buf); // "FF" ``` ## 三、时间处理 (6 函数) | 函数 | 说明 | |------|------| | `func_time_sys2str(buf, sz, ts)` | 系统时间 → "YYYY-MM-DD HH:MM:SS.mmm" | | `func_str2time_sys(s, ts)` | 字符串 → 系统时间 | | `func_get_time(t, type)` | 获取当前时间(type: 1=sys, 2=cal) | | `func_set_time(t, type)` | 设置系统时间(需 root) | | `func_time_sys2cal(src, dst)` | 系统时间 → 日历时间 | | `func_time_cal2sys(src, dst)` | 日历时间 → 系统时间 | ## 四、文件目录操作 (11 函数) | 函数 | 说明 | |------|------| | `func_dir_exist(p)` | 目录是否存在 | | `func_make_dirs(p)` | 递归创建目录 | | `func_del_dirs(p)` | 递归删除目录 | | `func_del_dirs_cmd(p)` | 系统命令删除(rm -rf) | | `func_file_exist(p)` | 文件是否存在 | | `func_file_size(p)` | 获取文件大小(字节) | | `func_read_file(p, buf, cap, out)` | 读文件到预分配缓冲 | | `func_read_file_alloc(p, out)` | 读文件到动态分配缓冲 | | `func_write_file(p, buf, n)` | 写缓冲到文件 | | `func_read_file_info(p, info, check)` | 读结构化文件头(256B, CRC 校验) | **示例**: ```c // 创建目录 func_make_dirs("/tmp/myapp/config"); // 读取文件 uint32_t size = 0; uint8_t *buf = func_read_file_alloc("/tmp/test.txt", &size); if (buf) { printf("Read %u bytes: %s\n", size, buf); free(buf); } ``` ## 五、进程管理 (9 函数) | 函数 | 说明 | |------|------| | `func_proc_self_name(buf, sz)` | 获取本进程名(读 /proc/self/comm) | | `func_proc_name_by_pid(pid, buf, sz)` | PID → 进程名 | | `func_proc_pid()` | 获取本进程 PID | | `func_proc_pid_by_name(name)` | 进程名 → PID | | `func_proc_exist_by_pid(pid)` | 按 PID 判断进程存在 | | `func_proc_exist_by_name(name)` | 按名称判断进程存在 | | `func_proc_path_by_pid(pid, buf, sz)` | PID → 可执行文件路径 | | `func_proc_self_path(buf, sz)` | 本进程路径 | | `func_proc_self_dir(buf, sz)` | 本进程目录 | ## 六、环境变量路径 (12 函数) | 函数 | 环境变量 | |------|---------| | `func_get_work_path(..)` | WORK_PATH | | `func_get_syscfg_path(..)` | SYS_CFG_PATH | | `func_get_app_root(..)` | APP_ROOT_PATH | | `func_get_his_root(..)` | HIS_ROOT_PATH | | `func_get_log_root(..)` | LOG_ROOT_PATH | | `func_get_dbc_root(..)` | DBC_ROOT_PATH | | `func_get_shell_path(..)` | SHELL_PATH | | `func_get_update_path(..)` | UPDATE_PATH | | `func_get_app_path(app, ..)` | 拼接: APP_ROOT/app | | `func_get_app_cfg(app, ext, ..)` | 拼接: APP_ROOT/app/ext | | `func_get_app_his(app, ..)` | 拼接: HIS_ROOT/app | | `func_get_app_log(app, ..)` | 拼接: LOG_ROOT/app | **示例**: ```c char path[256]; func_get_app_cfg("RTU", "config.json", path, sizeof(path)); printf("Config path: %s\n", path); // /opt/RTU/config.json ``` ## 七、IPC 消息队列 (9 函数) | 函数 | 说明 | |------|------| | `func_ipc_create_by_name(name, qid)` | 按名称创建 System V 消息队列 | | `func_ipc_create_by_pid(pid, qid)` | 按 PID 创建 | | `func_ipc_get_by_name(name, qid)` | 按名称获取 | | `func_ipc_get_by_pid(pid, qid)` | 按 PID 获取 | | `func_ipc_send_buf(qid, tx, n)` | 发送原始字节 | | `func_ipc_recv_buf(qid, rx, n)` | 接收原始字节 | | `func_ipc_send_msg(qid, msg)` | 发送结构体消息 | | `func_ipc_recv_msg(qid, msg)` | 接收结构体消息 | | `func_ipc_delete(qid)` | 删除队列 | ## 依赖关系 - **依赖**: myBase.h - **被依赖**: liblog (进程路径), 所有需要 CRC/文件/进程操作的模块