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/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)
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,14 @@
|
||||||
include ./../../linux.mk
|
include ./../../linux.mk
|
||||||
|
|
||||||
# 纠正 ROOT_DIR:release/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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue