1.RT-THREAD启动流程

RT-THREAD启动流程

​	rtt启动并不是从main函数开始的,而是从components.c里的$Sub$$main开始的。MDK编译器中当原函数已经封装成外部库函数不可修改,或者已经编码烧录在rom中的时候,可以通过"\$Sub\$\$" 和 "\$Super\$\$"标识符对原函数进行打补丁操作。$Sub$$foo函数可以在进行调用foo函数之前,先进入$Sub$$foo执行代码,之后再通过调用$Super$$foo回到原来定义的函数。在rtt中,就是用了这一对符号对main函数进行了扩展:

在components.c中,通过$Sub$$main对rtt进行初始化
int $Sub$$main(void)
{
    rtthread_startup();
    return 0;
}

rtthread_startup中,进行了初始化操作,比如:关闭中断,堆栈初始化,串口打印板载信息,初始化定时器,调度器的初始化等等,其中对main函数也进行了调度:rt_application_init();

int rtthread_startup(void)
{
    rt_hw_interrupt_disable();

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

rt_application_init中,创建了一个线程main,将main函数做为一个线程进行调度,调度入口是main_thread_entry。

void rt_application_init(void)
{
    rt_thread_t tid;

#ifdef RT_USING_HEAP
    tid = rt_thread_create("main", main_thread_entry, RT_NULL,
                           RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
    RT_ASSERT(tid != RT_NULL);
#else
    rt_err_t result;

    tid = &main_thread;
    result = rt_thread_init(tid, "main", main_thread_entry, RT_NULL,
                            main_stack, sizeof(main_stack), RT_MAIN_THREAD_PRIORITY, 20);
    RT_ASSERT(result == RT_EOK);
	
    /* if not define RT_USING_HEAP, using to eliminate the warning */
    (void)result;
#endif

    rt_thread_startup(tid);
}
在该线程中,就出现了$Super$$main(),也就是说直到这里才真正的运行了我们的main函数。
void main_thread_entry(void *parameter)
{
    extern int main(void);
    extern int $Super$$main(void);

    /* RT-Thread components initialization */
    rt_components_init();

    /* invoke system main function */
#if defined(__CC_ARM) || defined(__CLANG_ARM)
    $Super$$main(); /* for ARMCC. */
#elif defined(__ICCARM__) || defined(__GNUC__)
    main();
#endif
}
rtt启动流程:Systeminit()--> $Sub$$main() --> rtthread_startup --> rt_application_init --> main_thread_entry --> $Super$$main() --> 用户主函数
  • 37
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值