RT_thread(一)系统的启动rtthread_startup



前言

本文会介绍进入$$spuermain之前系统的准备工作


一、思维导图

在这里插入图片描述

二、submain

1.系统启动rtthread_startup();

1.系统开始初始化:

int rtthread_startup(void)
{
   
    rt_hw_interrupt_disable();//关中断1

    /* 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;
}

2. 硬件初始化

void rt_hw_board_init(void)
{
   
    HAL_Init();//HAL初始化
    SystemClock_Config();//系统时钟(晶振)设置
#ifdef RT_USING_HEAP
    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);//系统内存堆初始化
#endif
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();//版的RT线程组件初始化
#endif
#ifdef RT_USING_CONSOLE
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);//设置控制台初始化
#endif
}

3.打印系统信息

void rt_show_version(void)
{
   
    rt_kprintf("\n \\ | /\n");
    rt_kprintf("- RT -     Thread Operating System\n");
    rt_kprintf(" / | \\     %d.%d.%d build %s\n",
               RT_VERSION, RT_SUBVERSION, RT_REVISION, __DATE__);
    rt_kprintf(" 2006 - 2018 Copyright by rt-thread team\n");
}
RTM_EXPORT(rt_show_version);

4.硬件时钟初始化

void rt_system_timer_init(void)
{
   
    int i;

    for (i = 0; i < sizeof(rt_timer_list) / sizeof(rt_timer_list[0]); i++)
    {
   
        rt_list_init(rt_timer_list + i);//定时器双向两链表初始化
    }
}

5.系统调度器初始化

void rt_system_scheduler_init(void)
{
   
    register rt_base_t offset;

    rt_scheduler_lock_nest = 0;//调度锁标志位

    RT_DEBUG_LOG(RT_DEBUG_SCHEDULER, ("start scheduler: max priority 0x%02x\n",
                                      RT_THREAD_PRIORITY_MAX));//日志打印最大优先级

    for (offset = 0; offset <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值