RTT下载链接
rt-thread.org/download.html#download-rt-thread-source-code
$Sub$$main(void)
在单片机上电之后,程序会跳转到0地址处(在ARM Cortex-M系列中,复位向量被存储在0地址处),获取到复位向量后,程序会跳转到复位向量所映射的地址处。(作者也是纯小白,等作者研究明白单片机的启动流程之后会在写一篇文章解释)
完成硬件(hardware)资源的初始化后,程序便会跳转到main函数所在的地址处执行main函数。但是在components.c文件中有这么一个函数,函数名为:
int $Sub$$main(void)
下面是这个函数的具体内容:
int $Sub$$main(void)
{
rt_hw_interrupt_disable();
rtthread_startup();
return 0;
}
- rt_hw_interrupt_disable();函数
在这个函数内部第一个被执行的函数为rt_hw_interrupt_disable();
当我们右键想要跳转到函数的定义时,会发现这个函数是 “undefined Defination”
这个函数的原型在CORTEX-M3文件下的context_rvds.S文件中
;/*
; * rt_base_t rt_hw_interrupt_disable();
; */
rt_hw_interrupt_disable PROC
EXPORT rt_hw_interrupt_disable
MRS r0, PRIMASK
CPSID I
BX LR
ENDP
这是一段Arm汇编语言,
PROC
(Procedure)指令表示下面是汇编语言中的一个函数声明。
EXPORT
指令指示编译器将rt_hw_interrupt_disable导出为一个可供其他模块或文件使用的符号,用大白话说就是这就是一个函数名。
MRS
指令用于将特殊寄存器(例如控制寄存器或状态寄存器)的值移动到通用寄存器中。在上面的代码中,是将PRIMASK中的值读取到通用寄存器R0中。
(关于通用寄存器的介绍,大家可以看这两篇文章:)
《嵌入式 - 嵌入式大杂烩》深入理解ARM寄存器_51CTO博客_ARM 嵌入式
https://zhuanlan.zhihu.com/p/473494886
CPSID I
: 这条指令用于禁用中断。CPSID 指令用于将特权模式中的中断使能位(I)清零,从而禁用所有可屏蔽的中断。在 Cortex-M 处理器中,使用 CPSID I 指令可以快速地禁用中断。
BX
这条指令用于返回到调用该函数的位置。它会将程序计数器(PC)设置为链接寄存器(LR)中保存的地址,从而实现函数的返回。
最后的ENDP
表示结束了这个函数声明。
对于此处MRS r0, PRIMASK这段代码可否删除,ChatGPT是这样回答的:
- rtthread_startup();函数
跳转到定义后发现是这样的一段代码
int rtthread_startup(void)
{
rt_hw_interrupt_disable();
/* board level initalization
* NOTE: please initialize heap inside board initialization.
*/
rt_hw_board_init();
/* show RT-Thread version */
rt_show_version();
/* timer system initialization */
rt_system_timer_init();
/* scheduler system initialization */
rt_system_scheduler_init();
#ifdef RT_USING_SIGNALS
/* signal system initialization */
rt_system_signal_init();
#endif
/* create init_thread */
rt_application_init();
/* timer thread initialization */
rt_system_timer_thread_init();
/* idle thread initialization */
rt_thread_idle_init();
/* start scheduler */
rt_system_scheduler_start();
/* never reach here */
return 0;
}
rtthread_startup函数中的一些函数说明
rt_hw_board_init
板级硬件初始化函数
rt_system_timer_init
初始化系统系统定时器
rt_system_scheduler_init
启动系统调度器
rt_system_signal_init
系统信号量初始化
rt_application_init
创建用户线程,由此创建一个用户main()线程,而 main()函数是RT-Thread的用户代码入口, 用户可以在main()函数里添加自己的应用。
rt_system_timer_thread_init
初始化系统定时器线程,根据超时函数执行时所处的上下文环境,当定时器设置为SOFT_TIMER模式时, 该函数将初始化系统的定时器线程。
rt_thread_idle_init
空闲线程初始化
rt_system_scheduler_start
开始系统调度
下面贴一张在RTT官网偷的图
(RT-Thread API参考手册:RT-Thread API参考手册: RT-Thread 简介)
后续会继续研究RTT的内核代码,并分享自己的心得体会。