RA6M3-HMI-Board 启动调用链
·
一、RA6M3-HMI-Board 启动调用链(精准版:匹配实际文件+行号)
结合你补充的实际文件布局(无独立board.c、rt_hw_board_init在drv_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$$main → rtthread_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.c的main()仅做转发,实际用户代码写在hal_entry.c的hal_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联动 |
四、总结(核心关键点)
- 调用链核心:
Reset_Handler(C)→SystemInit(FSP)→rtthread_startup()(RT内核)→main_thread_entry→hal_entry()(用户代码); - 板级逻辑:无独立
board.c,rt_hw_board_init()在drv_common.c实现,是瑞萨系列共享逻辑; - 编译器适配:GCC走
entry(),ARMCC走$Sub$$main,最终都汇聚到rtthread_startup(); - 用户入口:FSP框架下实际入口是
hal_entry(),而非直接编写main()。
该调用链完全匹配RA6M3-HMI-Board的实际文件布局,可直接对照仓库代码逐行验证,也是瑞萨FSP+RT-Thread融合的典型特征(C化启动、共享板级驱动、FSP入口约定)。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)