01_rtthread_startup_log

RT-Thread启动涉及硬件初始化、内核对象设置、main线程创建及调度器启动。在调度器启动前,线程处于就绪状态,启动后运行优先级最高的线程。rt_hw_board_init()负责时钟设置、串口初始化等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 测试使用的工程文件目录:Z:\2022-YS\YS-F4-Pro_HAL_RT-Thread-Demo

RT-Thread的启动流程如下图所示:

RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺序是:系统先从启动文件开始运行,然后进入 RT-Thread 的启动函数 rtthread_startup() ,最后进入用户入口函数 main(),如上图所示。

 

 

 这部分启动代码,大致可以分为四个部分:

(1)初始化与系统相关的硬件;

(2)初始化系统内核对象,例如定时器、调度器、信号;

(3)创建 main 线程,在 main 线程中对各类模块依次进行初始化;

(4)初始化定时器线程、空闲线程,并启动调度器。

启动调度器之前,系统所创建的线程在执行 rt_thread_startup() 后并不会立马运行,它们会处于就绪状态等待系统调度;待启动调度器之后,系统才转入第一个线程开始运行,根据调度规则,选择的是就绪队列中优先级最高的线程。

rt_hw_board_init() 中完成系统时钟设置,为系统提供心跳、串口初始化,将系统输入输出终端绑定到这个串口,后续系统运行信息就会从串口打印出来。

 

 

 

 

 

 

 

 

 

### RT-Thread 操作系统调试无法进入 `main` 函数解决方案 当遇到 RT-Thread 操作系统无法正常进入 `main` 函数的情况时,可以按照以下方法排查和解决问题。 #### 1. 启动流程验证 确保启动过程遵循标准路径:从启动文件开始运行,接着调用 RT-Thread 的启动函数 `rtthread_startup()`,最终到达用户程序入口 `main()`。对于 MDK-ARM 开发环境而言,通过使用 `$Sub$$` 和 `$Super$$` 扩展特性来实现这一点[^1]。 #### 2. 检查链接脚本配置 确认项目中的链接脚本已正确定义了 `_start`, `Reset_Handler` 等关键符号,并且这些符号指向正确的地址空间。错误的链接设置可能导致 CPU 控制流偏离预期路径,从而跳过了必要的初始化步骤或直接进入了死循环状态。 #### 3. 审核启动代码片段 仔细审查自动生成或手动编写的启动汇编/ C 文件部分,特别是那些负责重定位向量表、清除 BSS 区域以及调用高级语言构造器的部分。任何一处疏忽都可能阻碍后续指令序列的有效执行。 #### 4. 使用断点调试工具 借助集成开发环境中内置的支持硬件级中断机制(如 JTAG/SWD 接口)来进行逐步跟踪分析。可以在疑似有问题的地方插入临时性的软件断点或者利用逻辑分析仪捕捉信号波形变化趋势,以便更直观地观察实际发生的事件序列。 #### 5. 日志输出辅助诊断 适当增加日志打印语句至各个阶段的关键位置处,比如在 `rtthread_startup()` 内部添加标志位信息,在接近 `main()` 前后也放置相应的提示消息。这有助于判断当前所处的具体环节及其前后关联情况。 ```c // 在 rtthread_startup 中加入日志记录 void rtthread_startup(void) { // ...其他原有代码... printf("Entering rtthread_startup...\n"); } int main(void) { printf("Reached main function!\n"); while (count++) { LOG_D("Hello RT-Thread!"); rt_thread_mdelay(1000); } return RT_EOK; } ``` 上述措施能够帮助识别是否存在未预见的因素干扰到了正常的加载次序,进而采取针对性修正手段加以排除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值