RTT内核启动流程

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中。
PRIMASK寄存器

(关于通用寄存器的介绍,大家可以看这两篇文章:)

《嵌入式 - 嵌入式大杂烩》深入理解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的内核代码,并分享自己的心得体会。

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值