尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

PX4学习笔记(二)从芯片复位 → px4_main 完整启动时序(文字流程图)

PX4学习笔记(二)从芯片复位 → px4_main 完整启动时序(文字流程图)
📅 发布时间:2026/6/26 18:45:26

总链路分段

硬件复位 → start.S 汇编初始化 → stm32_start () 芯片 C 底层初始化 → os_start () NuttX 内核完整初始化 → NSH 控制台启动 → 挂载 ROMFS 并执行 rcS 启动脚本 → 调用 px4_main.c

阶段 1:硬件上电 / 看门狗 / 软件复位(硬件层,无代码)

  1. MCU 复位,CPU PC 指针强制指向 Flash 起始地址 0x08000000
  2. 硬件自动读取向量表前两个字:
    • 0x00:主堆栈 MSP 初始栈顶地址
    • 0x04:复位中断服务程序 Reset_Handler 入口地址
  3. CPU 跳转 Reset_Handler,进入nuttx/arch/arm/armv7-m/start.S

阶段 2:start.S 汇编初始化(纯汇编,无 C 运行环境)

文件路径:nuttx/arch/arm/armv7-m/start.S

  1. cpsid i关闭全局中断,防止初始化阶段外设中断干扰
  2. 加载向量表预设值,初始化 MSP 主堆栈(中断 / 复位专用栈)
  3. 判断复位来源(冷上电 /bootloader 跳转),决定是否完整初始化 RAM
  4. 清零.bss段:循环把 RAM 未初始化全局变量区全部置 0
  5. 拷贝.data段:将 Flash 中已初始化全局变量复制到 RAM
  6. 可选配置双堆栈 MSP/PSP,区分中断栈与任务栈
  7. 跳转至芯片 C 初始化函数stm32_start()

本阶段仅搭建 C 语言运行环境,不操作任何外设、不配置时钟

阶段 3:stm32_start.c STM32 芯片底层初始化

文件路径:nuttx/arch/arm/src/stm32/stm32_start.c

  1. RCC 复位全部外设,外设寄存器恢复出厂默认
  2. 配置外部晶振 HSE / 内部 HSI,配置 PLL 倍频,设置 SYSCLK、AHB、APB 分频(系统主频)
  3. 开启 Cortex-M FPU 浮点单元(CPACR 寄存器),为姿态解算提供硬件浮点
  4. 开启 Flash 预取缓冲、指令缓存,提升 Flash 代码运行速度
  5. 初始化 SysTick 滴答定时器,提供内核调度时基
  6. 划分 RAM 空闲区域,初始化系统堆(malloc/free 底层内存池)
  7. 调用board_early_initialize()板级早期初始化
    • 路径:boards/xxx/xxx/src/board_init.c
    • 功能:基础 LED、电源使能引脚、PMIC 预上电、传感器供电开关初始化
  8. 全部硬件底层就绪,调用 NuttX 操作系统入口:os_start()

阶段 4:os_start () NuttX 内核全量初始化

文件路径:nuttx/sched/os_start.c

  1. 初始化内核全局状态、TCB 任务控制块链表
  2. 同步机制初始化:信号量、互斥锁、条件变量、POSIX 消息队列
  3. 中断子系统 irq 初始化,注册硬件中断向量、中断优先级分组
  4. 内存管理 mm 初始化:任务静态栈管理、堆内存分配器
  5. VFS 虚拟文件系统初始化:挂载设备节点、初始化 CDev 字符设备框架
  6. 初始化块设备驱动框架(SD/FRAM 等存储外设底层接口)
  7. 创建系统空闲 IDLE 任务(最低优先级,无其他任务时运行)
  8. 开启全局中断cpsie i,启动抢占式优先级调度器
  9. 调度器切换至 IDLE 任务,NuttX RTOS 正式运行

阶段 5:NuttX 自动启动 NSH Shell 任务

  1. os_start 完成调度后,内核自动运行第一个用户任务:NSH 控制台
  2. NSH 初始化串口控制台、标准输入输出 stdout/stderr
  3. NSH 自动挂载内置 ROMFS 文件系统(固件内置只读文件系统)
    • 对应资源:ROMFS/px4fmu_common/
  4. NSH 执行启动脚本rcS,路径/etc/init.d/rcS

阶段 6:rcS 启动脚本(PX4 业务入口前置)

文件路径:ROMFS/px4fmu_common/init.d/rcS

  1. 配置系统环境变量、日志目录、参数存储分区
  2. 初始化高精度 hrt 定时器、挂载 FRAM/SD 卡文件系统
  3. 执行核心入口命令:px4_main
  4. 脚本调用平台层入口函数,进入 PX4 专属业务层

阶段 7:px4_main PX4 飞控框架主入口

文件路径:platforms/nuttx/px4_main.c

  1. 初始化 PX4 平台封装层(封装 NuttX 原生系统调用)
  2. 初始化 uORB 消息总线、参数管理模块
  3. 依次加载所有板载外设驱动(IMU、GPS、PWM、RC 输入等)
  4. 启动 WorkQueue 高低优先级任务线程池
  5. 启动飞控核心业务任务:commander、姿态估计、姿态控制、mavlink 通信等

极简纵向时序总览(快速记忆)

复位 → start.S(栈 + bss/data 初始化)→ stm32_start(时钟 / FPU / 板级早初始化) → os_start(NuttX 内核、调度、中断、VFS 初始化)→ NSH 启动 → 挂载 ROMFS 执行 rcS 脚本 → 调用 px4_main.c

关键分界标记

  1. start.S ↔ stm32_start:汇编结束,进入芯片硬件时钟配置
  2. stm32_start ↔ os_start:裸机硬件初始化完成,进入 RTOS 操作系统
  3. os_start ↔ NSH:内核调度器启动,拥有多任务能力
  4. NSH+rcS ↔ px4_main:通用 NuttX 系统结束,进入 PX4 飞控专属底层框架

相关新闻

  • leetcode 3737. 统计主要元素子数组数目 I 中等
  • 基于C#与WPF构建高效串口调试工具:从通信原理到协议解析实践
  • 企业级与个人开发者AI大模型API聚合平台选型指南:生产环境下的技术路径对比

最新新闻

  • MediaPipe TouchDesigner插件:GPU加速的实时视觉交互解决方案
  • 3个实战场景:如何用SMUDebugTool解决Ryzen系统调试与性能优化难题
  • 【软工方法论30】架构评审全流程与最佳实践
  • 天星账号保管箱:超越密码管理的数字安全中枢
  • 3个技巧让你轻松掌握DLSS版本管理:为什么说DLSS Swapper是游戏画质优化的智能助手?
  • 如何快速解决MediaPipe-TouchDesigner摄像头连接故障:5种实用方案

日新闻

  • Qwen2.5-Turbo百万上下文实战指南:百炼平台长文本处理全解析
  • 怎么监控对标账号更新,2026年作者监控工作流,5款深度对比
  • EdgeRemover:专业级Windows Edge浏览器管理工具,彻底解决顽固软件卸载难题

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号