一、RA6M3-HMI-Board 启动调用链(精准版:匹配实际文件+行号)

结合你补充的实际文件布局(无独立board.crt_hw_board_initdrv_common.c、用户入口为hal_entry()),整理最终精准调用链,覆盖GCC/ARMCC双编译器,标注所有关键文件、行号和核心逻辑:

步骤 核心函数 所在文件 关键行号 核心动作
1 复位向量 → Reset_Handler bsp/renesas/ra6m3-hmi-board/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/startup.c 139(向量表)、61-77(函数体) 硬件复位后第一个执行函数,分支调用不同编译器入口
2 SystemInit() bsp/renesas/ra6m3-hmi-board/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c 229-506(整体)、506(bsp_init(NULL) 瑞萨MCU底层初始化(时钟/栈/内存),调用R_BSP_WarmStart
2a R_BSP_WarmStart(BSP_WARM_START_RESET) 同上system.c 300、321、500 调用板级暖启动逻辑(弱符号)
2b R_BSP_WarmStart()(强符号实现) bsp/renesas/libraries/HAL_Drivers/drv_common.c 220-241 覆盖FSP弱定义,初始化IOPORT等硬件(RA6M3专属)
3 编译器入口分支(GCC) - - -
3-1 entry()rtthread_startup() src/components.c 160-163(entry)、238-281(rtthread_startup GCC下跳转RT-Thread内核启动入口
3-2 编译器入口分支(ARMCC/Keil) - - -
3-2a main()$Sub$$mainrtthread_startup() src/components.c 143-147($Sub$$main ARMCC下劫持默认main,跳转内核启动入口
4 rtthread_startup()rt_hw_local_irq_disable() src/components.c 243 关闭本地中断,进入临界区
5 rt_hw_board_init()(板级核心) bsp/renesas/libraries/HAL_Drivers/drv_common.c 163-204 替代传统board.c,完成RT-Thread板级初始化
5a 子步骤:rt_hw_systick_init()/堆初始化/串口/控制台 同上drv_common.c 173-193 初始化系统滴答、堆(必需)、UART控制台
5b rt_components_board_init() src/components.c 202(调用点)、86-105(实现) 执行INIT_BOARD_EXPORT标注的初始化函数(调度前)
6 rt_show_version() src/components.c 251 打印RT-Thread版本(控制台已就绪)
7 rt_system_timer_init() src/components.c 254 系统定时器初始化(软件定时器基础)
8 rt_system_scheduler_init() src/components.c 257 调度器就绪队列/优先级表初始化
9 (可选)rt_system_signal_init() src/components.c 259-262 信号机制初始化(RT_USING_SIGNALS启用时)
10 rt_application_init() src/components.c 265 创建main线程,绑定入口main_thread_entry
11 rt_system_timer_thread_init() src/components.c 268 定时器线程初始化(处理软件定时器超时)
12 rt_thread_idle_init() src/components.c 271 空闲线程初始化(系统必需,回收资源)
13 rt_thread_defunct_init() src/components.c 274 5.2.2新增,已删除线程资源回收初始化
14 rt_system_scheduler_start() src/components.c 281 启动调度器(进入多线程,永不返回)
15 调度器运行 → main_thread_entry() src/components.c 181-203 main线程执行入口
16 rt_components_init() src/components.c 188(调用点)、110-131(实现) 执行INIT_DEVICE/COMPONENT/APP等初始化(用户main前)
17 用户入口分支(GCC) - - -
17-1 main()(FSP生成) bsp/renesas/ra6m3-hmi-board/ra_gen/main.c 3-6 转发到用户实际入口hal_entry()
17-2 用户入口分支(ARMCC/Keil) - - -
17-2a $Super$$main()main()(FSP生成) src/components.c 197-198 调用原始main,再转发到hal_entry()
18 hal_entry()(用户业务逻辑) bsp/renesas/ra6m3-hmi-board/src/hal_entry.c 21-32 最终用户代码入口(替代传统main()

二、核心差异点(与通用RT-Thread BSP对比)

1. 无独立board.c
  • 通用BSP的rt_hw_board_init()board/board.c,本BSP将其实现到bsp/renesas/libraries/HAL_Drivers/drv_common.c(163-204行),作为瑞萨系列共享板级逻辑;
  • 若需定制,可新增board.c并实现强符号rt_hw_board_init(),覆盖drv_common.c中的rt_weak默认实现。
2. 用户入口不是直接main()
  • FSP生成ra_gen/main.cmain()仅做转发,实际用户代码写在hal_entry.chal_entry()
  • 原因:瑞萨FSP框架约定hal_entry()为应用入口,与RT-Thread的main线程逻辑解耦。
3. 启动文件无.s,全C化
  • startup.c替代传统汇编启动文件,仅通过链接脚本fsp.ld(139行)声明ENTRY(Reset_Handler)
  • SystemInit()整合了栈/时钟/中断初始化(替代汇编的栈配置),核心逻辑全C化。

三、编译入口验证(文件如何被编入工程)

关键文件 编入工程的位置 行号/说明
startup.c/system.c bsp/renesas/ra6m3-hmi-board/ra/SConscript 17-18行,显式加入编译列表
drv_common.c bsp/renesas/libraries/HAL_Drivers/SConscript 列表首项,瑞萨系列共享驱动
hal_entry.c bsp/renesas/ra6m3-hmi-board/SConscript 19行Glob('./src/*.c'),包含src/下所有C文件
ra_gen/main.c FSP工具生成 工程SConscript/链接脚本中自动包含,与hal_data.h联动

四、总结(核心关键点)

  1. 调用链核心Reset_Handler(C)→ SystemInit(FSP)→ rtthread_startup()(RT内核)→ main_thread_entryhal_entry()(用户代码);
  2. 板级逻辑:无独立board.crt_hw_board_init()drv_common.c实现,是瑞萨系列共享逻辑;
  3. 编译器适配:GCC走entry(),ARMCC走$Sub$$main,最终都汇聚到rtthread_startup()
  4. 用户入口:FSP框架下实际入口是hal_entry(),而非直接编写main()

该调用链完全匹配RA6M3-HMI-Board的实际文件布局,可直接对照仓库代码逐行验证,也是瑞萨FSP+RT-Thread融合的典型特征(C化启动、共享板级驱动、FSP入口约定)。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐