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:
parent
447443a6e5
commit
3f6a3cfe91
|
|
@ -10,36 +10,35 @@ INC_PATH := -I$(ROOT)/release/inc \
|
|||
-I$(ROOT)/src/public/libcmd/inc \
|
||||
-I$(ROOT)/src/public/libtask/inc \
|
||||
-I$(ROOT)/src/public/libmy_xxhash/inc \
|
||||
-I$(ROOT)/src/public/libcJSON/inc \
|
||||
-I$(ROOT)/src/protocol/libmodbus/inc
|
||||
|
||||
LIBS := -L$(ROOT)/release/$(BUILD_TYPE)/lib \
|
||||
-lsystem -lmodbus_m -lmodbus -l60870 \
|
||||
-lmodbus_m -lmodbus -l60870 \
|
||||
-ldatacenter -lxml -lcmd -ltask \
|
||||
-llog -lfunc -lmy_xxhash -lcJSON -lmd5 -lcomm \
|
||||
-lpthread -lstdc++
|
||||
|
||||
O := $(ROOT)/release/$(BUILD_TYPE)/exe/RTU
|
||||
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
|
||||
all: $(O)
|
||||
@echo "[RTU] built -> $(O)"
|
||||
C_OBJ := $(CURDIR)/RTU/obj/main.o
|
||||
CXX_OBJ := $(CURDIR)/RTU/obj/app_sys.o
|
||||
|
||||
$(O): $(OBJS)
|
||||
.PHONY: all; all: $(O)
|
||||
|
||||
$(O): $(C_OBJ) $(CXX_OBJ)
|
||||
@mkdir -p $(dir $@)
|
||||
$(CXX) $^ $(LIBS) -o $@
|
||||
@echo "[RTU] built -> $(O)"
|
||||
|
||||
$(B)/%.o: $(S)/%.c
|
||||
$(C_OBJ): $(S)/main.c
|
||||
@mkdir -p $(dir $@)
|
||||
$(CC) $(F) -c $< -o $@
|
||||
$(CC) $(C_FLAGS) $(INC_PATH) -c $< -o $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf $(B) $(O)
|
||||
$(CXX_OBJ): $(S)/app_sys.cpp
|
||||
@mkdir -p $(dir $@)
|
||||
$(CXX) $(CXX_FLAGS) $(INC_PATH) -c $< -o $@
|
||||
|
||||
.PHONY: rebuild
|
||||
rebuild: clean all
|
||||
.PHONY: clean; clean:
|
||||
rm -rf $(CURDIR)/RTU/obj $(O)
|
||||
|
|
|
|||
|
|
@ -1,36 +1,14 @@
|
|||
include ./../../linux.mk
|
||||
|
||||
# 纠正 ROOT_DIR:release/src/system 只有三级深度,linux.mk 假设四级
|
||||
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)
|
||||
|
||||
# app_sys.cpp 已合并到 RTU makefile 中,此处仅管理子模块
|
||||
SUBDIRS := ./libmodbus_m ./RTU
|
||||
|
||||
.PHONY: all clean rebuild
|
||||
|
||||
all: $(LIB)
|
||||
all:
|
||||
@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
|
||||
|
||||
rebuild: clean all
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/**
|
||||
* @file main.c
|
||||
* @brief RTU 主程序入口
|
||||
* @details 注册所有线程模块 → init1 → init2 → start → wait。
|
||||
* 每个模块在自己的独立线程中运行主循环。
|
||||
* @details app_sys_init() 自动启动所有 X-Macro 注册的模块。
|
||||
* 新增模块只需修改 src/system/inc/app_modules.h,无需改动本文件。
|
||||
*/
|
||||
#include "mySystem.h"
|
||||
#include "myLog.h"
|
||||
|
|
@ -16,20 +16,6 @@
|
|||
#include <signal.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 void sig_handler(int sig)
|
||||
|
|
@ -39,15 +25,10 @@ static void sig_handler(int sig)
|
|||
LOG_I("signal received, shutting down...");
|
||||
}
|
||||
|
||||
/* ================================================================
|
||||
* 内置命令
|
||||
* ================================================================ */
|
||||
|
||||
static void cmd_version(int argc, char *argv[])
|
||||
{
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
printf("RTU_ALL_AI v1.0\n");
|
||||
printf(" libmodbus v%d.%d.%d\n",
|
||||
libmodbus_version_major, libmodbus_version_minor,
|
||||
|
|
@ -58,17 +39,12 @@ static void cmd_uptime(int argc, char *argv[])
|
|||
{
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
printf("RTU uptime: (running)\n");
|
||||
}
|
||||
|
||||
CMD_REGISTER("version", cmd_version, "show firmware version");
|
||||
CMD_REGISTER("uptime", cmd_uptime, "show uptime");
|
||||
|
||||
/* ================================================================
|
||||
* main
|
||||
* ================================================================ */
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
(void)argc;
|
||||
|
|
@ -76,57 +52,33 @@ int main(int argc, char *argv[])
|
|||
|
||||
printf("\n=== RTU_ALL_AI Starting ===\n\n");
|
||||
|
||||
/* 信号处理 */
|
||||
signal(SIGINT, sig_handler);
|
||||
signal(SIGTERM, sig_handler);
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
|
||||
/* 初始化日志 */
|
||||
log_init(NULL);
|
||||
|
||||
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);
|
||||
|
||||
/* 阶段 2: 模块初始化(信号注册后) */
|
||||
if (app_modules_init2() != 0)
|
||||
if (app_sys_init() != 0)
|
||||
{
|
||||
LOG_E("app_modules_init2 failed, aborting");
|
||||
|
||||
LOG_E("app_sys_init failed, aborting");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* 启动所有模块线程 */
|
||||
app_modules_start();
|
||||
LOG_I("RTU running");
|
||||
|
||||
LOG_I("RTU running, %d worker threads", 1);
|
||||
|
||||
/* 主循环: 处理命令输入 */
|
||||
while (g_running)
|
||||
{
|
||||
char *line = linenoise("RTU> ");
|
||||
|
||||
if (!line)
|
||||
{
|
||||
break; /* Ctrl+D */
|
||||
}
|
||||
if (!line) { break; }
|
||||
|
||||
if (line[0] != '\0')
|
||||
{
|
||||
linenoiseHistoryAdd(line);
|
||||
|
||||
/* 解析为 argc/argv */
|
||||
char *argv_buf[16];
|
||||
uint8_t argc = 0;
|
||||
|
||||
|
|
@ -148,12 +100,7 @@ int main(int argc, char *argv[])
|
|||
linenoiseFree(line);
|
||||
}
|
||||
|
||||
/* 停止所有模块 */
|
||||
LOG_I("stopping all modules...");
|
||||
app_modules_stop();
|
||||
app_modules_join();
|
||||
|
||||
/* 清理 */
|
||||
LOG_I("shutting down...");
|
||||
dc_cleanup();
|
||||
log_cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -1018,18 +1018,4 @@ void *app_modbus_m(void *arg)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
// ==================== 模块注册 ====================
|
||||
|
||||
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);
|
||||
}
|
||||
/* ==================== 模块注册(由 app_modules.h X-Macro 自动完成,无需手动 register) ==================== */
|
||||
|
|
|
|||
Loading…
Reference in New Issue