# nuttx_proj **Repository Path**: wangxinyv/nuttx_proj ## Basic Information - **Project Name**: nuttx_proj - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-07 - **Last Updated**: 2026-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # STM32F407VET6 工业网关 — 产品工程 本目录是**产品层**。NuttX 与 nuttx-apps 作为**只读的上游依赖**放在这里, 我们自己的代码全部在 `boards/` 与 `apps/` 下 —— 这样升级 NuttX 不会与自己的改动冲突。 ## 目录结构 ``` . ├── boards/stm32f4/stm32f407vet6/ # 板级:bring-up、引脚、NuttX 配置、链接脚本 ├── apps/industry/gateway/ # 工业网关应用 ├── scripts/ │ ├── link.sh # 把应用挂接进 apps 树(幂等,可重复跑) │ └── build.sh # 配置 + 编译 ├── nuttx/ # 上游,只读,不改 ├── nuttx-apps/ # 上游,只读,不改 └── _backup_before_L2/ # 改造前备份,确认稳定后可删 ``` ## 构建 ```bash ./scripts/build.sh # 默认产品(gateway) ./scripts/build.sh gateway --force # 重新 configure 再编译 ./scripts/build.sh gateway --clean # distclean 后从头编译 ./scripts/build.sh <其他产品> # 自动发现 boards/*/*/configs/<产品> ./scripts/build.sh <板子>/<产品> --force # 板子重名时明确指定 ``` > **换设备 / 从零编译**:[`BUILD.md`](BUILD.md)(含工具链安装、离线依赖、烧录、常见问题) **新增产品或硬件**:见 `MULTI_PRODUCT_GUIDE.md`——新增一个 `configs/<产品>/defconfig` 和/或一个 `apps/<产品线>/<应用>/` 即可,脚本自动发现。 产物在 `nuttx/nuttx.bin` 与 `nuttx/nuttx.hex`。 工具链默认 `/home/raine/Embedded/tools/gcc-arm-none-eabi-10.3-2021.10/bin`, 可用 `NUTTX_TOOLCHAIN=/path/to/bin ./scripts/build.sh` 覆盖。 ## 为什么上游能保持零改动 三处机制,缺一不可。 ### 1. 板子 —— `CONFIG_ARCH_BOARD_CUSTOM_DIR` 板子在 NuttX 树外,走 out-of-tree custom board 机制: ```kconfig CONFIG_ARCH_BOARD_COMMON=y CONFIG_ARCH_BOARD_CUSTOM=y CONFIG_ARCH_BOARD_CUSTOM_NAME="stm32f407vet6" CONFIG_ARCH_BOARD_CUSTOM_DIR="../boards/stm32f4/stm32f407vet6" CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y ``` - `_RELPATH=y` 时,路径相对 **nuttx 目录** - 构建时 NuttX 自己把板子目录软链成 `arch/arm/src/board` 与 `include/arch/board`, 所以 `boards/Kconfig` **完全不需要改** - **`CONFIG_ARCH_BOARD_COMMON=y` 必须加**:`tools/Config.mk` 只在 `$(BOARD_DIR)/../common` 不存在、且该符号为 `y` 时,才回退到 `$(TOPDIR)/boards///common`。而板子需要那个 common 目录里的 `Makefile`(它负责 include 板子 `src/Make.defs` 并驱动板级库构建)。 漏掉这条会报 `No rule to make target 'libboard.a'`。 ### 2. 应用 —— symlink `nuttx-apps/industry/Kconfig` 由 `mkkconfig.sh` 用 `ls */Kconfig` **自动生成**, 所以把 `apps/industry/gateway` 软链成 `nuttx-apps/industry/gateway` 就会被自动收进去, **父级文件一行都不用改**。软链由 `scripts/link.sh` 创建(幂等)。 软链本身用 `nuttx-apps/.git/info/exclude` 做了**本地**排除(git 官方机制, 不属于上游受控内容),因此两个上游仓库的 `git status` 都是干净的。 ### 3. 应用目录 —— `CONFIG_APPS_DIR` **必须在 defconfig 里显式写** `CONFIG_APPS_DIR="../nuttx-apps"`。 否则 `configure.sh` 会自动探测 apps 目录(依次尝试 `../apps`、`../nuttx-apps`), 而本仓库根下恰好有个 `apps/`,会抢先命中,导致 `source "$APPSBINDIR/Kconfig"` 找不到文件。 ## Submodule 日常操作 `nuttx` 与 `nuttx-apps` 是本仓库的 **git submodule**(gitee 镜像), 产品仓库只记录它们各自的 commit(gitlink),不含任何本地改动。 ```bash # 首次拿到完整工程(新机器 / 新同事) git clone --recursive <本仓库地址> # 或者已经 clone 过但没拉子模块: git submodule update --init # 拉取后同步到当前锁定的 commit git submodule update # 升级到分支最新(.gitmodules 里配置了 branch 字段) git submodule update --remote ``` **升级上游的正确姿势**(锁定明确版本,推荐): ```bash cd nuttx && git fetch && git checkout cd ../nuttx-apps && git fetch && git checkout cd .. && git add nuttx nuttx-apps && git commit -m "Bump nuttx to " ./scripts/build.sh --force ``` 提交后产品仓库就把这个上游版本"钉死"了——任何人 clone 都得到完全相同的上游。 上游零改动,因此**不会产生冲突**。 ## 随时校验上游是否仍然干净 ```bash cd nuttx && git status --short # 应为空 cd ../nuttx-apps && git status --short # 应为空 ``` ## 相关文档 - 板级调试记录与框架讲解:`boards/stm32f4/stm32f407vet6/doc/` - 工业网关架构规划:`boards/stm32f4/stm32f407vet6/doc/INDUSTRIAL_GATEWAY_ARCH.md` - 应用说明:`apps/industry/gateway/README.md`