refactor(system): 适配 X-Macro 框架 — main.c + libmodbus_m + makefiles

- main.c: 移除显式 app_modbus_m_register() 调用,改为 dc_init → app_sys_init
- modbus_m.cpp: 删除 app_modbus_m_register(),app_modules.h X-Macro 自动注册
- release/src/system/makefile: 移除 libsystem.a 构建(app_sys.cpp 并入 RTU)
- release/src/system/RTU/makefile: 增加 app_sys.cpp 编译,链接 -lcJSON
- 编译验证: x86 + ARM RTU 可执行文件全通过

新增模块流程: 只需在 app_modules.h 添加一行 X-Macro
This commit is contained in:
ypc 2026-07-08 16:38:20 +08:00
parent 447443a6e5
commit 3f6a3cfe91
4 changed files with 27 additions and 117 deletions

View File

@ -10,36 +10,35 @@ INC_PATH := -I$(ROOT)/release/inc \
-I$(ROOT)/src/public/libcmd/inc \ -I$(ROOT)/src/public/libcmd/inc \
-I$(ROOT)/src/public/libtask/inc \ -I$(ROOT)/src/public/libtask/inc \
-I$(ROOT)/src/public/libmy_xxhash/inc \ -I$(ROOT)/src/public/libmy_xxhash/inc \
-I$(ROOT)/src/public/libcJSON/inc \
-I$(ROOT)/src/protocol/libmodbus/inc -I$(ROOT)/src/protocol/libmodbus/inc
LIBS := -L$(ROOT)/release/$(BUILD_TYPE)/lib \ LIBS := -L$(ROOT)/release/$(BUILD_TYPE)/lib \
-lsystem -lmodbus_m -lmodbus -l60870 \ -lmodbus_m -lmodbus -l60870 \
-ldatacenter -lxml -lcmd -ltask \ -ldatacenter -lxml -lcmd -ltask \
-llog -lfunc -lmy_xxhash -lcJSON -lmd5 -lcomm \ -llog -lfunc -lmy_xxhash -lcJSON -lmd5 -lcomm \
-lpthread -lstdc++ -lpthread -lstdc++
O := $(ROOT)/release/$(BUILD_TYPE)/exe/RTU O := $(ROOT)/release/$(BUILD_TYPE)/exe/RTU
S := $(ROOT)/src/system/RTU/src S := $(ROOT)/src/system/RTU/src
B := $(CURDIR)/RTU/obj
SRCS := $(wildcard $(S)/*.c)
OBJS := $(patsubst $(S)/%.c, $(B)/%.o, $(SRCS))
F := $(C_FLAGS) $(INC_PATH)
.PHONY: all C_OBJ := $(CURDIR)/RTU/obj/main.o
all: $(O) CXX_OBJ := $(CURDIR)/RTU/obj/app_sys.o
@echo "[RTU] built -> $(O)"
$(O): $(OBJS) .PHONY: all; all: $(O)
$(O): $(C_OBJ) $(CXX_OBJ)
@mkdir -p $(dir $@) @mkdir -p $(dir $@)
$(CXX) $^ $(LIBS) -o $@ $(CXX) $^ $(LIBS) -o $@
@echo "[RTU] built -> $(O)"
$(B)/%.o: $(S)/%.c $(C_OBJ): $(S)/main.c
@mkdir -p $(dir $@) @mkdir -p $(dir $@)
$(CC) $(F) -c $< -o $@ $(CC) $(C_FLAGS) $(INC_PATH) -c $< -o $@
.PHONY: clean $(CXX_OBJ): $(S)/app_sys.cpp
clean: @mkdir -p $(dir $@)
rm -rf $(B) $(O) $(CXX) $(CXX_FLAGS) $(INC_PATH) -c $< -o $@
.PHONY: rebuild .PHONY: clean; clean:
rebuild: clean all rm -rf $(CURDIR)/RTU/obj $(O)

View File

@ -1,36 +1,14 @@
include ./../../linux.mk include ./../../linux.mk
# 纠正 ROOT_DIRrelease/src/system 只有三级深度linux.mk 假设四级 # app_sys.cpp 已合并到 RTU makefile 中,此处仅管理子模块
ORIG_ROOT := $(ROOT_DIR)
ROOT := $(realpath $(CURDIR)/../../..)
SYS_SRC := $(ROOT)/src/system
PUB_SRC := $(ROOT)/src/public
LIB := $(ROOT)/release/$(BUILD_TYPE)/lib/libsystem.a
LIB_OBJ := $(CURDIR)/libsystem/obj/app_modules.o
LIB_FLAGS := $(C_FLAGS) -I$(SYS_SRC)/inc -I$(PUB_SRC)/liblog/inc -I$(PUB_SRC)/libtask/inc -I$(ROOT)/release/inc
$(LIB): $(LIB_OBJ)
@mkdir -p $(dir $@)
$(AR) rcs $@ $^
@echo "[libsystem] built"
$(LIB_OBJ): $(SYS_SRC)/app_modules.c
@mkdir -p $(dir $@)
$(CC) $(LIB_FLAGS) -c $< -o $@
.PHONY: clean-sys
clean-sys:
rm -rf $(CURDIR)/libsystem/obj $(LIB)
SUBDIRS := ./libmodbus_m ./RTU SUBDIRS := ./libmodbus_m ./RTU
.PHONY: all clean rebuild .PHONY: all clean rebuild
all: $(LIB) all:
@for d in $(SUBDIRS); do [ -f "$$d/makefile" ] && (cd "$$d" && $(MAKE) -f makefile all) || true; done @for d in $(SUBDIRS); do [ -f "$$d/makefile" ] && (cd "$$d" && $(MAKE) -f makefile all) || true; done
clean: clean-sys clean:
@for d in $(SUBDIRS); do [ -f "$$d/makefile" ] && (cd "$$d" && $(MAKE) -f makefile clean) || true; done @for d in $(SUBDIRS); do [ -f "$$d/makefile" ] && (cd "$$d" && $(MAKE) -f makefile clean) || true; done
rebuild: clean all rebuild: clean all

View File

@ -1,8 +1,8 @@
/** /**
* @file main.c * @file main.c
* @brief RTU * @brief RTU
* @details 线 init1 init2 start wait * @details app_sys_init() X-Macro
* 线 * src/system/inc/app_modules.h
*/ */
#include "mySystem.h" #include "mySystem.h"
#include "myLog.h" #include "myLog.h"
@ -16,20 +16,6 @@
#include <signal.h> #include <signal.h>
#include <string.h> #include <string.h>
/* ================================================================
* system/
* ================================================================ */
/* libmodbus_m — Modbus 主站管理 */
extern int app_modbus_m_init1(void *arg);
extern int app_modbus_m_init2(void *arg);
extern void *app_modbus_m(void *arg);
extern void app_modbus_m_register(void);
/* ================================================================
*
* ================================================================ */
static volatile int g_running = 1; static volatile int g_running = 1;
static void sig_handler(int sig) static void sig_handler(int sig)
@ -39,15 +25,10 @@ static void sig_handler(int sig)
LOG_I("signal received, shutting down..."); LOG_I("signal received, shutting down...");
} }
/* ================================================================
*
* ================================================================ */
static void cmd_version(int argc, char *argv[]) static void cmd_version(int argc, char *argv[])
{ {
(void)argc; (void)argc;
(void)argv; (void)argv;
printf("RTU_ALL_AI v1.0\n"); printf("RTU_ALL_AI v1.0\n");
printf(" libmodbus v%d.%d.%d\n", printf(" libmodbus v%d.%d.%d\n",
libmodbus_version_major, libmodbus_version_minor, libmodbus_version_major, libmodbus_version_minor,
@ -58,17 +39,12 @@ static void cmd_uptime(int argc, char *argv[])
{ {
(void)argc; (void)argc;
(void)argv; (void)argv;
printf("RTU uptime: (running)\n"); printf("RTU uptime: (running)\n");
} }
CMD_REGISTER("version", cmd_version, "show firmware version"); CMD_REGISTER("version", cmd_version, "show firmware version");
CMD_REGISTER("uptime", cmd_uptime, "show uptime"); CMD_REGISTER("uptime", cmd_uptime, "show uptime");
/* ================================================================
* main
* ================================================================ */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
(void)argc; (void)argc;
@ -76,57 +52,33 @@ int main(int argc, char *argv[])
printf("\n=== RTU_ALL_AI Starting ===\n\n"); printf("\n=== RTU_ALL_AI Starting ===\n\n");
/* 信号处理 */
signal(SIGINT, sig_handler); signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler); signal(SIGTERM, sig_handler);
signal(SIGPIPE, SIG_IGN);
/* 初始化日志 */
log_init(NULL); log_init(NULL);
LOG_I("RTU booting..."); LOG_I("RTU booting...");
/* 注册所有线程模块 */
app_modbus_m_register();
/* 阶段 1: 模块初始化(信号注册前) */
if (app_modules_init1() != 0)
{
LOG_E("app_modules_init1 failed, aborting");
return 1;
}
/* 数据中心初始化 */
dc_init(NULL); dc_init(NULL);
/* 阶段 2: 模块初始化(信号注册后) */ if (app_sys_init() != 0)
if (app_modules_init2() != 0)
{ {
LOG_E("app_modules_init2 failed, aborting"); LOG_E("app_sys_init failed, aborting");
return 1; return 1;
} }
/* 启动所有模块线程 */ LOG_I("RTU running");
app_modules_start();
LOG_I("RTU running, %d worker threads", 1);
/* 主循环: 处理命令输入 */
while (g_running) while (g_running)
{ {
char *line = linenoise("RTU> "); char *line = linenoise("RTU> ");
if (!line) if (!line) { break; }
{
break; /* Ctrl+D */
}
if (line[0] != '\0') if (line[0] != '\0')
{ {
linenoiseHistoryAdd(line); linenoiseHistoryAdd(line);
/* 解析为 argc/argv */
char *argv_buf[16]; char *argv_buf[16];
uint8_t argc = 0; uint8_t argc = 0;
@ -148,12 +100,7 @@ int main(int argc, char *argv[])
linenoiseFree(line); linenoiseFree(line);
} }
/* 停止所有模块 */ LOG_I("shutting down...");
LOG_I("stopping all modules...");
app_modules_stop();
app_modules_join();
/* 清理 */
dc_cleanup(); dc_cleanup();
log_cleanup(); log_cleanup();

View File

@ -1018,18 +1018,4 @@ void *app_modbus_m(void *arg)
return NULL; return NULL;
} }
// ==================== 模块注册 ==================== /* ==================== 模块注册(由 app_modules.h X-Macro 自动完成,无需手动 register ==================== */
static stru_app g_app_modbus_m;
extern "C" void app_modbus_m_register(void)
{
memset(&g_app_modbus_m, 0, sizeof(g_app_modbus_m));
g_app_modbus_m.name = MODULE_MODBUS_M;
app_module_register(MODULE_MODBUS_M,
app_modbus_m_init1,
app_modbus_m_init2,
app_modbus_m,
&g_app_modbus_m);
}