RT-Thread源码-1-启动流程剖析

  • 本文参考代码为 RT-Thread Nano 3.1.3版本代码。在初始篇中仅针对此操作系统的初始化及启动流程进行分析。
  • 不同的处理器系列及版本,以及使用的编译器之间会存在一些差别,但基本流程不变。
  • 以Cortex-M4、GCC版本为例

初始化

  • 从上电启动或复位重启,从栈顶初始化中断向量表后跳转到ResetHandler函数的栈地址,开始执行。
  • ResetHandler函数中:
    1. 跳转执行系统初始化SystemInit
    2. 跳转执行main函数,对RTOS进行初始化
      在这里插入图片描述

启动

  • main函数进入RT-Thread启动函数 rtthread_startup
  • rtthread_startup
    在这里插入图片描述
    1. rt_hw_interrupt_disable
      失能中断,在系统初始化前为了保证后续初始化程序稳定执行,须先记录PRIMASK(中断屏蔽)寄存器值,失能所有中断
      在这里插入图片描述
    2. rt_hw_board_init
      在这里插入图片描述
      1. 设置系统各时钟分频
      2. 设置系统滴答频率
      3. 初始化用户自定义板级组件
      4. 若使能了堆管理功能,开启了SLAB算法,则会进行系统堆初始化
        在这里插入图片描述
        此处__rt_init_rti_board_start及__rt_init_rti_board_end定义于.rti_fn段中,分别表示.rti_fn段的起始地址及结束地址
        在这里插入图片描述
        在这里插入图片描述
    3. rt_show_version 显示RT-Thread系统版本
    4. rt_system_timer_init 初始化了系统定时器列表,主要是初始化定时器列表
    5. rt_system_scheduler_init 初始化系统线程调度器,主要初始化了当前执行线程优先级、当前执行线程、锁次数记录、处于就绪态线程的优先级组、初始化终止线程列表
    6. rt_system_signal_init若使能信号(RT_USING_SIGNAL),则进行初始化
    7. rt_application_init应用程序(main及除其余组件,组件初始化方式同上)初始化,此处使用异步的方式进行
      在这里插入图片描述
      在这里插入图片描述在这里插入图片描述
    8. rt_system_timer_thread_init 若使能了软件定时器,则此处初始化软件定时器列表,初始化并启动软件定时器线程,用于轮询各定时器状态并触发相应回调函数
      在这里插入图片描述
    9. rt_thread_idle_init 初始化并启动空闲线程,此线程用于处理终止线程及系统电源管理
      在这里插入图片描述
    10. rt_system_scheduler_start 启动线程调度器 从就绪态线程组中找到优先级最高的线程,并从线程列表中获取并设置为当前执行线程,最后切换上下文,开始线程调度
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值